diff --git a/.github/guides/VISUALS.md b/.github/guides/VISUALS.md index 4d8f7d3b585c8..69194004d4c10 100644 --- a/.github/guides/VISUALS.md +++ b/.github/guides/VISUALS.md @@ -406,6 +406,9 @@ There are a few snowflake layers that can be used to accomplish niche goals, alo Floating layers will float "up" the chain of things they're being drawn onto, until they find a real layer. They'll then offset off of that. +Adding `TOPDOWN_LAYER` (actual value `10000`) to another layer forces the appearance into topdown rendering, locally disabling [side map](#side_map-check-the-main-page-too). +We can think of this as applying to planes, since we don't want it interlaying with other non topdown objects. + This allows us to keep relative layer differences while not needing to make all sources static. Often very useful. ## Planes diff --git a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm index cddd5a0820659..d910f5d76734c 100644 --- a/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm +++ b/_maps/RandomRuins/AnywhereRuins/golem_ship.dmm @@ -686,7 +686,6 @@ "Ro" = ( /obj/structure/table/wood, /obj/item/bedsheet/rd/royal_cape{ - layer = 3; pixel_x = 5; pixel_y = 9 }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm index 8e4b42e823900..5b3efc37d685e 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_bughabitat.dmm @@ -188,7 +188,7 @@ /turf/open/floor/iron, /area/ruin/bughabitat) "sr" = ( -/obj/machinery/plumbing/growing_vat, +/obj/machinery/vatgrower, /turf/open/floor/iron, /area/ruin/bughabitat) "st" = ( @@ -322,14 +322,10 @@ /area/ruin/bughabitat) "Ku" = ( /obj/structure/table, -/obj/item/construction/plumbing/research, /turf/open/floor/plastic, /area/ruin/bughabitat) "Ly" = ( /obj/structure/table, -/obj/item/stack/ducts/fifty{ - amount = 23 - }, /mob/living/basic/butterfly, /turf/open/floor/plastic, /area/ruin/bughabitat) diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm index 1a12daf1c6bb4..2e500943b6430 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_phonebooth.dmm @@ -25,9 +25,8 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 }, -/obj/machinery/atmospherics/components/tank/air{ - dir = 8; - piping_layer = 4 +/obj/machinery/atmospherics/components/tank/air/layer4{ + dir = 8 }, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating/icemoon, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm index 22af4367dd9e6..d01b86d5e4649 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_lavaland.dmm @@ -1,1747 +1,3595 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE -"b" = ( -/turf/closed/mineral/random/snow, -/area/icemoon/underground/unexplored) -"e" = ( -/obj/structure/trap/cult, +"ab" = ( +/obj/structure/stone_tile/surrounding/cracked{ + dir = 10 + }, +/obj/structure/stone_tile/center/burnt, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"an" = ( +/turf/open/misc/asteroid{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"cn" = ( +/obj/item/paper/crumpled/bloody/ruins/lavaland_incursion, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"dX" = ( +/obj/structure/stone_tile/slab, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/turf/open/indestructible/boss, +/area/lavaland/surface) +"eP" = ( +/obj/structure/stone_tile/slab, +/turf/open/indestructible/boss{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/lavaland/surface) +"eV" = ( +/turf/closed/mineral/snowmountain/cavern/icemoon, +/area/icemoon/underground/explored) +"fF" = ( +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"gd" = ( +/obj/structure/stone_tile/slab, +/obj/structure/stone_tile/surrounding_tile, +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"gi" = ( +/obj/structure/necropolis_gate, +/obj/structure/stone_tile/slab, /turf/open/floor/cult, -/area/icemoon/underground) -"h" = ( -/obj/item/paper{ - default_raw_text = "We have managed to seal the beast inside, the last of its kind they say... unfortunately in doing so, it seems we have spawned creatures beyond our power to contain..." +/area/lavaland/surface) +"gE" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"gF" = ( +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/turf/open/floor/cult, +/area/lavaland/surface) +"jY" = ( +/obj/structure/stone_tile/cracked{ + dir = 8 }, -/obj/item/pen, /turf/open/misc/asteroid{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"mL" = ( +/obj/structure/stone_tile/cracked{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"na" = ( +/obj/structure/girder/cult, +/turf/open/floor/cult, +/area/lavaland/surface) +"nY" = ( +/obj/item/grown/bananapeel, +/obj/structure/stone_tile/slab, +/turf/open/floor/cult, +/area/lavaland/surface) +"oK" = ( +/obj/structure/stone_tile/slab, +/turf/open/floor/engine/cult{ initial_gas_mix = "LAVALAND_ATMOS" }, -/area/icemoon/underground) -"q" = ( -/turf/open/genturf, -/area/lavaland/surface/outdoors/unexplored/danger/no_ruins) -"w" = ( +/area/lavaland/surface/outdoors) +"oV" = ( +/obj/structure/stone_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"pw" = ( +/obj/structure/stone_tile/slab, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"qv" = ( +/obj/structure/stone_tile/surrounding/burnt, +/obj/structure/stone_tile/center/burnt, +/turf/open/lava/plasma/ice_moon, +/area/icemoon/underground/explored) +"qN" = ( +/obj/structure/stone_tile{ + dir = 1 + }, +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 4 + }, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"qV" = ( +/turf/open/floor/cult, +/area/lavaland/surface) +"rn" = ( +/obj/item/melee/cultblade/dagger, +/obj/item/paper/crumpled/bloody/ruins/lavaland_incursion/last, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"ry" = ( +/obj/structure/stone_tile, +/obj/structure/stone_tile{ + dir = 4 + }, +/obj/structure/stone_tile{ + dir = 8 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"tI" = ( +/turf/template_noop, +/area/template_noop) +"uP" = ( +/obj/structure/stone_tile/block{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile/burnt, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"uX" = ( +/mob/living/basic/mining/legion/cult_skeleton, +/turf/open/floor/cult, +/area/lavaland/surface) +"vu" = ( +/turf/open/misc/asteroid/lavaland_atmos, +/area/lavaland/surface/outdoors) +"vE" = ( /obj/machinery/door/airlock/cult/friendly{ use_power = 0 }, /turf/open/floor/cult, -/area/icemoon/underground) -"y" = ( -/mob/living/simple_animal/hostile/megafauna/dragon{ - desc = "Hunted to extinction, this icey moon is the final resting place for these creatures."; - name = "\proper the last ash drake" +/area/lavaland/surface) +"wf" = ( +/obj/structure/stone_tile/slab, +/obj/structure/stone_tile/block/burnt{ + dir = 1 }, -/turf/open/floor/mineral/gold, -/area/icemoon/underground) -"A" = ( -/obj/effect/mob_spawn/corpse/human/skeleton, -/turf/open/misc/asteroid{ +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"wP" = ( +/obj/structure/stone_tile/slab/burnt, +/turf/open/floor/engine/cult{ initial_gas_mix = "LAVALAND_ATMOS" }, -/area/icemoon/underground) -"E" = ( -/obj/item/grown/bananapeel, +/area/lavaland/surface/outdoors) +"xo" = ( +/obj/structure/stone_tile/slab, +/obj/structure/stone_tile/surrounding/cracked, +/obj/structure/stone_tile/surrounding_tile, +/obj/structure/stone_tile/center, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"xw" = ( +/obj/structure/stone_tile/slab/cracked{ + dir = 5 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/obj/structure/stone_tile/slab/cracked{ + dir = 10 + }, +/turf/open/misc/asteroid{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"yP" = ( +/obj/structure/stone_tile/slab/cracked, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"zz" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"zC" = ( +/obj/structure/trap/cult, /turf/open/floor/cult, -/area/icemoon/underground) -"J" = ( +/area/lavaland/surface) +"Cb" = ( /turf/closed/wall/mineral/cult, -/area/icemoon/underground) -"P" = ( -/turf/open/floor/mineral/silver, -/area/icemoon/underground) -"R" = ( -/turf/open/floor/mineral/gold, -/area/icemoon/underground) -"T" = ( -/turf/open/floor/cult, -/area/icemoon/underground) -"V" = ( -/obj/item/storage/toolbox/mechanical/old/clean, -/turf/open/misc/asteroid{ +/area/lavaland/surface) +"Ce" = ( +/turf/closed/mineral/volcanic/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/lavaland/surface) +"Cp" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface) +"Dq" = ( +/obj/structure/stone_tile/block/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/cracked{ + dir = 8 + }, +/turf/open/lava/plasma/ice_moon, +/area/icemoon/underground/explored) +"GN" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/open/floor/engine/cult{ initial_gas_mix = "LAVALAND_ATMOS" }, -/area/icemoon/underground) -"Z" = ( -/turf/open/misc/asteroid{ +/area/lavaland/surface/outdoors) +"If" = ( +/turf/closed/indestructible/riveted/boss, +/area/lavaland/surface) +"Ja" = ( +/turf/open/lava/plasma/ice_moon, +/area/icemoon/underground/explored) +"JE" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/icemoon/underground/explored) +"Ky" = ( +/turf/closed/mineral/volcanic/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"Nn" = ( +/turf/closed/mineral/random/snow, +/area/icemoon/underground/explored) +"Nr" = ( +/turf/closed/wall/mineral/cult, +/area/lavaland/surface/outdoors) +"NB" = ( +/obj/structure/stone_tile/slab, +/obj/structure/stone_tile/slab/cracked{ + dir = 4 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"PT" = ( +/turf/open/floor/mineral/gold{ initial_gas_mix = "LAVALAND_ATMOS" }, -/area/icemoon/underground) +/area/lavaland/surface) +"PV" = ( +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/turf/open/indestructible/necropolis/air, +/area/lavaland/surface) +"Qp" = ( +/turf/closed/indestructible/necropolis, +/area/lavaland/surface) +"QC" = ( +/obj/structure/stone_tile/slab/cracked, +/turf/open/lava/plasma/ice_moon, +/area/icemoon/underground/explored) +"QL" = ( +/obj/structure/stone_tile/slab/burnt, +/obj/structure/stone_tile/surrounding_tile, +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"Sw" = ( +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"SX" = ( +/obj/item/melee/cultblade/dagger, +/obj/item/clothing/glasses/hud/health/night/cultblind, +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/turf/open/misc/asteroid/lavaland_atmos, +/area/lavaland/surface/outdoors) +"Tr" = ( +/obj/structure/trap/cult, +/obj/effect/mob_spawn/corpse/human/skeleton/cultist, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"Uh" = ( +/obj/structure/stone_tile/center/cracked, +/obj/structure/stone_tile/surrounding/cracked{ + dir = 5 + }, +/turf/open/floor/engine/cult{ + initial_gas_mix = "LAVALAND_ATMOS" + }, +/area/lavaland/surface/outdoors) +"Uj" = ( +/obj/structure/stone_tile/slab, +/obj/structure/stone_tile/surrounding_tile{ + dir = 1 + }, +/obj/structure/stone_tile/surrounding_tile{ + dir = 8 + }, +/turf/open/indestructible/boss, +/area/lavaland/surface) +"UE" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/burnt{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"UF" = ( +/turf/open/indestructible/necropolis/air, +/area/lavaland/surface) +"UO" = ( +/obj/structure/stone_tile/burnt{ + dir = 8 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 4 + }, +/obj/structure/stone_tile/block/cracked{ + dir = 9 + }, +/turf/open/misc/asteroid{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"UX" = ( +/mob/living/basic/mining/legion/cult_skeleton, +/turf/open/indestructible/necropolis/air, +/area/lavaland/surface) +"UY" = ( +/turf/open/genturf, +/area/lavaland/surface/outdoors/unexplored/danger/no_ruins) +"Vh" = ( +/obj/structure/stone_tile/slab, +/turf/open/floor/cult, +/area/lavaland/surface) +"Vw" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"VX" = ( +/obj/structure/stone_tile/block/cracked, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/lava/plasma/ice_moon, +/area/icemoon/underground/explored) +"Wm" = ( +/turf/open/misc/asteroid/snow/icemoon, +/area/icemoon/underground/explored) +"WK" = ( +/obj/item/clothing/head/helmet/skull, +/turf/open/misc/asteroid/lavaland_atmos, +/area/lavaland/surface/outdoors) +"WN" = ( +/obj/structure/stone_tile/slab, +/obj/structure/stone_tile/block/cracked{ + dir = 1 + }, +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"Xm" = ( +/obj/structure/stone_tile/slab/burnt, +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"XQ" = ( +/turf/open/misc/asteroid/basalt/lava_land_surface{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"Zs" = ( +/turf/open/misc/asteroid{ + initial_gas_mix = "ICEMOON_ATMOS" + }, +/area/icemoon/underground/explored) +"ZR" = ( +/obj/structure/stone_tile/slab, +/obj/structure/stone_tile/surrounding_tile{ + dir = 4 + }, +/obj/structure/stone_tile/surrounding_tile, +/mob/living/simple_animal/hostile/megafauna/dragon{ + name = "\proper the last ash drake"; + desc = "The sole survivor of its species, hunted to the verge of extinction. This frozen hell is the final resting place for the last of the dragons." + }, +/turf/open/indestructible/boss, +/area/lavaland/surface) (1,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +tI +tI +tI +tI +tI +tI +tI +tI +tI +eV +Wm +Wm +Ja +Ja +Ja +Ja +Ja +Wm +eV +eV +eV +Ja +Ja +Ja +Ja +Ja +Wm +Wm +Nn +Ja +Ja +Ja +Ja +Nn +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI "} (2,1,1) = {" -b -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -w -w -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -b +tI +tI +tI +tI +tI +tI +tI +tI +eV +eV +eV +Ja +Ja +Ja +Ja +Ja +Ja +Ja +Wm +Wm +Wm +Ja +Ja +Ja +Ja +Ja +Ja +Ja +Ja +Zs +XQ +Ky +Ja +Ja +Wm +Ja +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI "} (3,1,1) = {" -b -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -T -e -T -T -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -b +tI +tI +tI +tI +tI +tI +tI +eV +eV +Wm +Wm +Zs +Ja +Ja +Ja +Ja +Ja +Ja +Zs +Zs +Zs +Zs +Zs +Zs +Ja +Ja +Ja +Ja +Zs +Ky +Ky +Ky +XQ +Ja +Ja +Wm +Nn +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI "} (4,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -T -T -E -T -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +tI +tI +eV +eV +Wm +XQ +XQ +XQ +Zs +Zs +Zs +Ja +Zs +Zs +XQ +XQ +XQ +XQ +Zs +Zs +Zs +XQ +XQ +Ja +Ja +Ja +Ky +Zs +Ja +Zs +Zs +Ja +Ja +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI "} (5,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -T -e -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +tI +Nn +Wm +Wm +XQ +Ky +Ky +XQ +Zs +XQ +Ja +Zs +Zs +Zs +Zs +Zs +Zs +XQ +XQ +XQ +XQ +XQ +XQ +XQ +Zs +Ja +Ja +Ja +Ja +Zs +Zs +Zs +Ja +Nn +Nn +Nn +Nn +Nn +tI +tI +tI +tI +Zs +Zs +tI +tI +tI +tI +tI +tI +tI "} (6,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -w -w -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +Nn +XQ +XQ +Ky +Ky +Ky +Ky +Ky +XQ +XQ +XQ +Zs +Zs +Zs +Ky +Ky +Zs +Zs +XQ +Zs +Ky +Zs +Zs +XQ +XQ +XQ +XQ +Zs +Zs +XQ +XQ +XQ +Zs +Ja +Wm +Wm +Nn +Nn +Nn +Nn +eV +Wm +XQ +Ky +Ky +tI +tI +tI +tI +tI +tI "} (7,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +Nn +XQ +Zs +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Zs +Zs +Ky +Ky +Ky +Ky +Ky +Zs +Ky +Ky +XQ +XQ +XQ +XQ +XQ +XQ +XQ +Zs +XQ +XQ +XQ +XQ +XQ +Zs +Zs +Wm +Nn +Nn +eV +eV +XQ +Ky +Ky +XQ +Zs +tI +tI +tI +tI +tI "} (8,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +XQ +XQ +Ky +Ky +Zs +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Zs +XQ +XQ +XQ +Zs +XQ +XQ +Ky +Ky +Ky +Zs +XQ +XQ +Ky +Zs +Nn +eV +eV +eV +Ky +Ky +Ky +Ky +XQ +tI +tI +tI +tI +tI "} (9,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +Wm +XQ +XQ +Wm +Wm +Cb +If +Ce +Ce +Ce +Ce +If +If +If +If +Cb +Cb +Cb +Cb +If +If +If +Cb +vE +vE +Cb +Cb +Cb +Cb +Cb +Cb +Ce +Ce +If +If +Ce +Ce +If +Cb +Cb +Cb +Cb +Ce +Ce +Cb +Ky +XQ +tI +tI +tI +tI +tI "} (10,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +Nn +Nn +Nn +Nn +Wm +Cb +Cb +Cb +Cb +If +If +If +If +If +If +If +If +Cb +Cb +Cb +Cb +If +qV +zC +qV +qV +If +Cb +Cb +If +If +Cp +If +Cb +Cp +Cp +Cp +Cp +If +If +Cb +Cp +Cp +Cb +If +Ky +Wm +Nn +tI +tI +tI +tI "} (11,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +Nn +eV +eV +eV +Cb +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +an +Cb +qV +qV +qV +gF +Cb +zz +zz +an +zz +UY +UY +Vw +Vw +Vw +Vw +UY +UY +UY +UY +UY +UY +Cb +If +eV +Wm +Nn +tI +tI +tI +tI "} (12,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +Nn +eV +eV +eV +eV +Cb +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +an +Cb +Cb +qV +zC +If +If +an +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +If +If +eV +Nn +Nn +tI +tI +tI +tI "} (13,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +Nn +eV +eV +eV +If +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +an +zz +Cb +vE +vE +If +zz +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +If +If +eV +Nn +Nn +tI +tI +tI +tI "} (14,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +tI +Nn +eV +eV +If +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +an +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +If +If +eV +eV +Nn +Nn +tI +tI +tI "} (15,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +tI +Nn +Nn +Ky +If +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +If +eV +eV +Nn +Nn +tI +tI +tI "} (16,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +tI +Nn +Ky +Ky +Ce +Cp +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Cb +eV +eV +eV +Nn +tI +tI +tI "} (17,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -V -Z -Z -Z -Z -Z -Z -Z -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +Nn +Ky +Ky +Ky +Ce +Cp +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Cb +eV +eV +eV +Nn +tI +tI +tI "} (18,1,1) = {" -b -J -J -J -J -q -q -q -q -q -q -q -q -q -q -q -A -J -J -J -J -J -J -Z -q -q -q -q -q -q -q -q -q -q -q -J -J -J -J -b +tI +tI +tI +Nn +Ky +Ky +Ky +Ky +Ce +Cp +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Cb +eV +eV +Nn +Nn +tI +tI +tI "} (19,1,1) = {" -b -J -T -T -J -J -q -q -q -q -q -q -q -q -q -q -h -J -R -P -P -R -J -Z -q -q -q -q -q -q -q -q -q -q -J -J -T -T -J -b +tI +tI +tI +Nn +Ky +Ky +Nn +Ky +If +Cp +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +If +Ky +eV +Nn +Nn +Nn +tI +tI "} (20,1,1) = {" -b -w -e -T -T -w -q -q -q -q -q -q -q -q -q -q -Z -J -P -R -R -P -J -Z -q -q -q -q -q -q -q -q -q -q -w -T -T -e -w -b +tI +tI +tI +Ky +Ky +Nn +Nn +eV +Cb +If +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +If +Ce +Ky +eV +eV +Nn +Nn +tI +tI "} (21,1,1) = {" -b -w -T -E -e -w -q -q -q -q -q -q -q -q -q -q -Z -J -P -R -y -P -J -Z -q -q -q -q -q -q -q -q -q -q -w -e -E -T -w -b +tI +tI +tI +Nn +Ky +Nn +eV +eV +Cb +If +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +If +Ce +Ky +Ky +eV +Nn +Nn +tI +tI "} (22,1,1) = {" -b -J -T -T -J -J -q -q -q -q -q -q -q -q -q -q -Z -J -R -P -P -R -J -Z -q -q -q -q -q -q -q -q -q -q -J -J -T -T -J -b +tI +tI +tI +tI +Nn +Nn +eV +eV +Cb +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cp +Ce +Ky +Ky +Ky +Nn +Nn +Nn +tI "} (23,1,1) = {" -b -J -J -J -J -q -q -q -q -q -q -q -q -q -q -q -Z -J -J -J -J -J -J -Z -q -q -q -q -q -q -q -q -q -q -q -J -J -J -J -b +tI +tI +tI +tI +Nn +eV +Nn +eV +If +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Nr +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cp +Ce +Ky +Ky +Ky +Nn +eV +Nn +Nn "} (24,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -Z -Z -Z -Z -Z -Z -Z -Z -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +Nn +eV +Wm +eV +If +If +Vw +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +vu +zz +GN +Sw +zz +vu +zz +Nr +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cp +Ce +Ky +Ky +Ky +Ky +eV +eV +eV "} (25,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +Nn +Nn +Wm +mL +If +Cp +Vw +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +vu +Sw +zz +oK +wP +vu +Uh +Sw +vu +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +If +If +Ky +XQ +Ky +Ky +Ky +Ky +eV "} (26,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +tI +Nn +Wm +Wm +WN +If +If +Vw +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +zz +SX +cn +Cb +Cb +Cb +Cb +Sw +Sw +vu +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +If +If +If +XQ +XQ +XQ +Zs +Zs +Ky +Wm "} (27,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +Nn +Wm +Wm +XQ +wf +If +Cp +Vw +Vw +zz +UY +UY +UY +UY +UY +UY +UY +UY +Nr +vu +zz +Cb +If +PT +PT +If +Cb +zz +zz +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Qp +Qp +Qp +If +If +If +pw +XQ +XQ +XQ +XQ +Wm +Wm "} (28,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +tI +Nn +Wm +Wm +XQ +Ky +If +Cp +Vw +Tr +zz +UY +UY +UY +UY +UY +UY +UY +UY +UY +Sw +oK +Cb +PT +dX +Uj +PT +Cb +Sw +ry +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +na +PV +Vh +If +eP +Xm +xw +jY +XQ +XQ +Zs +Ja "} (29,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +Nn +Wm +Ja +Wm +XQ +Ky +Ce +Cp +Vw +oK +Sw +UY +UY +UY +UY +UY +UY +UY +UY +UY +Sw +Sw +Cb +PT +Uj +ZR +PT +Cb +gE +Sw +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +vE +qV +qV +nY +gi +eP +qv +UE +VX +UO +XQ +Zs +QC "} (30,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +tI +eV +Ja +Ja +Wm +Ky +Ky +Ce +Cp +Vw +xo +an +UY +UY +UY +UY +UY +UY +UY +UY +Nr +zz +zz +Cb +If +PT +PT +If +Cb +zz +vu +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +vE +zC +UF +Vh +If +eP +NB +QL +Dq +QC +Ja +Ja +Zs "} (31,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +eV +eV +Ja +Ja +Zs +Ky +Ky +Ce +Cp +Vw +Vw +oK +UY +UY +UY +UY +UY +UY +UY +UY +UY +zz +vu +Sw +Cb +Cb +Cb +Cb +ab +fF +vu +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Cb +Qp +Qp +If +If +gd +XQ +XQ +XQ +Ja +Zs +Wm "} (32,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +eV +Wm +Ja +Ja +Ky +Ky +Ky +Ce +Cp +Vw +Vw +zz +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +zz +Sw +vu +Sw +uP +vu +fF +rn +zz +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Qp +If +If +XQ +Zs +Zs +XQ +Zs +Ja +Wm "} (33,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +eV +Wm +Ja +Ja +Ky +Ky +Ky +Ce +Cp +Vw +UY +Vw +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +zz +zz +Sw +qN +zz +WK +vu +Nr +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +If +If +If +XQ +XQ +Zs +Zs +XQ +Ja +Wm "} (34,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +eV +Wm +Ja +Ky +Ky +Ky +Ky +Ce +Cp +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Nr +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cp +If +Zs +XQ +Zs +XQ +XQ +XQ +Wm "} (35,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -w -w -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +eV +Wm +Ja +Ky +Ky +Ky +Ky +If +Cp +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cp +If +Ky +Ky +XQ +XQ +Ky +Ky +Wm "} (36,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -T -e -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +Nn +Ja +Ja +Ky +Ky +Ky +yP +If +If +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cp +Ce +Ky +Ky +Ky +Ky +Ky +Ky +eV "} (37,1,1) = {" -b -J -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -T -T -E -T -J -q -q -q -q -q -q -q -q -q -q -q -q -q -q -J -J -b +tI +Wm +Ja +Ja +Ky +Ky +Ky +oV +If +If +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cp +Ce +Ky +Ky +Ky +Ky +Ky +eV +eV "} (38,1,1) = {" -b -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -T -e -T -T -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -b +tI +Wm +Ja +Ja +Ky +Ky +XQ +Zs +If +If +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cp +Ce +Ky +Ky +Ky +Ky +eV +eV +eV "} (39,1,1) = {" -b -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -w -w -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -J -b +tI +Wm +Ja +Ky +Ky +XQ +XQ +Zs +Cb +If +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +If +If +Ky +Ky +Nn +Nn +Nn +Nn +tI "} (40,1,1) = {" -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b -b +tI +Wm +Ja +Ky +Ky +XQ +Zs +Ky +Cb +If +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Cb +eV +eV +Nn +Nn +Nn +tI +tI +"} +(41,1,1) = {" +tI +Wm +Ja +Ky +Ky +XQ +Ky +Ky +Cb +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Cb +eV +eV +Wm +Nn +Nn +tI +tI +"} +(42,1,1) = {" +tI +Wm +Ja +Ja +Ky +XQ +Ky +Ky +Cb +If +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Cb +eV +XQ +XQ +Wm +Wm +Nn +tI +"} +(43,1,1) = {" +tI +Wm +Ja +Ja +Ky +XQ +Ky +Ky +If +Cp +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Cb +Ky +XQ +Zs +Zs +Ja +Wm +Nn +"} +(44,1,1) = {" +tI +Nn +Wm +Ja +Ja +Zs +Ky +Ky +Ce +Cp +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +vE +vE +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Cb +Ky +Ky +Ja +Ja +Zs +Wm +Nn +"} +(45,1,1) = {" +tI +Nn +eV +Ja +Ja +Zs +XQ +Ky +If +If +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Qp +Qp +qV +qV +Cb +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Ce +Ky +Ky +Zs +Zs +Ja +Wm +eV +"} +(46,1,1) = {" +tI +Nn +eV +Ja +Ja +Wm +Zs +XQ +If +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Qp +UX +UF +qV +uX +Cb +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +UY +Cb +Ce +Ky +Ja +Ja +Ja +Ja +Ja +eV +"} +(47,1,1) = {" +tI +Nn +eV +Wm +Ja +Ja +Zs +eV +Cb +Cb +Cb +If +If +If +If +If +Cp +Cp +Cp +If +If +If +If +Qp +Qp +UF +qV +qV +qV +Cb +Cb +Cb +Cp +Cp +Cp +Cp +Cp +Cp +Cp +Cb +Cb +Cb +Cb +Cb +Cb +Cb +Cb +Ce +Ky +Ky +Zs +Ja +Ja +Ja +Wm +"} +(48,1,1) = {" +tI +eV +eV +eV +Ja +Wm +Nn +eV +Cb +Cb +Cb +Cb +If +If +Ce +Ce +Ce +Ce +Ce +Ce +If +If +If +If +Qp +Qp +vE +vE +Cb +Cb +Cb +Ce +Cp +Cp +Cp +Ce +Ce +Ce +Ce +Ce +Ce +Ce +Cb +Cb +Cb +Cb +Cb +Cb +Ky +Zs +Ja +Ja +Ja +Wm +Nn +"} +(49,1,1) = {" +tI +eV +eV +eV +eV +Nn +Nn +Nn +eV +eV +eV +Zs +Ky +Ky +Ky +Ky +Ky +Ky +Ky +XQ +Zs +Ky +Ky +Ky +Ky +XQ +XQ +XQ +XQ +XQ +XQ +Zs +JE +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +XQ +XQ +Zs +Zs +Zs +Ja +Ja +Ky +Nn +Nn +"} +(50,1,1) = {" +tI +Nn +Nn +Nn +Nn +Nn +Nn +Nn +Nn +eV +eV +Zs +Ky +Ky +Ky +Ky +Ky +Ky +Zs +XQ +XQ +Zs +Ky +Ky +XQ +Zs +Zs +Zs +XQ +Zs +XQ +XQ +XQ +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Zs +XQ +XQ +XQ +XQ +Zs +XQ +XQ +Ja +Ky +Ky +Nn +Nn +"} +(51,1,1) = {" +tI +tI +tI +Nn +Nn +Nn +Nn +Nn +Nn +Nn +Nn +eV +Zs +Ky +Ky +Ky +Ky +Zs +Ja +XQ +XQ +XQ +Zs +Zs +Nn +Nn +Nn +Nn +Nn +Zs +Zs +XQ +XQ +Zs +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Zs +Zs +XQ +XQ +XQ +Ky +Ky +Ky +Ky +Nn +Nn +"} +(52,1,1) = {" +tI +tI +tI +tI +tI +tI +Nn +Nn +Nn +Nn +Nn +Nn +XQ +XQ +Ky +Ky +Ky +Ja +Ja +Ja +Zs +Ky +XQ +Nn +Nn +Nn +eV +eV +Nn +Nn +Nn +XQ +XQ +eV +eV +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +eV +Nn +tI +"} +(53,1,1) = {" +tI +tI +tI +tI +tI +tI +tI +tI +Nn +Nn +Nn +Nn +Nn +XQ +Ky +Ky +Ky +Ky +Ja +Ja +Ky +Ky +XQ +eV +Nn +eV +eV +tI +tI +Nn +Nn +Nn +eV +eV +eV +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +eV +eV +eV +tI +tI +"} +(54,1,1) = {" +tI +tI +tI +tI +tI +tI +tI +tI +tI +Nn +Nn +Nn +Nn +Zs +XQ +Ky +Ky +Ky +Ky +Ky +Ky +Ky +eV +eV +eV +tI +tI +tI +tI +tI +tI +Nn +eV +eV +eV +eV +eV +eV +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +Ky +eV +eV +eV +eV +tI +tI +tI +"} +(55,1,1) = {" +tI +tI +tI +tI +tI +tI +tI +tI +tI +Nn +Nn +Nn +Nn +Nn +Nn +XQ +Ky +Ky +Ky +Ky +Ky +eV +eV +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +tI +eV +eV +eV +eV +eV +eV +tI +tI +tI +tI +eV +eV +eV +eV +eV +eV +tI +tI +tI +tI "} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm index 6ceb38619a4c5..82f4d3677800a 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_biodome_beach.dmm @@ -549,9 +549,7 @@ /turf/open/misc/beach/sand, /area/ruin/powered/beach) "rU" = ( -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /obj/item/reagent_containers/cup/beaker{ pixel_x = 5 }, @@ -920,9 +918,7 @@ /area/ruin/powered/beach) "GA" = ( /obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/chair/stool/directional/south, /obj/item/storage/backpack/duffelbag, /obj/item/clothing/under/shorts/red, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm index 52e9e68ac409c..6156174aaba56 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_elephant_graveyard.dmm @@ -496,7 +496,6 @@ /obj/structure/flora/rock/style_random, /obj/structure/cable, /obj/item/pickaxe{ - layer = 2.5; pixel_x = -8; pixel_y = 5 }, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm index d4ebe90811fb2..851cfe35548b6 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_phonebooth.dmm @@ -23,9 +23,8 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 }, -/obj/machinery/atmospherics/components/tank/air{ - dir = 8; - piping_layer = 4 +/obj/machinery/atmospherics/components/tank/air/layer4{ + dir = 8 }, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating/lavaland_atmos, diff --git a/_maps/RandomRuins/SpaceRuins/bus.dmm b/_maps/RandomRuins/SpaceRuins/bus.dmm index 1cd3d0f7ec261..a8a4a968d976d 100644 --- a/_maps/RandomRuins/SpaceRuins/bus.dmm +++ b/_maps/RandomRuins/SpaceRuins/bus.dmm @@ -29,7 +29,6 @@ "ao" = ( /obj/machinery/telecomms/server{ pixel_z = 12; - layer = 2.91; name = "tgsv3"; desc = "It's, uh... pending an upgrade." }, @@ -240,8 +239,7 @@ /area/ruin/space) "ud" = ( /obj/structure/fluff/bus/passable{ - icon_state = "bottomdoor"; - layer = 3 + icon_state = "bottomdoor" }, /turf/open/misc/asteroid/airless, /area/ruin/space) @@ -308,7 +306,6 @@ }, /obj/machinery/telecomms/server{ pixel_z = 12; - layer = 2.91; name = "tgsv3"; desc = "It's, uh... pending an upgrade." }, diff --git a/_maps/RandomRuins/SpaceRuins/clericden.dmm b/_maps/RandomRuins/SpaceRuins/clericden.dmm index c6e6bebddb0be..f274f7a23f563 100644 --- a/_maps/RandomRuins/SpaceRuins/clericden.dmm +++ b/_maps/RandomRuins/SpaceRuins/clericden.dmm @@ -108,9 +108,7 @@ /turf/open/floor/plating/airless, /area/ruin/space) "A" = ( -/obj/structure/table/wood{ - layer = 3.3 - }, +/obj/structure/table/wood, /turf/open/floor/carpet/royalblack/airless, /area/ruin/space) "B" = ( diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm index 1976a33a4adda..64e7be0705b6b 100644 --- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm +++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm @@ -362,8 +362,7 @@ /obj/structure/door_assembly/door_assembly_hatch{ anchored = 1; name = "crew quarters"; - desc = "People lived in this place."; - layer = 2.8 + desc = "People lived in this place." }, /turf/template_noop, /area/ruin/space/has_grav/infested_frigate) @@ -380,9 +379,7 @@ pixel_x = 6; pixel_y = 6 }, -/obj/item/phone{ - layer = 3.1 - }, +/obj/item/phone, /obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/rnd_notes{ default_raw_text = "STERILIZATION ORDERS

Detailed findings:

A biological research lab within the HD-10180 system has suffered from a complete containment failure. The SYN-C Brutus is to deliver a nuclear payload via strike team. Everything inside and outside the facility is to be killed on sight, including any research staff. Nuclear authentication codes have been sent via red phone, as have other detailed orders.

The rest of the documents are maps and mundane information regarding the crew's destination."; name = "STERILIZATION ORDERS"; @@ -638,9 +635,7 @@ /turf/open/floor/mineral/plastitanium/airless, /area/ruin/space/has_grav/infested_frigate) "jx" = ( -/obj/effect/decal/cleanable/glass{ - layer = 3.1 - }, +/obj/effect/decal/cleanable/glass, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/infested_frigate) @@ -653,9 +648,7 @@ desc = "It would have been locked anyway."; name = "syndicate navigation console" }, -/obj/effect/decal/cleanable/glass{ - layer = 3.1 - }, +/obj/effect/decal/cleanable/glass, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) "kc" = ( @@ -862,9 +855,7 @@ /obj/effect/decal/cleanable/blood{ icon_state = "floor5-old" }, -/obj/item/ammo_casing/spent{ - layer = 3.1 - }, +/obj/item/ammo_casing/spent, /obj/item/gun/ballistic/automatic/plastikov, /obj/effect/mob_spawn/corpse/human/syndicatepilot, /turf/open/floor/mineral/plastitanium/red, @@ -981,8 +972,7 @@ /obj/effect/decal/cleanable/glass, /obj/machinery/button/door/directional/north{ name = "prisoner isolation shutter"; - id = "captivity"; - layer = 3.4 + id = "captivity" }, /turf/open/floor/pod/dark, /area/ruin/space/has_grav/infested_frigate) @@ -1238,12 +1228,9 @@ /area/ruin/space/has_grav/infested_frigate) "vj" = ( /obj/machinery/door/poddoor{ - id = "Brutusexterior"; - closingLayer = 2.65 - }, -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium{ - layer = 2.9 + id = "Brutusexterior" }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/ruin/space/has_grav/infested_frigate) "vm" = ( @@ -1626,9 +1613,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/infested_frigate) "yZ" = ( -/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium{ - layer = 2.9 - }, +/obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, /area/ruin/space/has_grav/infested_frigate) "zg" = ( @@ -1926,9 +1911,7 @@ /obj/effect/decal/cleanable/blood/gibs{ icon_state = "gib1-old" }, -/obj/machinery/door/window/left/directional/east{ - layer = 3.2 - }, +/obj/machinery/door/window/left/directional/east, /obj/machinery/door/poddoor/shutters/window/preopen{ id = "captivity" }, diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index 6062a970205c6..ade5d068b6ebc 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -59,19 +59,6 @@ /obj/structure/alien/weeds/node, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) -"ar" = ( -/obj/effect/decal/cleanable/robot_debris, -/obj/structure/alien/weeds, -/obj/structure/closet/crate, -/obj/item/stack/sheet/glass/fifty{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/stack/sheet/plasteel{ - amount = 30 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) "as" = ( /turf/closed/wall, /area/ruin/space/ancientstation/charlie/bridge) @@ -225,16 +212,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) -"bh" = ( -/obj/machinery/computer/old{ - dir = 4 - }, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/west, -/obj/machinery/door/window/brigdoor/right/directional/east, -/turf/open/floor/iron/dark, -/area/ruin/space/ancientstation/delta/ai) "bi" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -248,6 +225,12 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) +"bl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "bm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue, @@ -887,6 +870,16 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hydro) +"dT" = ( +/obj/machinery/modular_computer/preset/research/away{ + dir = 4 + }, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/machinery/door/window/brigdoor/right/directional/east, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "dU" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -959,12 +952,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/bridge) -"ek" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/reagent_dispensers/fueltank, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) "el" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -1082,14 +1069,6 @@ "eJ" = ( /turf/closed/wall, /area/ruin/space/ancientstation/charlie/sec) -"eK" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) "eL" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -1524,12 +1503,6 @@ /obj/structure/grille, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) -"gM" = ( -/obj/machinery/rnd/production/circuit_imprinter/offstation, -/obj/effect/decal/cleanable/dirt, -/obj/item/reagent_containers/dropper, -/turf/open/floor/iron/white, -/area/ruin/space/ancientstation/delta/rnd) "gP" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/computer/operating/oldstation{ @@ -1905,14 +1878,6 @@ /obj/effect/turf_decal/tile/red/anticorner/contrasted, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) -"io" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/dirt, -/obj/item/folder/white, -/obj/item/reagent_containers/cup/beaker, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/delta/rnd) "ip" = ( /obj/machinery/chem_master, /obj/effect/decal/cleanable/dirt, @@ -2007,6 +1972,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/ruin/space/ancientstation/delta/rnd) +"iH" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/structure/fluff/broken_canister_frame, +/obj/effect/decal/cleanable/plasma, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "iI" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -2083,6 +2059,16 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) +"jc" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "je" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -2249,14 +2235,6 @@ /obj/machinery/door/window/left/directional/east, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) -"jP" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/backpack/duffelbag, -/obj/structure/closet, -/obj/effect/spawner/random/clothing/backpack, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) "jU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/public/glass{ @@ -2671,17 +2649,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) -"lz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/tile/yellow/half/contrasted{ - dir = 1 - }, -/obj/effect/spawner/random/trash/garbage, -/obj/effect/spawner/random/trash/garbage, -/obj/effect/spawner/random/trash/garbage, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) "lB" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/directional/east, @@ -2896,14 +2863,6 @@ /obj/structure/cable, /turf/template_noop, /area/ruin/space/solars/ancientstation/charlie/solars) -"mz" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/item/storage/backpack/old, -/obj/structure/closet, -/obj/effect/spawner/random/clothing/backpack, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/dorms) "mA" = ( /obj/machinery/conveyor{ id = "beta" @@ -2935,12 +2894,6 @@ }, /turf/open/floor/plating, /area/ruin/space/ancientstation/beta/mining) -"mF" = ( -/obj/machinery/shower/directional/west{ - has_water_reclaimer = 0 - }, -/turf/open/floor/vault, -/area/ruin/space/ancientstation/delta/biolab) "mG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3115,14 +3068,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/hall) -"ng" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/pipedispenser/disposal/transit_tube, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) "nk" = ( /turf/closed/wall, /area/ruin/space/ancientstation/charlie/dorms) @@ -3175,26 +3120,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) -"nC" = ( -/obj/structure/closet/crate, -/obj/item/cautery{ - pixel_x = 4 - }, -/obj/item/hemostat, -/obj/item/circular_saw, -/obj/item/scalpel{ - pixel_y = 12 - }, -/obj/item/retractor, -/obj/item/surgical_drapes, -/obj/machinery/light/small/broken/directional/west, -/obj/item/tank/internals/anesthetic, -/obj/item/clothing/mask/breath/medical, -/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ - dir = 8 - }, -/turf/open/floor/iron/airless, -/area/ruin/space/ancientstation/beta/medbay) "nD" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table/optable, @@ -3202,6 +3127,15 @@ /obj/effect/turf_decal/tile/blue/anticorner/contrasted, /turf/open/floor/iron/airless, /area/ruin/space/ancientstation/beta/medbay) +"nG" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/table, +/obj/machinery/door/window/brigdoor/right/directional/east, +/obj/item/computer_disk, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "nI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/science, @@ -3260,6 +3194,11 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/rnd) +"nT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/pipedispenser, +/turf/open/floor/iron/airless, +/area/ruin/space/ancientstation/beta/hall) "nU" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/airalarm/directional/north, @@ -3534,12 +3473,6 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) -"pv" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/turf/open/floor/engine/n2, -/area/ruin/space/ancientstation/beta/atmos) "pD" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{ @@ -3557,6 +3490,14 @@ /obj/machinery/light_switch/directional/east, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/engie) +"pI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 1 + }, +/obj/machinery/computer/apc_control/away, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/engie) "pK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -3623,13 +3564,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/mining) -"qk" = ( -/obj/machinery/pipedispenser, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) "ql" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3682,11 +3616,6 @@ }, /turf/closed/wall, /area/ruin/space/ancientstation/beta/atmos) -"qH" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/plumbing/input, -/turf/open/floor/engine, -/area/ruin/space/ancientstation/delta/biolab) "qK" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/portable_atmospherics/scrubber, @@ -3777,6 +3706,10 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) +"rw" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/turf/open/floor/engine/n2, +/area/ruin/space/ancientstation/beta/atmos) "rC" = ( /obj/effect/decal/cleanable/blood/xtracks{ dir = 8 @@ -3864,14 +3797,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"se" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/obj/effect/turf_decal/tile/yellow/half/contrasted, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/charlie/engie) "si" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb, @@ -4206,17 +4131,6 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/hall) -"uC" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ - dir = 8; - chamber_id = "beta-n2" - }, -/turf/open/floor/engine/n2, -/area/ruin/space/ancientstation/beta/atmos) "uI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -4289,6 +4203,17 @@ dir = 1 }, /area/ruin/space/ancientstation/delta/biolab) +"vh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/item/tank/internals/oxygen{ + pixel_x = 1 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "vk" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4413,19 +4338,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"wg" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small/directional/east, -/obj/structure/closet/crate/secure/weapon{ - req_access = list("away_sec") - }, -/obj/item/knife/combat, -/obj/item/clothing/suit/armor/vest/old, -/obj/item/gun/ballistic/rifle/boltaction, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310, -/turf/open/floor/plating, -/area/ruin/space/ancientstation/delta/hall) "wi" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/command{ @@ -4589,6 +4501,15 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/supermatter) +"xd" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/dirt, +/obj/item/folder/white, +/obj/item/reagent_containers/cup/beaker, +/obj/effect/decal/cleanable/dirt, +/obj/item/reagent_containers/dropper, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/delta/rnd) "xi" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -4672,6 +4593,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating/airless, /area/ruin/space/ancientstation/beta/hall) +"xW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/table, +/obj/item/reagent_containers/condiment/enzyme, +/turf/open/floor/iron/cafeteria, +/area/ruin/space/ancientstation/charlie/kitchen) "xY" = ( /obj/effect/turf_decal/caution/stand_clear, /obj/effect/turf_decal/stripes/line, @@ -5000,6 +4927,13 @@ "Ax" = ( /turf/closed/mineral/plasma, /area/ruin/space/ancientstation/beta/hall) +"Az" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/engie) "AA" = ( /obj/effect/decal/cleanable/dirt, /obj/item/kirbyplants/random/dead, @@ -5037,6 +4971,13 @@ "AK" = ( /turf/closed/wall, /area/ruin/space/ancientstation/beta/medbay) +"AM" = ( +/obj/effect/decal/cleanable/glass, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/turf_decal/stripes/line, +/obj/structure/tank_dispenser/plasma, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "AT" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -5101,14 +5042,6 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/sec) -"Bq" = ( -/obj/effect/decal/cleanable/dirt, -/obj/structure/table, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, -/turf/open/floor/iron/cafeteria, -/area/ruin/space/ancientstation/charlie/kitchen) "Bs" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /turf/open/floor/engine/o2, @@ -5195,6 +5128,25 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/engine/airless, /area/ruin/space/ancientstation/beta/supermatter) +"BR" = ( +/obj/machinery/shower/directional/west{ + has_water_reclaimer = 0 + }, +/turf/open/floor/pod/dark, +/area/ruin/space/ancientstation/delta/biolab) +"BS" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/east, +/obj/structure/closet/crate/secure/weapon{ + req_access = list("away_sec") + }, +/obj/item/spess_knife, +/obj/item/clothing/suit/armor/vest/old, +/obj/item/gun/ballistic/rifle/boltaction, +/obj/item/ammo_box/strilka310, +/obj/item/ammo_box/strilka310, +/turf/open/floor/plating, +/area/ruin/space/ancientstation/delta/hall) "Cc" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -5249,6 +5201,27 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/kitchen) +"Ct" = ( +/obj/structure/closet/crate, +/obj/item/cautery{ + pixel_x = 4 + }, +/obj/item/hemostat, +/obj/item/circular_saw, +/obj/item/scalpel{ + pixel_y = 12 + }, +/obj/item/retractor, +/obj/item/surgical_drapes, +/obj/machinery/light/small/broken/directional/west, +/obj/item/tank/internals/anesthetic, +/obj/item/clothing/mask/breath/medical, +/obj/effect/turf_decal/tile/blue/anticorner/contrasted{ + dir = 8 + }, +/obj/item/tank/internals/anesthetic/pure, +/turf/open/floor/iron/airless, +/area/ruin/space/ancientstation/beta/medbay) "CA" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 4 @@ -5386,13 +5359,6 @@ /obj/machinery/light_switch/directional/north, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) -"DC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) "DI" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/highsecurity, @@ -5584,6 +5550,22 @@ /obj/machinery/space_heater, /turf/open/floor/plating/rust, /area/ruin/space/ancientstation/delta/hall) +"Fm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, +/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ + dir = 1 + }, +/obj/effect/decal/cleanable/dirt, +/obj/item/tank/internals/oxygen{ + pixel_y = -8; + pixel_x = 8 + }, +/obj/item/tank/internals/oxygen{ + pixel_x = -4; + pixel_y = 4 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "Fo" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/glass, @@ -5606,6 +5588,12 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/diagonal, /area/ruin/space/ancientstation/beta/gravity) +"Ft" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vatgrower, +/turf/open/floor/engine, +/area/ruin/space/ancientstation/delta/biolab) "Fv" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -5721,13 +5709,6 @@ /obj/effect/decal/cleanable/food/flour, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/hall) -"Gb" = ( -/obj/effect/decal/cleanable/glass, -/obj/item/stack/rods, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) "Gd" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/closet/crate, @@ -5781,6 +5762,16 @@ "Gz" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/delta/hall) +"GA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light/small/directional/south, +/obj/machinery/atmospherics/components/binary/tank_compressor{ + dir = 8 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/beta/atmos) "GH" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -5808,13 +5799,6 @@ }, /turf/open/floor/iron/cafeteria, /area/ruin/space/ancientstation/charlie/kitchen) -"GP" = ( -/obj/machinery/pipedispenser/disposal, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) "GX" = ( /turf/closed/wall/rust, /area/ruin/space/ancientstation/delta/biolab) @@ -5975,6 +5959,15 @@ dir = 4 }, /area/ruin/space/ancientstation/delta/biolab) +"Ib" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/yellow/half/contrasted, +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/garbage, +/obj/effect/spawner/random/trash/garbage, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/engie) "Ic" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -6148,6 +6141,14 @@ /obj/structure/lattice, /turf/template_noop, /area/space/nearstation) +"Jk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/item/storage/backpack/industrial, +/obj/item/storage/backpack/messenger/eng, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/dorms) "Jo" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -6167,6 +6168,20 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"Js" = ( +/obj/effect/decal/cleanable/robot_debris, +/obj/structure/alien/weeds, +/obj/structure/closet/crate, +/obj/item/stack/sheet/glass/fifty{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/stack/sheet/plasteel{ + amount = 30 + }, +/obj/item/stack/sheet/mineral/diamond, +/turf/open/floor/iron/dark, +/area/ruin/space/ancientstation/delta/ai) "Jw" = ( /obj/effect/decal/cleanable/glass, /obj/structure/closet/firecloset, @@ -6379,6 +6394,13 @@ /obj/effect/mapping_helpers/broken_machine, /turf/open/floor/iron, /area/ruin/space/ancientstation/charlie/dorms) +"Kr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/item/storage/backpack/duffelbag/sec, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/dorms) "Ku" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, @@ -6984,6 +7006,14 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/white/textured, /area/ruin/space/ancientstation/delta/proto) +"Oi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/structure/closet, +/obj/item/storage/backpack/science, +/obj/item/storage/backpack/messenger/science, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/dorms) "Ol" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/east, @@ -7379,6 +7409,11 @@ }, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/atmos) +"Rg" = ( +/obj/machinery/rnd/production/circuit_imprinter/offstation, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/iron/white, +/area/ruin/space/ancientstation/delta/rnd) "Rm" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -7756,14 +7791,6 @@ /obj/machinery/door/window/brigdoor/right/directional/east, /turf/open/floor/iron, /area/ruin/space/ancientstation/beta/mining) -"TO" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/plumbing/growing_vat{ - dir = 1 - }, -/turf/open/floor/engine, -/area/ruin/space/ancientstation/delta/biolab) "TV" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/maintenance/two, @@ -8097,6 +8124,15 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron, /area/ruin/space/ancientstation/delta/hall) +"WT" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/machinery/atmospherics/components/unary/vent_pump/siphon/monitored{ + dir = 8; + chamber_id = "beta-n2" + }, +/turf/open/floor/engine/n2, +/area/ruin/space/ancientstation/beta/atmos) "WV" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -8191,14 +8227,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/engine/n2, /area/ruin/space/ancientstation/beta/atmos) -"XB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible/layer2, -/obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ - dir = 1 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron, -/area/ruin/space/ancientstation/beta/atmos) "XD" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Custodial Closet" @@ -8461,6 +8489,18 @@ /obj/machinery/light/small/broken/directional/east, /turf/open/floor/iron/dark, /area/ruin/space/ancientstation/delta/ai) +"YT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/yellow/half/contrasted{ + dir = 8 + }, +/obj/item/chair{ + pixel_y = -8; + pixel_x = 13 + }, +/turf/open/floor/iron, +/area/ruin/space/ancientstation/charlie/engie) "YW" = ( /turf/open/floor/iron/textured_half, /area/ruin/space/ancientstation/beta/supermatter) @@ -9904,8 +9944,8 @@ Rf mH mH mH -qk -GP +bl +jc bJ aa aa @@ -9951,7 +9991,7 @@ zi NP NB oE -nC +Ct Ck aa aa @@ -9961,9 +10001,9 @@ Uu SZ Uu Yp -Gb -XB -Ln +AM +Fm +vh kK Ln ny @@ -9971,7 +10011,7 @@ nz fR nB nK -DC +GA mH aa aa @@ -10037,7 +10077,7 @@ nA UW kW HA -ng +iH bJ nr aa @@ -10159,7 +10199,7 @@ gJ Ax Ax kQ -Cj +nT Sf Cj VF @@ -10233,7 +10273,7 @@ bJ TB Kf zm -uC +WT XA bJ UP @@ -10299,7 +10339,7 @@ bJ CU Lh Zg -pv +rw OS bJ aa @@ -10365,7 +10405,7 @@ bJ Bs Lh Gi -pv +rw Ze bJ nr @@ -11600,7 +11640,7 @@ jE aa Ma By -eK +YT fc Wn Tf @@ -11665,7 +11705,7 @@ mS jE dl eI -lz +pI ju hm Yi @@ -11673,7 +11713,7 @@ Gt Yi hm em -ek +Ib dl eI Ox @@ -11807,7 +11847,7 @@ QZ hP em em -se +Az Ox iV fI @@ -12209,11 +12249,11 @@ wb bR aG nk -mz +Oi gZ kN Mt -mz +Jk nk nk aa @@ -12529,7 +12569,7 @@ dR Sr dz fi -Bq +xW GN ht ht @@ -12741,7 +12781,7 @@ ks uS jB Kk -jP +Kr aG nk aa @@ -14226,8 +14266,8 @@ ad ag aM NS -bh -cz +dT +nG cz cz ad @@ -14247,7 +14287,7 @@ oe WV ca hY -io +xd iE Yf wx @@ -14307,7 +14347,7 @@ wx BN fa hh -gM +Rg oH of WV @@ -15103,8 +15143,8 @@ NG OE UR rp -qH -TO +CK +Ft Xy vy rp @@ -15148,7 +15188,7 @@ aa aa ad ad -ar +Js be bp ZW @@ -15166,16 +15206,16 @@ wK UH ae GX -mF +BR AT rp -CK +vy VW Wd Np rp jg -wg +BS yx bE Jg diff --git a/_maps/RandomRuins/SpaceRuins/phonebooth.dmm b/_maps/RandomRuins/SpaceRuins/phonebooth.dmm index 9f766e42f850b..2eb0698ebbfd5 100644 --- a/_maps/RandomRuins/SpaceRuins/phonebooth.dmm +++ b/_maps/RandomRuins/SpaceRuins/phonebooth.dmm @@ -23,9 +23,8 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 }, -/obj/machinery/atmospherics/components/tank/air{ - dir = 8; - piping_layer = 4 +/obj/machinery/atmospherics/components/tank/air/layer4{ + dir = 8 }, /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating/airless, diff --git a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm index 3a2d28ba1ee8f..eec1e5a9671a7 100644 --- a/_maps/RandomRuins/SpaceRuins/spacehotel.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacehotel.dmm @@ -847,9 +847,7 @@ pixel_x = 6; pixel_y = 6 }, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, diff --git a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm index 327b0f558ca37..f31929b70a4e2 100644 --- a/_maps/RandomRuins/SpaceRuins/the_outlet.dmm +++ b/_maps/RandomRuins/SpaceRuins/the_outlet.dmm @@ -87,12 +87,9 @@ /area/ruin/space/has_grav/the_outlet/researchrooms) "cL" = ( /obj/effect/rune/apocalypse{ - req_cultists = 999; - layer = 2 - }, -/obj/structure/destructible/cult/pants_altar{ - layer = 3 + req_cultists = 999 }, +/obj/structure/destructible/cult/pants_altar, /turf/open/floor/cult, /area/ruin/space/has_grav/the_outlet/cultinfluence) "cZ" = ( diff --git a/_maps/RandomRuins/SpaceRuins/transit_booth.dmm b/_maps/RandomRuins/SpaceRuins/transit_booth.dmm index eaff9f2f073b0..52dbf8149f8e2 100644 --- a/_maps/RandomRuins/SpaceRuins/transit_booth.dmm +++ b/_maps/RandomRuins/SpaceRuins/transit_booth.dmm @@ -16,16 +16,6 @@ /obj/structure/sign/warning/vacuum/external/directional/north, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"ad" = ( -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/obj/machinery/light/directional/east, -/obj/effect/turf_decal/siding/dark{ - dir = 8 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/transit_booth) "ae" = ( /obj/machinery/vending/coffee, /turf/open/floor/iron/dark, @@ -93,23 +83,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"an" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/obj/structure/sign/poster/official/cohiba_robusto_ad/directional/north, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/transit_booth) -"ao" = ( -/obj/effect/turf_decal/siding/dark{ - dir = 8 - }, -/obj/machinery/light/directional/west, -/obj/effect/turf_decal/siding/dark{ - dir = 4 - }, -/turf/open/floor/iron, -/area/ruin/space/has_grav/transit_booth) "ap" = ( /obj/machinery/door/airlock/external{ name = "Transit Booth Airlock" @@ -262,9 +235,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) "aF" = ( -/obj/structure/window/reinforced/spawner/directional/south{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/south, /obj/structure/rack, /obj/item/reagent_containers/cup/glass/bottle/absinthe/premium{ pixel_x = 6 @@ -280,9 +251,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) "aG" = ( -/obj/structure/window/reinforced/spawner/directional/south{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/south, /obj/machinery/mass_driver{ dir = 1; id = "north" @@ -325,14 +294,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"aJ" = ( -/obj/structure/table, -/obj/item/reagent_containers/cup/glass/coffee{ - pixel_x = 6; - pixel_y = 3 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/transit_booth) "aK" = ( /obj/machinery/door/poddoor{ id = "south" @@ -342,17 +303,6 @@ /obj/structure/table/reinforced, /turf/open/floor/plating, /area/ruin/space/has_grav/transit_booth) -"aL" = ( -/obj/structure/table, -/obj/item/storage/fancy/cigarettes/cigars{ - pixel_y = 11; - pixel_x = 3 - }, -/obj/item/lighter{ - pixel_x = -8 - }, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/transit_booth) "aM" = ( /obj/machinery/door/poddoor{ id = "north" @@ -442,9 +392,7 @@ /turf/open/floor/iron, /area/ruin/space/has_grav/transit_booth) "aV" = ( -/obj/structure/window/reinforced/spawner/directional/south{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/south, /obj/structure/rack, /obj/item/book/random{ pixel_x = -5; @@ -461,9 +409,7 @@ /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) "aW" = ( -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/mass_driver{ dir = 4; id = "east" @@ -486,13 +432,6 @@ }, /turf/open/floor/iron/dark, /area/ruin/space/has_grav/transit_booth) -"aY" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/obj/structure/sign/poster/official/high_class_martini/directional/south, -/turf/open/floor/iron/dark, -/area/ruin/space/has_grav/transit_booth) "aZ" = ( /obj/effect/turf_decal/siding/dark{ dir = 5 diff --git a/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm b/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm index d36e65ddc2269..af55da5cb4f37 100644 --- a/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm +++ b/_maps/RandomRuins/SpaceRuins/travelers_rest.dmm @@ -69,9 +69,7 @@ /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 9 }, -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/ruin/space/has_grav/travelers_rest) diff --git a/_maps/RandomRuins/SpaceRuins/waystation.dmm b/_maps/RandomRuins/SpaceRuins/waystation.dmm index baa77a700d20e..38f8fcbac8cdd 100644 --- a/_maps/RandomRuins/SpaceRuins/waystation.dmm +++ b/_maps/RandomRuins/SpaceRuins/waystation.dmm @@ -1105,13 +1105,11 @@ "rF" = ( /obj/machinery/button/door/directional/east{ id = "Blastdoor_load"; - layer = 4; name = "Loading Doors"; pixel_y = -6 }, /obj/machinery/button/door/directional/east{ id = "Blastdoor_unload"; - layer = 4; name = "Loading Doors"; pixel_y = 6 }, @@ -2241,9 +2239,7 @@ /area/ruin/space/has_grav/waystation/securestorage) "NK" = ( /obj/effect/turf_decal/bot, -/obj/machinery/atmospherics/components/tank/air{ - piping_layer = 4 - }, +/obj/machinery/atmospherics/components/tank/air, /turf/open/floor/plating, /area/ruin/space/has_grav/waystation) "NT" = ( diff --git a/_maps/RandomZLevels/SnowCabin.dmm b/_maps/RandomZLevels/SnowCabin.dmm index ff38749b2060d..3b5c32345c0e3 100644 --- a/_maps/RandomZLevels/SnowCabin.dmm +++ b/_maps/RandomZLevels/SnowCabin.dmm @@ -2771,14 +2771,12 @@ /obj/item/claymore/weak/ceremonial{ desc = "Brought to you by the guys in charge of making replica katana toys!"; force = 1; - layer = 3.01; name = "replica claymore"; pixel_x = 5; pixel_y = 8; throwforce = 2 }, /obj/item/shield/roman/fake{ - layer = 3.01; pixel_x = -7 }, /obj/effect/light_emitter{ @@ -3379,7 +3377,6 @@ /obj/item/gun/magic/wand{ desc = "It's just a fancy staff so that holy clerics and priests look cool. What? You didn't think someone would leave a REAL magic artifact with a snowman out in the cold, did you?"; icon_state = "revivewand"; - layer = 3.01; name = "holy staff"; pixel_y = -2 }, @@ -4417,9 +4414,7 @@ pixel_x = -1; pixel_y = 13 }, -/obj/item/staff{ - layer = 3.01 - }, +/obj/item/staff, /obj/effect/light_emitter{ set_cap = 3; set_luminosity = 6; diff --git a/_maps/RandomZLevels/TheBeach.dmm b/_maps/RandomZLevels/TheBeach.dmm index c18eba4fbc266..c7a097a02ad17 100644 --- a/_maps/RandomZLevels/TheBeach.dmm +++ b/_maps/RandomZLevels/TheBeach.dmm @@ -2023,7 +2023,6 @@ "Aa" = ( /obj/structure/table/wood, /obj/item/reagent_containers/condiment/enzyme{ - layer = 5; pixel_x = 9; pixel_y = 5 }, @@ -2510,9 +2509,7 @@ /area/awaymission/beach) "Ft" = ( /obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/chair/stool/directional/south, /obj/item/clothing/glasses/sunglasses{ pixel_y = -2; diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 9473a5e3ba09a..3a4e4c8affed6 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -112,7 +112,6 @@ "aJ" = ( /obj/machinery/door/poddoor{ id = "AwayRD"; - layer = 2.9; name = "Privacy Shutter" }, /obj/effect/spawner/structure/window/reinforced, @@ -929,7 +928,6 @@ /obj/machinery/door/poddoor{ desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaybiohazard"; - layer = 2.9; name = "Acid-Proof Biohazard Containment Door" }, /obj/effect/turf_decal/delivery, @@ -2233,7 +2231,6 @@ /obj/machinery/door/poddoor{ desc = "A heavy duty blast door that opens mechanically. This one has been applied with an acid-proof coating."; id = "Awaybiohazard"; - layer = 2.9; name = "Acid-Proof Biohazard Containment Door" }, /obj/effect/spawner/structure/window/reinforced, @@ -2377,9 +2374,7 @@ /area/awaymission/moonoutpost19/syndicate) "pF" = ( /obj/machinery/light/small/directional/north, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/structure/table, /obj/structure/bedsheetbin, /obj/item/clothing/neck/tie/black, @@ -3455,8 +3450,7 @@ /obj/structure/bed, /obj/item/bedsheet, /obj/effect/decal/remains/human{ - desc = "They look like human remains. The skeleton is laid out on its side and there seems to have been no sign of struggle."; - layer = 4.1 + desc = "They look like human remains. The skeleton is laid out on its side and there seems to have been no sign of struggle." }, /obj/machinery/button/door/directional/west{ id = "awaydorm3"; @@ -3773,7 +3767,6 @@ "yx" = ( /obj/machinery/conveyor_switch/oneway{ id = "awaysyndie"; - layer = 3.1; name = "mining conveyor" }, /obj/effect/turf_decal/stripes/line{ @@ -4122,7 +4115,6 @@ dir = 1 }, /obj/item/crowbar{ - layer = 2.9; pixel_x = 7; pixel_y = -13 }, @@ -4751,7 +4743,6 @@ /area/awaymission/moonoutpost19/research) "Fw" = ( /obj/item/pickaxe{ - layer = 2.9; pixel_x = -12; pixel_y = 6 }, diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index 7f862487515fc..1e84014fa0e1b 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -2461,9 +2461,7 @@ /turf/open/floor/wood, /area/awaymission/research/interior/dorm) "lN" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/siding/yellow{ dir = 4 @@ -2707,25 +2705,19 @@ "mK" = ( /obj/structure/flora/bush/flowers_br/style_random, /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/grass, /area/awaymission/research/interior/escapepods) "mL" = ( /obj/structure/flora/bush/ferny/style_random, /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/grass, /area/awaymission/research/interior/escapepods) "mM" = ( /obj/structure/flora/bush/grassy/style_random, /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/grass, /area/awaymission/research/interior/escapepods) "mO" = ( diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index ac13cf870c55d..d66be7f5614ff 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -172,21 +172,14 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/research) "aQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "aR" = ( /obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 }, /obj/effect/landmark/awaystart, /obj/item/bedsheet/purple, @@ -196,21 +189,14 @@ /turf/closed/wall, /area/awaymission/snowdin/post/dorm) "aT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/item/bedsheet/purple, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "aU" = ( /obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 }, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) @@ -218,61 +204,40 @@ /turf/closed/wall/rust, /area/awaymission/snowdin/post/dorm) "aW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "aX" = ( /obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 }, /obj/effect/landmark/awaystart, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "aY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "aZ" = ( /obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 }, /obj/item/bedsheet/orange, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "ba" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/sign/poster/contraband/kudzu/directional/north, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "bb" = ( /obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 }, /obj/effect/landmark/awaystart, /obj/item/paper/crumpled/ruins/snowdin/dontdeadopeninside, @@ -299,11 +264,7 @@ /turf/closed/indestructible/rock/snow/ice, /area/awaymission/snowdin/cave/cavern) "bi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, @@ -325,11 +286,7 @@ /turf/open/floor/iron/white, /area/awaymission/snowdin/post) "bl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, @@ -385,29 +342,17 @@ /turf/open/floor/iron/freezer, /area/awaymission/snowdin/post/kitchen) "bw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/structure/kitchenspike, /turf/open/floor/iron/freezer, /area/awaymission/snowdin/post/kitchen) "bx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "bA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, @@ -430,12 +375,7 @@ /area/awaymission/snowdin/post/research) "bF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/snowdin/post/research) @@ -453,33 +393,18 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) "bH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/holopad, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/research) "bI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/research) "bJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/awaymission/snowdin/post/research) @@ -494,11 +419,7 @@ /turf/open/floor/iron/freezer, /area/awaymission/snowdin/post/kitchen) "bN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/spider/stickyweb, /turf/open/floor/iron/freezer, /area/awaymission/snowdin/post/kitchen) @@ -513,11 +434,7 @@ /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) "bQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ id_tag = "snowdindormresearch3"; @@ -526,11 +443,7 @@ /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "bR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ id_tag = "snowdindormresearch2"; @@ -539,11 +452,7 @@ /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "bS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ id_tag = "snowdindormresearch1"; @@ -552,11 +461,7 @@ /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "bT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ id_tag = "snowdindormhydro2"; @@ -566,11 +471,7 @@ /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "bU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ id_tag = "snowdindormhydro1"; @@ -580,11 +481,7 @@ /area/awaymission/snowdin/post/dorm) "bV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/firedoor, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -613,11 +510,7 @@ /turf/open/floor/iron/freezer, /area/awaymission/snowdin/post/kitchen) "cc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/kitchenspike, /obj/structure/spider/stickyweb, /turf/open/floor/iron/freezer, @@ -650,11 +543,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/kitchen) "cl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/machinery/light/directional/north, /turf/open/floor/plating, /area/awaymission/snowdin/post/kitchen) @@ -673,11 +562,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "cp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -695,11 +580,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "cs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) @@ -712,11 +593,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "cu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -729,11 +606,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "cw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 @@ -748,11 +621,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "cy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, @@ -770,11 +639,7 @@ /area/awaymission/snowdin/post/research) "cA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, @@ -816,12 +681,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/spider/stickyweb, /turf/open/floor/iron/freezer, /area/awaymission/snowdin/post/kitchen) @@ -829,12 +689,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/airlock{ name = "Freezer" }, @@ -846,24 +701,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/kitchen) "cL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/item/kitchen/fork, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -872,63 +717,33 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/kitchen) "cO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/snowdin/post/kitchen) "cP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/holopad, /turf/open/floor/iron, /area/awaymission/snowdin/post/kitchen) "cQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/kitchen) "cR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/kitchen) "cS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/food/egg_smudge, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -949,23 +764,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "cW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -974,12 +779,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "cX" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -988,21 +788,12 @@ /area/awaymission/snowdin/post/dorm) "cY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "cZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -1011,12 +802,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "da" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -1026,34 +812,20 @@ /area/awaymission/snowdin/post/dorm) "db" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "dd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "de" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -1062,21 +834,12 @@ /area/awaymission/snowdin/post/dorm) "df" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "dg" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -1088,12 +851,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/research) "dh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, @@ -1101,12 +859,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/research) "di" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -1117,12 +870,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/snowdin/post/research) @@ -1163,11 +911,7 @@ /area/awaymission/snowdin/post/kitchen) "dt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/food/flour, /obj/structure/cable, /turf/open/floor/plating, @@ -1245,11 +989,7 @@ /area/awaymission/snowdin/post) "dL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, @@ -1325,11 +1065,7 @@ /turf/open/floor/carpet, /area/awaymission/snowdin/post/dorm) "eb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/structure/sign/poster/contraband/lusty_xenomorph/directional/east, /obj/structure/table/wood, /obj/item/paper_bin, @@ -1355,11 +1091,7 @@ /area/awaymission/snowdin/post/dorm) "eh" = ( /obj/structure/bed, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/landmark/awaystart, /obj/item/bedsheet/red, /obj/effect/mapping_helpers/broken_floor, @@ -1371,11 +1103,7 @@ /area/awaymission/snowdin/post) "ej" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post) @@ -1434,11 +1162,7 @@ /area/awaymission/snowdin/post/kitchen) "ez" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -1500,11 +1224,7 @@ /turf/open/floor/carpet, /area/awaymission/snowdin/post/dorm) "eP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/carpet, /area/awaymission/snowdin/post/dorm) "eQ" = ( @@ -1514,12 +1234,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "eR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, @@ -1531,12 +1246,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) @@ -1544,12 +1254,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/airlock{ id_tag = "snowdindormsec"; name = "James Reed's Private Quarters" @@ -1560,12 +1265,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) @@ -1573,22 +1273,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/item/trash/cheesie, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "eW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/item/trash/cheesie, /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) @@ -1622,11 +1312,7 @@ /area/awaymission/snowdin/post/research) "fd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/plating, @@ -1657,11 +1343,7 @@ /area/awaymission/snowdin/post/messhall) "fj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/airlock/public/glass{ name = "Kitchen" }, @@ -1724,12 +1406,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "fu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /turf/open/floor/plating, @@ -1745,11 +1422,7 @@ /area/awaymission/snowdin/post) "fx" = ( /obj/item/reagent_containers/blood, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -1828,11 +1501,7 @@ /area/awaymission/snowdin/post/hydro) "fQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) @@ -1851,11 +1520,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) "fV" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/effect/turf_decal/tile/green/anticorner/contrasted{ dir = 4 @@ -1907,11 +1572,7 @@ /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave) "gh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet, /area/awaymission/snowdin/post/dorm) @@ -1919,11 +1580,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -1956,11 +1613,7 @@ /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/cave/mountain) "gm" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/structure/closet/crate, /obj/item/clothing/shoes/winterboots, /obj/item/clothing/suit/hooded/wintercoat, @@ -1968,12 +1621,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "gn" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -1981,37 +1629,14 @@ /turf/open/floor/iron/white, /area/awaymission/snowdin/post) "go" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 1 - }, -/turf/open/floor/iron/white, -/area/awaymission/snowdin/post) -"gp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 }, /turf/open/floor/iron/white, /area/awaymission/snowdin/post) "gq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 1 @@ -2084,11 +1709,7 @@ /area/awaymission/snowdin/post/hydro) "gF" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -2118,11 +1739,7 @@ /area/awaymission/snowdin/post/hydro) "gL" = ( /obj/structure/sink/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) @@ -2185,12 +1802,7 @@ /turf/closed/mineral/diamond/ice, /area/awaymission/snowdin/cave/cavern) "gZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, @@ -2204,12 +1816,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -2220,12 +1827,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/airlock/maintenance{ name = "Misc Storage" }, @@ -2233,33 +1835,18 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "hc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "hd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "he" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/closet/crate/preopen, /obj/item/clothing/shoes/winterboots, /obj/item/clothing/shoes/winterboots, @@ -2299,10 +1886,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) "ho" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/closed/wall/ice, /area/awaymission/snowdin/post/mining_main/mechbay) "hp" = ( @@ -2360,11 +1944,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "hA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "hB" = ( @@ -2418,24 +1998,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/carpet, /area/awaymission/snowdin/post/dorm) "hJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/airlock{ id_tag = "snowdindormcap"; name = "Overseer's Private Quarters" @@ -2446,24 +2016,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 }, /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "hL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -2486,11 +2046,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post) "hO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -2504,11 +2060,7 @@ /area/awaymission/snowdin/post) "hP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /obj/structure/cable, @@ -2533,11 +2085,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) "hT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/landmark/awaystart, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -2551,11 +2099,7 @@ /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) "hW" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) "hX" = ( @@ -2568,11 +2112,7 @@ /area/awaymission/snowdin/post/hydro) "hY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) @@ -2591,15 +2131,6 @@ /obj/structure/fireaxecabinet/directional/north, /turf/open/floor/plating, /area/awaymission/snowdin/post/secpost) -"ib" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) "ic" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/closed/wall/ice, @@ -2660,22 +2191,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 5 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "ip" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -2683,12 +2204,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "iq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -2699,12 +2215,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "ir" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, @@ -2715,12 +2226,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "is" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -2735,12 +2241,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "it" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -2751,11 +2252,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post) "iu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -2767,12 +2264,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -2782,12 +2274,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/sign/departments/medbay/directional/north, /obj/structure/cable, /obj/effect/mapping_helpers/broken_floor, @@ -2819,12 +2306,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) "iB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, @@ -2835,12 +2317,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) "iC" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/landmark/awaystart, /turf/open/floor/iron, /area/awaymission/snowdin/post/gateway) @@ -2862,11 +2339,7 @@ /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) "iH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) "iI" = ( @@ -2885,11 +2358,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "iL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 }, @@ -2908,23 +2377,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "iP" = ( /obj/machinery/light/directional/north, /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -2932,12 +2391,7 @@ /area/awaymission/snowdin/post/garage) "iQ" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -2947,24 +2401,14 @@ /obj/machinery/door/airlock/public/glass{ name = "Garage" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "iS" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, @@ -2972,12 +2416,7 @@ /area/awaymission/snowdin/post/garage) "iT" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -2991,12 +2430,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "iV" = ( @@ -3004,12 +2438,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "iW" = ( @@ -3041,12 +2470,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/item/storage/box{ name = "box of donkpockets" }, @@ -3070,11 +2494,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/dorm) "jh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -3120,12 +2540,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post) "jp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, @@ -3134,12 +2549,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post) "jq" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -3148,12 +2558,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post) "jr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, @@ -3180,11 +2585,7 @@ /area/awaymission/snowdin/post/gateway) "jv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/landmark/awaystart, /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, @@ -3215,20 +2616,12 @@ /area/awaymission/snowdin/post/messhall) "jz" = ( /obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/item/kitchen/fork, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) "jB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/sink/directional/west, /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 4 @@ -3259,11 +2652,7 @@ }, /obj/effect/landmark/awaystart, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "jF" = ( @@ -3287,21 +2676,14 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "jJ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "jK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) @@ -3325,11 +2707,7 @@ }, /area/awaymission/snowdin/cave/cavern) "jP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock{ name = "Bathroom" @@ -3356,11 +2734,7 @@ /area/awaymission/snowdin/post) "jV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, @@ -3385,11 +2759,7 @@ /area/awaymission/snowdin/post/gateway) "jZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/poddoor/shutters/preopen{ id = "snowdin_gate" }, @@ -3406,11 +2776,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/messhall) "kc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/messhall) @@ -3436,41 +2802,23 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "ki" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "kj" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "kk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -3505,21 +2853,12 @@ /turf/closed/wall/ice, /area/awaymission/snowdin/cave/mountain) "kv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/machinery/shower/directional/south, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "kw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, @@ -3527,12 +2866,7 @@ /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "kx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -3540,12 +2874,7 @@ /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "ky" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -3555,37 +2884,15 @@ /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "kz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) -"kA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ - dir = 9 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/showroomfloor, -/area/awaymission/snowdin/post/dorm) "kB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "kF" = ( @@ -3615,11 +2922,7 @@ /area/awaymission/snowdin/post) "kK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -3685,11 +2988,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "kV" = ( @@ -3718,11 +3017,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "kZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) @@ -3733,11 +3028,7 @@ /area/awaymission/snowdin/post/mining_main/mechbay) "lb" = ( /obj/machinery/light/directional/west, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) @@ -3751,12 +3042,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "lf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, @@ -3771,12 +3057,7 @@ /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "lj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "lk" = ( @@ -3788,22 +3069,13 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/custodials) "lm" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/structure/mop_bucket/janitorialcart, /obj/item/mop, /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/custodials) "lo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, @@ -3815,12 +3087,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/snowdin_station_sign/up/two, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -3830,12 +3097,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/snowdin_station_sign/up/three, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -3846,12 +3108,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/snowdin_station_sign/up/four, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -3861,12 +3118,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/snowdin_station_sign/up/five, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -3876,12 +3128,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/snowdin_station_sign/up/six, /obj/structure/cable, /turf/open/floor/iron, @@ -3890,23 +3137,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/snowdin_station_sign/up/seven, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/snowdin/post) "lv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /turf/open/floor/iron, @@ -3915,12 +3153,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/snowdin/post) @@ -3928,12 +3161,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -3948,23 +3176,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/firedoor, /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) "lz" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, @@ -3972,12 +3190,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/messhall) "lA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -3985,12 +3198,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/messhall) "lB" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -4001,12 +3209,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) @@ -4014,21 +3217,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) "lE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -4041,12 +3235,7 @@ /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) "lF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, @@ -4054,11 +3243,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "lG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, @@ -4067,24 +3252,14 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "lH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/snowdin/post/hydro) "lI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/iron, @@ -4099,33 +3274,14 @@ /turf/open/floor/wood, /area/awaymission/snowdin/post/dorm) "lK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/mapping_helpers/broken_floor, -/turf/open/floor/plating, -/area/awaymission/snowdin/post/hydro) -"lL" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post/hydro) "lM" = ( /obj/machinery/door/airlock/external/glass/ruin, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) @@ -4136,12 +3292,7 @@ /area/awaymission/snowdin/post/garage) "lO" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, @@ -4149,12 +3300,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "lP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -4165,24 +3311,14 @@ /obj/machinery/door/airlock{ name = "Mechanic's Quarters" }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /turf/open/floor/iron, /area/awaymission/snowdin/post/garage) "lR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, @@ -4229,12 +3365,7 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/custodials) "mb" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -4242,12 +3373,7 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/custodials) "mc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -4261,12 +3387,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 8 @@ -4274,12 +3395,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post) "me" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 1 }, @@ -4287,12 +3403,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post) "mf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -4348,11 +3459,7 @@ /area/awaymission/snowdin/post/messhall) "mo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron/cafeteria, /area/awaymission/snowdin/post/messhall) @@ -4405,12 +3512,7 @@ /turf/open/floor/plating/snowed/smoothed, /area/awaymission/snowdin/outside) "my" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "mz" = ( @@ -4451,22 +3553,13 @@ /area/awaymission/snowdin/post/custodials) "mI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/awaymission/snowdin/post) "mJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -4500,11 +3593,7 @@ /area/awaymission/snowdin/post/messhall) "mP" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/airlock/engineering/glass{ name = "Engineering" }, @@ -4530,11 +3619,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "mT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 }, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) @@ -4589,12 +3675,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post) "ne" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 8 }, @@ -4603,12 +3684,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post) "nf" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -4621,49 +3697,20 @@ /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) "nh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, /turf/open/floor/plating, /area/awaymission/snowdin/post) "ni" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 10 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post) -"nj" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) -"nk" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 10; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) "nl" = ( /obj/effect/baseturf_helper/asteroid/snow, /turf/closed/wall, @@ -4676,11 +3723,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) "np" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, @@ -4780,11 +3823,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post) "nM" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/snowdin/post) @@ -4811,11 +3850,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) "nR" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -4867,11 +3902,7 @@ /turf/closed/wall, /area/awaymission/snowdin/post/secpost) "of" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/structure/cable, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -4914,32 +3945,17 @@ /area/awaymission/snowdin/post/engineering) "on" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) "oo" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) "op" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) "or" = ( @@ -5006,43 +4022,23 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 9 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/secpost) "oE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/awaymission/snowdin/post/secpost) "oF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post/secpost) "oG" = ( /obj/structure/table, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, @@ -5067,11 +4063,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post) "oK" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 @@ -5079,11 +4071,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post) "oL" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ @@ -5105,11 +4093,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) "oO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible, /turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) @@ -5267,23 +4251,13 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post) "ps" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/awaymission/snowdin/post) "pt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 }, @@ -5299,11 +4273,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) "pv" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ dir = 8 }, @@ -5406,14 +4376,6 @@ /obj/effect/turf_decal/tile/neutral/half/contrasted, /turf/open/floor/iron, /area/awaymission/snowdin/post) -"pQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plating, -/area/awaymission/snowdin/post) "pR" = ( /obj/structure/closet/emcloset, /obj/item/clothing/suit/hooded/wintercoat, @@ -5427,11 +4389,7 @@ /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) "pT" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/visible{ dir = 5 }, @@ -5592,11 +4550,7 @@ /area/awaymission/snowdin/post) "qs" = ( /obj/machinery/door/airlock/external/glass/ruin, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/barricade/wooden/crude, /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, @@ -5605,28 +4559,13 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /obj/machinery/power/terminal{ dir = 8 }, /turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) -"qu" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/engineering) "qv" = ( /obj/machinery/atmospherics/components/binary/volume_pump{ name = "Air Mix To Turbine Mix" @@ -5690,7 +4629,7 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/post/custodials) "qF" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/closed/wall/ice, /area/awaymission/snowdin/post/cavern2) "qG" = ( @@ -5738,11 +4677,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/engineering) "qS" = ( @@ -5823,9 +4758,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern2) "rd" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - piping_layer = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 }, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern2) @@ -5854,12 +4788,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post) "rm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 9; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post) "rn" = ( @@ -5872,11 +4801,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post) "ro" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/closed/wall/ice, /area/awaymission/snowdin/post/engineering) "rp" = ( @@ -5969,11 +4894,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post) "rI" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/monitored{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/layer4{ + dir = 1 }, /obj/effect/light_emitter{ name = "cave light"; @@ -6549,11 +5471,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) "ut" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 }, /obj/structure/table, /obj/item/stack/sheet/glass/fifty{ @@ -6782,7 +5701,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/dorm) "vt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/cavern1) "vu" = ( @@ -6802,12 +5721,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/cavern1) "vy" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 6 }, @@ -6815,7 +5729,7 @@ /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/dorm) "vA" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/closed/wall/ice, /area/awaymission/snowdin/post/cavern1) "vB" = ( @@ -6843,7 +5757,7 @@ /turf/open/floor/iron/showroomfloor, /area/awaymission/snowdin/post/cavern1) "vG" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector{ +/obj/machinery/atmospherics/components/unary/outlet_injector/layer4{ dir = 1 }, /turf/open/floor/plating/snowed/cavern, @@ -7134,12 +6048,7 @@ /turf/open/floor/engine/cult, /area/awaymission/snowdin/post/mining_dock) "xw" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 6; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/firealarm/directional/west, /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, @@ -7298,13 +6207,6 @@ slowdown = 1 }, /area/awaymission/snowdin/cave) -"xV" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4 - }, -/turf/closed/mineral/snowmountain/cavern, -/area/awaymission/snowdin/cave/cavern) "xW" = ( /turf/closed/wall/ice, /area/awaymission/snowdin/post/mining_dock) @@ -7708,7 +6610,7 @@ /turf/closed/wall/mineral/wood, /area/awaymission/snowdin/igloo) "zv" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{ dir = 8 }, /turf/open/floor/plating/snowed/cavern, @@ -7760,9 +6662,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "zH" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 }, /obj/machinery/space_heater, /obj/structure/sign/warning/xeno_mining/directional/east, @@ -7770,14 +6671,11 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "zI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/closed/wall/ice, /area/awaymission/snowdin/post/mining_dock) "zJ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on{ +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ @@ -10244,11 +9142,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/item/storage/box{ name = "box of donkpockets" }, @@ -10425,11 +9319,8 @@ /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) "MP" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 8 }, /obj/machinery/firealarm/directional/east, /obj/machinery/light/broken/directional/east, @@ -10556,11 +9447,8 @@ /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "NA" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 }, /obj/machinery/light/small/directional/south, /turf/open/floor/plating, @@ -10692,12 +9580,7 @@ /turf/open/floor/iron/white, /area/awaymission/snowdin/post) "Oh" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small/broken/directional/south, /turf/open/floor/iron/showroomfloor, @@ -10822,22 +9705,14 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/secpost) "OX" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, /turf/open/floor/iron, /area/awaymission/snowdin/post/research) "OZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/machinery/door/airlock/security{ name = "Security Checkpoint" @@ -10893,12 +9768,7 @@ }, /area/awaymission/snowdin/cave) "Pm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -10990,11 +9860,7 @@ /turf/open/floor/iron/dark, /area/awaymission/snowdin/cave) "PU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/effect/decal/cleanable/dirt, /obj/machinery/button/door/directional/east{ id = "snowdindormcap"; @@ -11098,9 +9964,8 @@ }, /area/awaymission/snowdin/cave) "Qn" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - piping_layer = 4 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 }, /obj/structure/sign/warning/xeno_mining/directional/east, /turf/open/floor/plating, @@ -11140,11 +10005,8 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) "QB" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 }, /obj/machinery/light/broken/directional/south, /obj/effect/mapping_helpers/broken_floor, @@ -11202,11 +10064,7 @@ /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "QN" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/door/airlock/public/glass, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -11493,12 +10351,7 @@ /turf/open/floor/iron, /area/awaymission/snowdin/post/research) "Sr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -11586,7 +10439,6 @@ /obj/machinery/door_buttons/access_button{ idDoor = "snowdin_turbine_interior"; idSelf = "snowdin_turbine_access"; - layer = 3.1; name = "Turbine Airlock Control"; pixel_x = 8; pixel_y = -24 @@ -11838,7 +10690,7 @@ /turf/open/floor/engine/plasma, /area/awaymission/snowdin/post/engineering) "Up" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/on, +/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer4, /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/post/cavern2) "Uq" = ( @@ -11853,12 +10705,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_main/mechbay) "Us" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -12459,12 +11306,7 @@ "Yd" = ( /obj/machinery/light/small/directional/west, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - dir = 5; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/awaymission/snowdin/post/garage) "Ye" = ( @@ -12644,11 +11486,7 @@ /turf/open/floor/plating, /area/awaymission/snowdin/post/gateway) "Zj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 @@ -12665,11 +11503,7 @@ /turf/open/misc/asteroid/snow, /area/awaymission/snowdin/outside) "Zp" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden{ - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, /obj/item/storage/medkit/o2{ pixel_x = 4; @@ -12731,12 +11565,7 @@ /turf/open/misc/asteroid/snow/ice, /area/awaymission/snowdin/cave/cavern) "ZH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/visible{ - dir = 4; - piping_layer = 4; - pixel_x = 5; - pixel_y = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer4, /obj/structure/cable, /turf/open/floor/iron, /area/awaymission/snowdin/post/engineering) @@ -19501,7 +18330,7 @@ aV ir jh jP -kA +lf Oh aV aV @@ -21294,7 +20123,7 @@ dG dM Mg fz -gp +gn hg hN it @@ -23874,7 +22703,7 @@ kK lv js jW -nj +nM nL dK js @@ -24131,14 +22960,14 @@ kJ lw jo js -nk +rm nM QN oK ps -pQ +rm qs -pQ +rm rm rH dX @@ -25679,7 +24508,7 @@ on oO pv pT -qu +ZH Sj rp SK @@ -28749,12 +27578,12 @@ bf fV gL hA -ib +lK iL jB iL iL -lL +lK mv iK nA @@ -62268,7 +61097,7 @@ eJ eJ eJ eL -xV +eJ fr fr fr diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index d458d3af0f987..5eeed4517657e 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -629,9 +629,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/central) "do" = ( -/obj/item/kirbyplants{ - layer = 5 - }, +/obj/item/kirbyplants, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/green, /turf/open/floor/iron, @@ -1360,9 +1358,7 @@ /turf/open/floor/carpet, /area/awaymission/undergroundoutpost45/central) "fT" = ( -/obj/item/kirbyplants{ - layer = 5 - }, +/obj/item/kirbyplants, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -1723,9 +1719,7 @@ "hq" = ( /obj/structure/table, /obj/item/stack/package_wrap, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /turf/open/floor/iron/cafeteria{ dir = 5 }, @@ -2459,9 +2453,7 @@ }, /area/awaymission/undergroundoutpost45/research) "kh" = ( -/obj/item/kirbyplants{ - layer = 5 - }, +/obj/item/kirbyplants, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white, /area/awaymission/undergroundoutpost45/research) @@ -3270,9 +3262,7 @@ /area/awaymission/undergroundoutpost45/research) "mQ" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/kirbyplants{ - layer = 5 - }, +/obj/item/kirbyplants, /turf/open/floor/iron/cafeteria{ dir = 5 }, @@ -4019,9 +4009,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/research) "pl" = ( -/obj/item/kirbyplants{ - layer = 5 - }, +/obj/item/kirbyplants, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ dir = 8 @@ -4232,7 +4220,6 @@ /area/awaymission/undergroundoutpost45/engineering) "qd" = ( /obj/machinery/meter{ - layer = 3.3; name = "Mixed Air Tank Out" }, /obj/machinery/atmospherics/pipe/layer_manifold/supply, @@ -4241,7 +4228,6 @@ /area/awaymission/undergroundoutpost45/engineering) "qe" = ( /obj/machinery/meter{ - layer = 3.3; name = "Mixed Air Tank In" }, /obj/machinery/atmospherics/pipe/smart/manifold4w/general, @@ -4354,9 +4340,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "qI" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/structure/closet/secure_closet/engineering_personal{ req_access = list("away_maintenance") }, @@ -4535,9 +4519,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "rk" = ( -/obj/item/kirbyplants{ - layer = 5 - }, +/obj/item/kirbyplants, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 4 }, @@ -4937,9 +4919,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "sq" = ( -/obj/machinery/meter{ - layer = 3.3 - }, +/obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/general, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -5108,9 +5088,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/engineering) "td" = ( -/obj/machinery/meter{ - layer = 3.3 - }, +/obj/machinery/meter, /obj/machinery/atmospherics/pipe/layer_manifold/orange{ dir = 4 }, @@ -5197,9 +5175,7 @@ /area/awaymission/undergroundoutpost45/engineering) "tw" = ( /obj/machinery/light/small/directional/south, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/portable_atmospherics/scrubber, /obj/effect/turf_decal/tile/red{ dir = 4 @@ -5548,17 +5524,13 @@ /turf/closed/wall/r_wall, /area/awaymission/undergroundoutpost45/engineering) "uI" = ( -/obj/machinery/meter{ - layer = 3.3 - }, +/obj/machinery/meter, /obj/machinery/atmospherics/pipe/layer_manifold/orange, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/awaymission/undergroundoutpost45/engineering) "uJ" = ( -/obj/machinery/meter{ - layer = 3.3 - }, +/obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/cyan/visible, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -5967,9 +5939,7 @@ /area/awaymission/undergroundoutpost45/mining) "wg" = ( /obj/machinery/light/small/directional/north, -/obj/item/kirbyplants{ - layer = 5 - }, +/obj/item/kirbyplants, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -6104,9 +6074,7 @@ /turf/open/floor/iron, /area/awaymission/undergroundoutpost45/crew_quarters) "xd" = ( -/obj/machinery/meter{ - layer = 3.3 - }, +/obj/machinery/meter, /obj/machinery/atmospherics/pipe/smart/manifold4w/green, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, diff --git a/_maps/deathmatch/OSHA_Violator.dmm b/_maps/deathmatch/OSHA_Violator.dmm index fc8291d181449..7d30951a4f0a6 100644 --- a/_maps/deathmatch/OSHA_Violator.dmm +++ b/_maps/deathmatch/OSHA_Violator.dmm @@ -20,11 +20,18 @@ /obj/structure/closet/secure_closet/engineering_welding, /turf/open/indestructible, /area/deathmatch) +"cl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) "cA" = ( /turf/open/indestructible, /area/deathmatch) "cR" = ( -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator/starts_on/magic, /obj/effect/turf_decal/bot, /obj/structure/cable, /turf/open/indestructible, @@ -36,7 +43,7 @@ "dt" = ( /obj/machinery/light/no_nightlight/directional/north, /obj/effect/turf_decal/stripes/line, -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator/starts_on/magic, /obj/structure/cable, /turf/open/indestructible, /area/deathmatch) @@ -252,9 +259,6 @@ /obj/structure/cable, /turf/open/indestructible, /area/deathmatch) -"sa" = ( -/turf/cordon, -/area/template_noop) "sb" = ( /obj/structure/frame/machine/secured, /turf/open/indestructible, @@ -581,7 +585,7 @@ /area/deathmatch) "Bv" = ( /obj/effect/turf_decal/stripes/line, -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator/starts_on/magic, /obj/structure/cable, /turf/open/indestructible, /area/deathmatch) @@ -685,6 +689,13 @@ /obj/machinery/light/no_nightlight/directional/west, /turf/open/indestructible, /area/deathmatch) +"Gw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/indestructible, +/area/deathmatch) "Gx" = ( /obj/machinery/conveyor/auto, /obj/structure/cable, @@ -849,7 +860,7 @@ /turf/open/indestructible, /area/deathmatch) "Pg" = ( -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator, /obj/machinery/light/no_nightlight/directional/north, /turf/open/indestructible, /area/deathmatch) @@ -980,7 +991,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator/starts_on/magic, /obj/structure/cable, /turf/open/indestructible, /area/deathmatch) @@ -1042,8 +1053,11 @@ /turf/open/indestructible, /area/deathmatch) "YA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, /obj/structure/cable, -/turf/closed/indestructible/fakeglass, +/turf/open/indestructible, /area/deathmatch) "YJ" = ( /obj/structure/cable, @@ -1062,7 +1076,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/field/generator/starts_on, +/obj/machinery/field/generator/starts_on/magic, /obj/structure/cable, /turf/open/indestructible, /area/deathmatch) @@ -1073,6 +1087,12 @@ }, /turf/open/indestructible, /area/deathmatch) +"Zq" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/indestructible, +/area/deathmatch) "Zr" = ( /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle, /turf/open/space/basic, @@ -1087,34 +1107,6 @@ /area/template_noop) (1,1,1) = {" -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -"} -(2,1,1) = {" -sa je je je @@ -1138,10 +1130,8 @@ je je je je -sa "} -(3,1,1) = {" -sa +(2,1,1) = {" je ai ai @@ -1165,10 +1155,8 @@ je je je je -sa "} -(4,1,1) = {" -sa +(3,1,1) = {" je ai bW @@ -1192,10 +1180,8 @@ je je je je -sa "} -(5,1,1) = {" -sa +(4,1,1) = {" je ai cA @@ -1219,10 +1205,8 @@ je je je je -sa "} -(6,1,1) = {" -sa +(5,1,1) = {" je aE cA @@ -1246,10 +1230,8 @@ je je je je -sa "} -(7,1,1) = {" -sa +(6,1,1) = {" je aE cA @@ -1273,10 +1255,8 @@ ai ai ai je -sa "} -(8,1,1) = {" -sa +(7,1,1) = {" je ai cA @@ -1300,10 +1280,8 @@ cA cA aE je -sa "} -(9,1,1) = {" -sa +(8,1,1) = {" je ai cA @@ -1327,10 +1305,8 @@ cA cA aE je -sa "} -(10,1,1) = {" -sa +(9,1,1) = {" je ai aE @@ -1354,10 +1330,8 @@ ai aE ai je -sa "} -(11,1,1) = {" -sa +(10,1,1) = {" je ai cR @@ -1381,13 +1355,11 @@ ai cR ai je -sa "} -(12,1,1) = {" -sa +(11,1,1) = {" je ai -YA +cl ai gN cA @@ -1408,10 +1380,8 @@ ai YA ai je -sa "} -(13,1,1) = {" -sa +(12,1,1) = {" je ai Ea @@ -1435,10 +1405,8 @@ Xp yo ai je -sa "} -(14,1,1) = {" -sa +(13,1,1) = {" je ai do @@ -1462,10 +1430,8 @@ gN Px ai je -sa "} -(15,1,1) = {" -sa +(14,1,1) = {" je ai dt @@ -1489,10 +1455,8 @@ gN YY ai je -sa "} -(16,1,1) = {" -sa +(15,1,1) = {" je ai do @@ -1516,10 +1480,8 @@ gN Px ai je -sa "} -(17,1,1) = {" -sa +(16,1,1) = {" je ai do @@ -1543,10 +1505,8 @@ gN Px ai je -sa "} -(18,1,1) = {" -sa +(17,1,1) = {" je ai dy @@ -1570,10 +1530,8 @@ gN Px ai je -sa "} -(19,1,1) = {" -sa +(18,1,1) = {" je bl do @@ -1597,10 +1555,8 @@ gN Px bl je -sa "} -(20,1,1) = {" -sa +(19,1,1) = {" je bl do @@ -1624,10 +1580,8 @@ XU Px bl Zr -sa "} -(21,1,1) = {" -sa +(20,1,1) = {" je bl do @@ -1651,10 +1605,8 @@ Yn Px bl Zz -sa "} -(22,1,1) = {" -sa +(21,1,1) = {" je bl Bv @@ -1678,10 +1630,8 @@ Yn UI bl je -sa "} -(23,1,1) = {" -sa +(22,1,1) = {" je bl do @@ -1705,10 +1655,8 @@ Yz Px bl je -sa "} -(24,1,1) = {" -sa +(23,1,1) = {" je bl do @@ -1732,10 +1680,8 @@ YJ Px bl ZD -sa "} -(25,1,1) = {" -sa +(24,1,1) = {" ac bl do @@ -1759,10 +1705,8 @@ gN Px bl je -sa "} -(26,1,1) = {" -sa +(25,1,1) = {" ae ai do @@ -1786,10 +1730,8 @@ gN Px ai je -sa "} -(27,1,1) = {" -sa +(26,1,1) = {" je ai do @@ -1813,10 +1755,8 @@ gN Zi ai je -sa "} -(28,1,1) = {" -sa +(27,1,1) = {" je ai do @@ -1840,10 +1780,8 @@ gN Px ai je -sa "} -(29,1,1) = {" -sa +(28,1,1) = {" je ai dt @@ -1867,10 +1805,8 @@ gN YY ai je -sa "} -(30,1,1) = {" -sa +(29,1,1) = {" je ai do @@ -1894,10 +1830,8 @@ gN Px ai je -sa "} -(31,1,1) = {" -sa +(30,1,1) = {" je ai do @@ -1921,10 +1855,8 @@ ig Px ai je -sa "} -(32,1,1) = {" -sa +(31,1,1) = {" je ai do @@ -1948,10 +1880,8 @@ ig Px ai je -sa "} -(33,1,1) = {" -sa +(32,1,1) = {" je ai do @@ -1975,10 +1905,8 @@ gN Px ai je -sa "} -(34,1,1) = {" -sa +(33,1,1) = {" je ai do @@ -2002,13 +1930,11 @@ YU Px ai je -sa "} -(35,1,1) = {" -sa +(34,1,1) = {" je ai -bl +Zq ai ai Bf @@ -2026,13 +1952,11 @@ Bf Bf ai ai -bl +Gw ai je -sa "} -(36,1,1) = {" -sa +(35,1,1) = {" je ai cR @@ -2056,10 +1980,8 @@ gC cR ai je -sa "} -(37,1,1) = {" -sa +(36,1,1) = {" je aE cA @@ -2083,10 +2005,8 @@ gN cA aE je -sa "} -(38,1,1) = {" -sa +(37,1,1) = {" je ai fH @@ -2110,10 +2030,8 @@ gN fH ai je -sa "} -(39,1,1) = {" -sa +(38,1,1) = {" je ai ai @@ -2137,32 +2055,4 @@ ai ai ai je -sa -"} -(40,1,1) = {" -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa -sa "} diff --git a/_maps/deathmatch/meta_brig.dmm b/_maps/deathmatch/meta_brig.dmm index 501e03e6ec632..60b8d8a471b0a 100644 --- a/_maps/deathmatch/meta_brig.dmm +++ b/_maps/deathmatch/meta_brig.dmm @@ -258,6 +258,16 @@ "du" = ( /turf/closed/indestructible/fakedoor, /area/deathmatch) +"dy" = ( +/obj/structure/chair/stool/directional/east, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 4 + }, +/obj/machinery/flasher/directional/north{ + id = "visitorflash" + }, +/turf/open/floor/iron, +/area/deathmatch) "dA" = ( /obj/effect/turf_decal/tile/blue{ dir = 8 @@ -1625,8 +1635,13 @@ /turf/open/indestructible/dark, /area/deathmatch) "yN" = ( -/turf/cordon, -/area/template_noop) +/obj/effect/decal/cleanable/dirt, +/obj/structure/chair/stool/directional/east, +/obj/effect/turf_decal/trimline/red/warning{ + dir = 4 + }, +/turf/open/floor/iron, +/area/deathmatch) "yO" = ( /obj/effect/turf_decal/trimline/red/filled/line{ dir = 4 @@ -3618,8 +3633,8 @@ IJ Yh Yh Yh -yN -yN +dy +YW yN IJ IJ diff --git a/_maps/deathmatch/ragecage.dmm b/_maps/deathmatch/ragecage.dmm index b5871e89c24f1..a96ab76b53829 100644 --- a/_maps/deathmatch/ragecage.dmm +++ b/_maps/deathmatch/ragecage.dmm @@ -208,31 +208,8 @@ /obj/item/storage/toolbox/mechanical/old, /turf/open/indestructible/plating, /area/deathmatch) -"Z" = ( -/turf/cordon, -/area/deathmatch) (1,1,1) = {" -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -"} -(2,1,1) = {" -Z G G H @@ -248,10 +225,8 @@ G H G G -Z "} -(3,1,1) = {" -Z +(2,1,1) = {" G p u @@ -267,10 +242,8 @@ U U f G -Z "} -(4,1,1) = {" -Z +(3,1,1) = {" G U B @@ -286,10 +259,8 @@ V V X G -Z "} -(5,1,1) = {" -Z +(4,1,1) = {" G U L @@ -305,10 +276,8 @@ A g U G -Z "} -(6,1,1) = {" -Z +(5,1,1) = {" G U d @@ -324,10 +293,8 @@ U x U G -Z "} -(7,1,1) = {" -Z +(6,1,1) = {" G X d @@ -343,10 +310,8 @@ U x U q -Z "} -(8,1,1) = {" -Z +(7,1,1) = {" G U d @@ -362,10 +327,8 @@ U R U G -Z "} -(9,1,1) = {" -Z +(8,1,1) = {" G U d @@ -381,10 +344,8 @@ U R U o -Z "} -(10,1,1) = {" -Z +(9,1,1) = {" G D d @@ -400,10 +361,8 @@ t R D o -Z "} -(11,1,1) = {" -Z +(10,1,1) = {" G U d @@ -419,10 +378,8 @@ U R U o -Z "} -(12,1,1) = {" -Z +(11,1,1) = {" G I d @@ -438,10 +395,8 @@ U R U G -Z "} -(13,1,1) = {" -Z +(12,1,1) = {" G U d @@ -457,10 +412,8 @@ i R I q -Z "} -(14,1,1) = {" -Z +(13,1,1) = {" G U d @@ -476,10 +429,8 @@ M R U G -Z "} -(15,1,1) = {" -Z +(14,1,1) = {" G U z @@ -495,10 +446,8 @@ P K U G -Z "} -(16,1,1) = {" -Z +(15,1,1) = {" G U m @@ -514,10 +463,8 @@ m m U G -Z "} -(17,1,1) = {" -Z +(16,1,1) = {" G f U @@ -533,10 +480,8 @@ U U f G -Z "} -(18,1,1) = {" -Z +(17,1,1) = {" G G H @@ -552,24 +497,4 @@ G H G G -Z -"} -(19,1,1) = {" -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z -Z "} diff --git a/_maps/deathmatch/ragin_mages.dmm b/_maps/deathmatch/ragin_mages.dmm index 8c42ef8665a18..3dcdb966d1147 100644 --- a/_maps/deathmatch/ragin_mages.dmm +++ b/_maps/deathmatch/ragin_mages.dmm @@ -761,11 +761,8 @@ /turf/open/floor/engine/cult, /area/deathmatch/teleport) "Xv" = ( +/obj/structure/railing, /obj/structure/railing{ - layer = 3.1 - }, -/obj/structure/railing{ - layer = 3.1; dir = 1 }, /turf/open/floor/engine/cult, diff --git a/_maps/deathmatch/underground_arena.dmm b/_maps/deathmatch/underground_arena.dmm index d407234f0ab2f..4d776acb0b416 100644 --- a/_maps/deathmatch/underground_arena.dmm +++ b/_maps/deathmatch/underground_arena.dmm @@ -473,9 +473,6 @@ }, /turf/open/indestructible/vault, /area/deathmatch) -"En" = ( -/turf/cordon, -/area/deathmatch) "EA" = ( /obj/effect/landmark/deathmatch_player_spawn, /turf/open/indestructible/dark/smooth_large, @@ -889,41 +886,6 @@ /area/deathmatch) (1,1,1) = {" -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -"} -(2,1,1) = {" -En qa qa qa @@ -954,10 +916,8 @@ qa qa qa qa -En "} -(3,1,1) = {" -En +(2,1,1) = {" qa aI aI @@ -988,10 +948,8 @@ aI aI aI qa -En "} -(4,1,1) = {" -En +(3,1,1) = {" qa aI aI @@ -1022,10 +980,8 @@ aI aI aI qa -En "} -(5,1,1) = {" -En +(4,1,1) = {" qa aI aI @@ -1056,10 +1012,8 @@ qa aI aI qa -En "} -(6,1,1) = {" -En +(5,1,1) = {" qa aI aI @@ -1090,10 +1044,8 @@ qa aI aI qa -En "} -(7,1,1) = {" -En +(6,1,1) = {" qa aI aI @@ -1124,10 +1076,8 @@ qa aI aI qa -En "} -(8,1,1) = {" -En +(7,1,1) = {" qa aI aI @@ -1158,10 +1108,8 @@ qa aI aI qa -En "} -(9,1,1) = {" -En +(8,1,1) = {" qa aI aI @@ -1192,10 +1140,8 @@ qa aI aI qa -En "} -(10,1,1) = {" -En +(9,1,1) = {" qa aI aI @@ -1226,10 +1172,8 @@ qa aI aI qa -En "} -(11,1,1) = {" -En +(10,1,1) = {" qa aI aI @@ -1260,10 +1204,8 @@ qa aI aI qa -En "} -(12,1,1) = {" -En +(11,1,1) = {" qa aI aI @@ -1294,10 +1236,8 @@ qa aI aI qa -En "} -(13,1,1) = {" -En +(12,1,1) = {" qa aI aI @@ -1328,10 +1268,8 @@ qa aI aI qa -En "} -(14,1,1) = {" -En +(13,1,1) = {" qa aI aI @@ -1362,10 +1300,8 @@ fX aI aI qa -En "} -(15,1,1) = {" -En +(14,1,1) = {" qa aI aI @@ -1396,10 +1332,8 @@ xK aI aI qa -En "} -(16,1,1) = {" -En +(15,1,1) = {" qa aI aI @@ -1430,10 +1364,8 @@ sd aI aI qa -En "} -(17,1,1) = {" -En +(16,1,1) = {" qa aI aI @@ -1464,10 +1396,8 @@ aI aI aI qa -En "} -(18,1,1) = {" -En +(17,1,1) = {" qa aI aI @@ -1498,10 +1428,8 @@ aI aI aI qa -En "} -(19,1,1) = {" -En +(18,1,1) = {" qa aI aI @@ -1532,10 +1460,8 @@ aI aI aI qa -En "} -(20,1,1) = {" -En +(19,1,1) = {" qa aI aI @@ -1566,10 +1492,8 @@ mz aI aI qa -En "} -(21,1,1) = {" -En +(20,1,1) = {" qa aI aI @@ -1600,10 +1524,8 @@ qa aI aI qa -En "} -(22,1,1) = {" -En +(21,1,1) = {" qa aI aI @@ -1634,10 +1556,8 @@ qa aI aI qa -En "} -(23,1,1) = {" -En +(22,1,1) = {" qa aI aI @@ -1668,10 +1588,8 @@ qa aI aI qa -En "} -(24,1,1) = {" -En +(23,1,1) = {" qa aI aI @@ -1702,10 +1620,8 @@ qa aI aI qa -En "} -(25,1,1) = {" -En +(24,1,1) = {" qa aI aI @@ -1736,10 +1652,8 @@ xG aI aI qa -En "} -(26,1,1) = {" -En +(25,1,1) = {" qa aI aI @@ -1770,10 +1684,8 @@ xG aI aI qa -En "} -(27,1,1) = {" -En +(26,1,1) = {" qa aI aI @@ -1804,10 +1716,8 @@ qa aI aI qa -En "} -(28,1,1) = {" -En +(27,1,1) = {" qa aI aI @@ -1838,10 +1748,8 @@ qa aI aI qa -En "} -(29,1,1) = {" -En +(28,1,1) = {" qa aI aI @@ -1872,10 +1780,8 @@ aI aI aI qa -En "} -(30,1,1) = {" -En +(29,1,1) = {" qa aI aI @@ -1906,10 +1812,8 @@ aI aI aI qa -En "} -(31,1,1) = {" -En +(30,1,1) = {" qa qa qa @@ -1940,39 +1844,4 @@ qa qa qa qa -En -"} -(32,1,1) = {" -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En -En "} diff --git a/_maps/map_files/Basketball/ass_blast_usa.dmm b/_maps/map_files/Basketball/ass_blast_usa.dmm index 4b3354ba6495d..baeb945de7678 100644 --- a/_maps/map_files/Basketball/ass_blast_usa.dmm +++ b/_maps/map_files/Basketball/ass_blast_usa.dmm @@ -102,9 +102,7 @@ "jj" = ( /obj/structure/table/reinforced, /obj/item/book/manual/wiki/cooking_to_serve_man, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /obj/item/food/bun, /obj/item/food/bun, /obj/item/food/bun, diff --git a/_maps/map_files/Basketball/beach_bums.dmm b/_maps/map_files/Basketball/beach_bums.dmm index 517e70f2b630a..d13215d7ca835 100644 --- a/_maps/map_files/Basketball/beach_bums.dmm +++ b/_maps/map_files/Basketball/beach_bums.dmm @@ -459,7 +459,6 @@ pixel_y = 13 }, /obj/item/fishing_line{ - layer = 4; pixel_x = 6; pixel_y = 3 }, diff --git a/_maps/map_files/Birdshot/birdshot.dmm b/_maps/map_files/Birdshot/birdshot.dmm index 2708d4719af1b..3e765d5d16786 100644 --- a/_maps/map_files/Birdshot/birdshot.dmm +++ b/_maps/map_files/Birdshot/birdshot.dmm @@ -381,24 +381,6 @@ }, /turf/open/floor/engine/airless, /area/station/engineering/atmos) -"aiQ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) -"ajQ" = ( -/obj/effect/spawner/random/maintenance, -/obj/effect/spawner/random/structure/closet_maintenance, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "ako" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -463,9 +445,6 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) -"akZ" = ( -/turf/closed/mineral/random/stationside, -/area/space) "alb" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -477,6 +456,7 @@ /obj/structure/table/wood, /obj/item/paper_bin, /obj/item/pen, +/obj/structure/cable, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) "all" = ( @@ -551,14 +531,15 @@ /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) "amK" = ( -/obj/machinery/icecream_vat, +/obj/effect/turf_decal/weather/snow, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/weather/snow/corner{ - dir = 1 + dir = 9 }, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/light/small/directional/north, -/obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, +/obj/machinery/airalarm/directional/west, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "amV" = ( @@ -582,19 +563,6 @@ }, /turf/open/floor/grass, /area/station/service/chapel) -"anD" = ( -/mob/living/basic/goat/pete, -/obj/effect/turf_decal/weather/snow, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/structure/cable, -/obj/effect/turf_decal/weather/snow/corner, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "anJ" = ( /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 @@ -646,13 +614,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible, /turf/open/floor/iron, /area/station/engineering/atmos) -"apj" = ( -/obj/effect/turf_decal/sand/plating, -/obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer5{ - dir = 4 - }, -/turf/open/floor/plating/airless, -/area/space) "apk" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/dark_red{ @@ -683,7 +644,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 5 }, -/turf/open/floor/stone, +/turf/open/floor/wood, /area/station/service/chapel) "apB" = ( /obj/structure/disposalpipe/junction{ @@ -700,12 +661,12 @@ /turf/open/floor/engine/helium, /area/station/ai_monitored/turret_protected/ai) "aqf" = ( -/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, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "aqn" = ( @@ -719,6 +680,21 @@ /obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"aqG" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line, +/obj/machinery/navbeacon{ + codes_txt = "patrol;next_patrol=16.0-CentralFore-CentralPort"; + location = "15.0-CentralStarboard-CentralFore" + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "aqV" = ( /obj/machinery/door/airlock/glass, /obj/machinery/door/firedoor, @@ -808,6 +784,17 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/white, /area/station/medical/paramedic) +"asS" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "asZ" = ( /obj/structure/disposalpipe/trunk, /obj/structure/disposaloutlet{ @@ -888,16 +875,6 @@ dir = 8 }, /area/station/maintenance/starboard/greater) -"aub" = ( -/obj/structure/sign/departments/botany/alt1/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "auc" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 5 @@ -985,7 +962,8 @@ "avp" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, -/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/maintenance/central/greater) "avr" = ( @@ -1049,6 +1027,20 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"awC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "awE" = ( /obj/structure/disposalpipe/sorting/mail/flip{ dir = 8 @@ -1204,6 +1196,17 @@ }, /turf/open/floor/wood, /area/station/engineering/main) +"ayT" = ( +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/structure/reagent_dispensers/watertank/high, +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 9 + }, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics) "ayV" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -1578,9 +1581,10 @@ /turf/open/floor/iron/dark/small, /area/station/maintenance/department/engine) "aFb" = ( -/obj/structure/flora/grass/jungle/b/style_3{ - pixel_y = -6; - pixel_x = -5 +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/large/style_2, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 }, /turf/open/floor/grass, /area/station/service/chapel) @@ -1660,7 +1664,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/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/iron, /area/station/hallway/primary/central/fore) "aGv" = ( @@ -1754,6 +1760,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "aIb" = ( @@ -1767,6 +1774,9 @@ name = "Library" }, /obj/machinery/door/firedoor, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, /turf/open/floor/iron/textured_half, /area/station/service/library) "aIk" = ( @@ -1777,6 +1787,15 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"aIr" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/window/right/directional/south, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters" + }, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) "aIu" = ( /obj/structure/bookcase/random/reference, /obj/machinery/camera/autoname/directional/north, @@ -1954,6 +1973,16 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/small, /area/station/hallway/secondary/service) +"aLC" = ( +/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, +/obj/machinery/camera/autoname/directional/east, +/obj/machinery/light/cold/directional/east, +/obj/machinery/power/apc/auto_name/directional/east{ + areastring = "/area/station/science/ordnance/burnchamber" + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "aLS" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, @@ -1986,13 +2015,6 @@ /obj/machinery/atmospherics/pipe/layer_manifold/supply/visible, /turf/open/floor/plating, /area/station/science/ordnance/testlab) -"aMZ" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/station/service/bar) "aNc" = ( /obj/structure/lattice/catwalk, /obj/structure/railing/corner{ @@ -2086,8 +2108,8 @@ }, /obj/machinery/light/warm/dim, /obj/structure/extinguisher_cabinet/directional/south, -/obj/machinery/camera/autoname/directional/south, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "aOz" = ( @@ -2176,17 +2198,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/smooth_large, /area/station/science/robotics/mechbay) -"aQc" = ( -/obj/structure/flora/bush/flowers_br/style_random, -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/weather/dirt{ - dir = 5 - }, -/obj/effect/turf_decal/weather/dirt{ - dir = 6 - }, -/turf/open/floor/grass, -/area/station/service/chapel) "aQf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -2216,6 +2227,12 @@ /obj/effect/turf_decal/siding/wideplating/dark/corner, /turf/open/floor/iron, /area/station/security) +"aQZ" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "aRa" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -2306,6 +2323,15 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/supermatter/room) +"aSW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "aTb" = ( /obj/structure/toilet{ dir = 4 @@ -2405,12 +2431,41 @@ }, /area/station/engineering/supermatter/room) "aVA" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +/obj/structure/closet/secure_closet/freezer/empty, +/obj/item/food/grown/tomato{ + pixel_y = 2; + pixel_x = 2 }, -/obj/machinery/newscaster/directional/west, -/turf/open/floor/stone, -/area/station/service/bar) +/obj/item/food/grown/tomato{ + pixel_y = 2; + pixel_x = 2 + }, +/obj/item/food/grown/eggplant{ + pixel_y = 5; + pixel_x = 5 + }, +/obj/item/food/grown/eggplant{ + pixel_y = 5; + pixel_x = 5 + }, +/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/soymilk, +/obj/item/reagent_containers/condiment/soymilk, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/flour, +/obj/item/food/grown/tomato{ + pixel_y = 2; + pixel_x = 2 + }, +/obj/item/food/grown/tomato{ + pixel_y = 2; + pixel_x = 2 + }, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) "aVF" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -2457,13 +2512,6 @@ "aWc" = ( /turf/open/floor/iron/small, /area/station/security/tram) -"aWf" = ( -/obj/machinery/camera/autoname/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "aWi" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2476,10 +2524,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/iron/textured_half, /area/station/security/execution/transfer) -"aWr" = ( -/obj/structure/flora/tree/jungle/small, -/turf/open/misc/dirt/jungle, -/area/station/service/chapel) "aWt" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, @@ -2534,14 +2578,13 @@ /turf/open/floor/iron, /area/station/commons/storage/art) "aYj" = ( -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, /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, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/stone, /area/station/service/bar/backroom) "aYp" = ( /obj/structure/chair, @@ -2583,9 +2626,10 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/greater) "aYU" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, +/obj/structure/chair/wood{ + dir = 8 + }, +/turf/open/floor/stone, /area/station/service/bar) "aYY" = ( /obj/structure/flora/bush/flowers_yw/style_random, @@ -2690,15 +2734,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"baW" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/machinery/camera/autoname/directional/west, -/obj/effect/landmark/start/assistant, -/turf/open/floor/stone, -/area/station/service/bar) "bba" = ( /obj/effect/turf_decal/siding/blue{ dir = 8 @@ -2827,12 +2862,20 @@ /turf/closed/wall/r_wall, /area/station/engineering/hallway) "bej" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood/corner{ +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood/end{ dir = 4 }, -/turf/open/floor/stone, +/turf/open/floor/wood, /area/station/service/chapel) +"bes" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/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/service/library) "bey" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 @@ -2970,16 +3013,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/cafeteria, /area/station/security/prison/mess) -"bie" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/status_display/ai/directional/west, -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "biB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark/smooth_large, @@ -3149,23 +3182,11 @@ /obj/structure/closet/crate/miningcar, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"blB" = ( -/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/end{ - dir = 1 - }, -/turf/open/floor/stone, -/area/station/service/bar) "blC" = ( +/obj/effect/turf_decal/siding/thinplating, /obj/effect/spawner/random/entertainment/arcade{ dir = 1 }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 10 - }, -/obj/structure/sign/poster/official/random/directional/south, /turf/open/floor/eighties/red, /area/station/hallway/primary/central/fore) "blJ" = ( @@ -3245,6 +3266,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "bnn" = ( @@ -3456,6 +3478,18 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/medical/virology) +"bpY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "bqd" = ( /obj/item/reagent_containers/cup/bottle/ammonia, /obj/structure/steam_vent, @@ -3704,18 +3738,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/security) -"buv" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/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/primary/central/fore) "buA" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -3773,6 +3795,17 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/white/small, /area/station/security/warden) +"bvP" = ( +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/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/plating, +/area/station/maintenance/central/greater) "bvV" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -3781,6 +3814,16 @@ /obj/structure/cable, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) +"bwy" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/west, +/obj/structure/destructible/cult/item_dispenser/archives/library, +/obj/item/book/codex_gigas, +/obj/machinery/light/small/dim/directional/west, +/turf/open/floor/iron/grimy, +/area/station/service/library) "bwz" = ( /obj/effect/spawner/random/entertainment/arcade, /obj/machinery/light/cold/directional/north, @@ -3806,14 +3849,13 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/maintenance/central/lesser) "bxl" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/weather/snow, /obj/effect/turf_decal/weather/snow/corner{ dir = 1 }, -/obj/effect/turf_decal/weather/snow, -/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/machinery/food_cart, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "bxs" = ( @@ -3920,19 +3962,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/small, /area/station/hallway/secondary/service) -"bzJ" = ( -/obj/structure/table/wood, -/obj/machinery/barsign{ - chosen_sign = "thecavern"; - icon_state = "thecavern"; - pixel_y = 32 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/machinery/chem_dispenser/drinks/beer, -/turf/open/floor/iron/dark/textured, -/area/station/service/bar) "bzZ" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark, @@ -3989,6 +4018,10 @@ }, /obj/structure/flora/bush/flowers_br/style_3, /obj/machinery/firealarm/directional/north, +/obj/structure/flora/bush/large/style_random{ + pixel_x = -20; + pixel_y = -16 + }, /turf/open/floor/grass, /area/station/service/chapel) "bBk" = ( @@ -4016,6 +4049,11 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/engineering/atmospherics_engine) +"bBL" = ( +/obj/effect/landmark/start/cook, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) "bBN" = ( /obj/structure/window/spawner/directional/east, /obj/structure/table/wood, @@ -4218,13 +4256,6 @@ /obj/effect/spawner/structure/window/reinforced/shuttle, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) -"bFd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/service/bar) "bFh" = ( /obj/structure/rack, /obj/item/binoculars, @@ -4252,7 +4283,8 @@ "bFO" = ( /obj/effect/spawner/random/trash, /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/plating, /area/station/maintenance/central/greater) "bFR" = ( @@ -4433,13 +4465,11 @@ /turf/open/floor/iron, /area/station/maintenance/starboard/aft) "bJx" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, /obj/effect/turf_decal/siding/wood/corner{ dir = 4 }, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, /area/station/service/chapel) "bJA" = ( /obj/item/kirbyplants/random, @@ -4473,14 +4503,6 @@ /obj/machinery/incident_display/tram/directional/north, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"bKd" = ( -/obj/structure/window/spawner/directional/west, -/obj/structure/flora/bush/jungle/a/style_random, -/obj/structure/flora/bush/flowers_pp/style_random, -/obj/structure/window/spawner/directional/east, -/obj/machinery/light/floor, -/turf/open/floor/grass, -/area/station/service/hydroponics) "bKl" = ( /obj/structure/railing/corner{ dir = 8 @@ -4526,7 +4548,10 @@ /area/station/security/tram) "bKO" = ( /obj/structure/table/wood, -/turf/open/floor/wood/large, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/iron/dark/diagonal, /area/station/service/bar) "bKU" = ( /obj/item/toy/crayon/spraycan{ @@ -4544,6 +4569,23 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/smooth, /area/station/engineering/main) +"bLS" = ( +/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/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock{ + name = "Library Maintenance" + }, +/obj/structure/cable, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/turf/open/floor/plating, +/area/station/service/library) "bLT" = ( /obj/structure/cable, /obj/structure/window/reinforced/spawner/directional/south, @@ -4557,6 +4599,17 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/commons/storage/art) +"bMn" = ( +/obj/effect/turf_decal/weather/snow, +/obj/effect/turf_decal/weather/snow/corner, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "bMt" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -4659,8 +4712,7 @@ /area/station/maintenance/disposal/incinerator) "bOG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/cook, -/turf/open/floor/iron/kitchen/small, +/turf/closed/wall, /area/station/service/kitchen) "bON" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4684,13 +4736,19 @@ }, /turf/open/floor/iron, /area/station/cargo/miningfoundry) -"bPv" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/neutral/half/contrasted{ +"bPy" = ( +/obj/structure/cable, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ dir = 1 }, -/turf/closed/wall, -/area/station/maintenance/central/greater) +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "bPU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/purple/visible, /turf/open/floor/iron, @@ -4708,7 +4766,7 @@ /area/station/security/office) "bQd" = ( /obj/structure/flora/grass/jungle/b/style_2, -/turf/open/misc/dirt/jungle, +/turf/open/misc/dirt/station, /area/station/service/chapel) "bQi" = ( /obj/effect/decal/cleanable/dirt, @@ -5071,11 +5129,11 @@ /turf/open/floor/iron/white/small, /area/station/medical/storage) "bXR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, /obj/structure/table/wood, -/turf/open/floor/iron/grimy, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/stone, /area/station/service/bar) "bYe" = ( /obj/effect/turf_decal/stripes/line{ @@ -5112,11 +5170,6 @@ dir = 1 }, /area/station/engineering/hallway) -"bYE" = ( -/obj/structure/cable, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/wood/parquet, -/area/station/service/library) "bYK" = ( /obj/effect/spawner/random/maintenance, /obj/effect/decal/cleanable/dirt, @@ -5232,6 +5285,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/structure/cable, /turf/open/floor/wood, /area/station/service/chapel/office) "caI" = ( @@ -5245,12 +5299,16 @@ /turf/open/floor/iron, /area/station/commons/fitness/locker_room) "caW" = ( -/obj/structure/sign/warning/no_smoking/circle/directional/north, -/obj/machinery/disposal/bin, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/firealarm/directional/west, +/obj/structure/cable, /obj/structure/disposalpipe/trunk{ - dir = 4 + dir = 1 }, -/turf/open/floor/wood/large, +/obj/machinery/disposal/bin, +/turf/open/floor/stone, /area/station/service/bar) "cbg" = ( /obj/structure/table/wood, @@ -5370,17 +5428,6 @@ }, /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) -"ccv" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/stone, -/area/station/service/bar) "ccx" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -5532,6 +5579,15 @@ /obj/effect/turf_decal/tile/neutral/opposingcorners, /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) +"cfb" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/stone, +/area/station/service/chapel) "cfc" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/hidden{ dir = 6 @@ -5570,6 +5626,18 @@ }, /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) +"cgs" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "cgt" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/garbage, @@ -5690,7 +5758,7 @@ "chI" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/siding/thinplating{ - dir = 10 + dir = 6 }, /turf/open/floor/eighties, /area/station/hallway/primary/central/fore) @@ -5715,10 +5783,20 @@ /obj/effect/turf_decal/weather/dirt{ dir = 1 }, -/mob/living/basic/deer, /obj/structure/flora/bush/flowers_pp/style_random, /turf/open/floor/grass, /area/station/service/chapel) +"cig" = ( +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/smooth, +/area/station/service/greenroom) "cik" = ( /obj/structure/bookcase/random, /obj/item/radio/intercom/directional/west, @@ -6003,14 +6081,6 @@ /obj/structure/barricade/wooden/crude, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"cmB" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/machinery/light/floor, -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/station/service/bar) "cmD" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -6067,6 +6137,17 @@ /obj/effect/landmark/start/shaft_miner, /turf/open/floor/iron, /area/station/cargo/miningoffice) +"coi" = ( +/obj/structure/cable/layer3, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/window/left/directional/south{ + name = "AI Security Door" + }, +/obj/machinery/flasher/directional/east{ + id = "ai" + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "cop" = ( /obj/machinery/portable_atmospherics/canister/anesthetic_mix, /obj/machinery/atmospherics/components/unary/portables_connector/visible{ @@ -6187,20 +6268,19 @@ /turf/open/floor/plating, /area/station/science/ordnance/storage) "cqD" = ( -/obj/structure/table/wood, -/obj/item/holosign_creator/robot_seat/bar{ - pixel_x = 2; - pixel_y = 9 - }, -/obj/structure/sign/picture_frame/portrait/bar{ - pixel_y = 32 - }, -/obj/item/roulette_wheel_beacon, -/obj/machinery/light/small/directional/north, -/obj/structure/disposalpipe/segment, +/obj/structure/closet/secure_closet/bar, +/obj/item/stack/spacecash/c1, +/obj/item/stack/spacecash/c1, +/obj/item/stack/spacecash/c1, +/obj/item/stack/spacecash/c1, +/obj/item/stack/spacecash/c1, +/obj/machinery/airalarm/directional/north, +/obj/structure/reagent_dispensers/beerkeg, +/obj/structure/reagent_dispensers/beerkeg, /obj/effect/turf_decal/siding/wood{ dir = 1 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/stone, /area/station/service/bar/backroom) "cqM" = ( @@ -6231,6 +6311,12 @@ "cri" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/firedoor, +/obj/structure/cable, /turf/open/floor/iron/kitchen/small, /area/station/service/kitchen) "crm" = ( @@ -6343,11 +6429,6 @@ /obj/machinery/power/apc/auto_name/directional/east, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/foyer) -"csZ" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "ctb" = ( /obj/effect/turf_decal/siding/yellow{ dir = 6 @@ -6369,34 +6450,6 @@ "ctH" = ( /turf/open/floor/iron/herringbone, /area/station/commons/dorms) -"ctN" = ( -/obj/structure/closet/secure_closet/freezer/empty, -/obj/item/food/grown/tomato{ - pixel_y = 2; - pixel_x = 2 - }, -/obj/item/food/grown/tomato{ - pixel_y = 2; - pixel_x = 2 - }, -/obj/item/food/grown/eggplant{ - pixel_y = 5; - pixel_x = 5 - }, -/obj/item/food/grown/eggplant{ - pixel_y = 5; - pixel_x = 5 - }, -/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/soymilk, -/obj/item/reagent_containers/condiment/soymilk, -/obj/item/reagent_containers/condiment/flour, -/obj/item/reagent_containers/condiment/flour, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "cua" = ( /obj/effect/spawner/random/maintenance, /obj/effect/spawner/random/structure/crate, @@ -6466,17 +6519,19 @@ dir = 1 }, /area/station/cargo/bitrunning/den) -"cvX" = ( -/obj/structure/sign/poster/official/random/directional/south, -/obj/effect/turf_decal/siding/wood/corner{ +"cvV" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, +/turf/open/floor/wood/tile, +/area/station/service/bar) +"cvX" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 }, -/obj/machinery/airalarm/directional/east, -/obj/item/kirbyplants/random, -/turf/open/floor/stone, +/obj/machinery/restaurant_portal/bar, +/turf/open/floor/wood/tile, /area/station/service/bar) "cwb" = ( /obj/effect/turf_decal/stripes/white/end{ @@ -6530,6 +6585,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/hallway/secondary/dock) +"cxz" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/station/service/chapel) "cxO" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -6659,16 +6721,17 @@ /turf/open/floor/iron/white/small, /area/station/medical/surgery/theatre) "cAl" = ( -/obj/machinery/camera/autoname/directional/east, /obj/effect/turf_decal/siding/wood{ - dir = 8 + dir = 4 }, -/obj/machinery/light/small/directional/east, /obj/effect/turf_decal/siding/wood{ - dir = 4 + dir = 8 }, -/obj/item/radio/intercom/directional/east, -/turf/open/floor/stone, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/start/assistant, +/obj/structure/cable, +/turf/open/floor/wood/tile, /area/station/service/bar) "cAm" = ( /obj/effect/decal/cleanable/dirt, @@ -6753,11 +6816,6 @@ /obj/item/storage/bag/xeno, /turf/open/floor/iron/white, /area/station/science/cytology) -"cCe" = ( -/obj/structure/bed/maint, -/obj/effect/spawner/random/trash, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "cCl" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -6790,6 +6848,10 @@ }, /turf/open/misc/asteroid/airless, /area/space/nearstation) +"cCM" = ( +/obj/structure/cable, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) "cCW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -6895,19 +6957,6 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"cEs" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/window/brigdoor/right/directional/north{ - atom_integrity = 300; - name = "AI Core Chamber Access"; - req_access = list("ai_upload") - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "AI Core shutters"; - name = "AI Core Shutter" - }, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "cED" = ( /obj/structure/railing/corner, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -7011,20 +7060,6 @@ /obj/effect/mapping_helpers/airlock/access/any/service/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) -"cFz" = ( -/obj/structure/cable/layer3, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/window/brigdoor/left/directional/north{ - atom_integrity = 300; - name = "AI Core Chamber Access"; - req_access = list("ai_upload") - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "AI Core shutters"; - name = "AI Core Shutter" - }, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "cFR" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -7088,6 +7123,25 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, /area/station/service/lawoffice) +"cHG" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) +"cHI" = ( +/obj/effect/turf_decal/box/corners{ + dir = 4 + }, +/obj/effect/turf_decal/box/corners{ + dir = 1 + }, +/obj/machinery/vatgrower, +/turf/open/floor/engine, +/area/station/science/cytology) "cHO" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/blue/full, @@ -7125,13 +7179,8 @@ /turf/open/floor/grass, /area/station/medical/virology) "cIX" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/iron/grimy, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, /area/station/service/bar) "cJb" = ( /obj/structure/lattice/catwalk, @@ -7141,20 +7190,11 @@ /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) "cJv" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/hydroponics, -/obj/machinery/door/airlock/hydroponics/glass{ - name = "Hydroponics" - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron/textured_half{ - dir = 8 - }, +/obj/effect/turf_decal/siding/thinplating_new/light, +/obj/machinery/light/small/dim/directional/south, +/turf/open/floor/iron/white/small, /area/station/service/hydroponics) "cJz" = ( /obj/structure/cable, @@ -7205,14 +7245,6 @@ dir = 4 }, /area/station/science/lab) -"cKc" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/flasher/directional/west{ - id = "ai" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/iron/stairs, -/area/station/ai_monitored/turret_protected/ai) "cKk" = ( /turf/closed/mineral/random/stationside, /area/station/ai_monitored/turret_protected/aisat/maint) @@ -7221,6 +7253,7 @@ dir = 4 }, /obj/structure/cable, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) "cKv" = ( @@ -7255,15 +7288,6 @@ /obj/structure/marker_beacon/indigo, /turf/open/space/basic, /area/space/nearstation) -"cLy" = ( -/obj/effect/spawner/random/trash, -/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/plating, -/area/station/maintenance/central/greater) "cLD" = ( /obj/structure/window/spawner/directional/north, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -7287,6 +7311,16 @@ }, /turf/open/floor/grass, /area/station/service/chapel) +"cLR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/window/right/directional/south{ + name = "AI Security Door" + }, +/obj/machinery/flasher/directional/west{ + id = "ai" + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "cLS" = ( /obj/effect/turf_decal/siding/white{ dir = 10 @@ -7511,15 +7545,14 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) "cQN" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/table/wood, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/grimy, +/turf/open/floor/stone, /area/station/service/bar) "cQP" = ( /obj/structure/cable, @@ -7655,6 +7688,18 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/shower) +"cSy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 5 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "cSC" = ( /turf/closed/wall, /area/station/commons/vacant_room/office) @@ -7669,12 +7714,7 @@ /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) "cTn" = ( -/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 = 9 - }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) "cTp" = ( @@ -7793,6 +7833,19 @@ }, /turf/open/floor/iron/dark/small, /area/station/service/chapel/storage) +"cVm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/turf/open/floor/iron/small, +/area/station/hallway/primary/central/aft) "cVx" = ( /obj/effect/turf_decal/siding/dark_red{ dir = 4 @@ -7855,30 +7908,6 @@ dir = 4 }, /area/station/maintenance/fore/lesser) -"cWB" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/cup/rag{ - pixel_x = -6; - pixel_y = 6 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = 10; - pixel_y = 8 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = 5; - pixel_y = 16 - }, -/obj/item/reagent_containers/cup/glass/drinkingglass{ - pixel_x = 5; - pixel_y = 5 - }, -/obj/item/reagent_containers/cup/glass/shaker{ - pixel_x = -7; - pixel_y = 15 - }, -/turf/open/floor/iron/dark/textured, -/area/station/service/bar) "cWM" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -7910,7 +7939,10 @@ /area/station/hallway/secondary/entry) "cXb" = ( /obj/machinery/light/small/directional/north, -/turf/open/misc/dirt/jungle, +/obj/effect/turf_decal/weather/dirt{ + dir = 9 + }, +/turf/open/floor/grass, /area/station/service/chapel) "cXh" = ( /obj/structure/disposalpipe/segment{ @@ -7919,6 +7951,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"cXp" = ( +/obj/effect/mapping_helpers/airlock/access/any/service/general, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/glass{ + name = "Service Hallway" + }, +/obj/structure/cable, +/turf/open/floor/iron/textured_half, +/area/station/hallway/secondary/service) "cXu" = ( /obj/effect/landmark/atmospheric_sanity/ignore_area, /turf/open/floor/plating, @@ -8043,10 +8085,10 @@ }, /area/station/hallway/primary/central/fore) "cZi" = ( -/obj/structure/extinguisher_cabinet/directional/south, /obj/machinery/camera/autoname/directional/south, /obj/item/kirbyplants/random, -/turf/open/floor/iron, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark/side, /area/station/hallway/primary/central/fore) "cZk" = ( /obj/structure/chair{ @@ -8065,6 +8107,15 @@ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) +"cZs" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/chapel) "cZx" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/south, @@ -8115,6 +8166,10 @@ /obj/machinery/light/cold/directional/west, /turf/open/floor/iron, /area/station/security) +"dao" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/stone, +/area/station/service/bar) "daq" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -8189,6 +8244,10 @@ "dbF" = ( /turf/open/floor/plating/rust, /area/station/ai_monitored/turret_protected/aisat/maint) +"dbJ" = ( +/obj/effect/landmark/start/librarian, +/turf/open/floor/iron/grimy, +/area/station/service/library) "dbN" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -8202,18 +8261,15 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"dbY" = ( -/obj/structure/railing, -/turf/open/space/basic, -/area/space) "dbZ" = ( /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 = 1 +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/turf/open/floor/wood, /area/station/service/chapel) "dcc" = ( /obj/item/kirbyplants/random/fullysynthetic, @@ -8313,15 +8369,15 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/carpet/red, /area/station/command/heads_quarters/hos) -"ddG" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 +"ddF" = ( +/mob/living/basic/goat/pete, +/obj/effect/turf_decal/weather/snow, +/obj/effect/turf_decal/weather/snow/corner, +/obj/structure/disposalpipe/segment{ + dir = 10 }, -/turf/open/floor/iron/small, -/area/station/hallway/primary/central/fore) +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "ddK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8331,6 +8387,17 @@ /obj/effect/landmark/start/chief_medical_officer, /turf/open/floor/iron/white, /area/station/medical/treatment_center) +"ddT" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 10 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "deb" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/decal/cleanable/dirt, @@ -8390,13 +8457,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/white/small, /area/station/medical/psychology) -"dfc" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, -/obj/machinery/restaurant_portal/restaurant, -/turf/open/floor/stone, -/area/station/service/bar) "dff" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/airalarm/directional/east, @@ -8476,13 +8536,13 @@ /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) "dhu" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 10 - }, /obj/structure/flora/bush/sparsegrass{ pixel_x = -5; pixel_y = 9 }, +/obj/effect/turf_decal/weather/dirt{ + dir = 10 + }, /turf/open/floor/grass, /area/station/service/chapel) "dhy" = ( @@ -8520,15 +8580,6 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"dib" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/eighties/red, -/area/station/hallway/primary/central/fore) "dim" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -8617,6 +8668,15 @@ /obj/machinery/light/floor, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"djc" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/red/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/smooth, +/area/station/service/greenroom) "djf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8625,6 +8685,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "djg" = ( @@ -8657,6 +8718,16 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron/textured_half, /area/station/commons/dorms) +"dkh" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/stone, +/area/station/service/chapel) "dkz" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -8716,6 +8787,10 @@ /obj/item/clothing/mask/surgical, /turf/open/floor/iron/small, /area/station/medical/storage) +"dlB" = ( +/obj/structure/extinguisher_cabinet/directional/north, +/turf/open/misc/dirt/station, +/area/station/service/chapel) "dlG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -9083,12 +9158,6 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/station/security/lockers) -"dsP" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/turf/open/floor/stone, -/area/station/service/bar/backroom) "dsU" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 6 @@ -9138,7 +9207,6 @@ /turf/open/floor/iron/dark, /area/station/science/genetics) "dtO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, @@ -9159,6 +9227,12 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/augments) +"duj" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) "dun" = ( /obj/machinery/atmospherics/pipe/smart/simple/green/visible{ dir = 4 @@ -9183,7 +9257,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/line, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -9211,6 +9284,9 @@ }, /turf/open/floor/wood, /area/station/engineering/atmos/office) +"dvd" = ( +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics) "dvo" = ( /obj/machinery/ore_silo, /obj/effect/turf_decal/bot_white, @@ -9354,11 +9430,14 @@ /turf/open/floor/plating, /area/station/construction/mining/aux_base) "dxV" = ( -/obj/effect/turf_decal/siding/wood, +/obj/machinery/airalarm/directional/north, +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks, /obj/effect/turf_decal/siding/wood{ - dir = 4 + dir = 5 }, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/dark/diagonal, /area/station/service/bar) "dxZ" = ( /obj/structure/cable, @@ -9709,7 +9788,6 @@ /obj/effect/turf_decal/siding/thinplating_new/light, /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/small, /area/station/service/hydroponics) "dEu" = ( @@ -9741,6 +9819,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"dEY" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 5 + }, +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics) "dFN" = ( /obj/structure/window/spawner/directional/east, /obj/structure/window/spawner/directional/north, @@ -9754,18 +9838,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/lesser) -"dGm" = ( -/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/wood{ - name = "Bar Backroom" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/bar, -/turf/open/floor/iron/textured_half{ - dir = 8 - }, -/area/station/service/bar) "dGV" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -9821,20 +9893,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) -"dIN" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/obj/machinery/navbeacon{ - codes_txt = "patrol;next_patrol=16.0-CentralFore-CentralPort"; - location = "15.0-CentralStarboard-CentralFore" - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "dIQ" = ( /obj/effect/turf_decal/weather/dirt, /obj/structure/flora/bush/flowers_yw/style_3, @@ -10009,16 +10067,11 @@ /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) "dMi" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 +/obj/effect/turf_decal/siding/wood{ + dir = 9 }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, /turf/open/floor/stone, /area/station/service/bar) "dMm" = ( @@ -10177,6 +10230,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "dPx" = ( @@ -10184,7 +10238,8 @@ dir = 1 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, /area/station/service/chapel) "dQi" = ( /obj/structure/cable, @@ -10214,19 +10269,15 @@ }, /turf/open/floor/engine, /area/station/science/cytology) -"dQY" = ( -/obj/machinery/status_display/evac/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "dRb" = ( -/obj/effect/landmark/start/bartender, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 8 +/obj/structure/sign/poster/official/random/directional/east, +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 6 }, -/obj/effect/turf_decal/siding/wood, /turf/open/floor/stone, /area/station/service/bar/backroom) "dRk" = ( @@ -10238,6 +10289,10 @@ }, /turf/open/misc/sandy_dirt, /area/station/security/tram) +"dRn" = ( +/obj/effect/turf_decal/siding/wood/end, +/turf/open/floor/stone, +/area/station/service/chapel) "dRD" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -10768,23 +10823,15 @@ /turf/open/floor/wood, /area/station/commons/fitness/recreation) "ebk" = ( +/obj/structure/chair/stool/bar/directional/north, /obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/machinery/light/floor, -/turf/open/floor/stone, +/obj/effect/landmark/start/assistant, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/tile, /area/station/service/bar) -"ebo" = ( -/obj/machinery/atmospherics/pipe/smart/simple/dark/visible, -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/light/cold/directional/east, -/obj/machinery/power/apc/auto_name/directional/east{ - areastring = "/area/station/science/ordnance/burnchamber" - }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "ebE" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -10841,6 +10888,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) +"ecC" = ( +/obj/machinery/light/floor, +/turf/open/floor/stone, +/area/station/service/bar) "ecL" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/transit_tube/horizontal, @@ -10866,6 +10917,17 @@ dir = 1 }, /area/station/science/research) +"edk" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/turf/open/floor/iron, +/area/station/service/hydroponics) "edD" = ( /obj/machinery/light/small/directional/west, /obj/item/kirbyplants/random, @@ -10928,12 +10990,6 @@ /obj/structure/broken_flooring/singular/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"eeq" = ( -/obj/structure/railing/corner{ - dir = 8 - }, -/turf/open/space/basic, -/area/space) "eeD" = ( /obj/structure/showcase/cyborg/old{ pixel_y = 20 @@ -10978,10 +11034,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"efC" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/station/service/bar) "efK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -11206,14 +11258,6 @@ }, /turf/open/floor/catwalk_floor, /area/station/engineering/main) -"ejX" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/vending/cigarette, -/turf/open/floor/stone, -/area/station/service/bar) "ekf" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -11285,6 +11329,20 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron, /area/station/security) +"elb" = ( +/obj/structure/table/reinforced, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 5 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters" + }, +/turf/open/floor/plating, +/area/station/service/kitchen) "eld" = ( /obj/machinery/atmospherics/pipe/smart/simple/orange/hidden, /obj/machinery/camera/directional/west{ @@ -11299,10 +11357,7 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance) "eln" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/obj/structure/flora/tree/jungle/small/style_4, +/obj/structure/flora/tree/jungle/small/style_5, /turf/open/floor/grass, /area/station/service/chapel) "elv" = ( @@ -11368,7 +11423,6 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "elN" = ( -/obj/machinery/computer/security/telescreen/entertainment/directional/north, /obj/effect/landmark/start/hangover, /obj/machinery/light/small/directional/north, /obj/effect/turf_decal/tile/neutral{ @@ -11400,13 +11454,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) -"emp" = ( -/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/plating, -/area/station/maintenance/central/greater) "emB" = ( /obj/machinery/door/airlock/maintenance{ name = "Maintenance" @@ -11560,24 +11607,6 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/catwalk_floor/flat_white, /area/station/security/checkpoint/science) -"equ" = ( -/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/door/firedoor, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/small, -/area/station/hallway/primary/central/aft) "eqz" = ( /obj/effect/turf_decal/siding/white/corner{ dir = 8 @@ -11603,6 +11632,18 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/dark/small, /area/station/maintenance/central/lesser) +"eqI" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "eqS" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -11669,8 +11710,10 @@ /turf/open/floor/iron/small, /area/station/security/office) "esr" = ( -/obj/structure/closet/emcloset, /obj/effect/turf_decal/tile/blue, +/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/side, /area/station/hallway/primary/central/fore) "ess" = ( @@ -11754,14 +11797,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/circuit, /area/station/maintenance/port/aft) -"etD" = ( -/obj/structure/cable/layer3, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/flasher/directional/east{ - id = "ai" - }, -/turf/open/floor/iron/stairs, -/area/station/ai_monitored/turret_protected/ai) "etX" = ( /obj/structure/sign/warning/hot_temp/directional/east, /turf/open/floor/iron/stairs/right, @@ -11783,7 +11818,7 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, -/turf/open/floor/iron, +/turf/open/floor/iron/white/small, /area/station/commons/fitness/locker_room) "euq" = ( /obj/structure/cable, @@ -11883,18 +11918,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/small, /area/station/maintenance/department/engine) -"ewo" = ( -/obj/effect/turf_decal/box/corners{ - dir = 4 - }, -/obj/effect/turf_decal/box/corners{ - dir = 1 - }, -/obj/machinery/plumbing/growing_vat{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "ewt" = ( /obj/structure/cable, /obj/machinery/firealarm/directional/south, @@ -12136,14 +12159,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/teleporter) -"eAU" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/door/window/right/directional/south{ - name = "AI Security Door" - }, -/obj/machinery/status_display/evac/directional/west, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "eAY" = ( /turf/open/floor/grass, /area/station/science/xenobiology) @@ -12245,15 +12260,6 @@ /obj/structure/flora/bush/pale, /turf/open/floor/grass, /area/station/hallway/primary/central/fore) -"eDl" = ( -/obj/structure/cable/layer3, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/door/window/left/directional/south{ - name = "AI Security Door" - }, -/obj/machinery/status_display/evac/directional/east, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "eDo" = ( /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/any/engineering/construction, @@ -12517,8 +12523,11 @@ /turf/open/floor/iron/white, /area/station/medical/paramedic) "eGU" = ( -/obj/structure/chair/stool/bar/directional/north, -/turf/open/floor/wood/large, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/tile, /area/station/service/bar) "eHa" = ( /obj/structure/sign/poster/official/random/directional/north, @@ -12553,6 +12562,18 @@ /obj/machinery/light/cold/directional/north, /turf/open/floor/iron, /area/station/security/prison/workout) +"eHv" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/chair/comfy/brown{ + buildstackamount = 0; + color = "#c45c57"; + dir = 8 + }, +/turf/open/floor/iron/grimy, +/area/station/service/library) "eHy" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -12628,12 +12649,9 @@ /turf/open/floor/plating, /area/station/engineering/atmos/storage/gas) "eIW" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/sign/poster/official/random/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/library) +/obj/effect/spawner/random/structure/girder, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "eIX" = ( /obj/machinery/light/cold/directional/south, /obj/effect/turf_decal/stripes/end{ @@ -12755,6 +12773,16 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) +"eMb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/portable_atmospherics/pipe_scrubber, +/turf/open/floor/iron, +/area/station/engineering/atmos) "eMc" = ( /obj/machinery/flasher/portable, /obj/effect/turf_decal/stripes/line{ @@ -12834,15 +12862,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/turret_protected/ai) -"eNM" = ( -/obj/structure/table/wood, -/obj/structure/reagent_dispensers/beerkeg, -/obj/effect/turf_decal/siding/wood/end{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/turf/open/floor/stone, -/area/station/service/bar) "eNU" = ( /obj/structure/table/reinforced, /obj/item/phone{ @@ -12898,6 +12917,17 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/medical/coldroom) +"ePk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "ePn" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light/small/directional/south, @@ -12989,16 +13019,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/engine) -"eRa" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) "eRy" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -13079,11 +13099,11 @@ /turf/open/floor/iron, /area/station/security/prison) "eTJ" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 }, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/tile, /area/station/service/bar) "eTT" = ( /obj/structure/cable, @@ -13274,13 +13294,10 @@ /turf/open/floor/iron/small, /area/station/engineering/atmos/pumproom) "eWk" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, /obj/effect/turf_decal/siding/wood/corner{ dir = 8 }, -/turf/open/floor/stone, +/turf/open/floor/wood, /area/station/service/chapel) "eWB" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -13290,12 +13307,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron, /area/station/security/tram) -"eWC" = ( -/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/maintenance/central/greater) "eWD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white, @@ -13336,15 +13347,12 @@ /turf/open/floor/iron, /area/station/security/prison/workout) "eXB" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/item/storage/fancy/candle_box, -/obj/machinery/light_switch/directional/west, -/obj/structure/rack/skeletal, -/obj/machinery/camera/autoname/directional/west, -/turf/open/floor/iron/grimy, -/area/station/service/library) +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/maintenance, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "eXK" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/table/wood, @@ -13353,6 +13361,15 @@ }, /turf/open/floor/stone, /area/station/maintenance/aft) +"eXR" = ( +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line, +/obj/effect/landmark/start/hangover, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "eXW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -13360,14 +13377,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/cafeteria, /area/station/science/breakroom) -"eXZ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/neutral/end{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "eYc" = ( /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/turret_protected/ai) @@ -13391,11 +13400,8 @@ /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat/equipment) "eYB" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood/end, +/turf/open/floor/wood, /area/station/service/chapel) "eYD" = ( /obj/structure/railing{ @@ -13436,6 +13442,9 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, +/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/hallway/primary/central/aft) "eZj" = ( @@ -13451,13 +13460,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/dark/textured, /area/station/ai_monitored/turret_protected/ai) -"fap" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/service/bar) "fav" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/machinery/computer/security/telescreen/entertainment/directional/west, @@ -13748,15 +13750,6 @@ }, /turf/open/floor/iron/diagonal, /area/station/engineering/lobby) -"fgJ" = ( -/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/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "fgT" = ( /obj/effect/turf_decal/weather/dirt{ dir = 1 @@ -13767,6 +13760,7 @@ /obj/machinery/power/apc/auto_name/directional/north{ low_power_nightshift_lights = 1 }, +/obj/effect/turf_decal/weather/dirt, /turf/open/floor/grass, /area/station/service/chapel) "fgW" = ( @@ -13797,6 +13791,16 @@ }, /turf/open/floor/iron/small, /area/station/security/office) +"fhp" = ( +/obj/structure/table, +/obj/effect/spawner/random/food_or_drink/donkpockets{ + pixel_y = 6 + }, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "fhT" = ( /obj/structure/sink/directional/east, /obj/structure/mirror/directional/west, @@ -13877,6 +13881,14 @@ /obj/machinery/duct, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"fiW" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/chair/sofa/bench/right, +/turf/open/floor/stone, +/area/station/service/chapel) "fjp" = ( /obj/machinery/door/airlock{ id_tag = "Cabin1"; @@ -14291,15 +14303,6 @@ /obj/machinery/door/window/brigdoor/right/directional/north, /turf/open/floor/iron/textured_large, /area/station/security/checkpoint/customs) -"fsb" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron/white, -/area/station/hallway/primary/central/aft) "fsk" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -14415,6 +14418,16 @@ }, /turf/open/floor/iron, /area/station/security/warden) +"ftC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/chapel) "ftX" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, @@ -14550,29 +14563,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/engine, /area/station/science/xenobiology) -"fvK" = ( -/obj/item/holosign_creator/robot_seat/restaurant, -/obj/item/book/manual/chef_recipes, -/obj/item/stack/package_wrap{ - pixel_y = 2 - }, -/obj/item/reagent_containers/condiment/enzyme{ - pixel_x = -7; - pixel_y = 6 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 - }, -/obj/machinery/light_switch/directional/north, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/table, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "fvL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -14661,13 +14651,12 @@ /turf/open/floor/iron/small, /area/station/engineering/atmos) "fxW" = ( -/obj/item/kirbyplants/random, -/obj/structure/extinguisher_cabinet/directional/south, +/obj/machinery/restaurant_portal/restaurant, /obj/effect/turf_decal/siding/wood{ - dir = 1 + dir = 10 }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/stone, +/obj/structure/extinguisher_cabinet/directional/west, +/turf/open/floor/wood/tile, /area/station/service/bar) "fyo" = ( /obj/structure/table, @@ -14770,9 +14759,8 @@ /turf/open/floor/iron/white, /area/station/medical/virology) "fzw" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 10 - }, +/obj/machinery/light/floor, +/obj/structure/cable, /turf/open/floor/stone, /area/station/service/bar) "fzx" = ( @@ -14801,6 +14789,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "fAr" = ( @@ -14897,12 +14886,10 @@ /turf/open/floor/plating, /area/station/maintenance/department/engine) "fBB" = ( -/obj/structure/table/wood, -/obj/item/plate, -/obj/item/food/cheesynachos{ - pixel_y = 2 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 }, -/turf/open/floor/wood/large, +/turf/open/floor/stone, /area/station/service/bar) "fBN" = ( /obj/structure/flora/bush/flowers_yw/style_3{ @@ -15059,16 +15046,6 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/break_room) -"fDX" = ( -/obj/effect/turf_decal/tile/neutral/full, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new/light/corner{ - dir = 8 - }, -/turf/open/floor/iron/white/small, -/area/station/service/hydroponics) "fDY" = ( /obj/structure/cable, /obj/structure/flora/bush/flowers_pp/style_random, @@ -15133,10 +15110,10 @@ /turf/closed/wall, /area/station/maintenance/port/lesser) "fEF" = ( +/obj/structure/cable, /obj/effect/turf_decal/siding/thinplating{ - dir = 9 + dir = 5 }, -/obj/structure/cable, /turf/open/floor/eighties, /area/station/hallway/primary/central/fore) "fEU" = ( @@ -15170,11 +15147,6 @@ /obj/machinery/atmospherics/pipe/smart/simple/green/visible, /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) -"fFr" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/neutral/end, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "fFt" = ( /obj/structure/chair/wood{ dir = 8 @@ -15265,6 +15237,14 @@ }, /turf/open/floor/plating/rust, /area/station/ai_monitored/turret_protected/aisat/maint) +"fGk" = ( +/obj/machinery/smartfridge, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters" + }, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) "fGT" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -15342,6 +15322,7 @@ codes_txt = "patrol;next_patrol=21.0-Bar-Porthall"; location = "20.0-CentralPort-Bar" }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "fHT" = ( @@ -15361,7 +15342,8 @@ /obj/structure/chair/wood{ dir = 8 }, -/turf/open/floor/wood/tile, +/obj/machinery/light/floor, +/turf/open/floor/stone, /area/station/service/bar) "fIw" = ( /obj/effect/landmark/navigate_destination/dockescpod, @@ -15748,7 +15730,9 @@ /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) "fMX" = ( -/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, /turf/open/floor/stone, /area/station/service/chapel) "fNb" = ( @@ -15859,6 +15843,13 @@ }, /turf/open/floor/iron/smooth, /area/station/ai_monitored/turret_protected/aisat_interior) +"fOq" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/bar) "fOJ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, @@ -15931,19 +15922,6 @@ /obj/structure/cable, /turf/open/floor/iron/diagonal, /area/station/engineering/lobby) -"fQd" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment, -/obj/structure/window/reinforced/spawner/directional/north, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) "fQA" = ( /obj/effect/spawner/random/structure/chair_maintenance{ dir = 8 @@ -16045,10 +16023,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood/end, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, /turf/open/floor/wood/parquet, /area/station/service/library) "fSe" = ( @@ -16173,14 +16147,6 @@ /obj/effect/mapping_helpers/airlock/access/all/science/general, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"fUz" = ( -/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/plating, -/area/station/maintenance/central/greater) "fUC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral, @@ -16241,12 +16207,10 @@ /turf/open/floor/plating, /area/station/construction/mining/aux_base) "fVl" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/cigarettes/cigars/cohiba{ - pixel_x = 2; - pixel_y = 10 +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 }, -/turf/open/floor/wood/large, +/turf/open/floor/stone, /area/station/service/bar) "fVy" = ( /obj/effect/turf_decal/tile/purple/opposingcorners, @@ -16275,15 +16239,6 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"fVQ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "fVU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -16414,6 +16369,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"fYe" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood, +/area/station/service/chapel) "fYo" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -16439,8 +16402,13 @@ /area/station/commons/dorms) "fYJ" = ( /obj/structure/table/wood, -/obj/item/food/lizard_fries, -/turf/open/floor/wood/large, +/obj/structure/displaycase/forsale/kitchen{ + pixel_y = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/iron/dark/diagonal, /area/station/service/bar) "fYU" = ( /obj/effect/spawner/random/structure/crate_loot, @@ -16540,7 +16508,6 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/line, -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 10 }, @@ -16601,6 +16568,13 @@ /obj/effect/mapping_helpers/requests_console/assistance, /turf/open/floor/iron/white/small, /area/station/science/lab) +"gbj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/light/floor, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) "gby" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/herringbone, @@ -16822,8 +16796,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, +/obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/service/library) "gfs" = ( @@ -17032,24 +17006,6 @@ /obj/machinery/nuclearbomb/beer, /turf/open/floor/iron/freezer, /area/station/command/corporate_suite) -"giB" = ( -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/hallway/primary/central/aft) "giU" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 1 @@ -17199,18 +17155,10 @@ /turf/open/floor/iron/grimy, /area/station/commons) "gls" = ( -/obj/item/radio/intercom/directional/south, -/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/iron/grimy, -/area/station/service/library) -"glA" = ( -/obj/effect/landmark/start/hangover, -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/wood/tile, -/area/station/service/bar) +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/central/greater) "glJ" = ( /obj/effect/turf_decal/tile/brown/opposingcorners, /obj/effect/turf_decal/siding/wideplating, @@ -17242,6 +17190,28 @@ }, /turf/open/floor/iron, /area/station/engineering/hallway) +"glT" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/table, +/obj/machinery/reagentgrinder{ + pixel_y = 9; + pixel_x = 4 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/enzyme{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/effect/turf_decal/siding{ + dir = 5 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "glY" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/rack, @@ -17281,6 +17251,21 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai) +"gnL" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 6 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "gnQ" = ( /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/hidden, /obj/effect/spawner/structure/window, @@ -17483,15 +17468,6 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/security) -"grI" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/turf/open/floor/wood/tile, -/area/station/service/bar) "gsh" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -17631,9 +17607,6 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron, /area/station/security/brig/entrance) -"gvY" = ( -/turf/closed/wall/r_wall, -/area/space) "gwa" = ( /obj/structure/chair{ dir = 1 @@ -17651,11 +17624,24 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/small, /area/station/engineering/atmos/storage/gas) +"gwm" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "gwx" = ( /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/tile/neutral{ dir = 8 @@ -17854,11 +17840,8 @@ /turf/open/floor/iron, /area/station/security/brig/entrance) "gyy" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/iron/grimy, +/obj/structure/table/wood, +/turf/open/floor/stone, /area/station/service/bar) "gzs" = ( /obj/effect/turf_decal/stripes/white/line{ @@ -18130,6 +18113,16 @@ "gCT" = ( /turf/closed/wall, /area/station/hallway/secondary/command) +"gDc" = ( +/obj/structure/table/reinforced, +/obj/item/folder/blue{ + pixel_y = 2 + }, +/obj/item/pen, +/obj/machinery/airalarm/directional/south, +/obj/machinery/status_display/evac/directional/east, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "gDe" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 4 @@ -18371,14 +18364,13 @@ /turf/open/floor/wood, /area/station/cargo/miningfoundry) "gGx" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/obj/item/kirbyplants/random, /obj/effect/turf_decal/siding/wood{ - dir = 4 + dir = 5 }, -/turf/open/floor/stone, +/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/bar) "gGB" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -18476,15 +18468,18 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "gIv" = ( -/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 = 8 - }, +/obj/machinery/camera/autoname/directional/east, +/obj/item/radio/intercom/directional/east, /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/turf/open/floor/stone, +/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 = 8 + }, +/obj/structure/cable, +/turf/open/floor/wood/tile, /area/station/service/bar) "gIx" = ( /obj/structure/cable, @@ -18581,6 +18576,16 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/carpet/royalblue, /area/station/command/corporate_suite) +"gJD" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/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, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "gJQ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/table, @@ -18652,6 +18657,12 @@ }, /turf/open/floor/iron/small, /area/station/service/barber) +"gKR" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "gKT" = ( /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, @@ -18672,8 +18683,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, /turf/open/floor/plating, /area/station/maintenance/central/greater) @@ -18724,9 +18736,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "gLV" = ( @@ -18870,14 +18879,14 @@ /turf/open/floor/wood, /area/station/engineering/atmos) "gNP" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral{ 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, /turf/open/floor/iron, /area/station/hallway/primary/port) "gNS" = ( @@ -18895,6 +18904,10 @@ dir = 1 }, /area/station/cargo/office) +"gNX" = ( +/obj/machinery/light/floor, +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics) "gOm" = ( /turf/closed/wall/r_wall, /area/station/ai_monitored/turret_protected/aisat/equipment) @@ -19274,11 +19287,6 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/security/medical) -"gUN" = ( -/obj/effect/turf_decal/weather/dirt, -/obj/structure/flora/tree/jungle/style_5, -/turf/open/floor/grass, -/area/station/service/chapel) "gUV" = ( /obj/structure/cable, /obj/structure/chair/stool/directional/south{ @@ -19536,14 +19544,6 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron/dark, /area/station/medical/medbay/central) -"haH" = ( -/obj/machinery/food_cart, -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/obj/effect/turf_decal/weather/snow, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "haO" = ( /obj/effect/turf_decal/stripes/white/end, /obj/machinery/door/poddoor/shutters{ @@ -19743,6 +19743,19 @@ /obj/effect/turf_decal/siding/yellow, /turf/open/floor/wood/tile, /area/station/command/bridge) +"hcQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/newscaster/directional/north, +/turf/open/floor/stone, +/area/station/service/bar) "hcT" = ( /obj/machinery/computer/slot_machine{ pixel_y = 2 @@ -19832,6 +19845,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/service/library) "hdQ" = ( @@ -19850,23 +19864,17 @@ /obj/effect/spawner/structure/window/reinforced/plasma, /turf/open/floor/plating, /area/station/engineering/supermatter/room) -"hdW" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/camera/autoname/directional/east, -/obj/effect/spawner/random/entertainment/arcade{ - dir = 8 - }, -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/eighties/red, -/area/station/hallway/primary/central/fore) "hdZ" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"hed" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/chapel) "hei" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -20051,6 +20059,15 @@ }, /turf/open/floor/iron, /area/station/maintenance/department/medical/central) +"hgH" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "hgP" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, @@ -20128,12 +20145,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/fore/greater) -"hhZ" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/space/basic, -/area/space) "hic" = ( /obj/machinery/holopad, /turf/open/floor/wood/large, @@ -20167,13 +20178,6 @@ }, /turf/open/floor/iron/small, /area/station/security/office) -"hiD" = ( -/obj/machinery/door/airlock/multi_tile/public{ - dir = 1 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/bar) "hiK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -20334,14 +20338,6 @@ /obj/machinery/status_display/ai/directional/west, /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/command/nuke_storage) -"hla" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Public Shrine" - }, -/obj/effect/turf_decal/siding/wood/end, -/obj/machinery/door/firedoor, -/turf/open/floor/stone, -/area/station/hallway/primary/port) "hlE" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 4 @@ -20416,6 +20412,12 @@ /obj/structure/chair/stool/directional/east, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) +"hmn" = ( +/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/hallway/primary/central/aft) "hmt" = ( /obj/structure/closet/crate, /obj/item/stack/license_plates/empty/fifty, @@ -20435,12 +20437,28 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) "hmC" = ( -/obj/effect/turf_decal/siding/wood/corner, /obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, -/turf/open/floor/stone, +/turf/open/floor/wood, /area/station/service/chapel) +"hmH" = ( +/obj/effect/spawner/xmastree, +/obj/structure/flora/tree/jungle/style_3, +/turf/open/floor/grass, +/area/station/service/chapel) +"hmK" = ( +/obj/machinery/door/airlock/wood{ + name = "Bar Backroom" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/structure/cable, +/turf/open/floor/iron/dark/textured_half{ + dir = 1 + }, +/area/station/service/bar/backroom) "hmQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/table, @@ -20535,10 +20553,10 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/item/radio/intercom/directional/west, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "hok" = ( @@ -20718,6 +20736,16 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) +"hrl" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/window/right/directional/west, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters" + }, +/turf/open/floor/iron, +/area/station/service/kitchen) "hrx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -20803,9 +20831,12 @@ /turf/open/floor/iron/small, /area/station/engineering/break_room) "hsx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/floor, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/vending/boozeomat, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/dark/diagonal, /area/station/service/bar) "hsy" = ( /obj/structure/railing/corner{ @@ -20829,6 +20860,13 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"hsH" = ( +/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/plating, +/area/station/maintenance/central/greater) "hsJ" = ( /obj/docking_port/stationary/mining_home, /obj/effect/turf_decal/stripes/white/line, @@ -21111,7 +21149,6 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/obj/item/kirbyplants/random, /obj/item/storage/box{ pixel_x = -8; pixel_y = 15 @@ -21242,6 +21279,8 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) "hzK" = ( @@ -21272,7 +21311,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 10 }, -/turf/open/floor/stone, +/turf/open/floor/wood, /area/station/service/chapel) "hAC" = ( /obj/machinery/light/small/directional/east, @@ -21322,6 +21361,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/fore) "hBA" = ( @@ -21640,26 +21680,6 @@ /obj/structure/sign/departments/telecomms/directional/south, /turf/open/floor/iron, /area/station/science/lobby) -"hHj" = ( -/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/bar, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) -"hHn" = ( -/obj/effect/turf_decal/weather/snow, -/obj/structure/closet/secure_closet/freezer/fridge, -/obj/effect/turf_decal/weather/snow/corner, -/obj/item/food/meat/bacon, -/obj/item/food/meat/bacon, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "hHy" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -22036,13 +22056,7 @@ }, /area/station/security/execution/transfer) "hOO" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 9 - }, -/obj/effect/turf_decal/weather/dirt{ - dir = 5 - }, -/obj/structure/flora/bush/large/style_random, +/obj/structure/flora/tree/jungle/small/style_4, /turf/open/floor/grass, /area/station/service/chapel) "hOX" = ( @@ -22060,8 +22074,6 @@ /obj/effect/decal/cleanable/dirt, /obj/structure/rack, /obj/effect/spawner/random/maintenance, -/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/central/greater) "hPd" = ( @@ -22129,6 +22141,21 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/circuit, /area/station/tcommsat/server) +"hQs" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 9 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "hQx" = ( /obj/effect/turf_decal/siding/wideplating/dark/corner, /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -22166,10 +22193,12 @@ /turf/open/floor/plating, /area/station/maintenance/port/aft) "hRc" = ( +/obj/structure/cable, /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 8 }, +/obj/structure/closet/crate/wooden/toy, /turf/open/floor/iron/smooth, /area/station/service/greenroom) "hRd" = ( @@ -22301,10 +22330,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/grimy, /area/station/engineering/main) -"hUj" = ( -/obj/structure/disposalpipe/segment, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "hUq" = ( /obj/structure/table/glass, /turf/open/floor/iron/smooth, @@ -22403,6 +22428,7 @@ /obj/machinery/light/small/directional/south, /obj/item/radio/intercom/directional/south, /obj/structure/flora/bush/flowers_yw, +/obj/machinery/camera/directional/south, /turf/open/floor/grass, /area/station/service/chapel) "hVX" = ( @@ -22457,15 +22483,6 @@ }, /turf/open/floor/iron/showroomfloor, /area/station/commons/toilet/auxiliary) -"hWG" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/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/primary/central/aft) "hWJ" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -22475,6 +22492,14 @@ /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/security) +"hWL" = ( +/obj/effect/turf_decal/weather/snow, +/obj/effect/turf_decal/weather/snow/corner, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "hWU" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -22991,6 +23016,13 @@ dir = 8 }, /area/station/maintenance/port/greater) +"ifu" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "ifH" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/red/line{ @@ -23388,6 +23420,16 @@ }, /turf/open/floor/iron/small, /area/station/hallway/secondary/service) +"ily" = ( +/obj/effect/turf_decal/box/corners, +/obj/effect/turf_decal/box/corners{ + dir = 8 + }, +/obj/machinery/plumbing/input{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "ilz" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt/dust, @@ -23466,6 +23508,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/fore) "inR" = ( @@ -23488,9 +23531,9 @@ /turf/open/floor/iron/white/side, /area/station/hallway/primary/central/aft) "ioa" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, /turf/open/floor/stone, /area/station/service/bar) "iob" = ( @@ -23625,6 +23668,15 @@ dir = 8 }, /area/station/command/bridge) +"ipt" = ( +/obj/structure/disposalpipe/segment{ + 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/plating, +/area/station/maintenance/central/greater) "ipx" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -23653,12 +23705,6 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) -"ipG" = ( -/obj/machinery/deepfryer, -/obj/structure/sign/poster/official/random/directional/north, -/obj/structure/cable, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "ipP" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/stripes/corner{ @@ -23888,19 +23934,6 @@ }, /turf/closed/wall, /area/station/hallway/primary/port) -"isO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) "isQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24259,6 +24292,22 @@ dir = 1 }, /area/station/maintenance/central/lesser) +"izu" = ( +/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/cobweb/cobweb2, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) +"izA" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/starboard) "izD" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -24276,6 +24325,20 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor, /area/station/engineering/atmos/storage/gas) +"izP" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "izT" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 8 @@ -24377,14 +24440,6 @@ }, /turf/open/floor/iron/white, /area/station/security/medical) -"iBa" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/service/bar) "iBc" = ( /obj/effect/turf_decal/siding/thinplating_new/terracotta{ dir = 5 @@ -24411,6 +24466,15 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"iBt" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/bartender, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, +/turf/open/floor/stone, +/area/station/service/bar/backroom) "iBu" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/smooth, @@ -24638,6 +24702,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "iFE" = ( @@ -24675,6 +24743,9 @@ /area/station/maintenance/solars/port/aft) "iGq" = ( /obj/effect/landmark/start/librarian, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/wood/parquet, /area/station/service/library) "iGt" = ( @@ -24778,6 +24849,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"iId" = ( +/obj/machinery/processor{ + pixel_y = 6 + }, +/obj/machinery/camera/autoname/directional/west, +/obj/structure/table, +/obj/effect/turf_decal/siding/end, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "iIs" = ( /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -24795,6 +24875,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "iIw" = ( @@ -25405,12 +25486,6 @@ /obj/structure/curtain, /turf/open/floor/iron/freezer, /area/station/command/heads_quarters/captain/private) -"iQe" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/stone, -/area/station/service/bar) "iQl" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -25462,6 +25537,12 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) +"iRk" = ( +/obj/effect/turf_decal/stripes/white/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/station/science/cytology) "iRl" = ( /obj/structure/table/wood, /obj/item/food/grown/citrus/lemon{ @@ -25489,6 +25570,25 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/fore/lesser) +"iRE" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/flowers_yw, +/turf/open/floor/grass, +/area/station/service/chapel) +"iRQ" = ( +/obj/effect/turf_decal/weather/snow, +/obj/structure/closet/secure_closet/freezer/fridge, +/obj/item/food/meat/bacon, +/obj/item/food/meat/bacon, +/obj/item/food/meat/slab/monkey, +/obj/item/food/meat/slab/monkey, +/obj/item/food/meat/slab/monkey, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "iSb" = ( /obj/structure/frame/computer{ dir = 1 @@ -25527,7 +25627,7 @@ /turf/open/floor/iron, /area/station/security/execution/transfer) "iSD" = ( -/turf/open/misc/dirt/jungle, +/turf/open/misc/dirt/station, /area/station/service/chapel) "iSE" = ( /obj/machinery/atmospherics/pipe/layer_manifold/cyan/visible, @@ -25894,6 +25994,17 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) +"iXu" = ( +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/north, +/turf/open/floor/iron/small, +/area/station/hallway/primary/central/aft) "iXx" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/closed/wall/r_wall, @@ -25919,17 +26030,18 @@ /turf/open/floor/iron/dark, /area/station/science/server) "iXW" = ( -/obj/structure/sign/poster/official/random/directional/north, /obj/structure/table/wood, -/obj/item/gun/ballistic/shotgun/doublebarrel, -/obj/structure/reagent_dispensers/beerkeg, -/obj/structure/reagent_dispensers/beerkeg{ - pixel_y = 5 - }, -/obj/machinery/camera/autoname/directional/north, /obj/effect/turf_decal/siding/wood{ - dir = 1 + dir = 5 + }, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_x = 5; + pixel_y = 6 }, +/obj/machinery/camera/autoname/directional/north, +/obj/machinery/firealarm/directional/east, +/obj/item/gun/ballistic/shotgun/doublebarrel, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/stone, /area/station/service/bar/backroom) "iXZ" = ( @@ -25938,16 +26050,9 @@ /obj/structure/disposalpipe/junction/flip{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) -"iYd" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/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/service/library) "iYh" = ( /obj/structure/fluff/broken_canister_frame, /turf/open/floor/plating, @@ -26041,6 +26146,7 @@ codes_txt = "patrol;next_patrol=19.0-Engineering-CentralPort"; location = "18.0-ToolStorage-Engineering" }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/fore) "iZM" = ( @@ -26048,6 +26154,19 @@ /obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/service/library) +"iZO" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 5 + }, +/obj/effect/turf_decal/trimline/neutral/corner{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "iZU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -26192,6 +26311,20 @@ /obj/machinery/photocopier, /turf/open/floor/iron/dark, /area/station/security/office) +"jbX" = ( +/obj/effect/landmark/start/assistant, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line, +/obj/effect/turf_decal/trimline/neutral/line{ + 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/hallway/primary/central/aft) "jch" = ( /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) @@ -26225,6 +26358,19 @@ /obj/machinery/door/window/right/directional/south, /turf/open/floor/plating, /area/station/service/chapel/funeral) +"jcB" = ( +/obj/machinery/door/airlock/wood{ + name = "Bar Backroom" + }, +/obj/effect/mapping_helpers/airlock/access/all/service/bar, +/obj/machinery/door/firedoor, +/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/textured_half{ + dir = 1 + }, +/area/station/service/bar) "jcE" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26232,11 +26378,6 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) -"jcG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron/white/small, -/area/station/service/hydroponics) "jcU" = ( /obj/structure/chair/wood/wings{ dir = 1 @@ -26353,7 +26494,6 @@ /turf/open/floor/iron/smooth, /area/station/security/evidence) "jfT" = ( -/obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 1 }, @@ -26366,9 +26506,6 @@ /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 8 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 - }, /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/service/greenroom) @@ -26377,17 +26514,13 @@ dir = 8 }, /obj/structure/flora/bush/jungle/a/style_3, -/turf/open/misc/dirt/jungle, +/turf/open/misc/dirt/station, /area/station/service/chapel) -"jgx" = ( -/obj/effect/turf_decal/tile/green/opposingcorners, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 8 - }, -/obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/hydroponics/constructable, -/turf/open/floor/iron, -/area/station/service/hydroponics) +"jgy" = ( +/obj/effect/spawner/random/trash/hobo_squat, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "jgF" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 @@ -26582,13 +26715,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron, /area/station/medical/chemistry) -"jjZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "jkz" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -26662,6 +26788,19 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/dark/small, /area/station/service/chapel/storage) +"jlA" = ( +/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, +/obj/effect/spawner/random/structure/steam_vent, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) +"jlC" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/stone, +/area/station/service/chapel) "jlL" = ( /obj/structure/closet/secure_closet/engineering_chief, /obj/item/storage/briefcase/secure, @@ -26809,10 +26948,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/smooth, /area/station/security/evidence) -"jnO" = ( -/obj/machinery/space_heater, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "jnZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -26984,6 +27119,18 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron/diagonal, /area/station/engineering/lobby) +"jqK" = ( +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 + }, +/obj/machinery/biogenerator, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/service/hydroponics) "jqZ" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -27013,20 +27160,6 @@ }, /turf/open/floor/iron/dark, /area/station/medical/chemistry) -"jrl" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/landmark/navigate_destination/teleporter, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "jrs" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -27047,17 +27180,6 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating/rust, /area/station/maintenance/fore/lesser) -"jrN" = ( -/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/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "jrS" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 10 @@ -27111,6 +27233,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "jsJ" = ( @@ -27234,7 +27357,6 @@ "juP" = ( /obj/machinery/light/small/directional/south, /obj/machinery/status_display/evac/directional/south, -/obj/effect/turf_decal/siding/wood, /turf/open/floor/stone, /area/station/service/chapel) "juS" = ( @@ -27270,25 +27392,9 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/fore) -"jvL" = ( -/obj/structure/table/reinforced, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters{ - name = "Kitchen Shutters"; - id = "kitchenshutters" - }, -/turf/open/floor/plating, -/area/station/service/kitchen) "jvN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -27373,11 +27479,6 @@ }, /turf/open/floor/iron, /area/station/security) -"jwt" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/table, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "jwC" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible/layer2{ dir = 5 @@ -27583,23 +27684,6 @@ /obj/effect/mapping_helpers/airlock/abandoned, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) -"jzf" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock{ - name = "Library Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/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/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/service/library) "jzg" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 1 @@ -27698,6 +27782,19 @@ }, /turf/open/floor/iron/dark/small, /area/station/ai_monitored/security/armory) +"jBu" = ( +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + 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/plating, +/area/station/maintenance/central/greater) "jBA" = ( /obj/structure/cable, /obj/machinery/power/smes/super/full, @@ -27730,7 +27827,7 @@ /area/station/maintenance/port/fore) "jCm" = ( /obj/effect/landmark/start/hangover, -/turf/open/misc/dirt/jungle, +/turf/open/misc/dirt/station, /area/station/service/chapel) "jCo" = ( /obj/structure/cable, @@ -27804,6 +27901,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) +"jDT" = ( +/obj/machinery/light/floor, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/stone, +/area/station/service/bar) "jEc" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -27928,12 +28035,12 @@ /turf/open/space/basic, /area/space/nearstation) "jFm" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, /obj/effect/turf_decal/siding/wood, /obj/effect/spawner/random/vending/snackvend, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/tile, /area/station/service/bar) "jFw" = ( /obj/item/kirbyplants/random, @@ -27965,11 +28072,12 @@ /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "jFK" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, /obj/effect/turf_decal/siding/wood, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/wood/tile, /area/station/service/bar) "jGc" = ( /obj/structure/window/spawner/directional/east, @@ -27990,6 +28098,15 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) +"jGy" = ( +/obj/machinery/power/apc/auto_name/directional/north, +/obj/machinery/vending/wardrobe/bar_wardrobe, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/stone, +/area/station/service/bar/backroom) "jGA" = ( /obj/structure/chair/sofa/bench/right{ dir = 4 @@ -28232,18 +28349,13 @@ /area/station/cargo/office) "jJd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new{ +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 8 }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) +/obj/machinery/hydroponics/constructable, +/turf/open/floor/iron, +/area/station/service/hydroponics) "jJg" = ( /obj/effect/turf_decal/siding/wideplating, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28337,14 +28449,6 @@ "jKU" = ( /turf/closed/wall, /area/station/engineering/atmos/storage/gas) -"jKV" = ( -/obj/machinery/processor{ - pixel_y = 6 - }, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/table, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "jLb" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -28367,6 +28471,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "jLB" = ( @@ -28440,10 +28545,6 @@ }, /turf/open/floor/iron/small, /area/station/engineering/atmos/pumproom) -"jMA" = ( -/obj/structure/chair/stool/bar/directional/east, -/turf/open/floor/wood/large, -/area/station/service/bar) "jMC" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 8 @@ -28594,6 +28695,13 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"jOM" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "jOS" = ( /obj/machinery/vending/cigarette, /obj/machinery/light/small/directional/south, @@ -28680,6 +28788,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Fore Primary Hallway" }, +/obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/hallway/primary/central/fore) "jRk" = ( @@ -28722,6 +28831,13 @@ /obj/structure/chair/sofa/bench, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"jRz" = ( +/obj/structure/flora/bush/large/style_3, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "jRE" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -28742,6 +28858,14 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"jRK" = ( +/obj/machinery/door/airlock{ + name = "Hydroponics Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/hydroponics, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "jRR" = ( /obj/machinery/atmospherics/components/binary/crystallizer{ dir = 4 @@ -28770,6 +28894,16 @@ /obj/item/bedsheet/brown, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"jSp" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/hallway/primary/central/fore) "jSw" = ( /obj/structure/railing, /turf/open/floor/catwalk_floor, @@ -28820,6 +28954,22 @@ /obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/security/detectives_office) +"jTj" = ( +/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/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) +"jTn" = ( +/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/central/greater) "jTu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -28908,14 +29058,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/department/electrical) -"jUA" = ( -/obj/structure/table, -/obj/item/storage/bag/tray, -/obj/item/knife/kitchen{ - pixel_y = 2 - }, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "jUU" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28939,6 +29081,11 @@ /obj/effect/mapping_helpers/airlock/access/all/security/general, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"jVx" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark/side, +/area/station/maintenance/central/greater) "jVI" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/landmark/event_spawn, @@ -29150,6 +29297,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"jYe" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/turf/open/floor/eighties, +/area/station/hallway/primary/central/fore) "jYr" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/mecha_part_fabricator{ @@ -29177,6 +29330,11 @@ /obj/structure/cable, /turf/open/floor/iron/white/small, /area/station/service/janitor) +"jYM" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/station/service/bar) "jYU" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "hopqueue"; @@ -29364,20 +29522,6 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/iron/showroomfloor, /area/station/medical/surgery/theatre) -"kcM" = ( -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/machinery/camera/autoname/directional/west, -/obj/structure/disposalpipe/segment, -/obj/machinery/light/small/directional/west, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) "kcQ" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 1 @@ -29426,11 +29570,6 @@ /obj/machinery/light_switch/directional/west, /turf/open/floor/iron/white/small, /area/station/science/server) -"keb" = ( -/obj/structure/cable, -/obj/effect/spawner/random/structure/girder, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "kee" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/corner{ @@ -29462,7 +29601,7 @@ /area/station/security/prison/work) "keL" = ( /obj/effect/turf_decal/siding/wood, -/turf/open/floor/stone, +/turf/open/floor/wood, /area/station/service/chapel) "keO" = ( /obj/effect/spawner/random/trash, @@ -29476,7 +29615,11 @@ /turf/open/floor/iron, /area/station/science/lower) "keQ" = ( -/obj/structure/flora/grass/jungle/b/style_3, +/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/structure/flora/bush/flowers_yw, /turf/open/floor/grass, /area/station/service/chapel) "keS" = ( @@ -29534,17 +29677,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/airalarm/directional/east, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"kfO" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/chair/wood{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/service/bar) "kfW" = ( /obj/effect/turf_decal/siding/yellow{ dir = 1 @@ -29587,7 +29722,7 @@ /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/components/unary/passive_vent, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "kgw" = ( /obj/machinery/door/airlock{ name = "Gambling Den" @@ -29791,6 +29926,10 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"kiY" = ( +/obj/structure/flora/tree/jungle/style_6, +/turf/open/floor/grass, +/area/station/service/chapel) "kjg" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -29817,6 +29956,18 @@ dir = 8 }, /area/station/hallway/secondary/dock) +"kjx" = ( +/obj/effect/turf_decal/weather/snow, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 10 + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/structure/cable, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "kjO" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/effect/turf_decal/siding/white{ @@ -29903,6 +30054,11 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) +"klf" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "klF" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 4 @@ -30008,19 +30164,6 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"kmz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/end{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "kmC" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -30359,6 +30502,12 @@ /obj/structure/cable, /turf/open/floor/iron/stairs, /area/station/maintenance/department/science/xenobiology) +"krF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/chapel) "krG" = ( /obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, @@ -30409,8 +30558,22 @@ /turf/open/floor/circuit, /area/station/tcommsat/server) "ksm" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/stone, +/obj/structure/table/wood, +/obj/machinery/camera/autoname/directional/north, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/barsign{ + chosen_sign = "thecavern"; + icon_state = "thecavern"; + pixel_y = 32 + }, +/obj/machinery/reagentgrinder{ + pixel_x = -5; + pixel_y = 10 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/iron/dark/diagonal, /area/station/service/bar) "kso" = ( /obj/structure/disposalpipe/junction{ @@ -30470,10 +30633,10 @@ /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/decal/cleanable/dirt, +/obj/structure/disposalpipe/segment{ + dir = 9 }, -/obj/effect/mapping_helpers/mail_sorting/service/hydroponics, /turf/open/floor/plating, /area/station/maintenance/central/greater) "ksN" = ( @@ -30621,6 +30784,7 @@ dir = 1 }, /obj/effect/turf_decal/trimline/neutral/line, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "kuO" = ( @@ -30860,30 +31024,6 @@ /obj/effect/turf_decal/trimline/neutral/line, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"kyZ" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) -"kzu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "kzv" = ( /obj/structure/chair/sofa/bench/left{ dir = 8 @@ -30894,25 +31034,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) -"kzx" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/hallway/primary/central/fore) -"kzz" = ( -/obj/effect/turf_decal/weather/dirt, -/mob/living/basic/deer, -/obj/structure/flora/bush/flowers_yw, -/turf/open/floor/grass, -/area/station/service/chapel) "kzI" = ( /obj/effect/turf_decal/bot_white, /obj/effect/spawner/random/structure/closet_empty/crate, @@ -30929,7 +31050,10 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, /area/station/service/chapel) "kAf" = ( /obj/structure/transit_tube/station/dispenser/flipped{ @@ -31003,14 +31127,13 @@ /turf/closed/wall/mineral/titanium/nodiagonal, /area/station/engineering/supermatter) "kBM" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 8 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/eighties/red, +/obj/effect/turf_decal/siding/thinplating{ + dir = 10 + }, +/turf/open/floor/eighties, /area/station/hallway/primary/central/fore) "kBZ" = ( /obj/machinery/door/airlock/command{ @@ -31354,13 +31477,6 @@ }, /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) -"kHU" = ( -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 8 - }, -/obj/effect/landmark/start/botanist, -/turf/open/floor/iron/white/small, -/area/station/service/hydroponics) "kHX" = ( /obj/effect/turf_decal/tile/neutral, /turf/open/floor/iron, @@ -31509,19 +31625,6 @@ /obj/structure/cable, /turf/open/floor/iron/stairs, /area/station/engineering/storage/tech) -"kJX" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "kKa" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -31744,19 +31847,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"kPp" = ( -/obj/structure/closet/secure_closet/bar, -/obj/item/stack/spacecash/c1, -/obj/item/stack/spacecash/c1, -/obj/item/stack/spacecash/c1, -/obj/item/stack/spacecash/c1, -/obj/item/stack/spacecash/c1, -/obj/machinery/airalarm/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/turf/open/floor/stone, -/area/station/service/bar/backroom) "kPv" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -31782,30 +31872,15 @@ "kPW" = ( /turf/open/floor/plating, /area/station/maintenance/port/fore) -"kQc" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "kQe" = ( /obj/machinery/button/door/directional/west{ id = "QMLoaddoor"; - layer = 4; name = "Loading Doors"; pixel_y = -8; req_access = list("cargo") }, /obj/machinery/button/door/directional/west{ id = "QMLoaddoor2"; - layer = 4; name = "Loading Doors"; pixel_y = 8; req_access = list("cargo") @@ -31847,14 +31922,6 @@ /obj/machinery/holopad, /turf/open/floor/iron, /area/station/cargo/storage) -"kRs" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/table/wood, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron/grimy, -/area/station/service/bar) "kRt" = ( /obj/machinery/monkey_recycler, /obj/effect/turf_decal/siding/white{ @@ -31875,7 +31942,6 @@ /turf/open/floor/engine/air, /area/station/engineering/atmos/space_catwalk) "kRA" = ( -/obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 }, @@ -31992,6 +32058,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron/textured_half{ dir = 8 }, @@ -32000,20 +32067,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/command/heads_quarters/qm) -"kTr" = ( -/obj/machinery/door/airlock/wood{ - name = "Bar Backroom" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/bar, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/stone, -/area/station/service/bar) "kTt" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -32076,6 +32129,10 @@ /obj/structure/cable, /turf/open/floor/iron/small, /area/station/hallway/primary/central/fore) +"kUa" = ( +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "kUf" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -32110,9 +32167,7 @@ "kVg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, +/obj/structure/chair/sofa/bench/left, /turf/open/floor/stone, /area/station/service/chapel) "kVn" = ( @@ -32166,6 +32221,17 @@ /obj/machinery/firealarm/directional/west, /turf/open/floor/iron/small, /area/station/security/office) +"kWF" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/service/bar) "kWJ" = ( /obj/structure/chair/sofa/bench/left{ dir = 1 @@ -32218,14 +32284,12 @@ /turf/open/floor/iron/white/small, /area/station/security/warden) "kXC" = ( -/obj/structure/sign/clock/directional/north, -/obj/structure/table/wood, -/obj/machinery/reagentgrinder{ - pixel_x = -5; - pixel_y = 10 - }, -/turf/open/floor/iron/dark/textured, -/area/station/service/bar) +/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/plating, +/area/station/maintenance/central/greater) "kXM" = ( /obj/effect/spawner/random/structure/girder, /obj/structure/barricade/wooden, @@ -32330,6 +32394,15 @@ /obj/structure/flora/grass/jungle/b/style_3, /turf/open/floor/grass, /area/station/service/chapel) +"kZv" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "AI Core shutters"; + name = "AI Core Shutter" + }, +/turf/open/floor/iron/stairs, +/area/station/ai_monitored/turret_protected/ai) "kZx" = ( /obj/machinery/button/door/directional/north{ id = "main_surgery"; @@ -32373,8 +32446,22 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, /area/station/service/chapel) +"lab" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/hallway/primary/central/aft) "lae" = ( /obj/machinery/atmospherics/components/binary/pump/on{ name = "Cold Loop to Gas" @@ -32439,6 +32526,22 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) +"lbi" = ( +/obj/structure/flora/bush/flowers_br, +/obj/structure/flora/bush/flowers_yw, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/station/hallway/primary/central/fore) +"lbl" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/item/storage/fancy/candle_box, +/obj/structure/rack/skeletal, +/obj/machinery/camera/autoname/directional/west, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/grimy, +/area/station/service/library) "lbF" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ dir = 1 @@ -32949,6 +33052,7 @@ }, /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/hallway/primary/central/aft) "lhZ" = ( @@ -33051,24 +33155,20 @@ /turf/open/floor/plating/rust, /area/station/maintenance/department/engine/atmos) "ljg" = ( -/obj/structure/kitchenspike, /obj/effect/turf_decal/weather/snow/corner{ - dir = 5 + dir = 1 }, /obj/effect/turf_decal/weather/snow, -/obj/machinery/airalarm/directional/north, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, +/obj/machinery/light/small/directional/north, +/obj/machinery/icecream_vat, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "lji" = ( +/obj/structure/flora/tree/jungle/style_2, /obj/effect/turf_decal/weather/dirt{ - dir = 1 + dir = 9 }, -/obj/structure/flora/bush/flowers_yw/style_3, -/obj/structure/extinguisher_cabinet/directional/north, -/obj/machinery/camera/directional/north, /turf/open/floor/grass, /area/station/service/chapel) "ljl" = ( @@ -33279,6 +33379,12 @@ }, /turf/open/floor/wood/tile, /area/station/maintenance/central/lesser) +"llZ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/chair/stool/bamboo, +/obj/structure/cable, +/turf/open/floor/carpet/lone, +/area/station/service/chapel/office) "lmb" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -33337,16 +33443,48 @@ }, /area/station/hallway/secondary/construction) "lnD" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/rag{ + pixel_x = -6; + pixel_y = 6 }, -/turf/open/floor/stone, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 10; + pixel_y = 8 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 5; + pixel_y = 16 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass{ + pixel_x = 5; + pixel_y = 5 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_x = -7; + pixel_y = 15 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/sign/warning/no_smoking/circle/directional/north, +/turf/open/floor/iron/dark/diagonal, /area/station/service/bar) "lnI" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/ore_box, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"lnM" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/window/brigdoor/right/directional/north{ + atom_integrity = 300; + name = "AI Core Chamber Access"; + req_access = list("ai_upload") + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "lnN" = ( /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 8 @@ -33441,15 +33579,6 @@ /obj/machinery/holopad, /turf/open/floor/stone, /area/station/command/heads_quarters/hos) -"loN" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/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/hallway/primary/central/aft) "lpC" = ( /turf/open/floor/plating, /area/station/service/chapel/funeral) @@ -33526,6 +33655,18 @@ }, /turf/open/floor/iron/white/side, /area/station/hallway/primary/starboard) +"lqh" = ( +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/south, +/obj/structure/flora/bush/large/style_random{ + pixel_x = -17; + pixel_y = 2 + }, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/flora/bush/flowers_yw, +/obj/structure/flora/bush/lavendergrass, +/turf/open/floor/grass, +/area/station/service/hydroponics) "lql" = ( /turf/open/floor/wood/parquet, /area/station/service/library) @@ -33550,6 +33691,18 @@ /obj/effect/landmark/transport/nav_beacon/tram/platform/birdshot/prison_wing, /turf/open/floor/tram, /area/station/security/tram) +"lqQ" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "lrh" = ( /obj/structure/cable, /obj/effect/spawner/random/trash, @@ -33613,19 +33766,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/service/barber) -"lso" = ( -/obj/effect/mapping_helpers/airlock/access/all/service/bar, -/obj/machinery/door/airlock/wood{ - name = "Bar Backroom" - }, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/turf/open/floor/stone, -/area/station/service/bar) "lsK" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/smart/simple/brown/visible, @@ -33760,26 +33900,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"luD" = ( -/obj/structure/table/reinforced, -/obj/structure/desk_bell{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters{ - name = "Kitchen Shutters"; - id = "kitchenshutters" - }, -/turf/open/floor/plating, -/area/station/service/kitchen) -"luE" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/event_spawn, -/turf/open/floor/wood/tile, -/area/station/service/bar) "luG" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/opposingcorners, @@ -33787,9 +33907,8 @@ /turf/open/floor/iron, /area/station/commons/fitness/recreation/entertainment) "luP" = ( -/obj/effect/landmark/start/hangover, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 1 +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, /turf/open/floor/wood/tile, /area/station/service/bar) @@ -33811,12 +33930,11 @@ /turf/open/space/basic, /area/space/nearstation) "lvr" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/landmark/navigate_destination/bar, +/obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "lvu" = ( @@ -33839,6 +33957,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/aft) "lvA" = ( @@ -34149,6 +34268,23 @@ /obj/structure/window/spawner/directional/north, /turf/open/floor/grass, /area/station/cargo/storage) +"lzW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/table/glass, +/obj/item/paper_bin{ + pixel_x = -3; + pixel_y = 7 + }, +/obj/item/pen/invisible{ + pixel_x = -2; + pixel_y = 7 + }, +/obj/machinery/newscaster/directional/north, +/obj/item/storage/photo_album/library, +/turf/open/floor/iron/grimy, +/area/station/service/library) "lAk" = ( /obj/effect/turf_decal/siding/white{ dir = 9 @@ -34169,16 +34305,6 @@ }, /turf/open/floor/iron, /area/station/cargo/office) -"lAt" = ( -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/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/kitchen/small, -/area/station/service/kitchen) "lAO" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -34212,14 +34338,11 @@ /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/aft) "lAV" = ( -/obj/structure/table/wood, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 }, -/turf/open/floor/wood/large, +/obj/structure/cable, +/turf/open/floor/stone, /area/station/service/bar) "lBf" = ( /obj/effect/decal/cleanable/dirt, @@ -34499,13 +34622,22 @@ /turf/open/floor/wood/tile, /area/station/maintenance/aft) "lEO" = ( -/obj/structure/cable, -/obj/effect/spawner/random/structure/steam_vent, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/effect/turf_decal/siding/wood{ + dir = 5 }, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) +/obj/structure/table/glass, +/obj/item/flashlight/lamp/green{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/item/taperecorder{ + pixel_x = -15; + pixel_y = 3 + }, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/light_switch/directional/north, +/turf/open/floor/iron/grimy, +/area/station/service/library) "lER" = ( /turf/open/floor/iron/dark, /area/station/maintenance/department/engine/atmos) @@ -34515,6 +34647,15 @@ }, /turf/open/floor/plating, /area/station/maintenance/hallway/abandoned_command) +"lFm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood, +/area/station/service/chapel) "lFq" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -34678,9 +34819,8 @@ /area/station/science/lower) "lHp" = ( /obj/effect/turf_decal/siding/thinplating{ - dir = 9 + dir = 1 }, -/obj/structure/sign/poster/official/tactical_game_cards/directional/west, /turf/open/floor/eighties/red, /area/station/hallway/primary/central/fore) "lHt" = ( @@ -34731,6 +34871,12 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/wood/large, /area/station/command/heads_quarters/captain/private) +"lHZ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/closed/wall, +/area/station/hallway/primary/central/aft) "lIa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -34831,14 +34977,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"lJm" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/effect/spawner/random/vending/colavend, -/turf/open/floor/stone, -/area/station/service/bar) "lJB" = ( /obj/item/radio/intercom/directional/north{ broadcasting = 1; @@ -35055,19 +35193,11 @@ /turf/open/floor/plating, /area/station/maintenance/department/medical/central) "lMH" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/structure/table/glass, -/obj/item/flashlight/lamp/green{ - pixel_x = 2; - pixel_y = 9 - }, -/obj/item/taperecorder{ - pixel_x = -15; - pixel_y = 3 +/obj/item/radio/intercom/directional/south, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 }, -/obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/grimy, /area/station/service/library) "lNf" = ( @@ -35230,24 +35360,12 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) -"lPq" = ( -/obj/structure/flora/bush/flowers_yw/style_2, -/turf/open/floor/grass, -/area/station/service/chapel) "lPw" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer2{ dir = 5 }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"lPB" = ( -/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 = 1 - }, -/turf/open/floor/stone, -/area/station/service/chapel) "lPC" = ( /obj/structure/bookcase/random, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -35385,6 +35503,19 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) +"lRM" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/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, +/area/station/hallway/primary/central/fore) "lRU" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -35483,11 +35614,14 @@ /turf/open/floor/iron/dark, /area/station/cargo/storage) "lTy" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/obj/effect/landmark/start/hangover, /obj/effect/turf_decal/siding/wood/corner{ dir = 1 }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/stone, +/turf/open/floor/wood/tile, /area/station/service/bar) "lTA" = ( /obj/effect/decal/cleanable/dirt, @@ -35528,12 +35662,12 @@ icon_state = "L1"; pixel_y = -15 }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "lUo" = ( @@ -35803,6 +35937,14 @@ /obj/item/banner/cargo, /turf/open/floor/iron/grimy, /area/station/command/heads_quarters/qm) +"lYa" = ( +/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/sign/departments/exodrone/directional/west, +/turf/open/floor/plating, +/area/station/maintenance/port/greater) "lYf" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -35906,6 +36048,7 @@ color = "#52B4E9" }, /obj/machinery/camera/autoname/directional/north, +/obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/service/hydroponics) "lZt" = ( @@ -35991,24 +36134,9 @@ }, /turf/open/floor/grass, /area/station/service/chapel) -"lZW" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "mae" = ( -/obj/structure/table/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 6 - }, -/obj/machinery/chem_dispenser/drinks, -/turf/open/floor/iron/dark/textured, +/obj/structure/cable, +/turf/closed/wall, /area/station/service/bar) "maf" = ( /turf/closed/wall/rust, @@ -36047,19 +36175,6 @@ }, /turf/open/floor/sepia, /area/station/maintenance/aft) -"mbf" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/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/airlock/unres{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "mbp" = ( /obj/structure/hedge, /obj/machinery/light_switch/directional/east, @@ -36071,20 +36186,6 @@ /obj/machinery/pdapainter/medbay, /turf/open/floor/wood/parquet, /area/station/command/heads_quarters/cmo) -"mbC" = ( -/obj/structure/table/reinforced, -/obj/structure/displaycase/forsale/kitchen{ - pixel_y = 5 - }, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/machinery/door/poddoor/shutters{ - name = "Kitchen Shutters"; - id = "kitchenshutters" - }, -/turf/open/floor/plating, -/area/station/service/kitchen) "mbG" = ( /obj/structure/fluff/broken_canister_frame, /turf/open/floor/plating, @@ -36098,16 +36199,6 @@ /obj/machinery/cell_charger, /turf/open/floor/iron/grimy, /area/station/science/cubicle) -"mce" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 5 - }, -/obj/machinery/status_display/evac/directional/north, -/turf/open/floor/stone, -/area/station/service/bar) "mch" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -36192,6 +36283,7 @@ dir = 4 }, /obj/effect/landmark/start/hangover, +/obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/service/library) "mdm" = ( @@ -36262,16 +36354,6 @@ dir = 4 }, /area/station/hallway/secondary/entry) -"mfa" = ( -/obj/effect/landmark/start/assistant, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/end{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "mfl" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/firealarm/directional/west, @@ -36325,15 +36407,6 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor, /area/station/maintenance/department/electrical) -"mfV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/engineering/atmos) "mgt" = ( /obj/machinery/vending/boozeomat, /obj/machinery/firealarm/directional/south, @@ -36350,18 +36423,14 @@ "mgW" = ( /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 - }, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 6 }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 9 +/obj/structure/disposalpipe/segment{ + dir = 5 }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics) "mhk" = ( /turf/closed/wall, /area/station/maintenance/port/greater) @@ -36387,12 +36456,6 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/iron/dark/smooth_large, /area/station/service/lawoffice) -"mib" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half{ - dir = 8 - }, -/area/station/service/bar) "mid" = ( /obj/effect/spawner/random/structure/crate_loot, /turf/open/floor/plating, @@ -36545,15 +36608,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"mkz" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/floor/stone, -/area/station/service/chapel) "mkA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -36563,14 +36617,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/white/textured_large, /area/station/command/heads_quarters/cmo) -"mkD" = ( -/obj/machinery/vending/boozeomat, -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 - }, -/obj/machinery/status_display/ai/directional/north, -/turf/open/floor/iron/dark/textured, -/area/station/service/bar) "mkF" = ( /obj/structure/disposalpipe/segment, /obj/effect/landmark/start/depsec/supply, @@ -36636,6 +36682,18 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/smooth, /area/station/engineering/break_room) +"mlD" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/landmark/start/hangover, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "mlK" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -36699,6 +36757,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, +/obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/service/library) "mmT" = ( @@ -36753,16 +36812,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/maintenance/central/lesser) -"mno" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/firealarm/directional/south, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/stone, -/area/station/service/bar) "mnw" = ( /obj/effect/spawner/random/vending/colavend, /obj/machinery/firealarm/directional/east, @@ -36810,6 +36859,12 @@ }, /turf/open/floor/iron/smooth, /area/station/cargo/drone_bay) +"mnH" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/structure/closet_maintenance, +/obj/effect/landmark/start/hangover, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "mnN" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -36829,11 +36884,14 @@ /turf/open/floor/plating, /area/station/cargo/storage) "mog" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, +/obj/machinery/oven/range, +/obj/machinery/airalarm/directional/north, +/obj/machinery/power/apc/auto_name/directional/west, /obj/structure/cable, -/turf/open/floor/iron/kitchen/small, +/obj/effect/turf_decal/siding/end{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, /area/station/service/kitchen) "moj" = ( /obj/machinery/door/airlock{ @@ -36889,30 +36947,12 @@ /obj/machinery/light/small/directional/south, /turf/open/floor/carpet/lone, /area/station/service/abandoned_gambling_den) -"mpx" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/siding/thinplating{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/eighties, -/area/station/hallway/primary/central/fore) "mpy" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, /turf/open/floor/wood/parquet, /area/station/medical/psychology) -"mpB" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood/corner, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/light/floor, -/turf/open/floor/stone, -/area/station/service/bar) "mpE" = ( /obj/machinery/light/cold/dim/directional/north, /obj/structure/disposalpipe/segment{ @@ -37006,19 +37046,6 @@ /obj/machinery/light/small/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"mru" = ( -/obj/effect/mapping_helpers/requests_console/supplies, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/requests_console/auto_name/directional/south, -/turf/open/floor/stone, -/area/station/service/bar) "mrP" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -37059,6 +37086,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "msq" = ( @@ -37566,8 +37596,11 @@ /turf/open/floor/plating, /area/station/maintenance/department/electrical) "mDf" = ( -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, +/obj/structure/chair/wood{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/stone, /area/station/service/bar) "mDh" = ( /obj/structure/cable, @@ -37639,13 +37672,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/catwalk_floor/flat_white, /area/station/science/robotics/lab) -"mEb" = ( -/obj/structure/flora/bush/jungle/c/style_random, -/obj/effect/turf_decal/weather/dirt{ - dir = 6 - }, -/turf/open/floor/grass, -/area/station/service/chapel) "mEq" = ( /obj/structure/closet/crate/wooden{ name = "Alms Box" @@ -37945,9 +37971,6 @@ /obj/machinery/door/airlock/public/glass{ name = "Public Shrine" }, -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 - }, /obj/machinery/door/firedoor, /turf/open/floor/stone, /area/station/hallway/primary/port) @@ -38183,29 +38206,6 @@ }, /turf/open/floor/iron, /area/station/science/cytology) -"mLT" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/table/glass, -/obj/item/paper_bin{ - pixel_x = -3; - pixel_y = 7 - }, -/obj/item/pen/invisible{ - pixel_x = -2; - pixel_y = 7 - }, -/obj/machinery/newscaster/directional/north, -/obj/item/storage/photo_album/library, -/obj/item/book/codex_gigas, -/turf/open/floor/iron/grimy, -/area/station/service/library) -"mLU" = ( -/obj/machinery/vending/autodrobe, -/obj/machinery/light/small/directional/west, -/turf/open/floor/wood/parquet, -/area/station/service/greenroom) "mMp" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -38250,13 +38250,6 @@ }, /turf/open/floor/iron, /area/station/science/robotics/lab) -"mMO" = ( -/obj/structure/cable, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/structure/disposalpipe/segment, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "mMY" = ( /obj/effect/turf_decal/tile/dark_red/half/contrasted{ dir = 1 @@ -38330,6 +38323,11 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"mOr" = ( +/obj/effect/spawner/random/trash/bucket, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "mOx" = ( /obj/item/stack/sheet/iron/fifty, /obj/item/stack/rods/fifty, @@ -38453,6 +38451,12 @@ /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible, /turf/open/floor/iron/stairs/left, /area/station/engineering/atmos) +"mRB" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/end, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "mRD" = ( /obj/effect/turf_decal/bot_white, /obj/effect/spawner/random/maintenance, @@ -38671,6 +38675,16 @@ }, /turf/open/floor/wood/parquet, /area/station/service/library) +"mUm" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/status_display/ai/directional/west, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/cold/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "mUn" = ( /obj/structure/cable, /obj/machinery/door/airlock{ @@ -38719,6 +38733,7 @@ /obj/effect/turf_decal/stripes/red/line{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron/small, /area/station/hallway/primary/central/aft) "mVm" = ( @@ -38791,8 +38806,6 @@ /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/tile/neutral{ dir = 4 }, @@ -38922,26 +38935,6 @@ /obj/effect/turf_decal/tile/dark_red/opposingcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/security/armory) -"mYT" = ( -/obj/structure/table, -/obj/item/assembly/igniter{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = 5; - pixel_y = -4 - }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = -1 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "mYW" = ( /obj/machinery/camera{ c_tag = "Xenobiology - Zoo"; @@ -39175,6 +39168,21 @@ }, /turf/open/floor/tram, /area/station/maintenance/department/medical/central) +"ndJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/landmark/navigate_destination/teleporter, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "ndM" = ( /obj/structure/tank_dispenser/oxygen, /turf/open/floor/iron, @@ -39203,7 +39211,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 9 }, -/turf/open/floor/stone, +/turf/open/floor/wood, /area/station/service/chapel) "neL" = ( /obj/structure/closet/crate{ @@ -39259,13 +39267,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"ngv" = ( -/obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/grille, -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/floor/plating, -/area/station/hallway/primary/central/fore) "ngL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39348,6 +39349,17 @@ }, /turf/open/floor/iron/checker, /area/station/security/breakroom) +"nhW" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 + }, +/obj/machinery/vending/wardrobe/hydro_wardrobe, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics) "nhZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39494,6 +39506,19 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/hallway/secondary/construction) +"njT" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "njW" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -39604,10 +39629,10 @@ /turf/open/floor/iron/smooth, /area/station/engineering/atmos) "nlQ" = ( +/obj/machinery/holopad, /obj/effect/turf_decal/siding/thinplating{ - dir = 8 + dir = 4 }, -/obj/machinery/holopad, /turf/open/floor/eighties, /area/station/hallway/primary/central/fore) "nlS" = ( @@ -39636,6 +39661,19 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/small, /area/station/engineering/break_room) +"nmC" = ( +/obj/structure/table, +/obj/item/storage/bag/tray, +/obj/item/knife/kitchen{ + pixel_y = 2 + }, +/obj/effect/spawner/random/food_or_drink/cake_ingredients, +/obj/item/kitchen/rollingpin, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "nmH" = ( /obj/structure/railing, /obj/effect/turf_decal/siding/wideplating, @@ -39775,6 +39813,15 @@ /obj/effect/spawner/random/trash, /turf/open/floor/iron, /area/station/maintenance/port/aft) +"npI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/tile, +/area/station/service/bar) "npL" = ( /obj/machinery/atmospherics/components/binary/pump/on{ name = "Engine Coolant Bypass"; @@ -39861,19 +39908,23 @@ /turf/open/floor/iron, /area/station/engineering/main) "nrg" = ( -/obj/structure/closet/secure_closet/hydroponics, /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 1 }, +/obj/structure/cable, +/obj/effect/landmark/start/botanist, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) "nrp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/item/flashlight/lantern/on, /obj/effect/turf_decal/siding/wood{ - dir = 1 + dir = 10 }, -/turf/open/floor/stone, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood, /area/station/service/chapel) "nry" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ @@ -39933,6 +39984,19 @@ }, /turf/open/floor/iron/white/side, /area/station/hallway/primary/central/aft) +"nsD" = ( +/obj/effect/turf_decal/trimline/neutral/line, +/obj/effect/turf_decal/trimline/neutral/line{ + 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, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "nsL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/red{ @@ -40198,18 +40262,6 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/storage) -"nxy" = ( -/obj/effect/turf_decal/weather/snow/corner{ - dir = 9 - }, -/obj/effect/turf_decal/weather/snow, -/obj/structure/closet/secure_closet/freezer/meat, -/obj/effect/turf_decal/weather/snow/corner, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/obj/item/food/meat/slab/monkey, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "nxD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40239,11 +40291,6 @@ /obj/machinery/keycard_auth/directional/south, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) -"nxK" = ( -/mob/living/basic/deer, -/obj/structure/flora/bush/sparsegrass, -/turf/open/floor/grass, -/area/station/service/chapel) "nxO" = ( /obj/effect/spawner/structure/window, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible, @@ -40376,15 +40423,6 @@ /area/station/security/tram) "nzK" = ( /obj/structure/cable, -/obj/item/ammo_casing/spent{ - pixel_x = 5; - pixel_y = 6 - }, -/obj/item/ammo_casing/spent, -/obj/item/ammo_casing/spent{ - pixel_x = 4; - pixel_y = -2 - }, /obj/effect/landmark/start/assistant, /obj/effect/turf_decal/trimline/neutral/end{ dir = 8 @@ -40424,21 +40462,6 @@ /obj/machinery/light/small/broken/directional/west, /turf/open/misc/sandy_dirt, /area/station/maintenance/starboard/aft) -"nAq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/iron/grimy, -/area/station/service/library) -"nAy" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "nAF" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -40487,19 +40510,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/starboard/central) -"nBL" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "nBM" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible{ @@ -40521,6 +40531,18 @@ }, /turf/open/floor/iron, /area/station/construction/mining/aux_base) +"nCt" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "nCC" = ( /obj/structure/chair/stool/directional/south, /obj/effect/turf_decal/siding/yellow{ @@ -40551,7 +40573,6 @@ /turf/open/floor/iron/dark, /area/station/medical/medbay/lobby) "nCX" = ( -/obj/machinery/light/floor, /obj/structure/flora/bush/flowers_pp, /obj/structure/flora/bush/flowers_yw, /obj/structure/flora/bush/fullgrass, @@ -40574,30 +40595,19 @@ }, /turf/open/floor/iron, /area/station/security) -"nDm" = ( -/obj/structure/table, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/effect/spawner/random/food_or_drink/cake_ingredients, -/obj/item/kitchen/rollingpin, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) +"nDj" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/service/chapel) "nDQ" = ( /obj/structure/chair{ dir = 4 }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"nDV" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "nEa" = ( /obj/structure/lattice/catwalk, /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, @@ -40622,9 +40632,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron/textured_half, /area/station/service/library) "nEx" = ( @@ -40715,6 +40723,14 @@ }, /turf/open/floor/plating, /area/station/command/heads_quarters/cmo) +"nFH" = ( +/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, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "nFI" = ( /obj/effect/turf_decal/stripes/end{ dir = 8 @@ -40855,6 +40871,21 @@ /obj/effect/spawner/random/structure/closet_maintenance, /turf/open/floor/plating, /area/station/maintenance/port/lesser) +"nHI" = ( +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, +/obj/machinery/camera/autoname/directional/west, +/obj/structure/disposalpipe/segment, +/obj/machinery/light/small/directional/west, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "nHN" = ( /obj/structure/table, /obj/item/stack/pipe_cleaner_coil/random, @@ -40890,6 +40921,20 @@ /obj/structure/sign/poster/official/random/directional/north, /turf/open/floor/plating, /area/station/maintenance/disposal/incinerator) +"nHU" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/red/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/hallway/primary/central/fore) "nId" = ( /turf/open/floor/circuit/green, /area/station/ai_monitored/command/nuke_storage) @@ -41095,7 +41140,6 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "nMW" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/red/line{ dir = 1 @@ -41230,6 +41274,21 @@ /obj/structure/cable, /turf/open/floor/iron/smooth_large, /area/station/cargo/warehouse) +"nPY" = ( +/obj/structure/table/reinforced, +/obj/structure/desk_bell{ + pixel_x = 4; + pixel_y = 3 + }, +/obj/machinery/door/firedoor/border_only{ + dir = 4 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters" + }, +/turf/open/floor/plating, +/area/station/service/kitchen) "nQa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, @@ -41456,9 +41515,7 @@ /area/station/security/tram) "nTz" = ( /obj/effect/turf_decal/tile/yellow/anticorner/contrasted, -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, /area/station/medical/pharmacy) @@ -41653,6 +41710,17 @@ }, /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) +"nWV" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating{ + dir = 10 + }, +/obj/structure/sign/poster/official/random/directional/south, +/obj/machinery/light/small/directional/south, +/turf/open/floor/eighties/red, +/area/station/hallway/primary/central/fore) "nXt" = ( /obj/effect/turf_decal/tile/yellow/full, /obj/structure/table/reinforced, @@ -41903,15 +41971,6 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/break_room) -"obi" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, -/obj/structure/disposalpipe/junction/flip{ - dir = 4 - }, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "obq" = ( /obj/structure/cable, /obj/structure/lattice/catwalk, @@ -41952,8 +42011,6 @@ /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/library, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -42002,7 +42059,10 @@ /turf/open/floor/plating/rust, /area/station/engineering/supermatter/room) "odH" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/stone, /area/station/service/chapel) "odP" = ( @@ -42065,12 +42125,10 @@ /turf/open/floor/plating, /area/station/medical/storage) "oeZ" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/chair/wood{ - dir = 8 + dir = 4 }, -/turf/open/floor/iron/grimy, +/turf/open/floor/stone, /area/station/service/bar) "off" = ( /obj/effect/turf_decal/siding/wood{ @@ -42086,10 +42144,9 @@ /turf/open/floor/iron/smooth_large, /area/station/maintenance/department/medical/central) "ofU" = ( -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/iron/grimy, +/obj/machinery/holopad, +/obj/effect/landmark/start/hangover, +/turf/open/floor/stone, /area/station/service/bar) "ofZ" = ( /turf/closed/mineral/random/stationside, @@ -42226,17 +42283,6 @@ /obj/structure/flora/bush/flowers_yw/style_random, /turf/open/floor/grass, /area/station/medical/treatment_center) -"ohy" = ( -/obj/effect/turf_decal/siding/white/corner{ - dir = 4 - }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "ohz" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/tile/yellow/opposingcorners, @@ -42256,13 +42302,6 @@ }, /turf/open/floor/iron/dark, /area/station/science/robotics/lab) -"ohK" = ( -/obj/structure/chair/stool/directional/north, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/turf/open/floor/stone, -/area/station/service/bar) "ohM" = ( /obj/structure/chair{ dir = 8 @@ -42355,6 +42394,13 @@ /obj/structure/alien/weeds, /turf/open/floor/wood, /area/station/maintenance/starboard/greater) +"oiZ" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/chapel) "ojz" = ( /obj/structure/railing{ dir = 1 @@ -42512,22 +42558,10 @@ /obj/machinery/light/small/dim/directional/west, /turf/open/floor/iron, /area/station/maintenance/port/aft) -"omb" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/station/service/bar) -"omk" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/turf/open/floor/stone, -/area/station/service/bar) +"omq" = ( +/obj/structure/cable, +/turf/open/floor/wood/parquet, +/area/station/service/library) "omW" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/iron/white/corner, @@ -42542,15 +42576,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"onc" = ( -/obj/machinery/door/morgue{ - name = "Private Study"; - req_access = list("library") - }, -/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/central/greater) "ong" = ( /obj/item/radio/intercom/directional/south, /obj/effect/turf_decal/tile/neutral, @@ -42714,11 +42739,9 @@ /turf/open/floor/iron, /area/station/commons/fitness/locker_room) "opV" = ( -/obj/effect/turf_decal/siding/wood, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, /obj/effect/landmark/start/bartender, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/stone, /area/station/service/bar) "opW" = ( @@ -42780,6 +42803,26 @@ "orb" = ( /turf/closed/wall, /area/station/engineering/main) +"orz" = ( +/obj/structure/table, +/obj/item/assembly/igniter{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/assembly/igniter{ + pixel_x = 5; + pixel_y = -4 + }, +/obj/item/assembly/igniter{ + pixel_x = 2; + pixel_y = 6 + }, +/obj/item/assembly/igniter{ + pixel_x = 2; + pixel_y = -1 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "orC" = ( /obj/structure/cable, /turf/open/floor/iron/smooth, @@ -42935,9 +42978,21 @@ "oul" = ( /obj/effect/turf_decal/weather/dirt, /obj/structure/flora/bush/flowers_yw/style_2, -/obj/structure/flora/tree/jungle/style_5, /turf/open/floor/grass, /area/station/service/chapel) +"oum" = ( +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/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/airlock/unres{ + dir = 4 + }, +/turf/open/floor/plating, +/area/station/hallway/primary/central/fore) "oun" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 10 @@ -42947,16 +43002,6 @@ "ouz" = ( /turf/open/floor/iron/dark/small, /area/station/command/heads_quarters/rd) -"ouF" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/west, -/obj/machinery/door/poddoor/shutters{ - name = "Kitchen Shutters"; - id = "kitchenshutters" - }, -/turf/open/floor/iron, -/area/station/service/kitchen) "ouH" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -42996,11 +43041,6 @@ /obj/machinery/airalarm/directional/west, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) -"ove" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/door/firedoor/border_only, -/turf/open/floor/plating, -/area/station/service/bar) "ovf" = ( /obj/structure/lattice/catwalk, /turf/open/space/basic, @@ -43169,20 +43209,6 @@ }, /turf/open/floor/iron/dark, /area/station/cargo/storage) -"oxy" = ( -/obj/effect/spawner/random/entertainment/arcade{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating, -/obj/structure/sign/poster/official/random/directional/south, -/turf/open/floor/eighties/red, -/area/station/hallway/primary/central/fore) -"oxK" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "oyn" = ( /obj/structure/disposalpipe/segment, /obj/machinery/door/airlock/public/glass{ @@ -43427,6 +43453,9 @@ dir = 4 }, /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/iron, /area/station/hallway/primary/central/aft) "oDa" = ( @@ -43449,15 +43478,11 @@ /turf/open/space/basic, /area/space/nearstation) "oDX" = ( -/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/chair/wood{ dir = 4 }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/iron/grimy, +/turf/open/floor/stone, /area/station/service/bar) "oDY" = ( /obj/effect/turf_decal/stripes/corner, @@ -43506,8 +43531,7 @@ dir = 1 }, /obj/machinery/firealarm/directional/north, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk, +/obj/structure/closet/secure_closet/hydroponics, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) "oEB" = ( @@ -43580,15 +43604,6 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"oFM" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/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/maintenance/central/greater) "oGk" = ( /turf/open/floor/circuit, /area/station/tcommsat/server) @@ -43620,13 +43635,6 @@ }, /turf/open/floor/carpet/executive, /area/station/command/meeting_room) -"oGJ" = ( -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "oGL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -43661,6 +43669,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/stairs, /area/station/maintenance/port/greater) +"oHp" = ( +/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, +/area/station/hallway/primary/central/aft) "oHw" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -43750,7 +43765,7 @@ /area/station/maintenance/department/medical/central) "oIL" = ( /obj/effect/turf_decal/siding/wood/corner{ - dir = 8 + dir = 4 }, /turf/open/floor/stone, /area/station/service/chapel) @@ -43865,6 +43880,16 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron/smooth_large, /area/station/science/auxlab/firing_range) +"oJO" = ( +/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/bar, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "oJP" = ( /obj/structure/cable, /obj/machinery/telecomms/broadcaster/preset_left, @@ -43954,6 +43979,7 @@ /obj/effect/turf_decal/tile/neutral, /obj/structure/sign/departments/holy/directional/south, /obj/machinery/light/cold/directional/south, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) "oMI" = ( @@ -43990,22 +44016,6 @@ }, /turf/open/floor/plating, /area/station/construction/mining/aux_base) -"oNF" = ( -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/firealarm/directional/east, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) "oNH" = ( /obj/structure/cable, /obj/effect/decal/cleanable/dirt, @@ -44022,6 +44032,13 @@ dir = 8 }, /area/station/science/research) +"oNW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/poster/official/random/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "oNX" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -44086,10 +44103,10 @@ /turf/open/floor/iron, /area/station/hallway/primary/port) "oOC" = ( +/obj/structure/flora/bush/flowers_br/style_random, /obj/effect/turf_decal/weather/dirt{ - dir = 1 + dir = 5 }, -/obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/service/chapel) "oOK" = ( @@ -44137,9 +44154,17 @@ "oPh" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/light/floor, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) +/obj/structure/disposalpipe/segment, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "oPi" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -44288,8 +44313,9 @@ dir = 8 }, /obj/item/kirbyplants/random, -/obj/machinery/light/small/directional/west, /obj/item/radio/intercom/directional/south, +/obj/structure/cable, +/obj/machinery/power/apc/auto_name/directional/west, /turf/open/floor/iron/smooth, /area/station/service/greenroom) "oRw" = ( @@ -44427,6 +44453,21 @@ }, /turf/open/floor/iron, /area/station/security/execution/transfer) +"oTM" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) +"oTN" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/airlock{ + name = "Kitchen" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) "oTT" = ( /obj/structure/disposalpipe/trunk{ dir = 4 @@ -44449,6 +44490,12 @@ }, /turf/open/space/basic, /area/space/nearstation) +"oUb" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/stone, +/area/station/service/chapel) "oUd" = ( /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) @@ -44459,6 +44506,9 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "oUq" = ( @@ -44510,21 +44560,21 @@ /obj/structure/cable, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/security/evidence) -"oUV" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/window/right/directional/east, -/turf/open/floor/iron/textured_half{ - dir = 8 - }, -/area/station/service/hydroponics) "oVl" = ( -/obj/machinery/vending/wardrobe/bar_wardrobe, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, +/obj/structure/sign/picture_frame/portrait/bar{ + pixel_y = 32 + }, +/obj/structure/table/wood, +/obj/item/roulette_wheel_beacon, +/obj/item/holosign_creator/robot_seat/bar{ + pixel_x = 2; + pixel_y = 9 + }, +/obj/machinery/light/small/directional/north, /obj/effect/turf_decal/siding/wood{ - dir = 9 + dir = 1 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /turf/open/floor/stone, /area/station/service/bar/backroom) "oVt" = ( @@ -44536,6 +44586,19 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/smooth, /area/station/engineering/main) +"oVE" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/bar) "oVF" = ( /mob/living/basic/mining/lobstrosity, /turf/open/misc/asteroid/airless, @@ -44634,18 +44697,6 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) -"oXV" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 5 - }, -/obj/effect/turf_decal/trimline/neutral/corner{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "oYi" = ( /obj/effect/turf_decal/trimline/neutral/line, /obj/effect/turf_decal/trimline/neutral/line{ @@ -44718,10 +44769,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/cable, +/obj/effect/spawner/random/structure/steam_vent, /obj/structure/disposalpipe/segment{ - dir = 6 + dir = 4 }, -/obj/effect/spawner/random/structure/steam_vent, /turf/open/floor/plating, /area/station/maintenance/central/greater) "oZz" = ( @@ -44781,13 +44832,6 @@ /obj/structure/tram, /turf/open/floor/tram, /area/station/security/tram) -"paJ" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/wood/parquet, -/area/station/service/library) "paW" = ( /obj/machinery/atmospherics/pipe/smart/manifold/yellow/visible{ dir = 8 @@ -44867,6 +44911,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "pbE" = ( @@ -44884,19 +44929,19 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/machinery/light/small/directional/east, /turf/open/floor/iron/smooth, /area/station/service/greenroom) -"pbK" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 +"pbO" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 }, -/obj/structure/flora/bush/flowers_br/style_random, -/obj/structure/flora/bush/jungle/b/style_2, -/obj/machinery/light/small/directional/north, -/obj/item/radio/intercom/directional/north, -/turf/open/floor/grass, -/area/station/service/chapel) +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "pbT" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -45065,8 +45110,10 @@ /turf/open/space/basic, /area/space/nearstation) "peU" = ( -/obj/effect/turf_decal/weather/dirt, /obj/structure/flora/rock/pile/jungle/style_2, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, /turf/open/floor/grass, /area/station/service/chapel) "peW" = ( @@ -45283,10 +45330,11 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "phG" = ( -/obj/structure/chair/wood{ +/obj/structure/table/wood, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, -/turf/open/floor/iron/grimy, +/turf/open/floor/stone, /area/station/service/bar) "phY" = ( /obj/structure/railing{ @@ -45387,7 +45435,6 @@ /turf/open/floor/plating, /area/station/maintenance/port/lesser) "pjA" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -45455,6 +45502,13 @@ /obj/item/weldingtool, /turf/open/floor/iron/dark, /area/station/maintenance/department/engine/atmos) +"pkQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/kitchen/small, +/area/station/service/kitchen) "pkR" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -45478,14 +45532,16 @@ /turf/open/floor/wood/tile, /area/station/service/lawoffice) "pkU" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/general, -/obj/structure/disposalpipe/segment, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/glass{ - name = "Service Hallway" +/obj/structure/window/spawner/directional/north, +/obj/structure/window/spawner/directional/south, +/obj/structure/flora/bush/flowers_br, +/obj/structure/flora/bush/flowers_yw, +/obj/structure/flora/bush/large/style_random{ + pixel_x = -17; + pixel_y = 2 }, -/turf/open/floor/iron/textured_half, -/area/station/hallway/secondary/service) +/turf/open/floor/grass, +/area/station/service/hydroponics) "plf" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -45629,17 +45685,6 @@ }, /turf/open/floor/iron, /area/station/science/cytology) -"pnW" = ( -/obj/machinery/computer/slot_machine{ - pixel_y = 2 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/computer/security/telescreen/entertainment/directional/north, -/turf/open/floor/stone, -/area/station/service/bar) "pnZ" = ( /obj/effect/turf_decal/tile/blue/fourcorners, /obj/machinery/firealarm/directional/west, @@ -45812,10 +45857,6 @@ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) -"pqa" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/space/basic, -/area/space) "pqm" = ( /turf/closed/wall/r_wall, /area/station/engineering/storage/tcomms) @@ -45902,14 +45943,6 @@ /obj/effect/landmark/start/prisoner, /turf/open/floor/iron/dark, /area/station/security/prison/safe) -"prt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/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/primary/central/aft) "prI" = ( /turf/closed/wall, /area/station/engineering/hallway) @@ -46017,14 +46050,6 @@ /obj/structure/broken_flooring/corner/directional/south, /turf/open/floor/plating, /area/station/maintenance/port/aft) -"ptf" = ( -/obj/machinery/status_display/ai/directional/west, -/obj/machinery/camera/autoname/directional/north, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "ptj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46074,19 +46099,15 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/port/aft) -"ptT" = ( -/obj/effect/turf_decal/siding/thinplating_new/light, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, +"ptX" = ( /obj/structure/disposalpipe/segment{ - dir = 5 + dir = 10 }, -/obj/machinery/light/small/directional/south, -/obj/machinery/requests_console/auto_name/directional/south, -/obj/effect/mapping_helpers/requests_console/supplies, -/turf/open/floor/iron/white/small, -/area/station/service/hydroponics) +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "pus" = ( /obj/effect/turf_decal/box/red/corners, /obj/effect/turf_decal/stripes/white/line{ @@ -46212,14 +46233,6 @@ "pwN" = ( /turf/open/floor/iron/dark/small, /area/station/service/chapel/storage) -"pwO" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/firealarm/directional/west, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "pxj" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -46250,14 +46263,6 @@ dir = 1 }, /area/station/security/prison/safe) -"pxW" = ( -/obj/structure/table, -/obj/machinery/cell_charger{ - pixel_y = 5 - }, -/obj/item/stock_parts/power_store/cell/high, -/turf/open/floor/engine, -/area/station/science/xenobiology) "pxZ" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, @@ -46346,13 +46351,6 @@ /obj/item/stack/sheet/mineral/titanium, /turf/open/floor/tram, /area/station/maintenance/department/medical/central) -"pzW" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 9 - }, -/obj/machinery/light/floor, -/turf/open/floor/stone, -/area/station/service/bar) "pAa" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/spawner/random/structure/barricade, @@ -46702,6 +46700,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"pEU" = ( +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/machinery/door/airlock/freezer{ + name = "Freezer" + }, +/obj/structure/disposalpipe/segment, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen) "pFk" = ( /obj/structure/broken_flooring/singular/directional/east, /obj/effect/decal/cleanable/dirt, @@ -46806,7 +46812,7 @@ "pGS" = ( /obj/machinery/status_display/evac/directional/north, /obj/machinery/camera/directional/north, -/turf/open/misc/dirt/jungle, +/turf/open/misc/dirt/station, /area/station/service/chapel) "pGU" = ( /obj/effect/turf_decal/trimline/white/line{ @@ -46876,9 +46882,7 @@ /obj/effect/turf_decal/weather/dirt{ dir = 6 }, -/mob/living/basic/frog, /obj/structure/flora/bush/flowers_br/style_3, -/obj/structure/flora/tree/jungle/small, /turf/open/floor/grass, /area/station/service/chapel) "pHC" = ( @@ -46915,11 +46919,6 @@ }, /turf/open/floor/wood, /area/station/commons/fitness/recreation) -"pHS" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "pHY" = ( /obj/effect/turf_decal/tile/red/opposingcorners, /obj/effect/turf_decal/tile/blue/opposingcorners{ @@ -47016,7 +47015,9 @@ /turf/open/floor/plating, /area/station/command/bridge) "pJc" = ( -/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/holopad, +/obj/structure/cable, /turf/open/floor/stone, /area/station/service/bar) "pJj" = ( @@ -47118,6 +47119,12 @@ /obj/effect/spawner/random/structure/girder, /turf/open/floor/tram, /area/station/maintenance/department/medical/central) +"pKx" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/station/service/library) "pKR" = ( /obj/effect/turf_decal/tile/blue/anticorner/contrasted{ dir = 4 @@ -47146,6 +47153,13 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"pLf" = ( +/obj/machinery/griddle, +/obj/effect/turf_decal/siding{ + dir = 10 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "pLg" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47215,13 +47229,6 @@ /obj/machinery/computer/security/telescreen/entertainment/directional/north, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) -"pMc" = ( -/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/plating, -/area/station/maintenance/central/greater) "pMs" = ( /obj/structure/transit_tube/horizontal, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -47436,6 +47443,13 @@ /obj/item/airlock_painter, /turf/open/floor/iron/small, /area/station/engineering/atmos/storage/gas) +"pPp" = ( +/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ + dir = 4 + }, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/engine, +/area/station/science/xenobiology) "pPH" = ( /obj/machinery/door/airlock/public/glass{ name = "Atmospherics Project Bay" @@ -47447,6 +47461,20 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"pPO" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood/tile, +/area/station/service/bar) +"pPU" = ( +/obj/structure/chair/stool/bar/directional/north, +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/tile, +/area/station/service/bar) "pPZ" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plating, @@ -47539,6 +47567,11 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) +"pRR" = ( +/obj/machinery/portable_atmospherics/canister/air, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "pSc" = ( /obj/item/bikehorn/rubberducky{ pixel_x = 6; @@ -47578,20 +47611,19 @@ /turf/open/floor/plating, /area/station/science/ordnance/testlab) "pSI" = ( -/obj/effect/turf_decal/siding/wood, -/obj/structure/destructible/cult/item_dispenser/archives/library, -/obj/machinery/light/small/directional/south, -/turf/open/floor/iron/grimy, -/area/station/service/library) +/obj/machinery/door/morgue{ + name = "Private Study"; + req_access = list("library") + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/catwalk_floor/iron_dark, +/area/station/maintenance/central/greater) "pSN" = ( /obj/item/radio/intercom/directional/south, /obj/machinery/holopad, /turf/open/floor/iron/dark/smooth_large, /area/station/service/lawoffice) -"pSO" = ( -/obj/machinery/portable_atmospherics/canister/air, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "pSP" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -47781,6 +47813,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/fore) "pVK" = ( @@ -47816,13 +47849,6 @@ }, /turf/open/floor/iron/dark/side, /area/station/science/xenobiology) -"pWj" = ( -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/hydroponics, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "pWl" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -47986,14 +48012,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/greater) -"pXH" = ( -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/table, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "pXL" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -48016,13 +48034,6 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/hallway/secondary/dock) -"pXU" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "pYi" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48109,6 +48120,16 @@ /obj/item/shard/titanium, /turf/open/floor/plating, /area/station/maintenance/department/engine/atmos) +"qan" = ( +/obj/structure/cable/layer3, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/window/brigdoor/left/directional/north{ + atom_integrity = 300; + name = "AI Core Chamber Access"; + req_access = list("ai_upload") + }, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "qaF" = ( /obj/structure/sink/directional/south, /obj/structure/mirror/directional/north, @@ -48493,21 +48514,6 @@ /obj/machinery/power/apc/auto_name/directional/north, /turf/open/floor/iron/white, /area/station/science/cytology) -"qhs" = ( -/obj/structure/cable, -/obj/effect/turf_decal/tile/red/opposingcorners, -/obj/effect/turf_decal/tile/blue/opposingcorners{ - dir = 8 - }, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/chair/wood{ - dir = 4 - }, -/obj/machinery/power/apc/auto_name/directional/west, -/turf/open/floor/iron/smooth, -/area/station/service/greenroom) "qhD" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -48527,6 +48533,16 @@ /obj/effect/turf_decal/trimline/white/mid_joiner, /turf/open/floor/wood, /area/station/commons/fitness/recreation) +"qhR" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/obj/effect/spawner/random/food_or_drink/booze{ + pixel_y = 10 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/bar) "qhV" = ( /obj/structure/table, /obj/machinery/fax{ @@ -48555,8 +48571,6 @@ /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) "qie" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, @@ -48609,8 +48623,10 @@ /obj/structure/cable, /obj/effect/spawner/random/structure/steam_vent, /obj/structure/disposalpipe/segment{ - dir = 9 + dir = 4 }, +/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/central/greater) "qiL" = ( @@ -48722,6 +48738,14 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) +"qkm" = ( +/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/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "qkp" = ( /obj/machinery/door/airlock{ name = "Maintenance" @@ -49078,12 +49102,14 @@ /turf/open/floor/engine/vacuum, /area/station/science/ordnance/freezerchamber) "qsY" = ( +/obj/structure/chair/stool/directional/west, /obj/effect/turf_decal/siding/wood{ - dir = 10 + dir = 8 }, -/obj/machinery/light/floor, -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/tile, /area/station/service/bar) "qtd" = ( /turf/open/floor/wood/tile, @@ -49296,6 +49322,12 @@ /obj/machinery/light/cold/directional/south, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"qwA" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 9 + }, +/turf/open/floor/eighties, +/area/station/hallway/primary/central/fore) "qwC" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/turf_decal/tile/dark_red/half/contrasted{ @@ -49306,6 +49338,7 @@ /turf/open/floor/iron, /area/station/security) "qwK" = ( +/obj/structure/cable, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) "qwU" = ( @@ -49659,13 +49692,6 @@ name = "Holodeck Projector Floor" }, /area/station/holodeck/rec_center) -"qBn" = ( -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "qBz" = ( /obj/effect/turf_decal/siding/wood, /obj/structure/mannequin/plastic, @@ -49748,10 +49774,11 @@ /turf/open/floor/iron/large, /area/station/command/heads_quarters/hop) "qCK" = ( +/obj/effect/landmark/start/botanist, /obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 5 + dir = 1 }, -/obj/effect/landmark/start/botanist, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) "qCT" = ( @@ -49863,7 +49890,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment, +/obj/structure/disposalpipe/junction/flip{ + dir = 1 + }, /turf/open/floor/wood/parquet, /area/station/service/library) "qDJ" = ( @@ -49886,9 +49915,22 @@ /turf/open/floor/wood/parquet, /area/station/medical/psychology) "qDL" = ( -/obj/machinery/chem_master/condimaster, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/firealarm/directional/east, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/effect/landmark/start/botanist, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "qDN" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/status_display/evac/directional/west, @@ -49913,15 +49955,6 @@ dir = 8 }, /area/station/science/lobby) -"qEk" = ( -/obj/structure/table/reinforced, -/obj/item/folder/blue{ - pixel_y = 2 - }, -/obj/item/pen, -/obj/machinery/airalarm/directional/south, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "qEm" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/machinery/atmospherics/pipe/smart/simple/cyan/hidden{ @@ -49985,6 +50018,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "qFh" = ( @@ -50109,6 +50143,18 @@ /obj/machinery/firealarm/directional/north, /turf/open/floor/iron/white/side, /area/station/science/lower) +"qIb" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/effect/mapping_helpers/airlock/unres, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "qIf" = ( /turf/closed/wall, /area/station/medical/cryo) @@ -50172,6 +50218,16 @@ }, /turf/open/floor/iron/diagonal, /area/station/command/heads_quarters/hop) +"qJz" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/spawner/random/food_or_drink/salad{ + pixel_y = 6 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/bar) "qJH" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50584,13 +50640,6 @@ /obj/effect/decal/cleanable/cobweb, /turf/open/floor/iron, /area/station/security/prison/rec) -"qRE" = ( -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 4 - }, -/obj/effect/landmark/start/botanist, -/turf/open/floor/iron/white/small, -/area/station/service/hydroponics) "qRN" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -50633,6 +50682,19 @@ /obj/machinery/firealarm/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"qSk" = ( +/obj/effect/turf_decal/trimline/neutral/line, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + 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/hallway/primary/port) "qSC" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/white/line, @@ -50835,6 +50897,13 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) +"qVm" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 8 + }, +/obj/machinery/firealarm/directional/west, +/turf/open/floor/eighties/red, +/area/station/hallway/primary/central/fore) "qVn" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -50967,17 +51036,6 @@ /obj/effect/mapping_helpers/airlock/access/all/command/general, /turf/open/floor/catwalk_floor/iron_smooth, /area/station/ai_monitored/turret_protected/aisat/maint) -"qWV" = ( -/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/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "qXb" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -51056,10 +51114,6 @@ /obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"qXr" = ( -/obj/structure/water_source/puddle, -/turf/open/floor/grass, -/area/station/service/chapel) "qXB" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -51094,6 +51148,7 @@ dir = 1 }, /obj/effect/landmark/observer_start, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "qYh" = ( @@ -51119,6 +51174,23 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/atmos) +"qYr" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "qYv" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -51327,6 +51399,14 @@ "rbg" = ( /turf/open/floor/iron/smooth, /area/station/engineering/atmos) +"rbj" = ( +/obj/item/radio/intercom/directional/east, +/obj/structure/disposalpipe/trunk{ + dir = 8 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/wood/parquet, +/area/station/service/library) "rbl" = ( /obj/structure/filingcabinet/chestdrawer, /obj/machinery/light/cold/dim/directional/east, @@ -51445,12 +51525,13 @@ name = "Public Shrine" }, /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/siding/wood/end{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/stone, +/turf/open/floor/iron/textured_half{ + dir = 8 + }, /area/station/hallway/primary/central/fore) "rcQ" = ( /obj/item/kirbyplants/random, @@ -51488,6 +51569,19 @@ }, /turf/open/floor/engine, /area/station/science/cytology) +"rdV" = ( +/obj/structure/cable, +/obj/structure/extinguisher_cabinet/directional/west, +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "rdW" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -51634,6 +51728,19 @@ /obj/item/radio/intercom/directional/west, /turf/open/floor/glass, /area/station/command/heads_quarters/rd) +"rfW" = ( +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/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, +/area/station/hallway/primary/central/fore) "rfZ" = ( /obj/structure/cable, /turf/open/floor/iron/grimy, @@ -51766,7 +51873,8 @@ /area/station/service/chapel/funeral) "rik" = ( /obj/structure/flora/grass/jungle/b/style_random, -/turf/open/misc/dirt/jungle, +/obj/machinery/camera/directional/north, +/turf/open/misc/dirt/station, /area/station/service/chapel) "riq" = ( /obj/machinery/atmospherics/pipe/smart/simple/general/visible{ @@ -51854,6 +51962,22 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"rko" = ( +/obj/structure/sign/directions/evac/directional/west, +/obj/structure/sign/directions/science/directional/west{ + dir = 4; + pixel_y = -8 + }, +/obj/structure/sign/directions/security/directional/west{ + pixel_y = 8 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/turf/open/floor/iron/small, +/area/station/hallway/primary/central/fore) "rkI" = ( /obj/structure/disposalpipe/trunk, /obj/structure/disposaloutlet{ @@ -51889,17 +52013,6 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/grimy, /area/station/commons/vacant_room/office) -"rlh" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/landmark/start/hangover, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "rli" = ( /obj/machinery/door/airlock/silver{ name = "Showers" @@ -52090,6 +52203,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) "rpi" = ( @@ -52133,13 +52247,9 @@ /obj/structure/disposalpipe/segment{ dir = 10 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) -"rpF" = ( -/obj/structure/flora/tree/jungle/small/style_4, -/obj/effect/turf_decal/weather/dirt, -/turf/open/floor/grass, -/area/station/service/chapel) "rpV" = ( /obj/effect/spawner/random/structure/crate, /obj/effect/spawner/random/maintenance, @@ -52181,11 +52291,8 @@ /turf/open/floor/iron, /area/station/commons/fitness/locker_room) "rqF" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/obj/structure/flora/bush/large/style_3, -/turf/open/floor/grass, +/obj/structure/flora/bush/jungle/a/style_3, +/turf/open/misc/dirt/station, /area/station/service/chapel) "rqR" = ( /obj/machinery/door/airlock/external/glass, @@ -52424,10 +52531,10 @@ /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/structure/disposalpipe/segment{ + dir = 9 }, -/obj/effect/mapping_helpers/mail_sorting/service/kitchen, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) "ruY" = ( @@ -52587,6 +52694,11 @@ /obj/item/razor, /turf/open/floor/iron/dark/small, /area/station/security/execution/education) +"rxD" = ( +/obj/structure/extinguisher_cabinet/directional/south, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/iron/dark/side, +/area/station/hallway/primary/central/fore) "rxP" = ( /obj/structure/table, /obj/item/assembly/signaler{ @@ -52633,6 +52745,18 @@ }, /turf/open/floor/iron/smooth, /area/station/hallway/secondary/command) +"rxZ" = ( +/obj/item/book/manual/chef_recipes, +/obj/item/stack/package_wrap{ + pixel_y = 2 + }, +/obj/item/holosign_creator/robot_seat/restaurant, +/obj/structure/table, +/obj/effect/turf_decal/siding{ + dir = 9 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "rya" = ( /obj/effect/turf_decal/weather/dirt{ dir = 10 @@ -52703,20 +52827,8 @@ icon_state = "L9"; pixel_y = -15 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) -"rzH" = ( -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/obj/machinery/door/airlock/freezer{ - name = "Freezer" - }, -/obj/structure/disposalpipe/segment, -/obj/structure/cable, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "rzJ" = ( /obj/structure/chair/sofa/bench/left{ dir = 4 @@ -52842,6 +52954,7 @@ /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/airlock/access/any/service/janitor, /turf/open/floor/iron/textured_half{ dir = 8 }, @@ -53036,6 +53149,15 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) +"rEW" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/port) "rEY" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/pdapainter{ @@ -53221,6 +53343,14 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/engineering/main) +"rHl" = ( +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/vending/cigarette, +/turf/open/floor/iron/dark/side, +/area/station/hallway/primary/central/fore) "rHp" = ( /obj/effect/turf_decal/siding/wood, /obj/effect/landmark/event_spawn, @@ -53397,18 +53527,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/commons/dorms) -"rLA" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/small, -/area/station/hallway/primary/central/fore) "rLK" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -53674,14 +53792,6 @@ /obj/structure/flora/bush/flowers_br/style_random, /turf/open/floor/grass, /area/station/service/chapel) -"rPX" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 4 - }, -/obj/machinery/holopad, -/turf/open/floor/stone, -/area/station/service/bar) "rQi" = ( /turf/closed/wall/r_wall, /area/station/engineering/main) @@ -53737,6 +53847,7 @@ dir = 8 }, /obj/machinery/light/cold/directional/west, +/obj/machinery/firealarm/directional/west, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "rQS" = ( @@ -53857,18 +53968,10 @@ }, /turf/open/floor/iron/smooth, /area/station/engineering/main) -"rTl" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/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, -/area/station/hallway/primary/central/fore) +"rTn" = ( +/obj/machinery/light/small/directional/north, +/turf/open/misc/dirt/station, +/area/station/service/chapel) "rTq" = ( /obj/machinery/photocopier, /obj/effect/decal/cleanable/dirt, @@ -53957,12 +54060,6 @@ "rUd" = ( /turf/closed/wall, /area/station/security/prison) -"rUg" = ( -/obj/effect/turf_decal/stripes/white/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "rUq" = ( /obj/item/assembly/mousetrap/armed, /turf/open/floor/stone, @@ -54040,14 +54137,23 @@ /turf/open/floor/iron/dark, /area/station/security/prison/safe) "rVt" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +/obj/structure/table/reinforced, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_x = 3 }, -/obj/structure/chair/wood{ +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -3 + }, +/obj/machinery/door/firedoor/border_only{ dir = 4 }, -/turf/open/floor/wood/tile, -/area/station/service/bar) +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters" + }, +/obj/effect/spawner/random/food_or_drink/condiment, +/turf/open/floor/plating, +/area/station/service/kitchen) "rVy" = ( /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -54208,9 +54314,8 @@ /area/station/maintenance/port/greater) "rXy" = ( /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/plating, /area/station/maintenance/central/greater) "rXM" = ( @@ -54220,14 +54325,6 @@ }, /turf/open/floor/iron, /area/station/engineering/storage/tech) -"rXO" = ( -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/unres, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "rXW" = ( /obj/structure/flora/bush/flowers_yw, /obj/machinery/door/window/left/directional/west{ @@ -54286,13 +54383,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/security/prison/workout) -"rYJ" = ( -/obj/machinery/skill_station, -/obj/structure/sign/painting/library{ - pixel_x = 30 - }, -/turf/open/floor/wood/parquet, -/area/station/service/library) "rYL" = ( /obj/effect/turf_decal/tile/yellow/opposingcorners, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54538,13 +54628,6 @@ /obj/machinery/light/small/broken/directional/south, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) -"scR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/wood/tile, -/area/station/service/bar) "scY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54579,17 +54662,6 @@ /obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/smooth, /area/station/engineering/supermatter/room) -"sem" = ( -/obj/machinery/door/airlock{ - name = "Kitchen" - }, -/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, -/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/plating, -/area/station/maintenance/central/greater) "ser" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -54677,15 +54749,6 @@ dir = 8 }, /area/station/engineering/main) -"sfU" = ( -/obj/machinery/light/small/directional/south, -/obj/machinery/camera/autoname/directional/south, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/turf_decal/siding/wood, -/turf/open/floor/stone, -/area/station/service/bar) "sge" = ( /obj/structure/reagent_dispensers/beerkeg, /obj/item/clothing/head/costume/festive, @@ -54845,6 +54908,17 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/fore) +"sjK" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/spawner/random/trash, +/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/maintenance/central/greater) "sjL" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/neutral/line{ @@ -54894,9 +54968,7 @@ /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 8 }, -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser, /obj/machinery/camera/autoname/directional/west, /turf/open/floor/iron, /area/station/medical/chemistry) @@ -55061,6 +55133,13 @@ }, /turf/open/floor/iron, /area/station/security/courtroom) +"sne" = ( +/obj/machinery/griddle, +/obj/effect/turf_decal/siding{ + dir = 6 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "snj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/disposalpipe/segment{ @@ -55185,6 +55264,9 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/iron/textured_half{ dir = 8 }, @@ -55271,6 +55353,10 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/iron/white/small, /area/station/medical/cryo) +"spH" = ( +/obj/machinery/door/firedoor, +/turf/open/floor/iron/small, +/area/station/service/bar) "spK" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -55375,18 +55461,26 @@ }, /turf/open/floor/engine, /area/station/science/xenobiology) +"srg" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/structure/disposalpipe/junction/flip{ + dir = 4 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "srn" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/maintenance/port/greater) "sry" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, /obj/structure/flora/bush/jungle/c/style_3{ pixel_x = 6; pixel_y = -6 }, +/obj/structure/flora/tree/jungle/small, /turf/open/floor/grass, /area/station/service/chapel) "srA" = ( @@ -55465,13 +55559,14 @@ /obj/machinery/atmospherics/pipe/layer_manifold/scrubbers/visible, /turf/closed/wall/r_wall, /area/station/engineering/hallway) -"ssR" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 +"ssY" = ( +/obj/structure/kitchenspike, +/obj/effect/turf_decal/weather/snow/corner{ + dir = 5 }, -/obj/structure/chair/stool/directional/west, -/turf/open/floor/stone, -/area/station/service/bar) +/obj/effect/turf_decal/weather/snow, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "sta" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/stripes/corner{ @@ -55651,14 +55746,6 @@ /mob/living/carbon/human/species/monkey, /turf/open/floor/grass, /area/station/science/genetics) -"svE" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/turf/open/floor/stone, -/area/station/service/bar) "svG" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/engine, @@ -55737,6 +55824,7 @@ /obj/effect/turf_decal/stripes/red/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron/small, /area/station/hallway/primary/starboard) "swF" = ( @@ -55762,9 +55850,7 @@ /obj/effect/turf_decal/weather/dirt{ dir = 1 }, -/obj/structure/flora/bush/jungle/a/style_random{ - pixel_y = -5 - }, +/obj/machinery/camera/directional/north, /turf/open/floor/grass, /area/station/service/chapel) "swO" = ( @@ -55808,20 +55894,13 @@ /turf/open/floor/wood, /area/station/command/heads_quarters/qm) "swW" = ( +/obj/effect/turf_decal/siding/wood, /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/effect/turf_decal/siding/wood, -/obj/machinery/restaurant_portal/bar, -/turf/open/floor/stone, +/obj/effect/spawner/random/vending/colavend, +/turf/open/floor/wood/tile, /area/station/service/bar) -"sxl" = ( -/obj/machinery/oven/range, -/obj/machinery/airalarm/directional/north, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "sxm" = ( /turf/closed/wall, /area/station/tcommsat/server) @@ -55960,6 +56039,15 @@ }, /turf/open/floor/iron/dark/small, /area/station/security/brig) +"szC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/chapel) "sAb" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/smart/simple/yellow/visible/layer1{ @@ -56254,7 +56342,6 @@ /turf/open/floor/plating, /area/station/maintenance/department/prison) "sFs" = ( -/obj/structure/cable, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -56276,8 +56363,10 @@ /turf/open/floor/engine, /area/station/science/xenobiology) "sGk" = ( -/obj/structure/flora/bush/jungle/c/style_random, -/obj/effect/turf_decal/weather/dirt, +/obj/effect/turf_decal/weather/dirt{ + dir = 6 + }, +/obj/structure/flora/bush/flowers_yw, /turf/open/floor/grass, /area/station/service/chapel) "sGp" = ( @@ -56440,6 +56529,13 @@ }, /turf/open/floor/iron/dark, /area/station/medical/medbay/aft) +"sJL" = ( +/obj/structure/table, +/obj/effect/turf_decal/siding{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "sJN" = ( /obj/effect/turf_decal/siding, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -56458,6 +56554,9 @@ desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; name = "BrewMaster 2199" }, +/obj/effect/turf_decal/delivery/white{ + color = "#52B4E9" + }, /turf/open/floor/iron, /area/station/service/hydroponics) "sKk" = ( @@ -56465,6 +56564,17 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/medical/medbay/central) +"sKm" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/red/line, +/obj/effect/turf_decal/stripes/red/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/small, +/area/station/hallway/primary/central/fore) "sKq" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -56589,12 +56699,11 @@ }, /area/station/science/research) "sMj" = ( -/obj/machinery/light/floor, -/obj/effect/turf_decal/siding/wood/corner{ +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood{ dir = 1 }, -/obj/effect/turf_decal/siding/wood/corner, -/turf/open/floor/stone, +/turf/open/floor/wood, /area/station/service/chapel) "sMq" = ( /obj/machinery/light/warm/directional/west, @@ -56685,15 +56794,17 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"sNA" = ( -/obj/effect/spawner/xmastree, -/turf/open/misc/dirt/jungle, -/area/station/service/chapel) "sNW" = ( /obj/structure/rack, /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/port/greater) +"sOi" = ( +/obj/effect/turf_decal/siding/wood/end{ + dir = 1 + }, +/turf/open/floor/stone, +/area/station/service/chapel) "sOj" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/turf_decal/stripes/line{ @@ -56857,6 +56968,17 @@ /obj/structure/alien/weeds, /turf/open/floor/plating, /area/station/maintenance/starboard/greater) +"sQy" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/station/service/chapel) "sQI" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/modular_computer/preset/id, @@ -56889,6 +57011,22 @@ }, /turf/open/floor/iron/dark/textured_corner, /area/station/command/heads_quarters/hop) +"sQP" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/red/line{ + 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/small, +/area/station/hallway/primary/central/aft) "sQS" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -56930,6 +57068,14 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/showroomfloor, /area/station/commons/dorms) +"sRF" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/turf/open/floor/stone, +/area/station/service/chapel) "sRL" = ( /turf/closed/wall, /area/station/service/janitor) @@ -57006,9 +57152,6 @@ /turf/open/floor/iron/textured_half, /area/station/engineering/atmos) "sSN" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 8 - }, /obj/structure/flora/bush/flowers_pp/style_2, /turf/open/floor/grass, /area/station/service/chapel) @@ -57058,6 +57201,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "sTi" = ( @@ -57204,6 +57348,13 @@ "sVN" = ( /turf/closed/wall/r_wall, /area/station/security/prison/workout) +"sVO" = ( +/obj/structure/grille, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/floor/plating, +/area/station/hallway/primary/central/fore) "sWc" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/chem_master, @@ -57268,6 +57419,15 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/port) +"sXu" = ( +/obj/structure/cable/layer3, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "AI Core shutters"; + name = "AI Core Shutter" + }, +/turf/open/floor/iron/stairs, +/area/station/ai_monitored/turret_protected/ai) "sXw" = ( /obj/machinery/telecomms/receiver/preset_left, /turf/open/floor/circuit, @@ -57359,23 +57519,6 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/cafeteria, /area/station/hallway/secondary/exit/departure_lounge) -"sYp" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/red/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/red/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/turf/open/floor/iron/small, -/area/station/hallway/primary/central/aft) "sYs" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/red/opposingcorners{ @@ -57406,16 +57549,25 @@ /obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/white/small, /area/station/medical/cryo) -"sZo" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ +"sYS" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor/border_only{ dir = 4 }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchenshutters"; + name = "Kitchen Shutters" + }, +/obj/effect/spawner/random/food_or_drink/donuts, +/turf/open/floor/plating, +/area/station/service/kitchen) +"sZo" = ( /obj/effect/turf_decal/siding/thinplating_new/light{ dir = 10 }, -/obj/structure/extinguisher_cabinet/directional/west, -/obj/machinery/light/small/directional/south, -/obj/effect/landmark/start/botanist, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) "sZx" = ( @@ -57431,6 +57583,15 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/rd) +"sZA" = ( +/obj/structure/flora/bush/flowers_br/style_random, +/obj/structure/flora/bush/flowers_pp/style_2, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 + }, +/obj/machinery/light/small/directional/north, +/turf/open/floor/grass, +/area/station/service/chapel) "sZH" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -57744,11 +57905,11 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/central) "tes" = ( +/obj/machinery/computer/security/telescreen/entertainment/directional/north, /obj/effect/turf_decal/siding/wood{ - dir = 5 + dir = 9 }, -/obj/machinery/light/floor, -/turf/open/floor/stone, +/turf/open/floor/wood/tile, /area/station/service/bar) "tev" = ( /obj/effect/turf_decal/weather/dirt, @@ -58090,17 +58251,9 @@ /turf/open/floor/iron/small, /area/station/engineering/supermatter/room) "tjT" = ( -/obj/structure/sink/kitchen/directional/south, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, +/obj/structure/extinguisher_cabinet/directional/north, /obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/camera/autoname/directional/north, -/obj/machinery/light/floor, -/obj/structure/disposalpipe/segment{ - dir = 10 + dir = 5 }, /turf/open/floor/stone, /area/station/service/bar) @@ -58205,14 +58358,13 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) "tmD" = ( -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 4 - }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) +/obj/structure/window/spawner/directional/west, +/obj/structure/flora/bush/jungle/a/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/window/spawner/directional/east, +/obj/machinery/light/floor, +/turf/open/floor/grass, +/area/station/service/hydroponics) "tmL" = ( /obj/structure/lattice, /obj/structure/transit_tube/curved/flipped{ @@ -58251,10 +58403,6 @@ "tnb" = ( /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"tnj" = ( -/obj/machinery/door/firedoor, -/turf/open/floor/iron/textured_half, -/area/station/service/bar) "tns" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt, @@ -58482,9 +58630,7 @@ /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/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) "tqh" = ( @@ -58626,14 +58772,6 @@ "tsF" = ( /turf/closed/wall/r_wall, /area/station/hallway/primary/central/fore) -"tsO" = ( -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/obj/effect/landmark/start/hangover, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "tsR" = ( /obj/machinery/electrolyzer, /turf/open/floor/catwalk_floor, @@ -58650,14 +58788,17 @@ /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) "tts" = ( -/obj/machinery/light/floor, /obj/structure/altar_of_gods, /obj/item/book/bible, /obj/effect/landmark/start/hangover, -/obj/item/flashlight/lantern{ - pixel_y = 5 +/obj/item/flashlight/lantern/on, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 }, -/turf/open/floor/wood/tile, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/stone, /area/station/service/chapel) "ttD" = ( /obj/effect/turf_decal/stripes/red/line{ @@ -58665,6 +58806,18 @@ }, /turf/open/floor/engine, /area/station/science/cytology) +"ttV" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/landmark/start/assistant, +/obj/machinery/barsign{ + chosen_sign = "thecavern"; + icon_state = "thecavern"; + pixel_y = 32 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "ttX" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/red/line{ @@ -58768,6 +58921,15 @@ /obj/machinery/camera/autoname/directional/east, /turf/open/floor/carpet/executive, /area/station/command/heads_quarters/captain/private) +"tvW" = ( +/obj/structure/chair/stool/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/landmark/start/hangover, +/turf/open/floor/wood/tile, +/area/station/service/bar) "tvZ" = ( /obj/effect/spawner/random/trash, /obj/structure/cable, @@ -58860,6 +59022,10 @@ dir = 8 }, /obj/machinery/newscaster/directional/west, +/obj/structure/flora/bush/large/style_random{ + pixel_x = -20; + pixel_y = -8 + }, /turf/open/floor/grass, /area/station/service/chapel) "twQ" = ( @@ -58973,12 +59139,6 @@ }, /turf/open/floor/iron/dark/small, /area/station/engineering/supermatter/room) -"tyz" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood, -/obj/effect/landmark/start/hangover, -/turf/open/floor/stone, -/area/station/service/bar) "tyA" = ( /obj/machinery/vending/modularpc, /obj/structure/sign/departments/science/alt/directional/east, @@ -59120,8 +59280,20 @@ /obj/machinery/disposal/bin, /obj/machinery/light/small/directional/south, /obj/effect/decal/cleanable/dirt, +/obj/structure/cable, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) +"tAw" = ( +/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/unres, +/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/central/greater) "tAx" = ( /obj/effect/turf_decal/trimline/blue/corner, /obj/structure/table/glass, @@ -59152,6 +59324,7 @@ /obj/machinery/door/firedoor, /obj/effect/mapping_helpers/airlock/access/all/service/chapel_office, /obj/structure/disposalpipe/segment, +/obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/service/chapel/office) "tAH" = ( @@ -59331,6 +59504,15 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) +"tDF" = ( +/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/plating, +/area/station/maintenance/central/greater) "tDM" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -59370,12 +59552,12 @@ /turf/open/floor/iron, /area/station/security/tram) "tEL" = ( -/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{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "tFs" = ( @@ -59639,6 +59821,17 @@ /obj/machinery/power/smes, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/port/aft) +"tKS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/cable, +/obj/effect/decal/cleanable/dirt, +/obj/structure/disposalpipe/sorting/mail{ + dir = 4 + }, +/obj/effect/mapping_helpers/mail_sorting/service/hydroponics, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "tLc" = ( /obj/structure/table/reinforced, /obj/effect/spawner/random/techstorage/service_all, @@ -59866,11 +60059,6 @@ }, /turf/open/floor/iron, /area/station/commons/storage/tools) -"tOK" = ( -/obj/effect/turf_decal/tile/neutral/fourcorners, -/obj/machinery/griddle, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "tOO" = ( /obj/structure/flora/bush/large/style_random{ pixel_x = -20; @@ -59959,13 +60147,14 @@ }, /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/light/small/directional/north, /obj/structure/sign/painting/library{ pixel_y = 32 }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/service/library) "tPZ" = ( @@ -59999,14 +60188,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/virology) -"tQC" = ( -/obj/machinery/door/firedoor, -/obj/machinery/seed_extractor, -/obj/machinery/door/window/right/directional/east, -/turf/open/floor/iron/textured_half{ - dir = 8 - }, -/area/station/service/hydroponics) "tQQ" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -60185,6 +60366,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 8 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/aft) "tTx" = ( @@ -60271,6 +60453,10 @@ /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 = 6 + }, +/obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/station/maintenance/central/greater) "tUo" = ( @@ -60327,10 +60513,14 @@ /turf/open/floor/carpet/red, /area/station/command/heads_quarters/hos) "tVp" = ( -/obj/effect/turf_decal/siding/wood/corner, -/obj/machinery/holopad, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/turf/open/floor/stone, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/chem_dispenser/drinks/beer, +/obj/effect/turf_decal/siding/wood, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/iron/dark/diagonal, /area/station/service/bar) "tVt" = ( /obj/effect/spawner/structure/window/reinforced, @@ -60406,6 +60596,14 @@ dir = 1 }, /area/station/hallway/secondary/exit/departure_lounge) +"tWT" = ( +/obj/effect/turf_decal/siding/thinplating{ + dir = 9 + }, +/obj/structure/sign/poster/official/tactical_game_cards/directional/west, +/obj/effect/spawner/random/vending/snackvend, +/turf/open/floor/eighties/red, +/area/station/hallway/primary/central/fore) "tXl" = ( /obj/effect/turf_decal/sand/plating, /obj/structure/table/bronze, @@ -60570,6 +60768,15 @@ /obj/machinery/light/cold/dim/directional/east, /turf/open/floor/iron, /area/station/engineering/main) +"uaa" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood, +/area/station/service/chapel) "uab" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -60780,16 +60987,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"udf" = ( -/obj/effect/turf_decal/delivery/white{ - color = "#52B4E9" - }, -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/turf_decal/siding/thinplating/light/end{ - dir = 8 - }, -/turf/open/floor/iron/white/small, -/area/station/service/hydroponics) "udv" = ( /obj/machinery/telecomms/receiver/preset_right, /turf/open/floor/circuit, @@ -60854,6 +61051,16 @@ /obj/machinery/airalarm/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos/space_catwalk) +"udW" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/structure/sign/departments/botany/alt1/directional/north, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "uek" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 8 @@ -61379,13 +61586,13 @@ /turf/open/floor/iron/dark/smooth_large, /area/station/command/meeting_room) "ulE" = ( -/obj/effect/spawner/random/trash, /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/structure/disposalpipe/sorting/mail{ dir = 4 }, +/obj/effect/mapping_helpers/mail_sorting/service/kitchen, /turf/open/floor/plating, /area/station/maintenance/central/greater) "ulK" = ( @@ -61687,6 +61894,15 @@ /obj/structure/alien/weeds, /turf/open/floor/iron, /area/station/maintenance/starboard/greater) +"uqV" = ( +/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/plating, +/area/station/maintenance/central/greater) "ura" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, /obj/machinery/light/small/directional/east, @@ -61710,6 +61926,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "urg" = ( @@ -61849,16 +62066,6 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/command/heads_quarters/qm) -"usA" = ( -/obj/machinery/door/window/left/directional/south{ - name = "Bio-Generator"; - req_access = list("hydroponics") - }, -/obj/machinery/biogenerator, -/obj/effect/turf_decal/delivery, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/station/service/hydroponics) "usF" = ( /obj/effect/mapping_helpers/broken_floor, /obj/structure/easel, @@ -62036,19 +62243,13 @@ }, /turf/open/floor/iron/small, /area/station/engineering/atmos/pumproom) -"uvs" = ( -/obj/effect/turf_decal/siding/thinplating{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/eighties, -/area/station/hallway/primary/central/fore) "uvx" = ( -/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 +/obj/effect/mapping_helpers/airlock/access/all/service/kitchen, +/obj/structure/cable, +/obj/machinery/door/airlock{ + name = "Maintenance" }, /turf/open/floor/plating, /area/station/maintenance/central/greater) @@ -62151,25 +62352,20 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos/pumproom) -"uyV" = ( -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 1 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 8 - }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) "uzj" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/security/prison/garden) +"uzm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/chapel) "uzo" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -62232,6 +62428,7 @@ /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "uAK" = ( @@ -62321,12 +62518,10 @@ /turf/open/floor/iron, /area/station/engineering/lobby) "uBN" = ( -/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 = 10 - }, +/obj/effect/turf_decal/siding/wood, +/obj/structure/cable, /turf/open/floor/stone, /area/station/service/bar/backroom) "uBQ" = ( @@ -62356,9 +62551,8 @@ /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible/layer4{ dir = 8 }, -/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped{ - dir = 4; - piping_layer = 2 +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/layer2{ + dir = 4 }, /turf/open/space/basic, /area/station/engineering/atmos/space_catwalk) @@ -62373,11 +62567,11 @@ "uCo" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/cable, /obj/structure/extinguisher_cabinet/directional/north, /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/wood/parquet, /area/station/service/library) "uCp" = ( @@ -62385,13 +62579,6 @@ /obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white/side, /area/station/hallway/primary/starboard) -"uCB" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 6 - }, -/obj/structure/flora/bush/sparsegrass, -/turf/open/floor/grass, -/area/station/service/chapel) "uCE" = ( /obj/machinery/atmospherics/pipe/smart/simple/cyan/visible{ dir = 5 @@ -62452,6 +62639,21 @@ dir = 8 }, /area/station/commons/fitness/locker_room) +"uDB" = ( +/obj/structure/cable, +/obj/structure/disposalpipe/segment, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "uDE" = ( /obj/structure/window/spawner/directional/north, /obj/structure/flora/bush/flowers_yw/style_random, @@ -62621,16 +62823,6 @@ dir = 1 }, /area/station/hallway/primary/starboard) -"uFG" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/neutral/line, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "uFQ" = ( /obj/structure/closet/crate/coffin, /obj/structure/window/spawner/directional/south, @@ -62690,14 +62882,6 @@ }, /turf/open/floor/iron, /area/station/engineering/hallway) -"uGD" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/bookcase/random/adult, -/obj/structure/sign/poster/official/random/directional/north, -/turf/open/floor/iron/grimy, -/area/station/service/library) "uGH" = ( /obj/machinery/rnd/production/circuit_imprinter, /obj/effect/turf_decal/bot, @@ -63047,25 +63231,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/central/lesser) -"uLK" = ( -/obj/structure/sign/directions/evac/directional/west, -/obj/structure/sign/directions/science/directional/west{ - dir = 4; - pixel_y = -8 - }, -/obj/structure/sign/directions/security/directional/west{ - pixel_y = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/red/line, -/obj/effect/turf_decal/stripes/red/line{ - dir = 1 - }, -/turf/open/floor/iron/small, -/area/station/hallway/primary/central/fore) "uLO" = ( /obj/item/stack/sheet/cardboard{ amount = 14 @@ -63133,6 +63298,10 @@ "uMH" = ( /turf/open/floor/iron/white/side, /area/station/science/research) +"uMJ" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics) "uMN" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/structure/hedge, @@ -63236,13 +63405,6 @@ }, /turf/open/floor/wood/tile, /area/station/maintenance/central/lesser) -"uOz" = ( -/obj/structure/flora/rock/pile/jungle/style_4, -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/turf/open/floor/grass, -/area/station/service/chapel) "uOH" = ( /obj/item/kirbyplants/random, /obj/machinery/light_switch/directional/west, @@ -63439,13 +63601,6 @@ "uSa" = ( /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) -"uSb" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, -/turf/open/floor/iron/grimy, -/area/station/service/library) "uSh" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -63609,6 +63764,14 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/department/engine) +"uUB" = ( +/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/stone, +/area/station/service/bar) "uUG" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -63618,13 +63781,13 @@ "uVo" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/trimline/neutral/line{ dir = 4 }, /obj/effect/turf_decal/trimline/neutral/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/central/fore) "uVD" = ( @@ -63632,6 +63795,13 @@ /obj/machinery/airalarm/directional/east, /turf/open/floor/iron/dark, /area/station/hallway/secondary/construction) +"uVH" = ( +/obj/machinery/modular_computer/preset/civilian{ + dir = 4 + }, +/obj/machinery/status_display/evac/directional/west, +/turf/open/floor/circuit/red, +/area/station/ai_monitored/turret_protected/ai) "uVO" = ( /obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/broken_floor, @@ -63787,6 +63957,14 @@ /obj/effect/turf_decal/stripes/end, /turf/open/floor/plating, /area/station/security/brig/entrance) +"uYM" = ( +/obj/machinery/deepfryer, +/obj/structure/sign/poster/official/random/directional/north, +/obj/effect/turf_decal/siding/end{ + dir = 4 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "uYO" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -63814,15 +63992,6 @@ }, /turf/open/floor/iron, /area/station/security/brig/entrance) -"uZy" = ( -/obj/effect/turf_decal/weather/snow, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/effect/turf_decal/weather/snow/corner, -/turf/open/floor/iron/freezer, -/area/station/service/kitchen/coldroom) "uZA" = ( /obj/structure/chair{ dir = 1; @@ -63848,6 +64017,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/central/lesser) +"uZY" = ( +/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 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "vaf" = ( /obj/item/kirbyplants/random/fullysynthetic, /obj/machinery/status_display/ai/directional/south, @@ -64218,15 +64397,13 @@ /turf/open/floor/iron/dark, /area/station/science/lab) "vfo" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral/opposingcorners{ - dir = 1 - }, -/obj/effect/turf_decal/siding/thinplating_new{ - dir = 10 +/obj/effect/turf_decal/tile/green/opposingcorners, +/obj/effect/turf_decal/tile/blue/opposingcorners{ + dir = 8 }, -/turf/open/floor/iron/small, -/area/station/hallway/secondary/service) +/obj/structure/extinguisher_cabinet/directional/east, +/turf/open/floor/iron, +/area/station/service/hydroponics) "vfD" = ( /obj/effect/turf_decal/siding/thinplating_new/light, /obj/structure/reagent_dispensers/fueltank, @@ -64237,6 +64414,18 @@ /obj/structure/hedge, /turf/open/floor/iron/grimy, /area/station/engineering/main) +"vfI" = ( +/obj/machinery/microwave{ + pixel_y = 5 + }, +/obj/machinery/light_switch/directional/north, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/table, +/obj/effect/turf_decal/siding/end, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "vfK" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -64250,17 +64439,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"vfM" = ( -/obj/machinery/door/airlock/multi_tile/public{ - dir = 8 - }, -/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/iron/textured_half{ - dir = 8 - }, -/area/station/service/bar) "vfN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -64342,6 +64520,17 @@ /obj/structure/barricade/wooden, /turf/open/floor/iron, /area/station/hallway/secondary/construction) +"vgS" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/desk_bell{ + pixel_x = 4; + pixel_y = 3 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/bar) "vgY" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -64403,6 +64592,7 @@ "vip" = ( /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/hallway/primary/central/aft) "vir" = ( @@ -64585,7 +64775,9 @@ /turf/open/floor/plating, /area/station/maintenance/department/engine) "vkI" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, /turf/open/floor/wood/tile, /area/station/service/bar) "vkJ" = ( @@ -64855,6 +65047,7 @@ /area/station/security/medical) "vnr" = ( /obj/structure/disposalpipe/segment, +/obj/structure/cable, /turf/open/floor/wood, /area/station/service/chapel/office) "vnu" = ( @@ -64985,6 +65178,7 @@ dir = 1 }, /obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/port) "vpk" = ( @@ -65151,19 +65345,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/herringbone, /area/station/commons/dorms) -"vrH" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "vrK" = ( /obj/structure/lattice/catwalk, /obj/structure/cable, @@ -65322,6 +65503,16 @@ }, /turf/open/floor/iron/smooth, /area/station/maintenance/solars/starboard/aft) +"vun" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable, +/obj/machinery/requests_console/auto_name/directional/west, +/obj/effect/mapping_helpers/requests_console/supplies, +/turf/open/floor/stone, +/area/station/service/bar) "vuq" = ( /obj/effect/turf_decal/tile/yellow{ dir = 1 @@ -65352,6 +65543,18 @@ /obj/effect/mapping_helpers/airlock/access/all/science/xenobio, /turf/open/floor/catwalk_floor/iron, /area/station/science/xenobiology) +"vuD" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "vuH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/power/apc/auto_name/directional/west, @@ -65421,6 +65624,7 @@ /obj/machinery/door/airlock/public/glass{ name = "Aft Corridor" }, +/obj/structure/cable, /turf/open/floor/iron/textured_half, /area/station/hallway/primary/aft) "vvg" = ( @@ -65561,6 +65765,13 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron/small, /area/station/security/office) +"vwW" = ( +/obj/machinery/chem_master/condimaster, +/obj/effect/turf_decal/siding/end{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/service/kitchen) "vwZ" = ( /obj/structure/chair/sofa/bench{ dir = 4 @@ -65596,13 +65807,24 @@ "vxt" = ( /turf/closed/wall, /area/station/maintenance/department/engine) +"vxA" = ( +/obj/effect/turf_decal/tile/neutral/opposingcorners{ + dir = 1 + }, +/obj/effect/turf_decal/siding/thinplating_new{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 8 + }, +/turf/open/floor/iron/small, +/area/station/hallway/secondary/service) "vxM" = ( /turf/open/floor/iron, /area/station/commons/storage/art) "vxR" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4; - piping_layer = 2 +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer2{ + dir = 4 }, /obj/machinery/light/cold/directional/west, /turf/open/floor/iron/dark, @@ -65652,10 +65874,10 @@ /turf/open/floor/iron/dark, /area/station/engineering/atmospherics_engine) "vyP" = ( -/obj/machinery/vending/wardrobe/hydro_wardrobe, /obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 5 + dir = 1 }, +/obj/structure/closet/secure_closet/hydroponics, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) "vyR" = ( @@ -65872,6 +66094,16 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/science/research) +"vCi" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 9 + }, +/obj/effect/turf_decal/trimline/neutral/corner, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "vCl" = ( /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -65973,6 +66205,13 @@ /obj/machinery/duct, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) +"vEk" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/item/kirbyplants/random, +/turf/open/floor/iron, +/area/station/hallway/primary/central/aft) "vEn" = ( /obj/effect/turf_decal/tile/blue, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -66030,14 +66269,6 @@ "vEW" = ( /turf/closed/wall/r_wall, /area/station/security/prison/shower) -"vEY" = ( -/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/plating, -/area/station/maintenance/central/greater) "vEZ" = ( /obj/structure/railing, /obj/structure/railing/corner{ @@ -66156,6 +66387,9 @@ /obj/effect/turf_decal/tile/blue/opposingcorners{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 1 + }, /obj/effect/landmark/start/clown, /turf/open/floor/iron/smooth, /area/station/service/greenroom) @@ -66263,6 +66497,11 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/starboard/aft) +"vIz" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "vIC" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -66608,14 +66847,6 @@ /obj/item/food/grown/mushroom/libertycap, /turf/open/misc/asteroid, /area/station/maintenance/starboard/greater) -"vMV" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/obj/effect/mapping_helpers/broken_floor, -/obj/effect/spawner/random/trash, -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "vMX" = ( /obj/effect/turf_decal/stripes/white/line{ dir = 5 @@ -66660,6 +66891,20 @@ /obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/smooth, /area/station/cargo/warehouse) +"vNM" = ( +/obj/machinery/door/airlock{ + name = "Hydroponics Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/hydroponics, +/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/textured_half{ + dir = 8 + }, +/area/station/service/hydroponics) "vOf" = ( /obj/structure/cable, /obj/structure/chair{ @@ -66788,6 +67033,13 @@ /obj/structure/flora/rock/pile/jungle/style_random, /turf/open/misc/sandy_dirt, /area/station/maintenance/port/lesser) +"vQu" = ( +/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/central/greater) "vQv" = ( /obj/structure/window/spawner/directional/west, /obj/structure/flora/bush/large/style_random, @@ -66869,6 +67121,7 @@ /area/station/hallway/primary/aft) "vSw" = ( /obj/effect/landmark/start/hangover, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/aft) "vSx" = ( @@ -66879,6 +67132,13 @@ }, /turf/open/floor/iron/kitchen/small, /area/station/security/prison/mess) +"vSI" = ( +/obj/machinery/door/firedoor, +/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/small, +/area/station/service/bar) "vSL" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/effect/turf_decal/tile/neutral{ @@ -67024,12 +67284,10 @@ /turf/open/floor/iron, /area/station/maintenance/port/aft) "vUh" = ( -/obj/machinery/atmospherics/components/binary/pump/off/general/visible/layer1{ - dir = 4; +/obj/machinery/atmospherics/components/binary/pump/off/general/visible{ name = "Plasma to Pure"; color = "#BF40BF"; - piping_layer = 3; - icon_state = "pump_map-3" + dir = 4 }, /turf/open/floor/iron/dark, /area/station/engineering/atmos) @@ -67073,6 +67331,24 @@ }, /turf/open/floor/iron/white/small, /area/station/security/prison/safe) +"vUS" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/chapel) +"vUV" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/stone, +/area/station/service/chapel) "vVo" = ( /obj/machinery/light/cold/directional/south, /obj/structure/table/reinforced, @@ -67234,7 +67510,11 @@ "vXd" = ( /obj/item/flashlight/lantern/on, /obj/effect/turf_decal/siding/wood, -/turf/open/floor/stone, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, /area/station/service/chapel) "vXi" = ( /obj/structure/table, @@ -67329,18 +67609,6 @@ }, /turf/open/floor/iron/dark/herringbone, /area/station/security/courtroom) -"vYJ" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/siding/wood/corner, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/turf/open/floor/stone, -/area/station/service/bar/backroom) "vYL" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -67379,13 +67647,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/iron/white, /area/station/medical/paramedic) -"vYW" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/structure/table/wood, -/turf/open/floor/iron/grimy, -/area/station/service/bar) "vZb" = ( /obj/structure/cable, /obj/structure/table, @@ -67965,17 +68226,6 @@ /obj/structure/filingcabinet, /turf/open/floor/iron/dark/small, /area/station/security/detectives_office) -"wjT" = ( -/obj/machinery/barsign{ - chosen_sign = "thecavern"; - icon_state = "thecavern"; - pixel_y = 32 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "wjZ" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -67996,13 +68246,6 @@ }, /turf/open/floor/wood/tile, /area/station/command/bridge) -"wku" = ( -/obj/effect/turf_decal/weather/dirt{ - dir = 1 - }, -/obj/machinery/light/floor, -/turf/open/floor/grass, -/area/station/service/chapel) "wkF" = ( /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, @@ -68155,6 +68398,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central/aft) "wnd" = ( @@ -68223,11 +68467,17 @@ /turf/open/floor/plating, /area/station/tcommsat/server) "woz" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/camera/autoname/directional/east, +/obj/effect/spawner/random/entertainment/arcade{ + dir = 8 + }, /obj/effect/turf_decal/siding/thinplating{ - dir = 5 + dir = 4 }, /obj/structure/cable, -/turf/open/floor/eighties, +/obj/machinery/light/small/dim/directional/east, +/turf/open/floor/eighties/red, /area/station/hallway/primary/central/fore) "woD" = ( /obj/effect/turf_decal/siding/wood{ @@ -68249,6 +68499,20 @@ /obj/item/wrench, /turf/open/floor/catwalk_floor, /area/station/science/xenobiology) +"woK" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "woP" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -68365,6 +68629,16 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/security/prison/workout) +"wrj" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/spawner/random/trash, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "wrk" = ( /obj/effect/turf_decal/siding/wideplating/dark{ dir = 1 @@ -68405,6 +68679,7 @@ /obj/effect/turf_decal/trimline/neutral/end{ dir = 1 }, +/obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/aft) "wrO" = ( @@ -68564,8 +68839,12 @@ /turf/open/floor/iron/smooth, /area/station/service/greenroom) "wtw" = ( -/obj/structure/chair/stool/bar/directional/west, -/turf/open/floor/wood/large, +/obj/effect/turf_decal/siding/wood/end{ + dir = 4 + }, +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/floor/iron/dark/diagonal, /area/station/service/bar) "wtx" = ( /obj/structure/cannon{ @@ -68595,12 +68874,6 @@ dir = 4 }, /area/station/science/lobby) -"wtV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ - dir = 4 - }, -/turf/open/floor/stone, -/area/station/service/chapel) "wtX" = ( /turf/closed/wall/r_wall, /area/station/security/checkpoint/customs/auxiliary) @@ -68670,11 +68943,11 @@ /turf/closed/wall, /area/station/command/heads_quarters/qm) "wuY" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/structure/chair/wood{ - dir = 8 + dir = 4 }, -/turf/open/floor/iron/grimy, +/obj/machinery/light/floor, +/turf/open/floor/stone, /area/station/service/bar) "wvk" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68858,9 +69131,7 @@ /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 1 }, -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser, /obj/effect/decal/cleanable/cobweb, /obj/machinery/light/small/directional/north, /turf/open/floor/iron/dark, @@ -68871,6 +69142,13 @@ /obj/effect/turf_decal/tile/dark_red, /turf/open/floor/iron, /area/station/security/prison) +"wyg" = ( +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics) "wyj" = ( /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/dirt, @@ -68939,9 +69217,6 @@ /obj/machinery/newscaster/directional/north, /turf/open/floor/iron/smooth, /area/station/engineering/atmos/office) -"wzj" = ( -/turf/open/floor/plating, -/area/station/maintenance/central/greater) "wzo" = ( /obj/machinery/light/small/directional/north, /obj/effect/landmark/start/cargo_technician, @@ -68982,8 +69257,9 @@ /turf/open/floor/carpet/lone, /area/station/service/chapel/office) "wAa" = ( -/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 = 10 + }, /turf/open/floor/wood/tile, /area/station/service/bar) "wAb" = ( @@ -69414,7 +69690,8 @@ /area/station/medical/medbay/central) "wHO" = ( /obj/structure/sign/poster/official/random/directional/north, -/obj/structure/closet/crate/wooden/toy, +/obj/machinery/vending/autodrobe, +/obj/machinery/light/small/directional/east, /turf/open/floor/wood/parquet, /area/station/service/greenroom) "wHP" = ( @@ -69501,6 +69778,16 @@ /obj/structure/cable, /turf/closed/wall/r_wall, /area/station/maintenance/department/science/xenobiology) +"wJv" = ( +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/obj/effect/spawner/random/food_or_drink/refreshing_beverage{ + pixel_y = 10 + }, +/turf/open/floor/iron/dark/diagonal, +/area/station/service/bar) "wJx" = ( /turf/closed/wall/r_wall, /area/station/security/courtroom) @@ -69535,10 +69822,9 @@ /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) "wJT" = ( -/obj/structure/flora/tree/jungle/small/style_4, -/obj/structure/flora/grass/jungle/b/style_random{ - pixel_y = -3; - pixel_x = 3 +/obj/structure/flora/bush/flowers_pp/style_2, +/obj/effect/turf_decal/weather/dirt{ + dir = 1 }, /turf/open/floor/grass, /area/station/service/chapel) @@ -69621,32 +69907,10 @@ /turf/open/floor/wood, /area/station/maintenance/starboard/greater) "wKH" = ( -/obj/structure/cable, -/obj/effect/turf_decal/siding/wood{ - dir = 4 - }, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/camera/autoname/directional/east, -/obj/machinery/computer/security/telescreen/entertainment/directional/east, -/obj/effect/turf_decal/siding/wood/corner{ - dir = 1 - }, -/turf/open/floor/stone, -/area/station/service/bar) -"wKM" = ( -/obj/structure/disposalpipe/segment, -/obj/machinery/door/airlock{ - name = "Maintenance" - }, -/obj/effect/mapping_helpers/airlock/access/any/service/maintenance, -/obj/effect/mapping_helpers/airlock/unres, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/spawner/random/maintenance, +/obj/structure/rack, /turf/open/floor/plating, -/area/station/maintenance/central/greater) +/area/station/service/bar) "wKO" = ( /obj/structure/disposalpipe/segment, /obj/machinery/camera/directional/east, @@ -69668,21 +69932,6 @@ /obj/machinery/incident_display/dual/directional/north, /turf/open/floor/iron/smooth, /area/station/command/bridge) -"wKX" = ( -/obj/structure/table, -/obj/machinery/microwave{ - pixel_y = 5 - }, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) -"wLa" = ( -/obj/machinery/smartfridge, -/obj/machinery/door/poddoor/shutters{ - name = "Kitchen Shutters"; - id = "kitchenshutters" - }, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "wLd" = ( /turf/closed/wall/r_wall, /area/station/maintenance/solars/port/aft) @@ -69831,6 +70080,18 @@ }, /turf/open/floor/iron, /area/station/engineering/atmos) +"wNs" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/line, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "wNv" = ( /obj/effect/landmark/navigate_destination/bridge, /turf/open/floor/iron/smooth_half, @@ -69960,13 +70221,15 @@ /turf/open/floor/plating, /area/station/science/genetics) "wOt" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 8 - }, /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/turf/open/floor/stone, +/obj/machinery/firealarm/directional/east, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/tile, /area/station/service/bar) "wOz" = ( /obj/effect/landmark/generic_maintenance_landmark, @@ -70027,10 +70290,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/interrogation) -"wPf" = ( -/obj/item/clothing/glasses/blindfold, -/turf/open/space/basic, -/area/space) "wPh" = ( /obj/structure/disposalpipe/trunk{ dir = 8 @@ -70154,6 +70413,12 @@ }, /turf/open/floor/iron/smooth, /area/station/security/evidence) +"wQw" = ( +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/turf/open/floor/stone, +/area/station/service/chapel) "wQx" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -70507,6 +70772,17 @@ /obj/machinery/light/small/dim/directional/north, /turf/open/floor/plating, /area/station/maintenance/department/prison) +"wVN" = ( +/obj/machinery/door/airlock{ + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/access/any/service/general, +/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/plating, +/area/station/maintenance/central/greater) "wWb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/green/visible, /obj/structure/railing{ @@ -70529,14 +70805,6 @@ dir = 1 }, /area/station/hallway/secondary/construction) -"wWC" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/effect/landmark/start/librarian, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/turf/open/floor/iron/grimy, -/area/station/service/library) "wWD" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/landmark/start/hangover, @@ -70625,6 +70893,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/catwalk_floor/iron_dark, /area/station/security/processing) +"wXt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, +/turf/open/floor/stone, +/area/station/service/chapel) "wXC" = ( /obj/effect/turf_decal/siding/red{ dir = 5 @@ -70743,6 +71015,14 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/starboard/central) +"wZD" = ( +/obj/effect/turf_decal/weather/dirt, +/obj/structure/flora/bush/large/style_random{ + pixel_x = -20; + pixel_y = 3 + }, +/turf/open/floor/grass, +/area/station/service/chapel) "wZF" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, @@ -70926,6 +71206,15 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark/herringbone, /area/station/ai_monitored/command/nuke_storage) +"xcz" = ( +/obj/structure/window/spawner/directional/west, +/obj/structure/flora/bush/jungle/a/style_random, +/obj/structure/flora/bush/flowers_pp/style_random, +/obj/structure/window/spawner/directional/east, +/obj/machinery/light/floor, +/obj/structure/window/spawner/directional/north, +/turf/open/floor/grass, +/area/station/service/hydroponics) "xcF" = ( /turf/open/floor/iron, /area/station/commons/dorms) @@ -71004,24 +71293,6 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) -"xdy" = ( -/obj/structure/table, -/obj/machinery/reagentgrinder{ - pixel_y = 9; - pixel_x = 4 - }, -/obj/item/reagent_containers/condiment/enzyme{ - pixel_x = -7; - pixel_y = 6 - }, -/obj/item/reagent_containers/condiment/peppermill{ - pixel_x = 3 - }, -/obj/item/reagent_containers/condiment/saltshaker{ - pixel_x = -3 - }, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "xdJ" = ( /obj/machinery/door/airlock/engineering{ name = "Engine Airlock" @@ -71047,6 +71318,14 @@ }, /turf/open/floor/iron/white/corner, /area/station/hallway/secondary/exit/departure_lounge) +"xdV" = ( +/obj/structure/table, +/obj/machinery/cell_charger{ + pixel_y = 5 + }, +/obj/item/stock_parts/power_store/cell/high, +/turf/open/floor/engine, +/area/station/science/xenobiology) "xed" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -71316,10 +71595,10 @@ name = "Public Shrine" }, /obj/machinery/door/firedoor, -/obj/effect/turf_decal/siding/wood/end{ - dir = 4 +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/textured_half{ + dir = 8 }, -/turf/open/floor/stone, /area/station/hallway/primary/central/fore) "xhD" = ( /obj/structure/table, @@ -71490,6 +71769,16 @@ /obj/structure/tram, /turf/open/floor/tram, /area/station/security/tram) +"xjQ" = ( +/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 + }, +/obj/effect/spawner/random/trash, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "xjT" = ( /obj/machinery/door/airlock/external{ name = "Construction Zone" @@ -71500,6 +71789,7 @@ /obj/machinery/vending/wardrobe/chap_wardrobe, /obj/effect/decal/cleanable/dirt, /obj/machinery/camera/autoname/directional/south, +/obj/structure/cable, /turf/open/floor/carpet/lone, /area/station/service/chapel/office) "xjX" = ( @@ -71572,6 +71862,9 @@ /obj/machinery/power/shieldwallgen, /turf/open/floor/iron/smooth_large, /area/station/command/teleporter) +"xkV" = ( +/turf/open/floor/stone, +/area/station/service/bar) "xkX" = ( /obj/effect/turf_decal/tile/yellow/diagonal_centre, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -71618,6 +71911,15 @@ "xlP" = ( /turf/open/floor/engine, /area/station/science/xenobiology) +"xlU" = ( +/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/cable, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "xlZ" = ( /turf/open/floor/iron, /area/station/maintenance/hallway/abandoned_command) @@ -71673,13 +71975,9 @@ "xnb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/effect/turf_decal/siding/thinplating_new/light{ - dir = 6 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, +/obj/effect/turf_decal/siding/thinplating_new/light, +/obj/machinery/requests_console/auto_name/directional/south, +/obj/effect/mapping_helpers/requests_console/supplies, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) "xng" = ( @@ -71707,6 +72005,8 @@ dir = 8 }, /obj/machinery/airalarm/directional/south, +/obj/item/kirbyplants/random, +/obj/machinery/light/small/directional/south, /turf/open/floor/iron/smooth, /area/station/service/greenroom) "xnA" = ( @@ -72065,7 +72365,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/door/window/right/directional/south{ - layer = 3.1; name = "Upload Console Window"; req_access = list("ai_upload") }, @@ -72232,13 +72531,13 @@ /turf/open/floor/iron/checker, /area/station/security/breakroom) "xtD" = ( -/obj/effect/turf_decal/siding/wood/corner{ - dir = 8 - }, /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/turf/open/floor/stone, +/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/bar) "xtI" = ( /turf/closed/wall/r_wall, @@ -72458,6 +72757,13 @@ /obj/machinery/shower/directional/east, /turf/open/floor/iron/showroomfloor, /area/station/security/prison/shower) +"xwj" = ( +/obj/effect/spawner/structure/window/reinforced/tinted, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/plating, +/area/station/security/courtroom) "xwk" = ( /obj/effect/mapping_helpers/broken_floor, /obj/machinery/airalarm/directional/north, @@ -72628,16 +72934,13 @@ /turf/open/floor/iron/white/textured_large, /area/station/medical/medbay/lobby) "xym" = ( -/obj/machinery/door/airlock{ - name = "Maintenance" +/obj/effect/turf_decal/siding/thinplating_new/light{ + dir = 5 }, -/obj/effect/mapping_helpers/airlock/access/any/service/general, -/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/plating, -/area/station/maintenance/central/greater) +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk, +/turf/open/floor/iron/white/small, +/area/station/service/hydroponics) "xyt" = ( /obj/effect/turf_decal/weather/dirt, /obj/structure/flora/bush/flowers_yw, @@ -72682,10 +72985,6 @@ /obj/structure/broken_flooring/pile/directional/east, /turf/open/floor/plating, /area/station/maintenance/starboard/aft) -"xza" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/space/basic, -/area/space) "xzd" = ( /obj/structure/lattice, /obj/structure/railing/corner, @@ -73020,8 +73319,8 @@ /turf/open/floor/plating, /area/station/maintenance/starboard/central) "xEl" = ( -/obj/item/kirbyplants/random, /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/structure/twelve_percent_spirit_board, /turf/open/floor/wood, /area/station/service/chapel/office) "xEm" = ( @@ -73243,10 +73542,6 @@ /obj/effect/spawner/random/trash, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) -"xHb" = ( -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/science/ordnance) "xHc" = ( /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -73343,16 +73638,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/treatment_center) -"xIw" = ( -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/neutral/line{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/fore) "xIA" = ( /obj/effect/turf_decal/arrows{ dir = 8 @@ -73396,24 +73681,6 @@ /obj/machinery/status_display/evac/directional/north, /turf/open/floor/iron, /area/station/hallway/secondary/dock) -"xJv" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor/border_only{ - dir = 4 - }, -/obj/item/reagent_containers/cup/bowl{ - pixel_y = 3 - }, -/obj/item/reagent_containers/cup/bowl{ - pixel_y = 8; - pixel_x = 3 - }, -/obj/machinery/door/poddoor/shutters{ - name = "Kitchen Shutters"; - id = "kitchenshutters" - }, -/turf/open/floor/plating, -/area/station/service/kitchen) "xJw" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/neutral/line{ @@ -73663,16 +73930,6 @@ "xNw" = ( /turf/closed/wall, /area/station/science/breakroom) -"xNA" = ( -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/chair/wood{ - dir = 8 - }, -/turf/open/floor/iron/grimy, -/area/station/service/bar) "xND" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/south, @@ -73801,6 +74058,13 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/security/prison/rec) +"xPp" = ( +/obj/effect/turf_decal/weather/dirt{ + dir = 5 + }, +/obj/structure/flora/tree/jungle/style_3, +/turf/open/floor/grass, +/area/station/service/chapel) "xPs" = ( /obj/effect/turf_decal/weather/dirt{ dir = 5 @@ -73821,6 +74085,20 @@ /obj/effect/landmark/start/hangover, /turf/open/floor/iron, /area/station/hallway/secondary/recreation) +"xPJ" = ( +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/neutral/line{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "xPN" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -73910,14 +74188,6 @@ /obj/structure/cable, /turf/open/floor/stone, /area/station/command/heads_quarters/captain/private) -"xQE" = ( -/obj/effect/turf_decal/siding/wood, -/obj/effect/turf_decal/siding/wood{ - dir = 1 - }, -/obj/effect/landmark/start/hangover, -/turf/open/floor/stone, -/area/station/service/bar) "xQG" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -74236,15 +74506,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/lobby) -"xUp" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/window/right/directional/south, -/obj/machinery/door/poddoor/shutters{ - name = "Kitchen Shutters"; - id = "kitchenshutters" - }, -/turf/open/floor/iron/kitchen/small, -/area/station/service/kitchen) "xUr" = ( /obj/structure/rack, /obj/machinery/flasher/directional/west, @@ -74516,9 +74777,9 @@ /area/station/maintenance/starboard/aft) "xXD" = ( /obj/effect/turf_decal/siding/thinplating_new/light, -/obj/structure/cable, -/obj/machinery/power/apc/auto_name/directional/south, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/machinery/power/apc/auto_name/directional/south, +/obj/structure/cable, /turf/open/floor/iron/white/small, /area/station/service/hydroponics) "xXG" = ( @@ -74655,8 +74916,8 @@ /area/station/maintenance/port/greater) "xZe" = ( /obj/effect/landmark/start/chaplain, -/obj/effect/turf_decal/siding/wood{ - dir = 4 +/obj/effect/turf_decal/siding/wood/end{ + dir = 8 }, /turf/open/floor/stone, /area/station/service/chapel) @@ -74848,13 +75109,6 @@ dir = 8 }, /area/station/hallway/secondary/entry) -"ybF" = ( -/obj/machinery/atmospherics/pipe/smart/simple/general/visible{ - dir = 4 - }, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/engine, -/area/station/science/xenobiology) "ybJ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -74882,7 +75136,7 @@ dir = 6 }, /obj/structure/flora/grass/jungle, -/turf/open/floor/grass, +/turf/open/misc/dirt/station, /area/station/service/chapel) "ycd" = ( /obj/effect/spawner/structure/window/reinforced, @@ -74940,12 +75194,28 @@ /turf/open/floor/iron, /area/station/hallway/secondary/recreation) "ycS" = ( +/obj/machinery/newscaster/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/camera/autoname/directional/west, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, /turf/open/floor/wood/tile, /area/station/service/bar) "ycW" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/iron/smooth_edge, /area/station/engineering/supermatter/room) +"ycX" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/sign/poster/official/random/directional/west, +/turf/open/floor/iron, +/area/station/hallway/primary/central/fore) "ydf" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -74992,16 +75262,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark/side, /area/station/hallway/primary/central/fore) -"ydH" = ( -/obj/effect/turf_decal/box/corners, -/obj/effect/turf_decal/box/corners{ - dir = 8 - }, -/obj/machinery/plumbing/input{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/cytology) "ydI" = ( /obj/machinery/light/cold/directional/north, /obj/effect/decal/cleanable/dirt/dust, @@ -75145,14 +75405,6 @@ }, /turf/open/floor/iron/small, /area/station/commons/fitness/locker_room) -"yfG" = ( -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/effect/turf_decal/trimline/neutral/end{ - dir = 8 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/central/aft) "yfJ" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/decal/cleanable/dirt, @@ -75169,16 +75421,16 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/maintenance/department/engine/atmos) -"yfP" = ( -/obj/machinery/modular_computer/preset/civilian{ - dir = 4 - }, -/turf/open/floor/circuit/red, -/area/station/ai_monitored/turret_protected/ai) "yfQ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/station/maintenance/department/science/xenobiology) +"yfX" = ( +/obj/machinery/space_heater, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plating, +/area/station/maintenance/central/greater) "yfY" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -75284,6 +75536,14 @@ /obj/structure/cable, /turf/open/floor/iron/smooth, /area/station/command/gateway) +"yhX" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/station/service/chapel) "yhY" = ( /obj/effect/turf_decal/siding/blue{ dir = 6 @@ -84623,7 +84883,7 @@ wBo giq wBo vmL -apj +hZf kwH nID vmL @@ -84905,12 +85165,12 @@ brC brC pfx ybO -akZ -akZ -akZ -akZ -akZ -akZ +aJq +aJq +aJq +aJq +aJq +aJq gcs blb blb @@ -86680,7 +86940,7 @@ gKs gKs aOb utf -mfV +eMb mFD mrW hYC @@ -87260,7 +87520,7 @@ fLF ahr nFX nFX -ozn +lYa pSP mhk mhk @@ -88038,7 +88298,7 @@ cXb sry uoR neF -hHy +hed hAB jCm iSD @@ -88292,7 +88552,7 @@ iHT pRc mhk pbw -rpF +qzP neF hmC xZe @@ -88550,10 +88810,10 @@ kwy mhk bBh qzP -tBk -keL +krF +sOi tts -tBk +dRn keL iSD rnr @@ -88809,11 +89069,11 @@ fme flw apq bJx -hHy +miF sMj vqF iyR -xYD +kiY tev wBm wXk @@ -89065,11 +89325,11 @@ iLH oyz tmi klN -tBk +nDj miF -keL +oiZ lvJ -ahl +xYD gRm rmk wBm @@ -89322,9 +89582,9 @@ mhk jSJ tOd qzP -tBk +nDj miF -keL +oiZ xPs qOb iQp @@ -89581,7 +89841,7 @@ ugI rYs dPx nqY -keL +oiZ iSD fGW bIJ @@ -89593,7 +89853,7 @@ rpE tAF vnr caD -buc +llZ alg qwK xjU @@ -89835,18 +90095,18 @@ mze mhk feL peU -iSD -dPx +cxz +vUS miF -keL -iSD +lFm +szC iSD iSD iSD wBm wXk pEO -xOS +gKR rQC von pvC @@ -90092,13 +90352,13 @@ mze mhk fgT ycb -aWr -dPx -miF +nDj +jlC +wha oIL -hHy +lFm kzV -hHy +uaa eYB mIE wXk @@ -90348,11 +90608,11 @@ mhk gLV mhk bTo -sNA iSD -dPx -miF -miF +nDj +vUV +hmH +tBk miF miF miF @@ -90606,15 +90866,15 @@ xsD srn xxj cSb -iSD -dPx -miF +nDj +dkh +hHy fMX -wha -wha -wha -mkz -hla +cxz +cZs +cZs +eYB +mIE wXk uQK iXZ @@ -90862,12 +91122,12 @@ mhk fpN mhk kZj -kzz -iSD +xyt +apq nrp -miF -keL -iSD +wXt +fYe +uzm iSD iyR rya @@ -91118,15 +91378,15 @@ mhk ozt mrn vRn -wku +ani bKv jCm dPx miF -keL -iSD +yhX iSD -uOz +iyR +lkJ qzP wAW yiY @@ -91376,11 +91636,11 @@ sNW jQv mhk oOC -qXr +xYD dhu kZI miF -keL +yhX jCm hOO lzG @@ -91634,12 +91894,12 @@ jQv mhk rqF aFb -fVF -kZI +qzP +sQy miF -keL +yhX iSD -iyR +ani cLL rPW wBm @@ -91889,14 +92149,14 @@ mhk mhk ete mhk -ani +dlB wJT sGk kZI miF -keL -iSD +yhX iSD +ani eln jlW wBm @@ -92146,12 +92406,12 @@ vMP vMP eRy mhk -pbK +iSD keQ -qzP -kZI +cxz +vUS miF -keL +yhX iyR sSN ttb @@ -92404,14 +92664,14 @@ mhk oTH mhk lji -ttb -qzP -kZI +wZD +nDj +sRF miF -keL +yhX lmm lkJ -nxK +iQp fVF wBm fNW @@ -92660,15 +92920,15 @@ kbk mhk mhk mhk -oOC -lPq -uCB -kZI -miF -keL +sZA +xyt +nDj +fiW +cfb +yhX jgq hYh -qXr +ahl oul wBm dcD @@ -92917,12 +93177,12 @@ kym rHD qVR wCR -ani -gUN -iSD +jRz +qzP +nDj kVg -miF -keL +oUb +yhX bQd ani hKZ @@ -93175,10 +93435,10 @@ qmz uvb wCR swM -mEb -iSD -kZI -miF +jlW +lFm +ftC +oUb vXd iSD gVL @@ -93431,12 +93691,12 @@ kym rHH oUJ wCR -aQc -iSD -iSD +oOC +iRE +rya kZI -wtV -keL +oUb +yhX iSD ojA uPW @@ -93688,12 +93948,12 @@ kCB rJo sas wCR -cXb -iSD -iSD -lPB +rTn +xPp +uoR +kZI odH -keL +yhX iSD gOt bYh @@ -93768,7 +94028,7 @@ dDB dDB dDB dDB -dbY +qyN kgu wOl dby @@ -93948,9 +94208,9 @@ wCR rik hyW iSD -lPB -miF -keL +kZI +oUb +yhX mye lZT uoR @@ -94025,8 +94285,8 @@ dDB dDB dDB dDB -eeq -hhZ +rMm +uPX fSf wRa xXJ @@ -94206,7 +94466,7 @@ iSD tzN pnK dbZ -wha +wQw bej spk iSD @@ -94708,7 +94968,7 @@ frI frI oyp mXZ -bie +mUm mAR qWG fkS @@ -94976,7 +95236,7 @@ jpu foe jpu lKA -amh +uDB jpu jpu fXJ @@ -95232,8 +95492,8 @@ dKm rEJ fUC fUC -fUC -fUC +ifu +aSW fUC fUC fUC @@ -95498,8 +95758,8 @@ wMg xeO xeO cUf -gNP -uQK +rEW +nsD iUH isK uBc @@ -95746,8 +96006,8 @@ waI xeO tnZ oPy -lql -lql +omq +pKx cik wKr dsl @@ -95755,8 +96015,8 @@ wMz ntP rNL xeO -gNP -uQK +rEW +qSk hWm fvh abB @@ -96513,7 +96773,7 @@ rpg jVM hdI kRA -paJ +pKx wMg iZM fEX @@ -96526,7 +96786,7 @@ iLh hEJ hEJ aIi -qWV +bMV eZi kHX tYX @@ -96769,8 +97029,8 @@ jVM eAm jVM uCo -bYE -rYJ +lql +pKx xeO gLg jdx @@ -97015,9 +97275,9 @@ uVT uVT uVT vET -nAy -uIv -jVM +ncL +wQB +jVx jVM rXy bFO @@ -97025,9 +97285,9 @@ avp avp qiI jVM -jzf -xeO +bLS xeO +rbj xeO sXD qSa @@ -97040,7 +97300,7 @@ wKr kKD mDA wMg -jrN +bMV eZi kHX tYX @@ -97276,15 +97536,15 @@ ncL wQB aaZ jVM -eAm +avp jVM jVM jVM +tDF jVM +ipt jVM -lzB -jVM -udf +yfC yfC yfC yfC @@ -97297,8 +97557,8 @@ yfC yfC yfC xli -equ -sYp +cVm +sQP ifH iuR tYX @@ -97530,18 +97790,18 @@ wzK eAc lcY kuE -wQB +lqQ esr -jVM -rpg +tAw +rXy jVM eXB eIW -mqz +ptX +hsH +srg jVM -fgJ -pWj -fDX +ayT sZo yfC lnN @@ -97552,10 +97812,10 @@ qiC qLU pnF qiC -mKY +yfC hoc lhT -mfa +jbX diP rgM trB @@ -97788,31 +98048,31 @@ uVT lYl kvl wQB -lmz -rXO -rpg +rxD jVM -uGD -nAq -pSI jVM -fgJ jVM +jVM +jVM +pSI +jVM +xlU +jRK nrg xXD yfC sJV uIA -mWT -kHU pIC pIC +mWT +pIC oun wBc -kxY +mKY mka -yfG -fVQ +vCi +gnL diP trB trB @@ -98047,10 +98307,10 @@ kvT wQB cZi jVM -moG +lbl +bwy +mqz jVM -mLT -wWC gls jVM lzB @@ -98060,13 +98320,13 @@ dEq wEv uJi ntu -jcG -qbA -qbA -hLb +uMJ +uMJ +uMJ +dvd tRJ wBc -oIY +kxY bMV dPp kMA @@ -98304,26 +98564,26 @@ kyO wQB drC jVM -eAm -jVM +lzW +dbJ lMH -uSb -iYd -onc -lzB +jVM +gls +jVM +uZY jVM oEz -ptT +dEq yfC lZf qCK -bRK -bRK -aTz -qRE -ltr +dvd +dvd +gNX +dvd +tRJ wBc -usA +oIY bMV dPp kUL @@ -98562,26 +98822,26 @@ wQB ydz jVM lEO -jVM -jVM -jVM -jVM +eHv +bes +pSI +gls jVM joR jVM vyP xnb yfC -edG -wBc -qiC +edk +wyg +qbA +qbA +hLb +dvd +tRJ qiC -ghj -wBc -wBc -jgx -mKY -bMV +yfC +udW djf kUL tYX @@ -98818,27 +99078,27 @@ rJZ wQB jVM jVM -pXU -avp -bFO -avp -csZ -mMO -obi jVM jVM +jVM +jVM +jVM +jVM +lzB +jVM +nhW cJv yfC -yfC -erf -bKd -tkm -yfC -oUV -tQC -yfC -yfC -aub +jqK +dEY +bRK +aTz +bRK +bRK +ltr +qiC +lqh +bMV dPp lir iuR @@ -99073,26 +99333,26 @@ xRU vET rJZ wQB +xZS +tWT +tjs +qqH +qVm +nWV jVM -jVM -jVM -jVM -jVM -jVM -jVM -jVM +uqV ksJ -emp +jVM xym mgW -isO -aiQ -nVw +yfC +edG +wBc jJd -uyV -kcM -eRa -eRa +qiC +ghj +qiC +qiC vfo pkU lUl @@ -99332,26 +99592,26 @@ kTX sbU xZS lHp -tjs -qqH +qwA +jYe kBM blC jVM gLo cTn -ajQ jVM -aLB -ilx -qEO -fQd -oNF -sGN -bzj +yfC +vNM +yfC +yfC +erf +xcz +tkm +yfC tmD -lEs -jUr -uMg +tkm +yfC +yfC msk wmX kUL @@ -99594,21 +99854,21 @@ nlQ chI mTT jVM -tpQ -keb -jVM -tGq -tGq -xmt -xmt -lAt -xmt -xmt -xmt -ouF -xmt -xmt -xli +tKS +vQu +vQu +wVN +hQs +rdV +bPy +nVw +qYr +eqI +nHI +cgs +asS +ddT +cXp iFD fzT kUL @@ -99842,30 +100102,30 @@ sDp gZy kke laK -oGJ +rJZ wQB xZS -dib +sRT woz -uvs -mpx -oxy +auP +kGw +vQx jVM -tpQ +jTj +mOr +jgy jVM -tGq -nxy -tGq -sxl -aTg +aLB +ilx +qEO oPh qDL -jKV -vTP -rpo -mjr -xmt -ptf +sGN +bzj +vxA +lEs +jUr +uMg xBd qXP kTF @@ -100098,31 +100358,31 @@ opn jwa opn jYY -jrl -oGJ -wQB -xZS -sRT -hdW -auP -kGw -vQx +ndJ +rJZ +eBC +xRV +xRV +xRV +xRV +oum +xRV jVM -lzB +xjQ jVM -haH -hHn tGq -ipG -aTg +tGq +xmt +xmt +xmt cri bOG -uRv -als -cXH -nZG xmt -liw +xmt +hrl +xmt +xmt +lHZ rzy qFc cEo @@ -100356,30 +100616,30 @@ jLR jLR xMY dCu -tsO -eBC -bPv -jVM -jVM -jVM -mbf +eXR +wQB +rHl +sVO +lbi jVM +jTn +xXe jVM ulE -jVM +bvP amK -anD -rzH +kjx +xmt mog -aTg -jwt -xdy -jUA -tOK -aTg -aTg -xUp -sWq +cCM +gbj +vwW +iId +vTP +rpo +mjr +xmt +vEk gLO pbD kUL @@ -100587,7 +100847,7 @@ xvT fAx fVU xvT -gvY +xvT blb blb blb @@ -100613,30 +100873,30 @@ azv jNe psc dCu -oGJ +rJZ wQB xAV -ngv +txW nCX jVM tUj -xXe -jVM +qkm +qkm ruS -sem +jVM bxl -uZy -tGq -fvK -aTg -pXH -wKX -nDm -tOK -aTg +bMn +xmt +uYM aTg -xUp -bIN +pkQ +bBL +uRv +als +cXH +nZG +xmt +liw bVJ sTb kUL @@ -100834,7 +101094,7 @@ hJp wct wct iWV -yfP +uVH wct isj isj @@ -100870,30 +101130,30 @@ xMY xMY voN sta -oGJ +rJZ wQB vpT txW eDi jVM -tUj -jVM +uZY +mnH jVM tpQ jVM ljg -waY -tGq -cME +ddF +pEU +duj aTg -dYu +rxZ +fhp +oTM +pLf aTg aTg -aTg -dYu -ctN -xmt -wUc +aIr +sWq nUd bmY lir @@ -101087,9 +101347,9 @@ cfk fkj dMg cyk -cEs -cKc -eAU +lnM +kZv +cLR cRI dbs fkj @@ -101127,31 +101387,31 @@ lGo jNO geE wCM -oGJ +rJZ wQB eIO xND ind jVM oZy -pMc -pMc +jVM +jVM uvx jVM -tGq -tGq -tGq -xmt -ohy -wLa -xJv -luD -jvL -mbC -xmt +iRQ +hWL xmt -xli -dQY +vfI +aTg +glT +nmC +sJL +sne +aTg +aTg +aIr +bIN +nUd bmY kUL tYX @@ -101384,31 +101644,31 @@ lun wNv mzM wCM -kyZ +woK kJR qcB jVM jVM jVM -cLy +wrj jVM -sON +jGy aYj -vkh -vkh -vkh -pnW -baW -iQe -iQe -ssR -ssR -ssR -ssR +sON +ssY +waY +xmt +cME +aTg +dYu +aTg +aTg +aTg +dYu aVA -dfc -vkh -wjT +xmt +wUc +nUd dPp kUL tYX @@ -101641,31 +101901,31 @@ gfs ivl mzM wCM -uFG +ePk tgx jVM -jnO -pSO -wzj -vEY -jVM +yfX +pRR +cTn +xlU +eoM oVl uBN -vkh -eNM -vkh -mce -ohK -rrX -tyz -dJv -rVt -rVt +sON +tGq +tGq +xmt +xmt +oTN +fGk +sYS +nPY rVt -scR -sfU -vkh -nUd +elb +xmt +xmt +xli +jOM dPp aOt iuR @@ -101898,30 +102158,30 @@ jxC ufb xCl cYY -kzu +wNs wiF jVM jVM jVM jVM -hHj +oJO eoM cqD -vYJ -kTr +iBt +hmK dMi -vkh +vun caW -jMA +vkh tes -rPX -ycS -aMZ -kRs +dJv +tvW +qsY +qsY qsY ycS fxW -vkh +jYM nUd dPp aww @@ -102115,9 +102375,9 @@ cfk fkj dPa dZZ -cFz -etD -eDl +qan +sXu +coi eND dbz fkj @@ -102155,31 +102415,31 @@ jye jOs mAv khS -dIN +aqG mwN jVM -vMV -eWC -eWC -fUz +sjK +nFH +hgH +cHG jVM iXW dRb -vkh +sON tjT -svE +rrX lAV fYJ eGU eTJ vkI -xNA +oeZ wuY oeZ luP jFK -hiD -nUd +vkh +ttV dPp aww vtX @@ -102376,7 +102636,7 @@ wct wct wct eNU -qEk +gDc wct gOm gOm @@ -102412,30 +102672,30 @@ quU quU tsF ubK -buv -lZW -wKM -oFM +lRM +vuD +qIb +gJD hPb jVM -cCe +tpQ +jVM +jVM +jVM jVM -kPp -dsP vkh -bzJ lnD fzw bKO -eGU -eTJ -luE -kfO +qhR +pPU +xkV +gyy phG gyy -ycS -jFK -tnj +xkV +cvV +vkh nUd dPp aqf @@ -102669,33 +102929,33 @@ liG rRQ tsF kiB -nBL +izP wNW jVM jVM jVM jVM -jVM -jVM -sON -sON -vkh +izu +tpQ +tpQ +jTn +jlA mae ksm opV fVl -eGU +qJz ebk -vkI -vYW +xkV +mDf mDf aYU -ycS -mno -vkh +dao +cvV +spH nUd dPp -qBn +aww nsz iuR dDB @@ -102926,30 +103186,30 @@ jyu ezx tsF vIJ -kzx +nHU twJ tgl iSi fLn -mLU -tgl -tgl -tgl -vkh +jVM +jVM +jVM +jVM +jVM kXC -omk +mae hsx pJc -bKO -eGU -xQE -vkI +xkV +oVE +pPU +ecC cIX ofU -omb -ycS -lJm -vkh +xkV +ecC +cvV +spH elN dPp sFs @@ -103183,33 +103443,33 @@ uff mak tsF qlV -uFG +ePk tmQ tgl lut pbd -wtv +cig hxp -qhs +wtv oRv -vkh -cWB -ccv +jVM +kXC +mae tVp ioa fBB -eGU -eTJ -wAa +vgS +pPU +xkV oDX -bFd -iBa -grI -ejX -ove +oeZ +oeZ +xkV +cvV +spH nUd dPp -jjZ +aww bje tYX dDB @@ -103440,33 +103700,33 @@ rth mbp tsF kpF -uFG +ePk wQB tgl lvA nyy diK -xvK +djc jgb hRc +jVM +kXC vkh -mkD -mpB dxV -bKO -bKO -eGU -eTJ -wAa +jDT +fOq +wJv +pPU +xkV cQN bXR -cmB -ycS +gyy +xkV swW -ove -nUd -eXZ -qBn +vkh +oNW +cSy +bpY sMt tYX dDB @@ -103697,7 +103957,7 @@ jyG meu tsF lAS -uFG +ePk wQB tgl wHO @@ -103706,24 +103966,24 @@ wvv xvK vGe xno +jVM +kXC vkh vkh -mru -vkh +kWF wtw -wtw -pzW +dJv lTy wAa +uUB fIl -fIl -glA -ycS +aYU +pPO jFm -ove +jYM nUd vip -kmz +njT fGT tYX dDB @@ -103954,31 +104214,31 @@ lGK mfP tsF lPo -kzu +wNs wQB tgl tgl -tgl +xHD tgl uIP dsK pHY -vkh -blB +jVM +kXC wKH -lso -wOt -wOt +vkh +hcQ +jcB gGx xtD gIv cAl -wOt -wOt +npI +npI wOt cvX -vkh -aWf +jYM +nUd vip duE aOh @@ -104009,8 +104269,8 @@ llC rbO llP xQa -pqa -pqa +xep +xep tFQ vLc xrC @@ -104211,7 +104471,7 @@ lGK jOS tsF vrn -uFG +ePk smf aCO iLA @@ -104220,24 +104480,24 @@ tgl qDd xHD xHD +jVM +jBu vkh -dGm vkh vkh vkh -efC vkh -mib -vfM +jYM vkh -fap -fap -fap +vSI +spH +spH vkh +jYM vkh -bnU +iXu mVc -giB +lab axd xli qir @@ -104468,7 +104728,7 @@ lGK mgt tsF kiO -nDV +nCt wNW coC pVj @@ -104480,20 +104740,20 @@ aBB nMW tEL rQN -pwO -rZq vpI +rZq +ycX pBu -vpI +khY lvr aGq khY khY khY lmz -uLK +rko diP -prt +vip gaj jXJ mxS @@ -104523,8 +104783,8 @@ tCZ gUk rgK geu -xza -xza +xuF +xuF xSO iTR pox @@ -104725,12 +104985,12 @@ iaw uoB tsF kjg -oXV -kJX -kQc -vrH -xIw -xIw +iZO +awC +gwm +xPJ +pbO +pbO icN mZd sDZ @@ -104741,16 +105001,16 @@ mut pjA mut otJ -xIw -rTl -xIw -rlh -vrH -xIw -fFr -ddG -hUj -hWG +pbO +pbO +rfW +mlD +xPJ +pbO +mRB +jSp +klf +oHp huj fIj uhM @@ -105005,12 +105265,12 @@ aPK aPK aPK mcS -rLA +sKm +dRT dRT -loN nNz inU -fsb +hmn bcv kov viy @@ -105258,7 +105518,7 @@ fNZ qUt qUt xJB -vYy +xwj vrO vYy xJB @@ -108350,7 +108610,7 @@ tnb qyY xvh xpU -xMr +izA swB vve vSw @@ -119424,7 +119684,7 @@ cVz sYa rQw xlP -ybF +pPp xlP tGp eWI @@ -119641,8 +119901,8 @@ xau rsL xSt xWq -oxK -rUg +iRk +aQZ wJL prf dSb @@ -119897,8 +120157,8 @@ rsL mIh rsL xTO -ewo -ydH +cHI +ily xPj wJL sHX @@ -120193,11 +120453,11 @@ pXQ kwA xaR sYa -pxW +xdV xlP gpy xlP -mYT +orz eWI eWI eWI @@ -125323,10 +125583,10 @@ oZz xZJ aVT enG -xHb -xHb -xHb -pHS +kUa +kUa +kUa +vIz xpR kQt nhl @@ -125580,7 +125840,7 @@ nWh xEn nWh xnR -ebo +aLC wLZ xwn cns @@ -135310,7 +135570,7 @@ dDB dDB dDB dDB -wPf +dDB dDB dDB dDB @@ -135374,7 +135634,7 @@ dDB dDB dDB dDB -akZ +aJq aJq aJq tYT diff --git a/_maps/map_files/CTF/downtown.dmm b/_maps/map_files/CTF/downtown.dmm index c61910375820d..fd11025e943c8 100644 --- a/_maps/map_files/CTF/downtown.dmm +++ b/_maps/map_files/CTF/downtown.dmm @@ -1831,7 +1831,6 @@ "Ok" = ( /obj/structure/fluff/bus/passable{ icon_state = "bottomdoor"; - layer = 3; resistance_flags = 64 }, /obj/effect/turf_decal/siding/yellow, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index ea6076af43a99..36ed6f1f93f98 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -3024,10 +3024,6 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/iron/white, /area/station/medical/chemistry) -"aKU" = ( -/obj/structure/sign/warning/electric_shock/directional/west, -/turf/open/space/basic, -/area/space) "aLv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -5386,10 +5382,6 @@ }, /turf/open/floor/iron/checker, /area/station/service/theater/abandoned) -"bpz" = ( -/obj/effect/turf_decal/box/red, -/turf/open/floor/iron/dark/textured_large, -/area/station/science/xenobiology) "bpM" = ( /obj/effect/spawner/random/engineering/tracking_beacon, /obj/effect/landmark/event_spawn, @@ -7280,13 +7272,11 @@ /obj/effect/turf_decal/bot, /obj/machinery/button/door/directional/east{ id = "cargounload"; - layer = 4; name = "Loading Doors"; pixel_y = 6 }, /obj/machinery/button/door/directional/east{ id = "cargoload"; - layer = 4; name = "Loading Doors"; pixel_y = -6 }, @@ -13195,7 +13185,7 @@ "djY" = ( /obj/structure/sign/warning/secure_area/directional/east, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "dka" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -13439,7 +13429,7 @@ /turf/open/floor/iron/dark, /area/station/security/brig) "dmU" = ( -/obj/item/kirbyplants/random, +/obj/effect/spawner/random/structure/twelve_percent_spirit_board, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) "dnd" = ( @@ -15968,7 +15958,7 @@ pixel_y = -32 }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "dUb" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -17565,9 +17555,8 @@ network = list("ss13","xeno","rd") }, /obj/machinery/status_display/ai/directional/west, -/obj/effect/turf_decal/tile/neutral/fourcorners, /obj/machinery/light/cold/directional/west, -/turf/open/floor/iron/dark, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "eqU" = ( /turf/open/space, @@ -19111,10 +19100,6 @@ /turf/open/floor/iron, /area/station/security/checkpoint/escape) "eKV" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Primary Restroom"; - name = "restroom camera" - }, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/north, /obj/effect/turf_decal/tile/neutral/half/contrasted{ @@ -25784,12 +25769,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron, /area/station/engineering/atmos) -"gqG" = ( -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/scrubber, -/obj/structure/sign/poster/official/there_is_no_gas_giant/directional/east, -/turf/open/floor/iron/textured_large, -/area/station/engineering/atmos/project) "gqH" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -26790,7 +26769,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/exit) "gCt" = ( -/turf/open/floor/circuit/green, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "gCB" = ( /obj/structure/cable, @@ -28631,7 +28610,7 @@ "haF" = ( /obj/structure/sign/warning/secure_area/directional/west, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "haG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/trimline/green/filled/line{ @@ -35085,8 +35064,7 @@ /area/station/hallway/secondary/exit/departure_lounge) "iJw" = ( /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "iJE" = ( /obj/structure/table/wood/fancy, @@ -36163,9 +36141,7 @@ /area/station/commons/toilet/locker) "iYp" = ( /obj/structure/cable, -/obj/machinery/nuclearbomb/selfdestruct{ - layer = 2 - }, +/obj/machinery/nuclearbomb/selfdestruct, /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) @@ -36829,6 +36805,17 @@ }, /turf/open/floor/iron/white, /area/station/science/robotics/lab) +"jfC" = ( +/obj/machinery/portable_atmospherics/pipe_scrubber, +/obj/effect/turf_decal/trimline/neutral, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/effect/turf_decal/siding/thinplating/dark{ + dir = 1 + }, +/obj/effect/turf_decal/box/white, +/obj/effect/turf_decal/tile/neutral/fourcorners, +/turf/open/floor/iron/dark, +/area/station/science/ordnance) "jfF" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40172,9 +40159,9 @@ /turf/open/floor/iron, /area/station/hallway/secondary/entry) "jUT" = ( -/obj/structure/lattice, +/obj/structure/sign/warning/electric_shock/directional/west, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "jUU" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -53150,6 +53137,17 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/science) +"nnh" = ( +/obj/structure/table/reinforced, +/obj/item/book/manual/wiki/cytology{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ + dir = 1 + }, +/turf/open/floor/iron, +/area/station/science/xenobiology) "nnv" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -54408,7 +54406,7 @@ "nET" = ( /obj/structure/sign/warning/electric_shock/directional/east, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "nEZ" = ( /turf/closed/wall/r_wall, /area/station/security/mechbay) @@ -57878,7 +57876,7 @@ "ozA" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, -/turf/open/floor/circuit/green, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "ozE" = ( /obj/effect/turf_decal/stripes/line, @@ -58270,7 +58268,7 @@ dir = 8 }, /turf/open/space, -/area/space/nearstation) +/area/space) "oFC" = ( /obj/machinery/airalarm/directional/west, /obj/structure/tank_dispenser, @@ -58318,9 +58316,7 @@ /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/delivery, -/obj/machinery/door/window/right/directional/east{ - layer = 3 - }, +/obj/machinery/door/window/right/directional/east, /turf/open/floor/iron, /area/station/maintenance/disposal) "oGr" = ( @@ -62605,7 +62601,7 @@ /area/station/science/lab) "pJz" = ( /obj/effect/decal/remains/xeno, -/turf/open/floor/circuit/green, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "pJM" = ( /obj/effect/turf_decal/stripes/line{ @@ -64038,7 +64034,7 @@ dir = 10 }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "pZc" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -64125,9 +64121,7 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, -/obj/machinery/disposal/bin{ - layer = 3.21 - }, +/obj/machinery/disposal/bin, /obj/effect/turf_decal/bot, /obj/machinery/door/firedoor/border_only{ dir = 1 @@ -67154,6 +67148,11 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/station/solars/port/fore) +"qNn" = ( +/obj/effect/turf_decal/box/red, +/obj/machinery/vatgrower, +/turf/open/floor/iron/dark/textured_large, +/area/station/science/xenobiology) "qNo" = ( /obj/structure/table/reinforced, /obj/machinery/firealarm/directional/south, @@ -72608,7 +72607,7 @@ /area/station/maintenance/port/aft) "sfE" = ( /obj/effect/decal/cleanable/xenoblood, -/turf/open/floor/circuit/green, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "sfH" = ( /obj/effect/landmark/start/hangover, @@ -75785,7 +75784,7 @@ /obj/structure/lattice, /obj/structure/sign/warning/electric_shock/directional/east, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "sVC" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4 @@ -75930,18 +75929,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/teleporter) -"sXy" = ( -/obj/structure/table/reinforced, -/obj/item/book/manual/wiki/cytology{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/book/manual/wiki/plumbing, -/obj/effect/turf_decal/tile/neutral/anticorner/contrasted{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/science/xenobiology) "sXB" = ( /obj/machinery/igniter/incinerator_ordmix, /turf/open/floor/engine/vacuum, @@ -76018,6 +76005,10 @@ /obj/effect/turf_decal/siding/purple{ dir = 8 }, +/obj/item/flatpack{ + board = /obj/item/circuitboard/machine/flatpacker + }, +/obj/item/multitool, /turf/open/floor/iron, /area/station/science/lab) "sYf" = ( @@ -77288,9 +77279,7 @@ /turf/open/floor/iron, /area/station/hallway/primary/fore) "trC" = ( -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /obj/item/kitchen/rollingpin, /obj/structure/table, /obj/item/reagent_containers/cup/bowl, @@ -84087,7 +84076,7 @@ "uXF" = ( /obj/structure/sign/warning/secure_area/directional/south, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "uXK" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/security{ @@ -84119,15 +84108,14 @@ /turf/open/floor/iron/dark, /area/station/science/ordnance) "uXU" = ( -/obj/structure/disposaloutlet{ - dir = 8 - }, /obj/structure/disposalpipe/trunk{ dir = 4 }, +/obj/machinery/disposal/delivery_chute{ + dir = 8 + }, /obj/effect/turf_decal/box/red, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "uYg" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90158,7 +90146,7 @@ dir = 10 }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "wzb" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 4 @@ -90445,9 +90433,8 @@ /turf/open/misc/grass, /area/station/hallway/primary/fore) "wCh" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - piping_layer = 2 +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer2{ + dir = 1 }, /obj/structure/window/reinforced/spawner/directional/south, /obj/effect/turf_decal/siding/thinplating/dark, @@ -91382,6 +91369,12 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"wOw" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/pipe_scrubber, +/obj/structure/sign/poster/official/there_is_no_gas_giant/directional/east, +/turf/open/floor/iron/textured_large, +/area/station/engineering/atmos/project) "wOz" = ( /obj/structure/chair/office/light, /obj/effect/turf_decal/trimline/green/filled/warning, @@ -92329,9 +92322,14 @@ /turf/open/floor/iron/textured, /area/station/medical/medbay) "xcR" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral/half/contrasted{ + dir = 4 + }, /obj/effect/spawner/random/engineering/tracking_beacon, -/obj/effect/landmark/event_spawn, -/turf/open/floor/circuit/green, +/turf/open/floor/iron, /area/station/science/xenobiology) "xcU" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -92355,8 +92353,8 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral/fourcorners, -/turf/open/floor/iron/dark, +/obj/structure/sign/warning/gas_mask/directional/north, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "xdA" = ( /obj/effect/spawner/random/decoration/carpet, @@ -94423,7 +94421,6 @@ /obj/item/reagent_containers/blood/random, /obj/effect/turf_decal/bot, /obj/item/reagent_containers/condiment/enzyme{ - layer = 5; pixel_x = -6; pixel_y = 8 }, @@ -115405,11 +115402,11 @@ fqm djS nCi nCi -sfN -sfN +gCt +gCt eqP -sfN -sfN +gCt +gCt nCi nCi cJd @@ -115661,13 +115658,13 @@ chp fqm vPU nCi -sfN -sfN -sfN +gCt +gCt +gCt iJw -sfN -sfN -sfN +gCt +gCt +gCt nCi vPU fqm @@ -115918,13 +115915,13 @@ rXu nCi eVp nCi -sfN +gCt ozA pJz -xcR +gCt sfE gCt -sfN +gCt nCi mFq nCi @@ -116175,13 +116172,13 @@ gbe nCi vPU nCi -sfN -sfN -sfN -sfN -sfN -sfN -sfN +gCt +gCt +gCt +gCt +gCt +gCt +gCt nCi vPU cfb @@ -116435,7 +116432,7 @@ nCi rIb rIb xdn -sfN +gCt uXU uhb uhb @@ -116690,7 +116687,7 @@ pyZ vBO uhb ebW -kNG +imx imx xsH umb @@ -117206,7 +117203,7 @@ mKn fPl jqr vxQ -vxQ +xcR vxQ lzc plQ @@ -121570,7 +121567,7 @@ rZw iQF eRr pTC -sXy +nnh fpt uOF sPk @@ -122855,7 +122852,7 @@ aWk mqP pTC esb -bpz +qNn lZG gmI ahY @@ -124840,7 +124837,7 @@ lCM qlr hwM pqw -gqG +wOw dYE sOi wzD @@ -130855,7 +130852,7 @@ lOw wCh cFB oQq -fYa +jfC hqU kzc qBk @@ -132168,7 +132165,7 @@ gqm qYo aaa lvw -jUT +qYo qYo aaa aaa @@ -151857,7 +151854,7 @@ aaa qYo aaa qYo -aKU +jUT qYo aaa qYo @@ -154672,13 +154669,13 @@ gJk aaa aad aaa -aKU +jUT aad aaa aad aaa aad -aKU +jUT aaa qYo aaa diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 5d70bb72e8081..c5ddd225cdfe1 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -1102,7 +1102,6 @@ /obj/structure/cable, /obj/machinery/button/door/directional/east{ id = "xenobio10"; - layer = 4; name = "Xenobio Pen 10 Blast DOors"; req_access = list("xenobiology") }, @@ -3901,7 +3900,7 @@ network = list("ss13","test","rd","xeno") }, /obj/machinery/light/directional/west, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "biR" = ( /obj/structure/table/glass, @@ -5634,14 +5633,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/plating, /area/station/maintenance/aft/greater) -"bFU" = ( -/obj/effect/turf_decal/siding/wideplating_new/light{ - dir = 4 - }, -/obj/machinery/plumbing/input, -/obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/iron/showroomfloor, -/area/station/security/prison/work) "bFY" = ( /obj/item/trash/syndi_cakes, /turf/open/floor/plating, @@ -6250,9 +6241,7 @@ /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) "bOy" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/effect/spawner/random/vending/snackvend, /obj/machinery/camera/directional/east{ c_tag = "Engineering Lobby" @@ -6279,7 +6268,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "bOX" = ( /obj/structure/cable, @@ -7158,7 +7147,6 @@ "cbP" = ( /obj/machinery/button/door/directional/east{ id = "xenobio9"; - layer = 4; name = "Xenobio Pen 9 Blast DOors"; req_access = list("xenobiology") }, @@ -7775,11 +7763,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/engineering/supermatter/room) -"cku" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/engine, -/area/station/science/xenobiology) "ckN" = ( /obj/structure/cable, /obj/machinery/newscaster/directional/south, @@ -8518,18 +8501,6 @@ /obj/structure/closet/emcloset, /turf/open/floor/plating, /area/station/maintenance/starboard/fore) -"cvG" = ( -/obj/effect/turf_decal/siding/wideplating_new/light, -/obj/item/trash/bee, -/obj/machinery/light/directional/west, -/obj/structure/cable, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ - dir = 4 - }, -/obj/structure/sign/poster/official/moth_piping/directional/west, -/obj/machinery/duct, -/turf/open/floor/iron/showroomfloor, -/area/station/security/prison/work) "cvN" = ( /obj/machinery/atmospherics/pipe/smart/simple/scrubbers/visible{ dir = 4 @@ -11266,9 +11237,7 @@ /area/station/science/robotics/lab) "dkB" = ( /obj/structure/rack, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 4 }, @@ -11350,7 +11319,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, /obj/machinery/button/door/directional/east{ id = "xenobio11"; - layer = 4; name = "Xenobio Pen 11 Blast DOors"; req_access = list("xenobiology") }, @@ -11493,7 +11461,6 @@ "doK" = ( /obj/machinery/button/door/directional/east{ id = "xenobio8"; - layer = 4; name = "Xenobio Pen 8 Blast DOors"; req_access = list("xenobiology") }, @@ -12804,6 +12771,11 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/station/maintenance/department/chapel) +"dHM" = ( +/obj/machinery/portable_atmospherics/pipe_scrubber, +/obj/machinery/light/directional/east, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/office) "dIl" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -13064,9 +13036,7 @@ /obj/effect/turf_decal/trimline/blue/filled/end{ dir = 1 }, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/item/radio/intercom/directional/west, /obj/structure/disposalpipe/segment, /turf/open/floor/iron/large, @@ -14458,11 +14428,6 @@ }, /turf/open/floor/iron/dark, /area/station/commons/storage/primary) -"ejD" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/light/directional/east, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/office) "ejL" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -16068,10 +16033,6 @@ dir = 8 }, /area/station/maintenance/port/fore) -"eLb" = ( -/obj/machinery/iv_drip, -/turf/open/floor/engine, -/area/station/science/xenobiology) "eLl" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -16292,10 +16253,6 @@ dir = 4 }, /area/station/ai_monitored/command/storage/eva) -"eOS" = ( -/obj/structure/table, -/turf/open/floor/engine, -/area/station/science/xenobiology) "ePd" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/grille/broken, @@ -21480,6 +21437,13 @@ /obj/item/kirbyplants/random, /turf/open/floor/iron/white, /area/station/medical/chemistry) +"gvi" = ( +/obj/effect/turf_decal/siding/wideplating_new/light{ + dir = 4 + }, +/obj/effect/decal/cleanable/blood/drip, +/turf/open/floor/iron/showroomfloor, +/area/station/security/prison/work) "gvj" = ( /obj/structure/cable, /turf/open/floor/iron, @@ -22523,6 +22487,13 @@ /obj/structure/sign/warning/biohazard, /turf/closed/wall/r_wall, /area/station/science/xenobiology) +"gLY" = ( +/obj/machinery/vatgrower, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/structure/cable, +/turf/open/floor/iron/showroomfloor, +/area/station/security/prison/work) "gLZ" = ( /obj/structure/table, /obj/item/flashlight/lamp, @@ -23774,6 +23745,10 @@ /obj/item/stock_parts/scanning_module, /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, +/obj/item/multitool, +/obj/item/flatpack{ + board = /obj/item/circuitboard/machine/flatpacker + }, /turf/open/floor/iron/white/side{ dir = 10 }, @@ -27160,7 +27135,6 @@ "ihN" = ( /obj/machinery/button/door/directional/west{ id = "xenobio4"; - layer = 4; name = "Xenobio Pen 4 Blast Door"; req_access = list("xenobiology") }, @@ -30963,7 +30937,6 @@ "jrc" = ( /obj/machinery/button/door/directional/east{ id = "xenobio6"; - layer = 4; name = "Xenobio Pen 6 Blast DOors"; req_access = list("xenobiology") }, @@ -32598,9 +32571,7 @@ location = "Medbay" }, /obj/effect/turf_decal/bot, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/structure/plasticflaps/opaque, /turf/open/floor/iron/dark, /area/station/maintenance/department/medical/central) @@ -36262,14 +36233,6 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/plating, /area/station/maintenance/starboard/lesser) -"kRw" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, -/turf/open/floor/iron/showroomfloor, -/area/station/engineering/atmos) "kRy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -39725,9 +39688,7 @@ /obj/machinery/camera/directional/north{ c_tag = "Atmospherics Monitoring" }, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/stripes/line{ dir = 8 }, @@ -39856,11 +39817,6 @@ dir = 4 }, /area/station/engineering/storage_shared) -"lVs" = ( -/obj/structure/table, -/obj/item/clothing/mask/surgical, -/turf/open/floor/engine, -/area/station/science/xenobiology) "lVt" = ( /obj/machinery/firealarm/directional/west, /obj/machinery/light/floor, @@ -40130,7 +40086,6 @@ /obj/structure/cable, /obj/machinery/button/door/directional/west{ id = "xenobio1"; - layer = 4; name = "Xenobio Pen 1 Blast Door"; req_access = list("xenobiology") }, @@ -44408,9 +44363,7 @@ /turf/open/floor/plating, /area/station/maintenance/aft/lesser) "nsq" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/filingcabinet/filingcabinet, /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 @@ -50349,14 +50302,12 @@ }, /obj/machinery/button/door/directional/west{ id = "QMLoaddoor"; - layer = 4; name = "Loading Doors"; pixel_y = -8; req_access = list("cargo") }, /obj/machinery/button/door/directional/west{ id = "QMLoaddoor2"; - layer = 4; name = "Loading Doors"; pixel_y = 8; req_access = list("cargo") @@ -50468,7 +50419,6 @@ /obj/structure/sink/directional/east, /obj/machinery/button/door/directional/west{ id = "xenobio2"; - layer = 4; name = "Xenobio Pen 2 Blast Door"; req_access = list("xenobiology") }, @@ -54996,6 +54946,9 @@ /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, /area/station/maintenance/department/medical/morgue) +"qvN" = ( +/turf/open/floor/engine/xenobio, +/area/station/science/xenobiology) "qvQ" = ( /obj/structure/closet/secure_closet/atmospherics, /turf/open/floor/iron/dark, @@ -55696,14 +55649,6 @@ /obj/effect/mapping_helpers/airlock/access/all/service/janitor, /turf/open/floor/iron, /area/station/service/janitor) -"qGe" = ( -/obj/structure/table, -/obj/item/scalpel{ - pixel_x = 2; - pixel_y = 6 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "qGg" = ( /obj/structure/rack, /obj/item/pickaxe, @@ -57784,7 +57729,6 @@ "rjT" = ( /obj/machinery/button/door/directional/west{ id = "xenobio3"; - layer = 4; name = "Xenobio Pen 3 Blast Door"; req_access = list("xenobiology") }, @@ -58331,6 +58275,10 @@ /area/station/hallway/secondary/service) "rrf" = ( /obj/structure/table/wood, +/obj/item/storage/crayons, +/obj/item/storage/fancy/candle_box{ + pixel_y = 5 + }, /turf/open/floor/iron/dark, /area/station/service/chapel/office) "rrl" = ( @@ -59567,12 +59515,6 @@ }, /turf/open/floor/wood, /area/station/maintenance/port/aft) -"rKS" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Dormitory Toilets" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "rKX" = ( /obj/machinery/camera{ c_tag = "Surgery B"; @@ -60374,7 +60316,6 @@ "rXD" = ( /obj/machinery/button/door/directional/east{ id = "xenobio7"; - layer = 4; name = "Xenobio Pen 7 Blast DOors"; req_access = list("xenobiology") }, @@ -61349,9 +61290,7 @@ /turf/open/floor/plating, /area/station/maintenance/department/cargo) "snv" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/machinery/door/poddoor/shutters/preopen{ id = "riot"; name = "Security Shutters" @@ -63815,9 +63754,7 @@ /turf/open/floor/plating, /area/station/maintenance/fore/lesser) "sXf" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/table/reinforced, /obj/item/stack/wrapping_paper{ pixel_x = 3; @@ -63946,17 +63883,6 @@ }, /turf/open/floor/engine, /area/station/engineering/atmos/hfr_room) -"sZp" = ( -/obj/effect/turf_decal/siding/wideplating_new/light{ - dir = 6 - }, -/obj/structure/cable, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/effect/landmark/start/prisoner, -/obj/machinery/duct, -/turf/open/floor/iron/showroomfloor, -/area/station/security/prison/work) "sZD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -65270,6 +65196,17 @@ /obj/machinery/holopad, /turf/open/floor/carpet/red, /area/station/security/prison/work) +"twx" = ( +/obj/effect/turf_decal/siding/wideplating_new/light, +/obj/item/trash/bee, +/obj/machinery/light/directional/west, +/obj/structure/cable, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ + dir = 4 + }, +/obj/structure/sign/poster/official/moth_piping/directional/west, +/turf/open/floor/iron/showroomfloor, +/area/station/security/prison/work) "twK" = ( /obj/machinery/porta_turret/ai{ dir = 8 @@ -67198,6 +67135,9 @@ }, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"ubh" = ( +/turf/open/openspace/xenobio, +/area/station/science/xenobiology) "ubi" = ( /turf/open/misc/asteroid/snow/coldroom, /area/icemoon/underground/explored) @@ -67741,7 +67681,7 @@ /area/station/maintenance/port/aft) "ujp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "ujs" = ( /obj/effect/spawner/structure/window/reinforced, @@ -67886,9 +67826,8 @@ /turf/open/floor/plating, /area/station/security/prison/safe) "ulE" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - piping_layer = 2 +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer2{ + dir = 1 }, /turf/open/floor/iron, /area/station/science/ordnance) @@ -67963,13 +67902,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet/blue, /area/station/security/prison/work) -"unm" = ( -/obj/machinery/plumbing/growing_vat, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/cobweb, -/obj/structure/cable, -/turf/open/floor/iron/showroomfloor, -/area/station/security/prison/work) "uno" = ( /obj/structure/closet/secure_closet/freezer/gulag_fridge, /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -68009,6 +67941,7 @@ /obj/structure/chair{ dir = 4 }, +/obj/structure/sign/departments/exodrone/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) "unO" = ( @@ -69163,7 +69096,8 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/turf/open/floor/engine, +/obj/structure/sign/warning/gas_mask/directional/north, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "uHV" = ( /obj/structure/disposalpipe/trunk/multiz{ @@ -69861,9 +69795,7 @@ /area/station/medical/medbay/aft) "uTc" = ( /obj/machinery/chem_heater/withbuffer, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/tile/yellow/full, /turf/open/floor/iron/white/smooth_large, /area/station/medical/pharmacy) @@ -69936,9 +69868,8 @@ }, /area/station/service/chapel) "uUn" = ( -/obj/structure/table/optable, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "uUq" = ( /obj/effect/spawner/structure/window/hollow/reinforced/middle, @@ -70743,7 +70674,7 @@ /area/station/command/heads_quarters/captain) "viR" = ( /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "viV" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -72413,9 +72344,7 @@ /area/station/cargo/sorting) "vHM" = ( /obj/structure/rack, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 8 }, @@ -73796,12 +73725,8 @@ /turf/open/floor/plating, /area/station/science/xenobiology) "wgu" = ( -/obj/structure/table/wood, -/obj/item/storage/fancy/candle_box{ - pixel_y = 5 - }, -/obj/item/storage/crayons, /obj/machinery/newscaster/directional/west, +/obj/effect/spawner/random/structure/twelve_percent_spirit_board, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) "wgG" = ( @@ -78744,6 +78669,16 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/aft) +"xCa" = ( +/obj/effect/turf_decal/siding/wideplating_new/light{ + dir = 6 + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/landmark/start/prisoner, +/turf/open/floor/iron/showroomfloor, +/area/station/security/prison/work) "xCb" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -78753,7 +78688,6 @@ "xCh" = ( /obj/machinery/button/door/directional/west{ id = "xenobio5"; - layer = 4; name = "Xenobio Pen 5 Blast Door"; req_access = list("xenobiology") }, @@ -79241,6 +79175,14 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/aft) +"xJi" = ( +/obj/machinery/portable_atmospherics/pipe_scrubber, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden, +/turf/open/floor/iron/showroomfloor, +/area/station/engineering/atmos) "xJj" = ( /turf/open/floor/iron, /area/station/science/xenobiology) @@ -79477,8 +79419,8 @@ /turf/open/floor/iron/dark/smooth_half, /area/station/ai_monitored/command/storage/eva) "xNa" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/engine, +/obj/effect/spawner/random/engineering/tracking_beacon, +/turf/open/floor/iron/white, /area/station/science/xenobiology) "xNn" = ( /obj/effect/turf_decal/stripes/line{ @@ -169416,8 +169358,8 @@ iDt iDt iDt oqL -unm -cvG +gLY +twx ldz fvK cIc @@ -169673,8 +169615,8 @@ iDt iDt iDt oqL -bFU -sZp +gvi +xCa axX auJ oVy @@ -189033,12 +188975,12 @@ xMq alM oxO ffe -lVs -abe -abe +qvN +qvN +qvN biI -abe -eOS +qvN +qvN qLY eGN lZX @@ -189290,12 +189232,12 @@ xMq alM oxO ffe -qGe -abe -cku +qvN +qvN +qvN uUn -xNa -eOS +qvN +qvN qLY vfe tsa @@ -189548,11 +189490,11 @@ alM oxO ffe viR -abe -abe +qvN +qvN bOT -abe -eLb +qvN +qvN qLY tkP fPv @@ -189805,10 +189747,10 @@ alM nsp ffe qLY -ctF +qLY uHS ujp -abe +qvN ctF qLY qLY @@ -191092,7 +191034,7 @@ ffe oqd vHq aZk -pMF +xNa pMF rdl iQM @@ -243527,7 +243469,7 @@ kQf hDh vnt keP -kRw +xJi ctr avk gxP @@ -243994,7 +243936,7 @@ yjF vVw yjF qSh -rKS +hsB uja jcy iuv @@ -254569,12 +254511,12 @@ wHc aEA dng dAB -ily -ily -ily -ily -ily -ily +ubh +ubh +ubh +ubh +ubh +ubh qLY pnA qFp @@ -254826,12 +254768,12 @@ wHc fPO pTU itt -ily -ily -ily -ily -ily -ily +ubh +ubh +ubh +ubh +ubh +ubh qLY baF fvk @@ -255083,12 +255025,12 @@ wHc oMT emK uvU -ily -ily -ily -ily -ily -ily +ubh +ubh +ubh +ubh +ubh +ubh qLY oCA fvk @@ -261772,7 +261714,7 @@ rjK nlP xTV imy -ejD +dHM auK vaa xLq diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 1713d3784311d..4d41b26a8176f 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -249,14 +249,6 @@ /obj/structure/window/spawner/directional/south, /turf/open/floor/iron, /area/station/engineering/atmos) -"afz" = ( -/obj/machinery/portable_atmospherics/scrubber, -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red/fourcorners, -/turf/open/floor/iron, -/area/station/engineering/atmos) "afD" = ( /turf/open/floor/engine{ name = "Holodeck Projector Floor" @@ -596,11 +588,12 @@ /turf/open/floor/iron, /area/station/hallway/primary/central) "alA" = ( -/obj/effect/mapping_helpers/mail_sorting/supply/cargo_bay, +/obj/structure/cable, /obj/structure/disposalpipe/sorting/mail{ - dir = 4 + dir = 4; + name = "Quartermaster Junction" }, -/obj/structure/cable, +/obj/effect/mapping_helpers/mail_sorting/supply/qm_office, /turf/open/floor/plating, /area/station/maintenance/port/fore) "alE" = ( @@ -1020,7 +1013,6 @@ dir = 8 }, /obj/structure/cable, -/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/hallway/primary/port) "aum" = ( @@ -2223,9 +2215,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/port/greater) @@ -2725,29 +2714,12 @@ /turf/open/floor/iron, /area/station/engineering/break_room) "aYl" = ( -/obj/structure/table, -/obj/item/assembly/igniter{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = 5; - pixel_y = -4 - }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = -1 - }, /obj/machinery/camera/directional/east{ c_tag = "Xenobiology Lab - Test Chamber"; network = list("ss13","rd","xeno") }, /obj/machinery/light/cold/directional/east, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "aYw" = ( /obj/machinery/door/airlock/external{ @@ -3987,6 +3959,12 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"btC" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/science/cytology) "btG" = ( /obj/structure/window/spawner/directional/west, /obj/structure/table, @@ -4234,7 +4212,7 @@ "bxr" = ( /obj/structure/sign/warning/electric_shock/directional/east, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "bxE" = ( /obj/machinery/camera/directional/south{ c_tag = "Chemistry South"; @@ -4424,13 +4402,13 @@ "bBy" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 8 - }, -/obj/effect/mapping_helpers/mail_sorting/supply/qm_office, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/structure/disposalpipe/sorting/mail{ + dir = 8 + }, +/obj/effect/mapping_helpers/mail_sorting/supply/cargo_bay, /turf/open/floor/iron, /area/station/hallway/primary/port) "bBA" = ( @@ -4666,9 +4644,7 @@ /turf/open/floor/iron, /area/station/science/robotics/lab) "bFN" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser, /obj/machinery/button/door/directional/north{ id = "pharmacy_shutters"; name = "pharmacy shutters control"; @@ -4898,6 +4874,15 @@ /obj/structure/cable, /turf/open/floor/iron, /area/station/hallway/primary/central) +"bJX" = ( +/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/iron, +/area/station/cargo/storage) "bKv" = ( /obj/item/pen, /obj/structure/table/reinforced, @@ -5492,15 +5477,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/iron/dark, /area/station/hallway/secondary/exit/departure_lounge) -"bVz" = ( -/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/primary/port) "bVB" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=9.3-Escape-3"; @@ -5741,7 +5717,6 @@ /obj/structure/table, /obj/machinery/button/door{ id = "xenobio6"; - layer = 3.3; name = "Xenobio Pen 6 Blast Doors"; pixel_y = 1; req_access = list("xenobiology") @@ -6688,6 +6663,10 @@ /obj/effect/turf_decal/tile/neutral/fourcorners, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) +"cuh" = ( +/obj/structure/disposalpipe/segment, +/turf/closed/wall, +/area/station/maintenance/port/fore) "cuk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 8 @@ -7048,15 +7027,14 @@ }, /turf/open/floor/wood, /area/station/service/library) -"cyp" = ( -/obj/machinery/power/apc/auto_name/directional/east, -/obj/machinery/portable_atmospherics/scrubber, -/obj/effect/turf_decal/siding/purple{ - dir = 6 +"cyE" = ( +/obj/machinery/portable_atmospherics/pipe_scrubber, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 }, -/obj/structure/cable, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) +/obj/effect/turf_decal/tile/red/fourcorners, +/turf/open/floor/iron, +/area/station/engineering/atmos) "cyG" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -7146,6 +7124,9 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/spawner/random/structure/crate, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, /turf/open/floor/plating, /area/station/maintenance/port/fore) "cAm" = ( @@ -7662,10 +7643,9 @@ /turf/open/floor/wood, /area/station/service/library) "cLN" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm/directional/west, +/obj/structure/sign/departments/exodrone/directional/east, /turf/open/floor/plating, -/area/station/cargo/drone_bay) +/area/station/maintenance/port/fore) "cMb" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, @@ -7986,7 +7966,7 @@ use_power = 0 }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "cTl" = ( /obj/structure/table/glass, /obj/item/reagent_containers/syringe, @@ -9514,6 +9494,7 @@ /obj/structure/cable, /obj/effect/spawner/random/maintenance, /obj/machinery/recharge_station, +/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/fore) "dvn" = ( @@ -9616,9 +9597,7 @@ /obj/structure/window/spawner/directional/south, /obj/structure/window/spawner/directional/north, /obj/structure/window/spawner/directional/west, -/obj/machinery/door/window/right/directional/east{ - layer = 3 - }, +/obj/machinery/door/window/right/directional/east, /turf/open/floor/plating, /area/station/maintenance/disposal) "dwJ" = ( @@ -9655,6 +9634,16 @@ /obj/effect/turf_decal/stripes/corner{ dir = 4 }, +/obj/structure/table, +/obj/item/storage/box/bandages{ + pixel_y = 6; + pixel_x = 4 + }, +/obj/effect/spawner/random/entertainment/deck, +/obj/effect/spawner/random/entertainment/cigarette_pack{ + pixel_x = -6; + pixel_y = 8 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) "dxq" = ( @@ -10285,7 +10274,7 @@ /obj/machinery/sparker/directional/north{ id = "Xenobio" }, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "dLn" = ( /obj/structure/rack, @@ -10868,6 +10857,7 @@ /area/station/medical/chemistry) "dUd" = ( /obj/structure/noticeboard/qm, +/obj/structure/disposalpipe/segment, /turf/closed/wall, /area/station/command/heads_quarters/qm) "dUj" = ( @@ -11284,6 +11274,7 @@ /obj/effect/turf_decal/trimline/brown/warning{ dir = 8 }, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/sorting) "ebg" = ( @@ -11744,16 +11735,6 @@ dir = 8 }, /area/station/service/chapel) -"ehN" = ( -/obj/structure/table, -/obj/machinery/cell_charger{ - pixel_y = 5 - }, -/obj/item/stack/cable_coil, -/obj/item/multitool, -/obj/item/stock_parts/power_store/cell/high, -/turf/open/floor/engine, -/area/station/science/xenobiology) "ehX" = ( /turf/open/floor/iron/dark, /area/station/medical/storage) @@ -12137,6 +12118,12 @@ /obj/machinery/light/small/directional/east, /turf/open/floor/iron/dark, /area/station/security/checkpoint/science) +"enG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/science/cytology) "enK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -12802,6 +12789,7 @@ /obj/machinery/camera/directional/north, /obj/machinery/digital_clock/directional/east, /obj/structure/extinguisher_cabinet/directional/north, +/obj/item/poster/traitor, /turf/open/floor/wood/large, /area/station/command/heads_quarters/qm) "ezT" = ( @@ -13594,6 +13582,16 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) +"ePT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/left/directional/south{ + name = "Cytology Pen"; + req_access = list("research") + }, +/turf/open/floor/iron/dark/textured_large, +/area/station/science/cytology) "ePX" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/medical/glass{ @@ -15153,6 +15151,10 @@ }, /turf/open/floor/iron, /area/station/hallway/secondary/entry) +"fpD" = ( +/obj/machinery/vatgrower, +/turf/open/floor/iron/dark/textured_large, +/area/station/science/cytology) "fpE" = ( /obj/structure/rack, /obj/item/tank/internals/emergency_oxygen, @@ -16008,7 +16010,7 @@ "fIR" = ( /obj/structure/sign/warning/secure_area/directional/north, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "fIS" = ( /obj/machinery/airalarm/directional/south, /obj/structure/disposalpipe/segment{ @@ -16271,6 +16273,7 @@ /obj/effect/spawner/random/maintenance, /obj/effect/turf_decal/stripes/corner, /obj/item/reagent_containers/cup/soda_cans/pwr_game, +/obj/structure/sign/poster/contraband/random/directional/south, /turf/open/floor/iron, /area/station/cargo/warehouse) "fNI" = ( @@ -16321,9 +16324,6 @@ /turf/open/floor/iron/dark, /area/station/security/range) "fOB" = ( -/obj/effect/mapping_helpers/airlock/unres{ - dir = 1 - }, /obj/effect/mapping_helpers/airlock/access/any/security/maintenance, /obj/machinery/door/airlock/maintenance{ name = "Brig Maintenance" @@ -16333,6 +16333,9 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 4 + }, /turf/open/floor/plating, /area/station/maintenance/port/fore) "fOS" = ( @@ -16992,7 +16995,7 @@ pixel_x = 32 }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "gdb" = ( /turf/closed/wall/r_wall, /area/station/security/range) @@ -17317,7 +17320,6 @@ /obj/structure/table, /obj/machinery/button/door{ id = "xenobio7"; - layer = 3.3; name = "Xenobio Pen 7 Blast Doors"; pixel_y = 4; req_access = list("xenobiology") @@ -18148,7 +18150,7 @@ /area/station/engineering/atmos) "gyK" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "gyO" = ( /obj/structure/cable, @@ -18179,9 +18181,6 @@ /area/station/maintenance/port/aft) "gzO" = ( /obj/machinery/firealarm/directional/west, -/obj/machinery/camera/directional/west{ - c_tag = "Restrooms" - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct, /turf/open/floor/iron/freezer, @@ -18476,12 +18475,6 @@ /obj/structure/table/wood, /turf/open/floor/carpet, /area/station/service/chapel/funeral) -"gFb" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/space/basic, -/area/space) "gFd" = ( /obj/machinery/power/terminal, /obj/machinery/light/small/directional/east, @@ -18886,6 +18879,10 @@ }, /obj/item/stock_parts/matter_bin, /obj/item/stock_parts/micro_laser, +/obj/item/flatpack{ + board = /obj/item/circuitboard/machine/flatpacker + }, +/obj/item/multitool, /turf/open/floor/iron, /area/station/science/lab) "gLY" = ( @@ -19102,6 +19099,7 @@ }, /obj/structure/extinguisher_cabinet/directional/north, /obj/machinery/light/small/directional/north, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/sorting) "gPY" = ( @@ -20337,9 +20335,6 @@ /obj/machinery/door/airlock/maintenance{ name = "Warehouse Maintenance" }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /obj/structure/cable, /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, @@ -20743,12 +20738,6 @@ }, /turf/open/floor/iron, /area/station/hallway/primary/aft) -"hvz" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/closed/wall, -/area/station/maintenance/port/fore) "hvB" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/effect/turf_decal/trimline/brown/filled/warning, @@ -24715,7 +24704,6 @@ /obj/structure/table, /obj/machinery/button/door{ id = "xenobio2"; - layer = 3.3; name = "Xenobio Pen 2 Blast Doors"; pixel_y = 1; req_access = list("xenobiology") @@ -25111,7 +25099,6 @@ /obj/structure/table, /obj/machinery/button/door{ id = "xenobio1"; - layer = 3.3; name = "Xenobio Pen 1 Blast Doors"; pixel_y = 1; req_access = list("xenobiology") @@ -25980,7 +25967,6 @@ "jjn" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/cable, -/obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/station/maintenance/port/greater) "jjs" = ( @@ -27123,6 +27109,7 @@ }, /obj/effect/turf_decal/trimline/brown/filled/corner, /obj/effect/turf_decal/trimline/white/corner, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/sorting) "jBC" = ( @@ -27952,9 +27939,6 @@ }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -27998,7 +27982,6 @@ "jQr" = ( /obj/machinery/door/airlock/maintenance, /obj/structure/cable, -/obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/unres{ dir = 1 }, @@ -28009,8 +27992,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 8 }, -/obj/effect/spawner/random/engineering/tracking_beacon, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "jQM" = ( /obj/machinery/door/firedoor, @@ -28640,6 +28622,7 @@ /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 4 }, +/obj/item/poster/traitor, /turf/open/floor/iron/dark, /area/station/security/evidence) "kbo" = ( @@ -28731,12 +28714,7 @@ /turf/open/floor/iron/dark, /area/station/command/bridge) "kcu" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron{ - amount = 10 - }, -/obj/item/electropack, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "kcF" = ( /obj/structure/disposalpipe/segment{ @@ -29002,6 +28980,7 @@ pixel_x = -9 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random/directional/south, /turf/open/floor/iron, /area/station/cargo/warehouse) "kir" = ( @@ -29086,14 +29065,12 @@ /obj/effect/turf_decal/bot, /obj/machinery/button/door/directional/west{ id = "QMLoaddoor"; - layer = 4; name = "Loading Doors"; pixel_y = -8; req_access = list("cargo") }, /obj/machinery/button/door/directional/west{ id = "QMLoaddoor2"; - layer = 4; name = "Loading Doors"; pixel_y = 8; req_access = list("cargo") @@ -29379,16 +29356,6 @@ }, /turf/open/floor/iron, /area/station/security/prison/work) -"koj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "kop" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -29608,7 +29575,7 @@ "ktw" = ( /obj/structure/sign/warning/electric_shock/directional/north, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "ktz" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -30416,7 +30383,7 @@ /area/station/maintenance/port) "kIJ" = ( /obj/effect/spawner/random/maintenance, -/obj/structure/disposalpipe/segment{ +/obj/structure/disposalpipe/junction{ dir = 4 }, /turf/open/floor/plating, @@ -30458,9 +30425,6 @@ /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 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -31829,31 +31793,18 @@ /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/item/pen/red{ - pixel_x = 8; - pixel_y = 8 - }, -/obj/item/pen/fountain{ - pixel_x = 10 - }, -/obj/item/pen/blue{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/storage/medkit/regular{ - pixel_x = -3; - pixel_y = 10 +/obj/structure/cable, +/obj/structure/railing{ + dir = 9 }, -/obj/structure/table, -/obj/item/stamp{ - pixel_x = -9; - pixel_y = -1 +/obj/machinery/disposal/bin/tagger, +/obj/structure/disposalpipe/trunk{ + dir = 4 }, -/obj/item/stamp/denied{ - pixel_y = -1 +/obj/effect/turf_decal/trimline/brown/filled/line{ + dir = 9 }, -/obj/structure/cable, -/turf/open/floor/catwalk_floor/iron, +/turf/open/floor/iron, /area/station/cargo/storage) "liX" = ( /obj/structure/cable, @@ -33363,6 +33314,7 @@ dir = 4 }, /obj/machinery/power/apc/auto_name/directional/south, +/obj/effect/spawner/random/structure/twelve_percent_spirit_board, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) "lPC" = ( @@ -33386,7 +33338,6 @@ /obj/structure/table, /obj/machinery/button/door{ id = "xenobio8"; - layer = 3.3; name = "Xenobio Pen 8 Blast Doors"; pixel_y = 4; req_access = list("xenobiology") @@ -34039,7 +33990,6 @@ /obj/structure/table, /obj/machinery/button/door{ id = "xenobio4"; - layer = 3.3; name = "Xenobio Pen 4 Blast Doors"; pixel_y = 4; req_access = list("xenobiology"); @@ -35244,7 +35194,6 @@ "mzm" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/saltshaker{ - layer = 3.1; pixel_x = -2; pixel_y = 2 }, @@ -35504,7 +35453,6 @@ /obj/structure/table, /obj/machinery/button/door{ id = "xenobio5"; - layer = 3.3; name = "Xenobio Pen 5 Blast Doors"; pixel_y = 4; req_access = list("xenobiology") @@ -35889,14 +35837,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"mKr" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plating, -/area/station/maintenance/port/fore) "mKu" = ( /obj/machinery/light_switch/directional/west, /obj/structure/cable, @@ -36556,7 +36496,7 @@ dir = 4 }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "mWA" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -37746,12 +37686,12 @@ "nrB" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/item/kirbyplants/random, /obj/structure/railing{ - dir = 9 + dir = 8 }, +/obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 9 + dir = 8 }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -38137,8 +38077,7 @@ /obj/machinery/computer/upload/ai, /obj/machinery/door/window/right/directional/south{ name = "Upload Console Window"; - req_access = list("ai_upload"); - layer = 3.1 + req_access = list("ai_upload") }, /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, @@ -38801,9 +38740,7 @@ /turf/open/floor/iron, /area/station/hallway/secondary/command) "nJn" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser, /obj/effect/turf_decal/tile/yellow/half/contrasted{ dir = 4 }, @@ -38821,7 +38758,7 @@ /area/station/medical/treatment_center) "nJr" = ( /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "nJu" = ( /obj/structure/closet/secure_closet/security/sec, @@ -39000,7 +38937,7 @@ "nLZ" = ( /obj/item/toy/beach_ball/branded, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "nMf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -39519,12 +39456,6 @@ /obj/effect/turf_decal/trimline/blue/filled/warning, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"nWF" = ( -/obj/structure/railing{ - dir = 8 - }, -/turf/open/space/basic, -/area/space) "nWS" = ( /obj/structure/window/reinforced/spawner/directional/west, /turf/open/space, @@ -40750,16 +40681,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/port/fore) -"oue" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/item/plunger{ - pixel_x = -7; - pixel_y = 20 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/science/cytology) "ouj" = ( /obj/structure/bed/medical/emergency, /obj/structure/bed/medical/emergency, @@ -41449,6 +41370,7 @@ /obj/effect/turf_decal/box, /obj/machinery/portable_atmospherics/canister, /obj/item/radio/intercom/directional/north, +/obj/structure/sign/warning/gas_mask/directional/east, /turf/open/floor/iron, /area/station/science/xenobiology) "oGn" = ( @@ -43030,13 +42952,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"pkP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/plumbing/growing_vat, -/turf/open/floor/iron/dark/textured_large, -/area/station/science/cytology) "pkQ" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock" @@ -43312,9 +43227,6 @@ "pqc" = ( /obj/machinery/door/firedoor, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron, /area/station/hallway/primary/port) "pqi" = ( @@ -44933,9 +44845,6 @@ /area/station/cargo/warehouse) "pTf" = ( /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron/goonplaque, /area/station/hallway/primary/port) "pTm" = ( @@ -45068,15 +44977,12 @@ /area/station/security/brig) "pVV" = ( /obj/effect/turf_decal/tile/brown/half/contrasted, -/obj/effect/spawner/random/entertainment/deck, -/obj/structure/table, -/obj/effect/spawner/random/entertainment/cigarette_pack{ - pixel_x = -6; - pixel_y = 8 +/obj/machinery/disposal/bin{ + name = "Jim Norton's Quebecois Coffee disposal unit" }, -/obj/item/storage/box/bandages{ - pixel_y = 6; - pixel_x = 4 +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 }, /turf/open/floor/iron, /area/station/cargo/miningoffice) @@ -45954,6 +45860,9 @@ }, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hos) +"qmi" = ( +/turf/open/floor/iron/dark/textured_large, +/area/station/science/cytology) "qmu" = ( /obj/machinery/modular_computer/preset/id{ dir = 8 @@ -46370,6 +46279,7 @@ "quT" = ( /obj/effect/turf_decal/trimline/brown/filled/line, /obj/machinery/light/directional/south, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) "qvJ" = ( @@ -46574,9 +46484,6 @@ "qzC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron, /area/station/hallway/primary/port) "qzE" = ( @@ -47024,6 +46931,19 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/structure/table, +/obj/item/flashlight/lamp{ + pixel_x = -7; + pixel_y = 9 + }, +/obj/item/folder/yellow{ + pixel_y = -5; + pixel_x = 5 + }, +/obj/item/pen/blue{ + pixel_x = 4; + pixel_y = -3 + }, /turf/open/floor/iron, /area/station/cargo/miningoffice) "qHK" = ( @@ -48212,9 +48132,6 @@ "qZO" = ( /obj/effect/landmark/event_spawn, /obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, /turf/open/floor/iron, /area/station/hallway/primary/port) "qZV" = ( @@ -48296,6 +48213,15 @@ /obj/structure/chair/stool/directional/west, /turf/open/floor/wood, /area/station/commons/lounge) +"rbd" = ( +/obj/machinery/power/apc/auto_name/directional/east, +/obj/machinery/portable_atmospherics/pipe_scrubber, +/obj/effect/turf_decal/siding/purple{ + dir = 6 + }, +/obj/structure/cable, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "rbi" = ( /obj/effect/spawner/random/structure/closet_maintenance, /obj/effect/spawner/random/maintenance, @@ -48554,10 +48480,6 @@ }, /turf/open/floor/iron, /area/station/cargo/drone_bay) -"rgM" = ( -/obj/structure/sign/poster/traitor/random, -/turf/closed/wall, -/area/station/cargo/warehouse) "rgS" = ( /obj/machinery/modular_computer/preset/civilian{ dir = 1 @@ -48885,7 +48807,6 @@ dir = 6 }, /obj/machinery/light/directional/west, -/obj/structure/disposalpipe/trunk, /turf/open/floor/iron, /area/station/cargo/storage) "rnb" = ( @@ -49650,6 +49571,7 @@ "rzo" = ( /obj/structure/cable, /obj/effect/landmark/start/cargo_technician, +/obj/structure/disposalpipe/segment, /turf/open/floor/iron, /area/station/cargo/storage) "rzq" = ( @@ -50325,7 +50247,6 @@ /obj/structure/table, /obj/machinery/button/door{ id = "xenobio3"; - layer = 3.3; name = "Xenobio Pen 3 Blast Doors"; pixel_y = 4; req_access = list("xenobiology") @@ -50334,18 +50255,6 @@ /obj/structure/window/reinforced/spawner/directional/south, /turf/open/floor/iron, /area/station/science/xenobiology) -"rMl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/iron, -/area/station/hallway/primary/port) "rMr" = ( /obj/structure/table/glass, /obj/item/experi_scanner{ @@ -51697,9 +51606,6 @@ dir = 1 }, /obj/structure/disposalpipe/segment, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/open/floor/iron, /area/station/hallway/primary/port) "slC" = ( @@ -51756,13 +51662,13 @@ /area/station/engineering/atmos) "smB" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/autolathe, /obj/structure/railing{ dir = 8 }, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, +/obj/machinery/autolathe, /turf/open/floor/iron, /area/station/cargo/storage) "smG" = ( @@ -51815,25 +51721,15 @@ }, /turf/open/floor/iron/white, /area/station/science/ordnance/testlab) -"snS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plating, -/area/station/maintenance/port/greater) "snZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/disposalpipe/segment, -/obj/structure/railing{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/obj/effect/turf_decal/trimline/brown/filled/line{ - dir = 8 +/obj/effect/turf_decal/trimline/brown/filled/corner{ + dir = 1 }, /turf/open/floor/iron, /area/station/cargo/storage) @@ -51963,10 +51859,6 @@ /obj/effect/mapping_helpers/broken_floor, /turf/open/floor/wood, /area/station/service/library) -"sri" = ( -/obj/machinery/duct, -/turf/open/floor/iron/dark/textured_large, -/area/station/science/cytology) "srk" = ( /obj/structure/sign/warning/electric_shock, /turf/closed/wall/r_wall, @@ -52530,21 +52422,31 @@ /area/station/engineering/atmos) "sCc" = ( /obj/structure/table, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 2 +/obj/structure/disposalpipe/segment{ + dir = 6 }, -/obj/item/clothing/gloves/cargo_gauntlet{ - pixel_y = 5 +/obj/structure/cable, +/obj/item/storage/medkit/regular{ + pixel_x = -3; + pixel_y = 10 }, -/obj/item/clothing/gloves/cargo_gauntlet{ +/obj/item/pen/blue{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/pen/fountain{ + pixel_x = 10 + }, +/obj/item/pen/red{ + pixel_x = 8; pixel_y = 8 }, -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/item/stamp/denied{ + pixel_y = -1 }, -/obj/structure/cable, -/obj/item/reagent_containers/cup/soda_cans/random{ - pixel_x = -9 +/obj/item/stamp{ + pixel_x = -9; + pixel_y = -1 }, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) @@ -53354,6 +53256,9 @@ /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 = 9 + }, /turf/open/floor/plating, /area/station/maintenance/port/fore) "sPV" = ( @@ -54415,10 +54320,10 @@ /area/station/cargo/miningoffice) "tik" = ( /obj/structure/disposalpipe/segment, -/obj/machinery/rnd/production/techfab/department/cargo, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, +/obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/iron, /area/station/cargo/storage) "tit" = ( @@ -54721,6 +54626,7 @@ "tnF" = ( /obj/machinery/light/small/dim/directional/west, /obj/effect/decal/cleanable/dirt, +/obj/structure/sign/poster/contraband/random/directional/west, /turf/open/floor/iron, /area/station/cargo/warehouse) "tnG" = ( @@ -55888,7 +55794,7 @@ "tLb" = ( /obj/structure/sign/warning/electric_shock/directional/south, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "tLc" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment{ @@ -58312,7 +58218,7 @@ use_power = 0 }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "uzJ" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 4 @@ -58416,9 +58322,8 @@ /turf/open/floor/iron/white, /area/station/science/ordnance/storage) "uBG" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4; - piping_layer = 2 +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer2{ + dir = 4 }, /obj/effect/turf_decal/siding/purple{ dir = 9 @@ -58434,13 +58339,6 @@ dir = 8 }, /area/station/medical/medbay/lobby) -"uCe" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/machinery/plumbing/input{ - dir = 1 - }, -/turf/open/floor/iron/dark/textured_large, -/area/station/science/cytology) "uCq" = ( /obj/structure/closet/firecloset, /obj/effect/turf_decal/tile/neutral/fourcorners, @@ -60178,9 +60076,7 @@ /turf/open/floor/iron/white, /area/station/command/heads_quarters/cmo) "vhb" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser, /obj/effect/turf_decal/tile/yellow/anticorner/contrasted{ dir = 8 }, @@ -60255,12 +60151,12 @@ /obj/item/folder/documents, /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners, +/obj/item/poster/traitor, /turf/open/floor/iron/dark, /area/station/ai_monitored/command/nuke_storage) "viF" = ( /obj/machinery/computer/upload/borg, /obj/machinery/door/window/left/directional/south{ - layer = 3.1; name = "Cyborg Upload Console Window"; req_access = list("ai_upload") }, @@ -61486,9 +61382,6 @@ /obj/machinery/light/small/directional/west, /obj/effect/decal/cleanable/dirt, /obj/structure/cable, -/obj/machinery/camera/directional/west{ - c_tag = "Auxilary Restrooms" - }, /obj/structure/sign/poster/official/random/directional/west, /turf/open/floor/iron, /area/station/commons/toilet/auxiliary) @@ -62185,6 +62078,10 @@ /obj/effect/mapping_helpers/airlock/access/any/command/maintenance, /turf/open/floor/plating, /area/station/maintenance/central) +"vOz" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/floor/iron/dark/textured_large, +/area/station/science/cytology) "vOK" = ( /obj/structure/plasticflaps/opaque, /obj/effect/turf_decal/bot, @@ -62748,6 +62645,19 @@ dir = 5 }, /obj/structure/cable, +/obj/structure/table, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 8 + }, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 5 + }, +/obj/item/clothing/gloves/cargo_gauntlet{ + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/soda_cans/random{ + pixel_x = -9 + }, /turf/open/floor/catwalk_floor/iron, /area/station/cargo/storage) "vWF" = ( @@ -66041,9 +65951,6 @@ "xgx" = ( /obj/structure/cable, /obj/structure/disposalpipe/segment, -/obj/effect/turf_decal/trimline/brown/filled/corner{ - dir = 1 - }, /turf/open/floor/iron, /area/station/cargo/storage) "xgB" = ( @@ -66741,7 +66648,7 @@ "xtw" = ( /obj/item/stack/rods, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "xtz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -67608,7 +67515,6 @@ "xIK" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/enzyme{ - layer = 5; pixel_x = -7; pixel_y = 13 }, @@ -68667,6 +68573,7 @@ /turf/open/floor/plating, /area/station/maintenance/port/fore) "ycv" = ( +/obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/white, /area/station/science/xenobiology) "ycw" = ( @@ -85230,7 +85137,7 @@ fcq pck lku uEw -snS +nJG jjn jQr kKd @@ -85492,8 +85399,8 @@ wUt fcq jPE auh -koj -rMl +crr +crr crr qer crr @@ -85743,14 +85650,14 @@ cbz dBE vQs vQs -rgM +vQs hor vQs vQs iSk nzD uxa -bVz +uxa bNQ aal sEk @@ -86003,11 +85910,11 @@ ePj tnF dKY kif -rgM +vQs dHc dHc bZY -xOw +rEO spH dHc fjD @@ -86521,7 +86428,7 @@ cJT vQs qlz hyW -xOw +rEO iOc mAs fjD @@ -86778,7 +86685,7 @@ pSY vQs tiD hyW -xOw +rEO iOc rcW fjD @@ -87032,10 +86939,10 @@ kZI nbd vKn fNz -rgM +vQs vQs hyW -xOw +rEO xbd pOa pOa @@ -87292,7 +87199,7 @@ rPp ljH vQs mQa -xOw +rEO mux pOa qXm @@ -88031,7 +87938,7 @@ bkJ iIE cAf dve -jXu +cuh pVV qqr iId @@ -88063,7 +87970,7 @@ sbF flG bzH hyW -xOw +rEO wAk pOa pOa @@ -88279,7 +88186,7 @@ hTG gJM srk qGP -sHu +cLN pkT sHu eMY @@ -88565,17 +88472,17 @@ bDn xzx hIp qCS -iqt -mmR +bJX +xgx rzo quT -bzH +iev gPN ebd ebd jBy -bzH -bzH +iev +iev bBy qZO pYn @@ -88793,7 +88700,7 @@ aaa tdg hkj sQp -cLN +kuW qHa ujT dYi @@ -89057,7 +88964,7 @@ mUF obF jXu fpn -hvz +jXu jXu jXu jXu @@ -89314,7 +89221,7 @@ xMx qrF jXu vxO -hvz +jXu aaa aaa aaf @@ -89571,7 +89478,7 @@ phP rgL jXu paU -hvz +jXu aaf rlU rlU @@ -89828,7 +89735,7 @@ jXu jXu jXu otQ -hvz +jXu aaa rlU dfl @@ -90085,7 +89992,7 @@ twr fnJ jXu wgm -mKr +fsQ aaa rlU qrg @@ -90342,7 +90249,7 @@ pOi bMu jXu agi -mKr +fsQ aaa rlU trx @@ -90599,7 +90506,7 @@ knQ cDV sLf uEA -mKr +fsQ aaa rlU vbF @@ -95199,7 +95106,7 @@ aaa aaa aaa aaa -nWF +sKY aaa sIe gkn @@ -101222,7 +101129,7 @@ jVy jTN vAH kIY -cyp +rbd gyQ rbD jwj @@ -110437,7 +110344,7 @@ dkC dwz dwz frE -afz +cyE uwQ siy lgL @@ -111491,7 +111398,7 @@ lMJ aaa aaa uaR -oue +btC wRL tyj myr @@ -111748,10 +111655,10 @@ dxK aaa aaa oMA -pkP -sri -sri -uCe +enG +fpD +qmi +vOz tsy sRa ppC @@ -112008,7 +111915,7 @@ uaR jHX oQk toR -toR +ePT syV jsi eoZ @@ -116078,7 +115985,7 @@ twf lMJ lMJ blx -gFb +hHO aaa aaa fuu @@ -117363,7 +117270,7 @@ oAQ lMJ lMJ blx -gFb +hHO aaa aaa fuu @@ -117407,7 +117314,7 @@ rDf eUe eSb nnc -hdy +nnc nnc rvK nnc @@ -117664,11 +117571,11 @@ hbK mgS hbK jlU -mtu -mtu +kcu +kcu gyK -mtu -mtu +kcu +kcu jlU hbK mTg @@ -117922,10 +117829,10 @@ fGy wyo jlU dLm -mtu +kcu gyK -mtu -mtu +kcu +kcu jlU qgn mCV @@ -118178,11 +118085,11 @@ pWT rDf uLa jlU -mtu -mtu +kcu +kcu jQz nJr -mtu +kcu jlU lUS pHt @@ -118391,7 +118298,7 @@ oAQ lMJ lMJ blx -gFb +hHO aaa aaa aaa @@ -118435,11 +118342,11 @@ hbK wrc wrc jlU -mtu -mtu -mtu -mtu -mtu +kcu +kcu +kcu +kcu +kcu jlU wrc wrc @@ -118693,7 +118600,7 @@ aaa lMJ jlU jlU -ehN +kcu aYl kcu jlU diff --git a/_maps/map_files/NorthStar/north_star.dmm b/_maps/map_files/NorthStar/north_star.dmm index 3e9ca40048097..3e4e2fa63556c 100644 --- a/_maps/map_files/NorthStar/north_star.dmm +++ b/_maps/map_files/NorthStar/north_star.dmm @@ -214,7 +214,7 @@ dir = 8 }, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "acp" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, @@ -3428,7 +3428,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/space) +/area/space/nearstation) "aTU" = ( /obj/effect/turf_decal/trimline/purple/line, /obj/effect/turf_decal/trimline/purple/line{ @@ -7212,7 +7212,7 @@ dir = 4 }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "bOq" = ( /obj/machinery/door/airlock/maintenance/external, /obj/effect/turf_decal/stripes/line{ @@ -11442,6 +11442,10 @@ pixel_y = 9 }, /obj/effect/turf_decal/tile/purple/fourcorners, +/obj/item/flatpack{ + board = /obj/item/circuitboard/machine/flatpacker + }, +/obj/item/multitool, /turf/open/floor/iron/white, /area/station/science/lab) "cSc" = ( @@ -12687,7 +12691,7 @@ dir = 4 }, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "djd" = ( /obj/structure/cable, /turf/open/floor/iron/dark, @@ -12794,7 +12798,7 @@ dir = 4 }, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "dks" = ( /obj/structure/girder, /obj/item/stack/sheet/iron, @@ -13708,14 +13712,6 @@ /obj/structure/cable, /turf/open/floor/engine/hull/reinforced, /area/space/nearstation) -"dyE" = ( -/obj/machinery/plumbing/growing_vat{ - dir = 4 - }, -/obj/machinery/light/cold/no_nightlight/directional/north, -/obj/machinery/status_display/ai/directional/north, -/turf/open/misc/dirt/jungle, -/area/station/science/cytology) "dyG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -14510,6 +14506,14 @@ /obj/structure/cable, /turf/open/floor/pod/dark, /area/station/maintenance/floor2/starboard/aft) +"dJs" = ( +/obj/machinery/vatgrower{ + dir = 4 + }, +/obj/machinery/light/cold/no_nightlight/directional/south, +/obj/machinery/status_display/evac/directional/south, +/turf/open/misc/sandy_dirt, +/area/station/science/cytology) "dJu" = ( /obj/structure/lattice/catwalk, /obj/structure/railing{ @@ -15644,9 +15648,7 @@ /obj/item/storage/box/syringes{ pixel_y = 6 }, -/obj/item/stack/medical/mesh{ - layer = 3.01 - }, +/obj/item/stack/medical/mesh, /turf/open/floor/iron/white, /area/station/medical/treatment_center) "dXz" = ( @@ -21263,9 +21265,6 @@ /obj/structure/stairs/north, /turf/open/floor/iron/white/small, /area/station/medical/chemistry) -"fCp" = ( -/turf/open/floor/plating/airless, -/area/space) "fCq" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/effect/landmark/generic_maintenance_landmark, @@ -23295,9 +23294,7 @@ /obj/effect/turf_decal/tile/blue/fourcorners, /obj/structure/table/reinforced/rglass, /obj/item/pai_card, -/obj/item/reagent_containers/spray/cleaner{ - layer = 3.01 - }, +/obj/item/reagent_containers/spray/cleaner, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) "gcs" = ( @@ -23662,16 +23659,14 @@ pixel_y = 10 }, /obj/machinery/cell_charger{ - pixel_y = 1; - layer = 2.91 + pixel_y = 1 }, /obj/item/stock_parts/power_store/cell/high{ pixel_y = 9; pixel_x = -1 }, /obj/item/stock_parts/power_store/cell/high{ - pixel_x = -1; - layer = 3.01 + pixel_x = -1 }, /turf/open/floor/iron/white/textured, /area/station/medical/treatment_center) @@ -26873,6 +26868,7 @@ /obj/item/circuitboard/machine/exoscanner, /obj/item/circuitboard/machine/exoscanner, /obj/item/circuitboard/machine/exoscanner, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/corner, /area/station/cargo/drone_bay) "haj" = ( @@ -27046,9 +27042,7 @@ /turf/open/floor/iron/dark, /area/station/security/courtroom) "hbW" = ( -/obj/structure/railing{ - layer = 3.1 - }, +/obj/structure/railing, /obj/effect/turf_decal/trimline/blue/filled/line{ dir = 6 }, @@ -28258,7 +28252,6 @@ /area/station/maintenance/floor2/starboard/aft) "hsA" = ( /obj/structure/extinguisher_cabinet/directional/east, -/obj/machinery/camera/autoname/directional/east, /turf/open/floor/iron, /area/station/commons/toilet) "hsG" = ( @@ -33808,8 +33801,7 @@ }, /obj/machinery/door/window/right/directional/south{ name = "Upload Console Window"; - req_access = list("ai_upload"); - layer = 3 + req_access = list("ai_upload") }, /turf/open/floor/iron/dark, /area/station/ai_monitored/turret_protected/ai_upload) @@ -34009,6 +34001,11 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/iron/dark/side, /area/station/commons/locker) +"iQR" = ( +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/pipe_scrubber, +/turf/open/floor/iron, +/area/station/engineering/atmos) "iQU" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -38761,6 +38758,7 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/structure/cable, +/obj/structure/sign/departments/exodrone/directional/west, /turf/open/floor/iron, /area/station/cargo/storage) "kcZ" = ( @@ -39011,9 +39009,8 @@ }, /area/station/hallway/floor1/aft) "kfg" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 1; - piping_layer = 2 +/obj/machinery/atmospherics/components/unary/thermomachine/heater/layer2{ + dir = 1 }, /obj/machinery/light/directional/south, /turf/open/floor/iron, @@ -44107,9 +44104,7 @@ /obj/effect/turf_decal/arrows{ dir = 4 }, -/obj/structure/railing{ - layer = 3.1 - }, +/obj/structure/railing, /obj/effect/decal/cleanable/robot_debris, /obj/effect/landmark/start/bitrunner, /turf/open/floor/iron/dark/textured_large, @@ -45985,7 +45980,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/door/window/left/directional/south{ - layer = 3.1; name = "Cyborg Upload Console Window"; req_access = list("ai_upload") }, @@ -53381,9 +53375,8 @@ }, /area/station/hallway/floor3/aft) "nJb" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/heater{ - dir = 1; - piping_layer = 2 +/obj/machinery/atmospherics/components/unary/thermomachine/heater/layer2{ + dir = 1 }, /turf/open/floor/iron, /area/station/engineering/atmos) @@ -61351,7 +61344,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/space) +/area/space/nearstation) "pNW" = ( /obj/effect/turf_decal/tile/blue/half/contrasted{ dir = 1 @@ -65624,7 +65617,7 @@ dir = 8 }, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "qRW" = ( /obj/structure/disposalpipe/junction{ dir = 8 @@ -67036,7 +67029,6 @@ /turf/open/floor/iron/dark, /area/station/hallway/floor1/aft) "rjB" = ( -/obj/structure/sign/warning/biohazard/directional/east, /obj/machinery/light/cold/no_nightlight/directional/east, /turf/open/floor/engine/xenobio, /area/station/science/xenobiology) @@ -69866,6 +69858,7 @@ /area/station/maintenance/floor1/port) "sav" = ( /obj/effect/turf_decal/box/corners, +/obj/structure/sign/warning/biohazard/directional/east, /turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "saA" = ( @@ -69927,7 +69920,6 @@ pixel_y = 2 }, /obj/structure/rack, -/obj/machinery/firealarm/directional/east, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/corner{ dir = 1 @@ -72507,7 +72499,7 @@ c_tag = "Minisat - Aft" }, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "sLe" = ( /obj/effect/turf_decal/stripes/line, /obj/effect/decal/cleanable/dirt, @@ -74564,7 +74556,7 @@ "tlJ" = ( /obj/machinery/camera/autoname/directional/east, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "tlK" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -78122,9 +78114,8 @@ /turf/open/floor/iron/checker, /area/station/commons/vacant_room/commissary) "uhC" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - piping_layer = 2 +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer2{ + dir = 1 }, /obj/machinery/light/small/directional/south, /turf/open/floor/iron/dark, @@ -78266,9 +78257,8 @@ /turf/open/floor/iron/dark/textured, /area/station/medical/surgery/fore) "ujl" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - piping_layer = 4 +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer4{ + dir = 1 }, /obj/item/radio/intercom/directional/south, /turf/open/floor/iron/dark, @@ -78305,7 +78295,7 @@ "ujI" = ( /obj/structure/railing, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "ujQ" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 8 @@ -78593,9 +78583,8 @@ /turf/open/floor/iron/dark, /area/station/science/breakroom) "unQ" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 4; - piping_layer = 2 +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer2{ + dir = 4 }, /turf/open/floor/iron/dark, /area/station/science/ordnance/testlab) @@ -80121,6 +80110,14 @@ /obj/effect/spawner/random/maintenance, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor1/port) +"uJq" = ( +/obj/machinery/vatgrower{ + dir = 4 + }, +/obj/machinery/light/cold/no_nightlight/directional/north, +/obj/machinery/status_display/ai/directional/north, +/turf/open/misc/dirt/jungle, +/area/station/science/cytology) "uJr" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/grass/fairy, @@ -80543,6 +80540,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/floor2/starboard/aft) +"uOc" = ( +/obj/effect/turf_decal/tile/neutral/full, +/obj/machinery/portable_atmospherics/pipe_scrubber, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron, +/area/station/science/ordnance/testlab) "uOd" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 4 @@ -82548,9 +82551,7 @@ /area/station/maintenance/floor4/port/fore) "voX" = ( /obj/machinery/door/firedoor/border_only, -/obj/structure/railing{ - layer = 3.1 - }, +/obj/structure/railing, /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 1 }, @@ -83429,9 +83430,7 @@ /area/station/cargo/lobby) "vzo" = ( /obj/machinery/netpod, -/obj/structure/railing{ - layer = 3.1 - }, +/obj/structure/railing, /turf/open/floor/catwalk_floor/iron_dark, /area/station/cargo/bitrunning/den) "vzu" = ( @@ -84918,6 +84917,7 @@ /obj/effect/turf_decal/box/corners{ dir = 4 }, +/obj/structure/sign/warning/gas_mask/directional/east, /turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "vTY" = ( @@ -85593,7 +85593,7 @@ dir = 1 }, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "wci" = ( /obj/effect/turf_decal/siding/wood/corner{ dir = 4 @@ -85949,14 +85949,6 @@ dir = 4 }, /area/station/command/bridge) -"wfG" = ( -/obj/machinery/plumbing/growing_vat{ - dir = 4 - }, -/obj/machinery/light/cold/no_nightlight/directional/south, -/obj/machinery/status_display/evac/directional/south, -/turf/open/misc/sandy_dirt, -/area/station/science/cytology) "wfI" = ( /obj/machinery/light_switch/directional/west, /turf/open/floor/wood, @@ -86331,7 +86323,6 @@ "wkP" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/saltshaker{ - layer = 3.1; pixel_x = -2; pixel_y = 2 }, @@ -87549,7 +87540,7 @@ /turf/open/floor/iron/dark, /area/station/security/holding_cell) "wzt" = ( -/obj/item/kirbyplants/random, +/obj/effect/spawner/random/structure/twelve_percent_spirit_board, /turf/open/floor/iron/white/textured_large, /area/station/service/chapel/office) "wzB" = ( @@ -90446,7 +90437,7 @@ dir = 4 }, /turf/open/floor/plating/airless, -/area/space) +/area/space/nearstation) "xlu" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -90653,6 +90644,9 @@ }, /turf/open/floor/grass, /area/station/service/hydroponics/garden/abandoned) +"xpw" = ( +/turf/open/space/basic, +/area/space/nearstation) "xpA" = ( /obj/effect/turf_decal/siding/wood{ dir = 8 @@ -91127,9 +91121,7 @@ /obj/item/reagent_containers/cup/beaker{ pixel_x = 5 }, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "xvO" = ( @@ -92223,6 +92215,9 @@ }, /turf/open/floor/catwalk_floor, /area/station/maintenance/floor4/starboard) +"xIV" = ( +/turf/open/space/openspace, +/area/space/nearstation) "xJk" = ( /obj/machinery/seed_extractor, /obj/effect/turf_decal/tile/green/full, @@ -92346,7 +92341,7 @@ "xKt" = ( /obj/structure/railing/corner, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "xKy" = ( /obj/machinery/modular_computer/preset/id{ dir = 8 @@ -93031,7 +93026,7 @@ dir = 1 }, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "xUB" = ( /obj/machinery/light/floor, /turf/open/floor/iron/dark/side{ @@ -135006,7 +135001,7 @@ oIJ hRR qXk hHB -hHB +iQR gmw hOy lHR @@ -147072,15 +147067,15 @@ owI owI owI aTO -fCp +rcO pNV aTO -fCp -fCp +rcO +rcO xln aTO -fCp -fCp +rcO +rcO xln teq teq @@ -147121,15 +147116,15 @@ iSU iSU iSU iSU -fCp -fCp +rcO +rcO xln aTO -fCp -fCp +rcO +rcO xln aTO -fCp +rcO pNV aTO owI @@ -147329,16 +147324,16 @@ owI owI owI owI -fCp -fCp +rcO +rcO owI -fCp -fCp -fCp +rcO +rcO +rcO owI -fCp -fCp -fCp +rcO +rcO +rcO owI owI owI @@ -147378,16 +147373,16 @@ owI owI owI owI -fCp -fCp -fCp +rcO +rcO +rcO owI -fCp -fCp -fCp +rcO +rcO +rcO owI -fCp -fCp +rcO +rcO owI owI owI @@ -147589,7 +147584,13 @@ owI owI owI owI +xpw +xpw +xpw owI +xpw +xpw +xpw owI owI owI @@ -147629,19 +147630,13 @@ owI owI owI owI +xpw +xpw +xpw owI -owI -owI -owI -owI -owI -owI -owI -owI -owI -owI -owI -owI +xpw +xpw +xpw owI owI owI @@ -174625,7 +174620,7 @@ oyh oyh oyh oyh -ucA +xIV ucA ucA ucA @@ -174882,7 +174877,7 @@ oyh oyh oyh oyh -ucA +xIV ucA ucA ucA @@ -175139,7 +175134,7 @@ oyh oyh oyh oyh -ucA +xIV ucA ucA ucA @@ -175396,7 +175391,7 @@ oyh oyh oyh oyh -ucA +xIV ucA ucA ucA @@ -175653,7 +175648,7 @@ oyh oyh oyh oyh -ucA +xIV ucA ucA ucA @@ -175910,7 +175905,7 @@ oyh oyh oyh oyh -ucA +xIV ucA ucA ucA @@ -191802,13 +191797,13 @@ iuW eHf dGa rkM -dyE +uJq nuv cLA npF lcT aAE -wfG +dJs qun nVT iCi @@ -315424,7 +315419,7 @@ hHi fMc gOF ddH -ddH +uOc nPE pDq vfi diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index a2d6ba70275d9..1b1fdf387396f 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -924,7 +924,7 @@ /turf/open/floor/iron, /area/station/construction) "dN" = ( -/obj/structure/table, +/obj/machinery/vending/subtype_vendor, /turf/open/floor/iron, /area/station/commons/storage/primary) "dO" = ( @@ -932,6 +932,7 @@ /obj/machinery/light/directional/south, /obj/item/storage/medkit/regular, /obj/item/healthanalyzer/advanced, +/obj/item/debug/omnitool/item_spawner, /turf/open/floor/iron, /area/station/commons/storage/primary) "dP" = ( @@ -1273,13 +1274,11 @@ /obj/effect/turf_decal/bot, /obj/machinery/button/door/directional/east{ id = "cargounload"; - layer = 4; name = "Loading Doors"; pixel_y = 8 }, /obj/machinery/button/door/directional/east{ id = "cargoload"; - layer = 4; name = "Loading Doors"; pixel_y = -8 }, @@ -1777,6 +1776,7 @@ /area/station/construction) "is" = ( /obj/structure/sign/warning/vacuum/external/directional/east, +/obj/machinery/vending/subtype_vendor, /turf/open/floor/iron, /area/station/medical/medbay) "jb" = ( @@ -1864,6 +1864,7 @@ "ny" = ( /obj/structure/table, /obj/item/storage/toolbox/syndicate, +/obj/item/debug/omnitool, /turf/open/floor/iron, /area/station/commons/storage/primary) "nI" = ( @@ -2219,6 +2220,24 @@ /obj/effect/turf_decal/tile/blue/half/contrasted, /turf/open/floor/iron, /area/station/command/bridge) +"IB" = ( +/obj/structure/cable, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/table, +/obj/item/debug/omnitool{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/debug/omnitool/item_spawner{ + pixel_x = 4; + pixel_y = -6 + }, +/turf/open/floor/iron/white/corner{ + dir = 1 + }, +/area/station/medical/medbay) "IF" = ( /obj/machinery/power/apc/auto_name/directional/north, /obj/structure/cable, @@ -7991,7 +8010,7 @@ av by Ot cl -cl +IB cl cH cu diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 9b5baa411fa10..2346e028c49e9 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -914,8 +914,7 @@ /area/centcom/central_command_areas/control) "ec" = ( /obj/structure/railing{ - dir = 4; - layer = 4.1 + dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/dark{ @@ -2091,14 +2090,12 @@ "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 @@ -2798,7 +2795,6 @@ /obj/machinery/recharger, /obj/machinery/button/door/indestructible{ id = "XCCsecdepartment"; - layer = 3; name = "CC Security Checkpoint Control"; pixel_x = 24; pixel_y = 24 @@ -4044,8 +4040,7 @@ /area/centcom/central_command_areas/ferry) "sw" = ( /obj/structure/railing{ - dir = 8; - layer = 4.1 + dir = 8 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/dark{ @@ -4910,14 +4905,12 @@ }, /obj/machinery/button/door/indestructible{ id = "XCCcustoms1"; - layer = 3.5; name = "CC Customs 1 Control"; pixel_x = 8; pixel_y = -24 }, /obj/machinery/button/door/indestructible{ id = "XCCcustoms2"; - layer = 3.5; name = "CC Customs 2 Control"; pixel_x = -8; pixel_y = -24 @@ -6450,8 +6443,7 @@ "CT" = ( /obj/structure/table/reinforced, /obj/structure/railing{ - dir = 8; - layer = 4.1 + dir = 8 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/dark{ @@ -7319,8 +7311,7 @@ /area/centcom/central_command_areas/control) "HZ" = ( /obj/structure/railing{ - dir = 6; - layer = 3.1 + dir = 6 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/dark{ @@ -7798,8 +7789,7 @@ /area/centcom/central_command_areas/evacuation) "Lz" = ( /obj/structure/railing{ - dir = 10; - layer = 3.1 + dir = 10 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/dark{ @@ -8931,8 +8921,7 @@ "QB" = ( /obj/structure/table/reinforced, /obj/structure/railing{ - dir = 4; - layer = 4.1 + dir = 4 }, /obj/effect/turf_decal/tile/neutral/fourcorners, /obj/effect/turf_decal/siding/dark{ @@ -10090,7 +10079,6 @@ }, /obj/machinery/button/door/indestructible{ id = "XCCcustoms1"; - layer = 3; name = "CC Emergency Docks Control"; pixel_x = 24; pixel_y = 24 diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index c7686749c5031..a7a40a07edf96 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -2957,7 +2957,6 @@ /area/station/security/checkpoint/engineering) "aoN" = ( /obj/machinery/elevator_control_panel{ - layer = 3.1; pixel_y = 2; linked_elevator_id = "tram_xeno_lift"; preset_destination_names = list("2"="Lower Deck", "3"="Upper Deck") @@ -3584,10 +3583,6 @@ }, /turf/open/floor/iron, /area/station/security/processing) -"avE" = ( -/obj/structure/lattice, -/turf/open/space/openspace, -/area/space/nearstation) "avG" = ( /obj/structure/chair{ dir = 1 @@ -3756,8 +3751,7 @@ /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 8 }, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, +/obj/structure/reagent_dispensers/fueltank, /turf/open/floor/iron, /area/station/cargo/drone_bay) "axC" = ( @@ -5740,6 +5734,7 @@ /area/station/medical/virology) "aQL" = ( /obj/machinery/airalarm/directional/south, +/obj/effect/spawner/random/structure/twelve_percent_spirit_board, /turf/open/floor/iron/grimy, /area/station/service/chapel/office) "aQM" = ( @@ -6454,12 +6449,6 @@ /obj/machinery/light/directional/north, /turf/open/floor/iron, /area/station/engineering/atmospherics_engine) -"bhf" = ( -/obj/effect/spawner/random/engineering/tracking_beacon, -/obj/effect/landmark/event_spawn, -/obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine, -/area/station/science/xenobiology) "bhr" = ( /turf/closed/wall/rock/porous, /area/station/security/prison/workout) @@ -6790,14 +6779,6 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/iron/dark, /area/station/command/bridge) -"bpl" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 1 - }, -/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, @@ -9191,14 +9172,14 @@ /turf/open/floor/iron/dark, /area/station/science/robotics/lab) "cdM" = ( -/obj/structure/table, -/obj/machinery/cell_charger{ - pixel_y = 5 +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + name = "Test Chamber Blast Door"; + id = "Xenolab" }, -/obj/item/stack/cable_coil, -/obj/item/multitool, -/obj/item/stock_parts/power_store/cell/high, -/turf/open/floor/engine, +/obj/structure/sign/warning/gas_mask/directional/north, +/turf/open/floor/plating, /area/station/science/xenobiology) "cdN" = ( /obj/machinery/button/ignition/incinerator/atmos, @@ -9709,6 +9690,14 @@ /obj/machinery/vending/modularpc, /turf/open/floor/iron/white, /area/station/science/lobby) +"coB" = ( +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/pipe_scrubber, +/turf/open/floor/iron, +/area/station/engineering/atmos) "coI" = ( /obj/machinery/door/airlock{ name = "Room 1"; @@ -10515,7 +10504,7 @@ /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, /obj/machinery/light/directional/north, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "cBo" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -18719,6 +18708,10 @@ /obj/item/radio/intercom/directional/north, /turf/open/floor/iron, /area/station/cargo/warehouse) +"fCy" = ( +/obj/machinery/light/small/directional/east, +/turf/open/floor/engine, +/area/station/science/xenobiology) "fCO" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -19401,6 +19394,13 @@ }, /turf/open/floor/iron/dark, /area/station/engineering/storage/tech) +"fPp" = ( +/obj/effect/turf_decal/box/red, +/obj/machinery/vatgrower{ + dir = 4 + }, +/turf/open/floor/engine, +/area/station/science/xenobiology) "fPv" = ( /obj/effect/turf_decal/delivery, /obj/machinery/door/window/left/directional/north{ @@ -21391,9 +21391,8 @@ /turf/open/floor/carpet, /area/station/commons/dorms) "gBr" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8; - piping_layer = 2 +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer2{ + dir = 8 }, /turf/open/floor/iron/dark, /area/station/science/ordnance) @@ -21644,13 +21643,6 @@ /obj/machinery/light/directional/east, /turf/open/floor/iron, /area/station/cargo/miningdock) -"gFm" = ( -/obj/machinery/light/small/directional/west, -/obj/machinery/plumbing/input{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "gFt" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, @@ -23797,13 +23789,6 @@ dir = 1 }, /area/station/hallway/secondary/service) -"hwQ" = ( -/obj/effect/turf_decal/box/red, -/obj/machinery/plumbing/growing_vat{ - dir = 4 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "hxL" = ( /obj/structure/transport/linear/public, /obj/effect/turf_decal/caution/stand_clear/red, @@ -23824,7 +23809,6 @@ /turf/open/floor/iron/dark/smooth_corner, /area/station/commons/fitness) "hze" = ( -/obj/structure/reagent_dispensers/fueltank, /obj/effect/turf_decal/trimline/brown/filled/line{ dir = 9 }, @@ -23832,6 +23816,8 @@ pixel_x = -22; pixel_y = -8 }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, /turf/open/floor/iron, /area/station/cargo/drone_bay) "hzk" = ( @@ -26226,6 +26212,10 @@ }, /turf/open/floor/wood/large, /area/station/service/library) +"iuV" = ( +/obj/machinery/light/small/directional/west, +/turf/open/floor/engine, +/area/station/science/xenobiology) "iva" = ( /obj/effect/turf_decal/trimline/dark_red/warning{ dir = 9 @@ -26408,7 +26398,7 @@ dir = 8 }, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "ixO" = ( /obj/structure/chair/comfy/brown{ dir = 8; @@ -32124,6 +32114,7 @@ }, /obj/effect/turf_decal/siding/thinplating, /obj/effect/landmark/event_spawn, +/obj/effect/spawner/random/engineering/tracking_beacon, /turf/open/floor/iron/dark, /area/station/science/xenobiology) "ksm" = ( @@ -32872,7 +32863,7 @@ dir = 1 }, /obj/structure/disposalpipe/trunk, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "kGA" = ( /obj/structure/railing, @@ -37178,7 +37169,7 @@ c_tag = "Secure - AI Lower External North" }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "mbk" = ( /obj/effect/turf_decal/sand, /obj/effect/turf_decal/trimline/red/filled/line{ @@ -38745,7 +38736,7 @@ /obj/machinery/sparker/directional/west{ id = "Xenobio" }, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "mFo" = ( /obj/effect/turf_decal/trimline/red/filled/line{ @@ -41461,6 +41452,10 @@ }, /obj/item/stock_parts/matter_bin, /obj/item/stock_parts/micro_laser, +/obj/item/multitool, +/obj/item/flatpack{ + board = /obj/item/circuitboard/machine/flatpacker + }, /turf/open/floor/iron/white, /area/station/science/lab) "nDX" = ( @@ -42278,13 +42273,6 @@ /obj/structure/fluff/tram_rail/electric, /turf/open/openspace, /area/station/hallway/primary/tram/center) -"nSR" = ( -/obj/machinery/light/small/directional/east, -/obj/machinery/plumbing/input{ - dir = 8 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "nSV" = ( /obj/effect/turf_decal/trimline/red/filled/corner{ dir = 1 @@ -47097,10 +47085,6 @@ /obj/machinery/light/floor, /turf/open/floor/grass, /area/station/science/lower) -"pHM" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "pHX" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 1 @@ -48262,12 +48246,6 @@ /obj/structure/sign/calendar/directional/east, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/ce) -"qcE" = ( -/obj/machinery/camera/directional/north{ - c_tag = "Civilian - Restroom North" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "qcG" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/iron/smooth, @@ -50760,26 +50738,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron, /area/station/hallway/primary/tram/left) -"qVL" = ( -/obj/structure/table, -/obj/item/assembly/igniter{ - pixel_x = -5; - pixel_y = 3 - }, -/obj/item/assembly/igniter{ - pixel_x = 5; - pixel_y = -4 - }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = 6 - }, -/obj/item/assembly/igniter{ - pixel_x = 2; - pixel_y = -1 - }, -/turf/open/floor/engine, -/area/station/science/xenobiology) "qVN" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -53758,7 +53716,7 @@ /area/station/medical/storage) "rYE" = ( /turf/open/floor/plating/airless, -/area/space) +/area/space/nearstation) "rYL" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -54282,7 +54240,7 @@ dir = 5 }, /turf/open/floor/iron/airless, -/area/space) +/area/space/nearstation) "siZ" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -57759,7 +57717,7 @@ /area/station/command/heads_quarters/captain/private) "ttj" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/dark/visible, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "tto" = ( /obj/machinery/hydroponics/constructable, @@ -57804,6 +57762,7 @@ /obj/structure/closet/crate/preopen, /obj/item/stock_parts/power_store/cell/empty, /obj/effect/spawner/random/engineering/flashlight, +/obj/structure/sign/departments/exodrone/directional/east, /turf/open/floor/iron, /area/station/cargo/warehouse) "tuf" = ( @@ -58221,12 +58180,7 @@ /turf/open/floor/iron/white, /area/station/science/xenobiology) "tBo" = ( -/obj/structure/table, -/obj/item/stack/sheet/iron{ - amount = 10 - }, -/obj/item/electropack, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "tBu" = ( /obj/effect/decal/cleanable/dirt, @@ -58291,9 +58245,6 @@ }, /turf/open/floor/iron, /area/station/cargo/storage) -"tCf" = ( -/turf/open/misc/asteroid/airless, -/area/space) "tCi" = ( /turf/open/floor/iron/dark, /area/station/service/chapel/monastery) @@ -58394,7 +58345,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 4 }, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "tED" = ( /obj/effect/turf_decal/tile/neutral/tram, @@ -66490,6 +66441,10 @@ }, /turf/open/floor/iron/cafeteria, /area/station/commons/dorms/laundry) +"wrn" = ( +/obj/machinery/portable_atmospherics/pipe_scrubber, +/turf/open/floor/iron/dark, +/area/station/science/ordnance/storage) "wru" = ( /obj/effect/turf_decal/trimline/neutral/filled/line{ dir = 1 @@ -66516,8 +66471,7 @@ /area/station/science/explab) "wrJ" = ( /obj/structure/railing{ - dir = 4; - layer = 3.1 + dir = 4 }, /obj/machinery/netpod, /turf/open/floor/catwalk_floor/iron_dark, @@ -67472,7 +67426,7 @@ "wIP" = ( /obj/structure/lattice, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "wIT" = ( /obj/structure/chair/wood, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, @@ -68402,10 +68356,6 @@ /obj/structure/railing, /turf/open/floor/iron, /area/station/cargo/miningfoundry) -"xdw" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/iron/dark, -/area/station/science/ordnance/storage) "xdx" = ( /obj/effect/turf_decal/stripes/line{ dir = 6 @@ -69281,12 +69231,6 @@ }, /turf/open/floor/iron/white, /area/station/medical/medbay/central) -"xut" = ( -/obj/machinery/camera/directional/south{ - c_tag = "Civilian - Restroom South" - }, -/turf/open/floor/iron/freezer, -/area/station/commons/toilet) "xuA" = ( /obj/structure/closet/secure_closet/medical2, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -69614,7 +69558,6 @@ /area/station/cargo/storage) "xAM" = ( /obj/machinery/elevator_control_panel{ - layer = 3.1; pixel_y = 2; linked_elevator_id = "tram_xeno_lift"; preset_destination_names = list("2"="Lower Deck", "3"="Upper Deck") @@ -70431,7 +70374,7 @@ "xRm" = ( /obj/structure/lattice, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "xRn" = ( /turf/open/floor/plating, /area/station/hallway/secondary/service) @@ -85064,12 +85007,12 @@ apC apC veV veV -qcE +hAD hAD veV pdr kMD -xut +hAD veV veV apC @@ -87662,10 +87605,10 @@ jcT jcT ncE aek -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm fYW vXM vXM @@ -89462,10 +89405,10 @@ ncE jcT jcT aek -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm fYW vXM vXM @@ -92290,10 +92233,10 @@ jcT jcT ncE aek -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm fYW fYW fYW @@ -92550,7 +92493,7 @@ aac aac aac vXM -pHM +xRm vXM vXM vXM @@ -92560,7 +92503,7 @@ vXM vXM vXM vXM -pHM +xRm fYW fYW fYW @@ -92807,7 +92750,7 @@ aac aac aac vXM -pHM +xRm vXM vXM vXM @@ -92817,14 +92760,14 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM vXM vXM vXM -pHM +xRm vXM fYW vXM @@ -93064,9 +93007,9 @@ jcT jcT aac aek -pHM -pHM -pHM +xRm +xRm +xRm rWa vXM vXM @@ -93074,14 +93017,14 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -93325,12 +93268,12 @@ vXM rWa vXM qdd -pHM -pHM +xRm +xRm rWa -pHM -pHM -pHM +xRm +xRm +xRm rWa vXM vXM @@ -93338,7 +93281,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -93589,17 +93532,17 @@ vXM rWa vXM qdd -pHM -pHM +xRm +xRm rWa -pHM -pHM -pHM +xRm +xRm +xRm rWa -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm fYW vXM vXM @@ -94606,12 +94549,12 @@ ncE ncE aac aek -pHM -pHM -pHM +xRm +xRm +xRm rWa -pHM -pHM +xRm +xRm qdd vXM rWa @@ -94866,16 +94809,16 @@ aac aac vXM vXM -pHM +xRm vXM vXM rWa -pHM -pHM -pHM +xRm +xRm +xRm rWa -pHM -pHM +xRm +xRm qdd vXM rWa @@ -95123,25 +95066,25 @@ aac aac aac aac -pHM +xRm vXM vXM vXM vXM vXM vXM -pHM +xRm vXM vXM rWa -pHM -pHM -pHM +xRm +xRm +xRm rWa -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm fYW vXM vXM @@ -95387,14 +95330,14 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -95651,7 +95594,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -95908,7 +95851,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -96165,7 +96108,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -97942,9 +97885,9 @@ aak aak aak aak -pHM -pHM -pHM +xRm +xRm +xRm aak aak aak @@ -98976,7 +98919,7 @@ aeL aeL aeL aeJ -pHM +xRm aak aaN igy @@ -99223,7 +99166,7 @@ vOU ney vNH aen -pHM +xRm aey aey aey @@ -99233,7 +99176,7 @@ aeL aeL aeL aeH -pHM +xRm aak aak amq @@ -99480,7 +99423,7 @@ dnE ney vNH aak -pHM +xRm aey aey aey @@ -99490,7 +99433,7 @@ aeL aeL aeL aeJ -pHM +xRm aak aaN igy @@ -99747,7 +99690,7 @@ aeL aeL aeL aeH -pHM +xRm aak aaa aaa @@ -100004,7 +99947,7 @@ aeL aeL aeL aeJ -pHM +xRm aak aaa aaa @@ -100138,19 +100081,19 @@ vXM vXM vXM cAd -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm aai aac aac @@ -101683,19 +101626,19 @@ vXM vXM vXM cAd -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm aai aac aac @@ -104101,7 +104044,7 @@ sHH sHH hZr hZr -bpl +coB mRs jaW mAx @@ -104112,7 +104055,7 @@ kgg eEp hzQ qHs -pHM +xRm aeV aeV prq @@ -104358,7 +104301,7 @@ rvh jUz ivk hZr -bpl +coB mRs woR mAx @@ -105135,7 +105078,7 @@ mfB qga exl oNq -pHM +xRm ahD fKg hVy @@ -107191,7 +107134,7 @@ ssw fja cPD oNq -pHM +xRm ahD gMi hNI @@ -107346,9 +107289,9 @@ vXM vXM vXM fYW -pHM -pHM -pHM +xRm +xRm +xRm aac aam hlS @@ -107460,8 +107403,8 @@ aaa aaa aac aai -pHM -pHM +xRm +xRm rge vXM vXM @@ -107705,7 +107648,7 @@ wIY pKo vaK hZr -pHM +xRm fjQ fjQ fjQ @@ -107962,7 +107905,7 @@ hZr hZr lCk hZr -pHM +xRm hZr vXM mQi @@ -108199,19 +108142,19 @@ aaa abM abM wQP -pHM +xRm oFH -pHM +xRm bWv -pHM +xRm oFH -pHM +xRm bWv -pHM +xRm oFH -pHM +xRm bWv -pHM +xRm oFH nYX jUW @@ -108219,7 +108162,7 @@ mHw orh uxn oNq -pHM +xRm hZr aaa oEf @@ -108229,8 +108172,8 @@ aac aac vXM vXM -pHM -pHM +xRm +xRm rge vXM vXM @@ -108997,8 +108940,8 @@ hYn aac aac vXM -pHM -pHM +xRm +xRm rge vXM vXM @@ -109403,9 +109346,9 @@ vXM vXM vXM fYW -pHM -pHM -pHM +xRm +xRm +xRm aac aam hlS @@ -110939,12 +110882,12 @@ vXM fYW vXM vXM -pHM +xRm vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -111196,12 +111139,12 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM vXM -pHM +xRm vXM vXM aac @@ -111453,12 +111396,12 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM vXM -pHM +xRm vXM vXM aac @@ -111706,18 +111649,18 @@ vXM vXM vXM fYW -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm bwp -pHM -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm +xRm bwp -pHM +xRm aai aac aac @@ -113248,20 +113191,20 @@ vXM vXM vXM fYW -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm bwp -pHM -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm +xRm bwp -pHM -pHM -pHM +xRm +xRm +xRm aai hlS hlS @@ -113509,14 +113452,14 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM vXM vXM vXM -pHM +xRm vXM vXM aac @@ -113766,14 +113709,14 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM vXM vXM vXM -pHM +xRm vXM vXM aac @@ -114023,14 +113966,14 @@ vXM fYW vXM vXM -pHM +xRm vXM vXM vXM vXM vXM vXM -pHM +xRm vXM vXM aac @@ -115573,9 +115516,9 @@ vXM vXM vXM fYW -pHM -pHM -pHM +xRm +xRm +xRm aac aac aam @@ -117630,9 +117573,9 @@ vXM vXM vXM fYW -pHM -pHM -pHM +xRm +xRm +xRm aac aac aac @@ -117762,7 +117705,7 @@ vXM rxw rxw vXM -pHM +xRm vXM vXM vXM @@ -117773,7 +117716,7 @@ vXM vXM vXM vXM -pHM +xRm vXM rxw rxw @@ -118019,7 +117962,7 @@ rxw rxw vXM vXM -pHM +xRm oqp oqp oqp @@ -118030,7 +117973,7 @@ oqp oqp oqp oqp -pHM +xRm vXM vXM rxw @@ -118528,7 +118471,7 @@ vXM vXM vXM vXM -pHM +xRm vXM oqp oqp @@ -118805,7 +118748,7 @@ mYt oqp oqp oqp -pHM +xRm rxw vXM vXM @@ -119537,22 +119480,22 @@ aaa aaa aaa aaa -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm xvl xvl xvl @@ -120048,25 +119991,25 @@ vwd pRm pRm pRm -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm dBj wXI jqs @@ -120498,8 +120441,8 @@ aac aac aac aai -pHM -pHM +xRm +xRm vle aaS aaa @@ -120562,25 +120505,25 @@ aGY pRm pRm pRm -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm dBj fMK fMK @@ -121074,27 +121017,27 @@ hJl iix iix iix -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm +xRm xvl xvl xvl @@ -121889,7 +121832,7 @@ mYt oqp oqp oqp -pHM +xRm rxw vXM vXM @@ -122075,7 +122018,7 @@ dfz mpd lEt glc -pHM +xRm pAT cHH bNp @@ -122126,7 +122069,7 @@ vXM vXM vXM vXM -pHM +xRm vXM oqp oqp @@ -122332,7 +122275,7 @@ dfz txW iMt glc -pHM +xRm hkN gIj loa @@ -122645,7 +122588,7 @@ rxw rxw vXM vXM -pHM +xRm oqp oqp oqp @@ -122656,7 +122599,7 @@ oqp oqp oqp oqp -pHM +xRm vXM vXM rxw @@ -122848,7 +122791,7 @@ aaa aaa aaa dfz -xdw +wrn ure bKT bqU @@ -122902,7 +122845,7 @@ vXM rxw rxw vXM -pHM +xRm vXM vXM vXM @@ -122913,7 +122856,7 @@ vXM vXM vXM vXM -pHM +xRm vXM rxw rxw @@ -123067,11 +123010,11 @@ aaP aaQ aac aaS -pHM -pHM -pHM -pHM -pHM +xRm +xRm +xRm +xRm +xRm aaS aaa aaa @@ -123320,7 +123263,7 @@ vXM vXM vXM vXM -pHM +xRm aaH aac aac @@ -123569,7 +123512,7 @@ aaa aaa aaa aaH -pHM +xRm vXM vXM vXM @@ -123577,7 +123520,7 @@ vXM vXM vXM vXM -pHM +xRm aaH aac aac @@ -123826,7 +123769,7 @@ aaa aaa aaa aaI -pHM +xRm vXM vXM vXM @@ -123834,7 +123777,7 @@ vXM vXM vXM vXM -pHM +xRm aaI aac aac @@ -124083,7 +124026,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -124091,7 +124034,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM aac @@ -124340,7 +124283,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -124348,7 +124291,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM aac @@ -124597,7 +124540,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -124605,7 +124548,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -124854,7 +124797,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -124862,7 +124805,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -125111,7 +125054,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -125119,7 +125062,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -125368,7 +125311,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -125376,7 +125319,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -125419,9 +125362,9 @@ aac aac aac aac -pHM +xRm vXM -pHM +xRm aac aac vXM @@ -125625,7 +125568,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -125633,7 +125576,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -125676,9 +125619,9 @@ vXM aac aac aac -pHM +xRm vXM -pHM +xRm aac aac vXM @@ -125882,7 +125825,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -125890,7 +125833,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -125933,9 +125876,9 @@ vXM vXM aac vXM -pHM +xRm vXM -pHM +xRm aac vXM vXM @@ -126139,7 +126082,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -126147,7 +126090,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -126190,9 +126133,9 @@ vXM vXM vXM vXM -pHM -pHM -pHM +xRm +xRm +xRm vXM vXM vXM @@ -126396,7 +126339,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -126404,7 +126347,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -126447,9 +126390,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -126653,7 +126596,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -126661,7 +126604,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -126704,9 +126647,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -126910,7 +126853,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -126918,7 +126861,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -126961,9 +126904,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -127167,7 +127110,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -127175,7 +127118,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -127218,9 +127161,9 @@ vXM vXM vXM vXM -pHM -pHM -pHM +xRm +xRm +xRm vXM vXM vXM @@ -127424,7 +127367,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -127432,7 +127375,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -127475,9 +127418,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -127681,7 +127624,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -127689,7 +127632,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -127732,9 +127675,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -127938,7 +127881,7 @@ vXM vXM vXM vXM -pHM +xRm vXM vXM vXM @@ -127989,9 +127932,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -128246,9 +128189,9 @@ vXM vXM vXM vXM -pHM -pHM -pHM +xRm +xRm +xRm vXM vXM vXM @@ -128503,9 +128446,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM fjj vXM @@ -128760,9 +128703,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -129017,9 +128960,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -129274,9 +129217,9 @@ vXM vXM vXM vXM -pHM -pHM -pHM +xRm +xRm +xRm vXM vXM vXM @@ -129531,9 +129474,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -129788,9 +129731,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -130045,9 +129988,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -130302,9 +130245,9 @@ vXM vXM vXM vXM -pHM -pHM -pHM +xRm +xRm +xRm vXM vXM vXM @@ -130559,9 +130502,9 @@ vXM vXM vXM vXM -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -130816,9 +130759,9 @@ vXM aaa aaa aaa -pHM +xRm vXM -pHM +xRm vXM vXM vXM @@ -131073,9 +131016,9 @@ aaa aaa aaa aaa -pHM +xRm vXM -pHM +xRm vXM vXM aaa @@ -139256,7 +139199,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -139513,7 +139456,7 @@ pMW pMW cAd pMW -avE +wIP pMW pMW pMW @@ -139533,7 +139476,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -139768,9 +139711,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -139790,7 +139733,7 @@ pMW pMW pMW pMW -avE +wIP pMW cAd pMW @@ -140025,9 +139968,9 @@ pMW pMW pMW pMW -avE -avE -avE +wIP +wIP +wIP pMW pMW pMW @@ -140047,9 +139990,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -140284,7 +140227,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -140304,9 +140247,9 @@ pMW pMW pMW pMW -avE -avE -avE +wIP +wIP +wIP pMW pMW pMW @@ -140541,7 +140484,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -140561,7 +140504,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -140798,7 +140741,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -140818,7 +140761,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -141055,7 +140998,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -141075,7 +141018,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -141826,7 +141769,7 @@ pMW pMW pMW pMW -pHM +xRm pMW pMW pMW @@ -141846,7 +141789,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -142083,7 +142026,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -142103,7 +142046,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -142854,8 +142797,8 @@ pMW pMW pMW pMW -avE -avE +wIP +wIP rOy rOy oKl @@ -142873,8 +142816,8 @@ pMW oKl rOy rOy -avE -avE +wIP +wIP pMW pMW pMW @@ -143115,7 +143058,7 @@ oKl pMW pMW pMW -avE +wIP pMW pMW pMW @@ -143127,7 +143070,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -143629,7 +143572,7 @@ oKl pMW pMW pMW -avE +wIP pMW pMW pMW @@ -143641,7 +143584,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -143882,8 +143825,8 @@ pMW pMW pMW pMW -avE -pHM +wIP +xRm rOy rOy rOy @@ -143901,8 +143844,8 @@ oKl rOy rOy rOy -pHM -avE +xRm +wIP pMW pMW pMW @@ -143913,7 +143856,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -144170,7 +144113,7 @@ pMW oKl rOy rOy -pHM +xRm rOy rOy pMW @@ -144401,7 +144344,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -144411,7 +144354,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -144424,12 +144367,12 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -144653,12 +144596,12 @@ pMW pMW pMW pMW -avE +wIP tPE tPE tPE tPE -avE +wIP pMW pMW pMW @@ -144668,12 +144611,12 @@ pMW pMW pMW pMW -avE +wIP tPE tPE tPE tPE -avE +wIP pMW pMW pMW @@ -144681,12 +144624,12 @@ pMW pMW pMW pMW -avE +wIP tPE tPE tPE tPE -avE +wIP pMW pMW pMW @@ -144910,7 +144853,7 @@ oKl oKl oKl oKl -avE +wIP tPE qnv tld @@ -144930,7 +144873,7 @@ nmY cPH dfL nmY -avE +wIP pMW pMW pMW @@ -144938,7 +144881,7 @@ pMW pMW pMW pMW -avE +wIP nmY hng xnH @@ -145162,7 +145105,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -145419,7 +145362,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -153448,10 +153391,10 @@ jFJ aHp qgS jFJ -avE -avE -avE -avE +wIP +wIP +wIP +wIP pMW pMW pMW @@ -153962,10 +153905,10 @@ jYe gnr bIJ jFJ -avE -avE -avE -avE +wIP +wIP +wIP +wIP pMW pMW pMW @@ -156789,8 +156732,8 @@ vCZ wAA vCZ vCZ -avE -avE +wIP +wIP esT mAG tMW @@ -156798,9 +156741,9 @@ byH tMW tMW esT -avE -avE -avE +wIP +wIP +wIP kFx pMW pMW @@ -157817,8 +157760,8 @@ aaa aaa aaa aai -avE -avE +wIP +wIP esT tMW tMW @@ -157826,10 +157769,10 @@ sOg mAG mAG esT -avE -avE -avE -avE +wIP +wIP +wIP +wIP kFx kFx kFx @@ -158086,7 +158029,7 @@ sdb pMW pMW pMW -avE +wIP pMW pMW pMW @@ -158096,7 +158039,7 @@ pMW pMW pMW pMW -avE +wIP kFx kFx kFx @@ -158343,7 +158286,7 @@ sdb pMW pMW pMW -avE +wIP pMW pMW pMW @@ -158353,14 +158296,14 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW pMW pMW pMW -avE +wIP pMW kFx pMW @@ -158610,14 +158553,14 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -158874,7 +158817,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -159132,10 +159075,10 @@ sdb sdb sdb esT -avE -avE -avE -avE +wIP +wIP +wIP +wIP kFx pMW pMW @@ -160674,10 +160617,10 @@ sdb sdb sdb esT -avE -avE -avE -avE +wIP +wIP +wIP +wIP kFx pMW pMW @@ -160930,7 +160873,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -161187,7 +161130,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -161444,7 +161387,7 @@ pMW pMW pMW pMW -avE +wIP pMW kFx pMW @@ -172882,10 +172825,10 @@ pMW pMW pMW kFx -avE -avE -avE -avE +wIP +wIP +wIP +wIP aTY iCA fZL @@ -174939,10 +174882,10 @@ pMW pMW pMW kFx -avE -avE -avE -avE +wIP +wIP +wIP +wIP aTY iCA iCA @@ -176475,12 +176418,12 @@ pMW kFx pMW pMW -avE +wIP pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -176732,12 +176675,12 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -176989,12 +176932,12 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -177242,10 +177185,10 @@ pMW pMW pMW kFx -avE -avE -avE -avE +wIP +wIP +wIP +wIP aTY uRv uRv @@ -178784,10 +178727,10 @@ pMW pMW pMW kFx -avE -avE -avE -avE +wIP +wIP +wIP +wIP aTY uRv uRv @@ -179045,14 +178988,14 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -179302,14 +179245,14 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -179559,14 +179502,14 @@ pMW kFx pMW pMW -avE +wIP pMW pMW pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -180947,8 +180890,8 @@ aaa aaa aaa qVr -gFm -hwQ +iuV +fPp soq abM abM @@ -181109,11 +181052,11 @@ pMW pMW pMW kFx -avE -avE -avE -avE -avE +wIP +wIP +wIP +wIP +wIP aTY iCA iCA @@ -181970,8 +181913,8 @@ umu qVr qVr mFh -bfH -bfH +tBo +tBo qVr gYw cHY @@ -182226,11 +182169,11 @@ mAL nKU qVr tEx -bfH -bfH -bfH +tBo +tBo +tBo qVr -pNa +cdM eiy itq qyQ @@ -182483,10 +182426,10 @@ bmz pIx qVr ttj -bfH -bfH -bfH -bfH +tBo +tBo +tBo +tBo pNa qNk xmY @@ -182741,7 +182684,7 @@ pHX qVr cAK ttj -bhf +ttj ttj ttj nzg @@ -182996,10 +182939,10 @@ pbH kBo kJA qVr -bfH -bfH -bfH -bfH +tBo +tBo +tBo +tBo kGv qSS cFQ @@ -183166,12 +183109,12 @@ pMW pMW pMW kFx -avE -avE -avE -avE -avE -avE +wIP +wIP +wIP +wIP +wIP +wIP aTY iCA fZL @@ -183253,10 +183196,10 @@ pbH mAL nKU qVr -bfH -bfH -bfH -bfH +tBo +tBo +tBo +tBo qVr jqK ijR @@ -183300,14 +183243,14 @@ rxw rxw pMW pMW -avE +wIP pMW pMW pMW bGh pMW pMW -avE +wIP pMW pMW rxw @@ -183511,8 +183454,8 @@ vSa cJR qVr qVr -cdM -qVL +tBo +tBo tBo qVr gYw @@ -183809,7 +183752,7 @@ pMW pMW pMW pMW -avE +wIP pMW gFf gFf @@ -184341,7 +184284,7 @@ oMI gFf gFf gFf -avE +wIP rxw pMW pMW @@ -184545,8 +184488,8 @@ aaa aaa aaa qVr -nSR -hwQ +fCy +fPp qVr aaa aaa @@ -185072,23 +185015,23 @@ aaa aaa aaa aaS -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP vUu vUu lwj @@ -185331,7 +185274,7 @@ aaa pMW pMW pMW -avE +wIP pMW pMW pMW @@ -185341,7 +185284,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -185588,7 +185531,7 @@ aaa pMW pMW pMW -avE +wIP pMW pMW pMW @@ -185598,7 +185541,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -185842,24 +185785,24 @@ aaa aaa aaa aaS -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP xSS lwj tqN @@ -186107,7 +186050,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -186364,7 +186307,7 @@ pMW pMW pMW pMW -avE +wIP pMW pMW pMW @@ -186609,28 +186552,28 @@ aac aaa aaa aaS -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE -avE +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP +wIP vUu vUu lwj @@ -187425,7 +187368,7 @@ oMI gFf gFf gFf -avE +wIP rxw pMW pMW @@ -187921,7 +187864,7 @@ pMW pMW pMW pMW -avE +wIP pMW gFf gFf @@ -188440,14 +188383,14 @@ rxw rxw pMW pMW -avE +wIP pMW pMW pMW ylt pMW pMW -avE +wIP pMW pMW rxw @@ -190956,7 +190899,7 @@ pMW pMW pMW iLP -tCf +aac iLP pMW pMW @@ -191212,9 +191155,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -191469,9 +191412,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -191726,9 +191669,9 @@ pMW pMW pMW pMW -avE -avE -avE +wIP +wIP +wIP pMW pMW pMW @@ -191983,9 +191926,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -192240,9 +192183,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -192497,9 +192440,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -192754,9 +192697,9 @@ pMW pMW pMW pMW -avE -avE -avE +wIP +wIP +wIP pMW pMW pMW @@ -193011,9 +192954,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -193268,9 +193211,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -193525,9 +193468,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -193782,9 +193725,9 @@ pMW pMW pMW pMW -avE -avE -avE +wIP +wIP +wIP pMW pMW pMW @@ -194039,9 +193982,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -194296,9 +194239,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -194553,9 +194496,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW pMW @@ -194810,9 +194753,9 @@ pMW pMW pMW pMW -avE -avE -avE +wIP +wIP +wIP pMW pMW pMW @@ -195067,9 +195010,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP pMW pMW aaa @@ -195324,9 +195267,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP aac aaa aac @@ -195581,9 +195524,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP aac aac aac @@ -195838,9 +195781,9 @@ pMW pMW pMW pMW -avE -avE -avE +wIP +wIP +wIP aac aac aac @@ -196095,9 +196038,9 @@ pMW pMW pMW pMW -avE +wIP pMW -avE +wIP aac aac aaa @@ -196352,9 +196295,9 @@ pMW aac aac aac -avE +wIP pMW -avE +wIP aaa aaa aaa @@ -196609,9 +196552,9 @@ aac aac aac aac -avE +wIP pMW -avE +wIP aaa aaa aaa diff --git a/_maps/map_files/wawastation/wawastation.dmm b/_maps/map_files/wawastation/wawastation.dmm index 8f3fb14e377c7..d9ee5460f5bda 100644 --- a/_maps/map_files/wawastation/wawastation.dmm +++ b/_maps/map_files/wawastation/wawastation.dmm @@ -2042,7 +2042,7 @@ dir = 8 }, /turf/open/floor/plating/airless, -/area/space) +/area/space/nearstation) "aIc" = ( /obj/structure/table, /obj/effect/spawner/random/bureaucracy/paper, @@ -2256,7 +2256,6 @@ "aKU" = ( /obj/effect/landmark/start/ai/secondary, /obj/machinery/door/window/brigdoor/left/directional/north{ - layer = 4.1; name = "Tertiary AI Core Access"; req_access = list("ai_upload"); pixel_y = 3 @@ -3330,7 +3329,7 @@ /obj/effect/decal/cleanable/blood/footprints{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "bga" = ( /obj/structure/chair/wood{ @@ -3739,7 +3738,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/door/airlock/maintenance, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/abandoned, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, @@ -3763,6 +3761,10 @@ }, /turf/open/floor/iron, /area/station/security/interrogation) +"bqs" = ( +/obj/structure/lattice/catwalk, +/turf/open/openspace/xenobio, +/area/station/science/xenobiology) "bqz" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/components/unary/portables_connector/visible/layer2, @@ -4114,10 +4116,6 @@ /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/station/security/detectives_office/private_investigators_office) -"bwC" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "bwQ" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -4448,9 +4446,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/white/textured_corner{ - dir = 4 - }, +/turf/open/openspace/xenobio, /area/station/science/xenobiology) "bBX" = ( /obj/structure/window/spawner/directional/north, @@ -4948,6 +4944,10 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron/white/textured_large, /area/station/science/xenobiology) +"bLJ" = ( +/obj/structure/cable, +/turf/open/openspace/xenobio, +/area/station/science/xenobiology) "bLS" = ( /obj/effect/turf_decal/stripes/box, /obj/structure/cable/multilayer/multiz, @@ -5696,7 +5696,6 @@ /turf/open/floor/iron/white, /area/station/science/lobby) "caH" = ( -/obj/effect/turf_decal/sand/plating, /obj/structure/sign/warning/directional/west, /turf/closed/wall/rust, /area/station/medical/chemistry/minisat) @@ -6609,8 +6608,20 @@ "ctf" = ( /obj/effect/mapping_helpers/broken_floor, /obj/effect/decal/cleanable/dirt/dust, -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, +/obj/structure/table, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = 16; + pixel_y = 1 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = 8; + pixel_y = 10 + }, +/obj/structure/sign/poster/contraband/random/directional/north, /turf/open/floor/iron/white, /area/station/maintenance/department/medical) "cti" = ( @@ -6786,7 +6797,7 @@ /area/station/maintenance/central/lesser) "cxg" = ( /turf/open/misc/asteroid/airless, -/area/space) +/area/space/nearstation) "cxr" = ( /obj/structure/cable, /obj/machinery/power/apc/auto_name/directional/east, @@ -7429,7 +7440,7 @@ "cKD" = ( /mob/living/basic/mining/basilisk, /turf/open/misc/asteroid/airless, -/area/space) +/area/space/nearstation) "cLd" = ( /obj/machinery/oven/range, /obj/machinery/light/directional/north, @@ -8431,9 +8442,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 }, -/turf/open/floor/iron/white/smooth_half{ - dir = 8 - }, +/turf/open/openspace/xenobio, /area/station/science/xenobiology) "dcl" = ( /obj/effect/turf_decal/sand/plating, @@ -8810,7 +8819,7 @@ /area/station/hallway/secondary/entry) "dir" = ( /obj/machinery/door/airlock/research/glass{ - name = "Chemistry Lab" + name = "Chemistry Minisat" }, /obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, /obj/structure/cable, @@ -10108,9 +10117,7 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) "dCv" = ( -/obj/structure/railing{ - layer = 3.01 - }, +/obj/structure/railing, /obj/structure/dresser, /obj/machinery/light_switch/directional/west, /turf/open/floor/carpet/red, @@ -10515,10 +10522,9 @@ /turf/open/floor/iron/dark, /area/station/security/execution/education) "dJM" = ( -/obj/structure/table/optable, /obj/item/radio/intercom/directional/east, /obj/effect/decal/cleanable/blood/old, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "dKp" = ( /obj/structure/lattice/catwalk, @@ -10583,7 +10589,7 @@ "dLY" = ( /obj/structure/broken_flooring/singular/directional/east, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "dMa" = ( /obj/structure/chair/office, /obj/effect/turf_decal/tile/brown/fourcorners, @@ -10751,9 +10757,8 @@ /turf/open/floor/iron/dark, /area/station/security/checkpoint/medical) "dPh" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 1; - piping_layer = 2 +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer2{ + dir = 1 }, /obj/effect/turf_decal/box/red, /obj/machinery/light/directional/south, @@ -11086,7 +11091,7 @@ "dUc" = ( /obj/structure/lattice, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "dUi" = ( /turf/closed/wall/r_wall, /area/station/engineering/lobby) @@ -11250,12 +11255,6 @@ }, /turf/open/floor/iron/dark, /area/station/security/lockers) -"dXh" = ( -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/turf/closed/wall, -/area/station/cargo/storage) "dXN" = ( /obj/machinery/door/airlock/research{ name = "Robotics Lab Storage" @@ -11525,7 +11524,7 @@ "ebN" = ( /obj/structure/broken_flooring/pile/directional/east, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "ebP" = ( /obj/machinery/power/apc/auto_name/directional/west, /obj/effect/mapping_helpers/apc/cell_5k, @@ -12674,6 +12673,8 @@ /obj/structure/cable, /obj/effect/turf_decal/sand/plating, /obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, /turf/open/floor/plating, /area/station/asteroid) "exT" = ( @@ -13164,12 +13165,10 @@ /turf/open/floor/iron/textured, /area/station/security/processing) "eFJ" = ( -/obj/structure/table, -/obj/item/biopsy_tool, /obj/machinery/sparker/directional/north{ id = "Xenobio" }, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "eFK" = ( /obj/structure/cable, @@ -13292,8 +13291,7 @@ /area/station/engineering/supermatter/room) "eIo" = ( /obj/structure/statue/sandstone/venus{ - dir = 1; - layer = 3.3 + dir = 1 }, /turf/open/floor/grass, /area/station/science/research) @@ -14485,9 +14483,7 @@ /area/station/construction/mining/aux_base) "fjb" = ( /obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/engine, /area/station/science/xenobiology) "fjg" = ( @@ -14596,7 +14592,7 @@ dir = 8 }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "flH" = ( /obj/structure/closet/boxinggloves, /obj/effect/landmark/start/hangover/closet, @@ -15057,7 +15053,7 @@ /obj/effect/decal/cleanable/blood/old{ icon_state = "gib3-old" }, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "fsZ" = ( /obj/machinery/door/window/brigdoor/left/directional/south{ @@ -15166,6 +15162,13 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/white, /area/station/science/ordnance/storage) +"fuZ" = ( +/obj/effect/turf_decal/trimline/green/filled/line{ + dir = 4 + }, +/obj/machinery/firealarm/directional/east, +/turf/open/floor/iron/white, +/area/station/hallway/secondary/entry) "fvd" = ( /obj/machinery/duct, /obj/effect/turf_decal/tile/dark_green/opposingcorners, @@ -16287,6 +16290,10 @@ /obj/effect/landmark/carpspawn, /turf/open/space/openspace, /area/space) +"fOe" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space/openspace, +/area/space/nearstation) "fOi" = ( /obj/effect/turf_decal/stripes{ dir = 8 @@ -17667,8 +17674,13 @@ /turf/open/floor/iron/dark, /area/station/security/mechbay) "gmm" = ( -/obj/structure/table, -/obj/item/storage/box/monkeycubes, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "Xenolab"; + name = "Test Chamber Blast Door" + }, +/obj/structure/sign/warning/gas_mask/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) "gms" = ( @@ -17947,14 +17959,12 @@ }, /obj/machinery/button/door/directional/west{ id = "QMLoaddoor"; - layer = 4; name = "Loading Doors"; pixel_y = -8; req_access = list("cargo") }, /obj/machinery/button/door/directional/west{ id = "QMLoaddoor2"; - layer = 4; name = "Loading Doors"; pixel_y = 8; req_access = list("cargo") @@ -21447,10 +21457,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron, /area/station/hallway/secondary/exit/departure_lounge) -"hCu" = ( -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating/airless, -/area/space) "hCv" = ( /obj/machinery/mech_bay_recharge_port{ dir = 2 @@ -21631,7 +21637,7 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/on{ dir = 8 }, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "hFO" = ( /obj/machinery/power/apc/auto_name/directional/north, @@ -22402,9 +22408,7 @@ /obj/item/reagent_containers/cup/beaker{ pixel_x = 5 }, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /turf/open/floor/iron/kitchen, /area/station/service/kitchen) "hUm" = ( @@ -22971,7 +22975,7 @@ /area/station/engineering/lobby) "ifd" = ( /turf/open/floor/engine/airless, -/area/space) +/area/space/nearstation) "ifj" = ( /turf/open/floor/circuit/red, /area/station/ai_monitored/turret_protected/ai_upload) @@ -23413,7 +23417,7 @@ dir = 1 }, /obj/item/storage/box/monkeycubes, -/turf/open/floor/iron/white/textured_half, +/turf/open/openspace/xenobio, /area/station/science/xenobiology) "ioL" = ( /obj/item/radio/intercom/directional/east, @@ -23455,7 +23459,6 @@ "ipq" = ( /obj/structure/table, /obj/item/reagent_containers/condiment/saltshaker{ - layer = 3.1; pixel_x = -2; pixel_y = 2 }, @@ -23574,7 +23577,6 @@ "irf" = ( /obj/structure/ladder, /obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9; pixel_x = 3 }, /obj/machinery/door/window/brigdoor/left/directional/south{ @@ -24492,7 +24494,6 @@ /area/station/commons/storage/tools) "iII" = ( /obj/machinery/shower/directional/east, -/obj/machinery/camera/autoname/directional/south, /turf/open/floor/iron/showroomfloor, /area/station/cargo/storage) "iIR" = ( @@ -25545,12 +25546,12 @@ /turf/open/floor/iron/dark, /area/station/ai_monitored/command/storage/eva) "jeV" = ( -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 8 - }, /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/trimline/yellow/filled/corner{ + dir = 8 + }, /turf/open/floor/iron/white, /area/station/medical/chemistry) "jeY" = ( @@ -25792,6 +25793,7 @@ /obj/structure/disposalpipe/segment{ dir = 5 }, +/obj/item/pickaxe, /turf/open/floor/plating, /area/station/asteroid) "jjp" = ( @@ -26369,11 +26371,6 @@ "jsC" = ( /turf/closed/wall/r_wall, /area/station/maintenance/department/medical/central) -"jsI" = ( -/turf/closed/mineral/random/stationside/asteroid/porus{ - mineralChance = 20 - }, -/area/space/nearstation) "jsL" = ( /obj/effect/turf_decal/bot{ dir = 1 @@ -26531,11 +26528,8 @@ /turf/open/floor/wood, /area/station/commons/lounge) "jvV" = ( -/obj/machinery/computer/operating{ - dir = 8 - }, /obj/structure/sign/warning/biohazard/directional/east, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "jwa" = ( /obj/structure/lattice, @@ -27968,6 +27962,16 @@ /obj/structure/cable/layer3, /turf/open/floor/iron/dark/telecomms, /area/station/tcommsat/server) +"jTw" = ( +/obj/machinery/door/airlock/research{ + glass = 1; + name = "Slime Euthanization Chamber"; + opacity = 0 + }, +/obj/effect/turf_decal/tile/blue/fourcorners, +/obj/effect/mapping_helpers/airlock/access/all/science/xenobio, +/turf/open/openspace/xenobio, +/area/station/science/xenobiology) "jTB" = ( /turf/closed/wall/r_wall, /area/station/science/ordnance/storage) @@ -28763,7 +28767,7 @@ /obj/effect/decal/cleanable/blood/old{ icon_state = "gib5-old" }, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "khL" = ( /obj/effect/turf_decal/trimline/green/filled/line, @@ -28959,9 +28963,6 @@ /obj/structure/table/wood/fancy/orange, /turf/open/floor/wood, /area/station/command/heads_quarters/qm) -"kkx" = ( -/turf/open/misc/asteroid/airless, -/area/space/nearstation) "kkA" = ( /obj/machinery/light_switch/directional/east, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ @@ -29490,12 +29491,9 @@ "krz" = ( /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on{ dir = 4; - name = "euthanization chamber freezer"; - layer = 2.89 - }, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 + name = "euthanization chamber freezer" }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/tile/blue/fourcorners, /turf/open/floor/iron, /area/station/science/xenobiology) @@ -30968,7 +30966,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 5 }, -/obj/machinery/light/small/dim/directional/north, +/obj/machinery/camera/autoname/directional/north{ + network = list("ss13","medbay") + }, /turf/open/floor/iron/white, /area/station/medical/chemistry) "kSm" = ( @@ -31185,9 +31185,14 @@ /turf/closed/wall/r_wall, /area/station/engineering/atmospherics_engine) "kVh" = ( -/obj/effect/turf_decal/sand/plating, -/turf/closed/wall/rust, -/area/station/medical/chemistry/minisat) +/obj/structure/closet/crate/freezer, +/obj/item/food/icecreamsandwich, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 9 + }, +/obj/structure/sign/departments/chemistry/directional/west, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "kVF" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -32075,9 +32080,7 @@ /turf/open/floor/iron, /area/station/ai_monitored/command/storage/eva) "lny" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/light/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -32732,6 +32735,15 @@ "lAj" = ( /turf/closed/wall, /area/station/construction/mining/aux_base) +"lAl" = ( +/obj/structure/window/spawner/directional/east, +/obj/machinery/portable_atmospherics/pipe_scrubber, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/turf/open/floor/iron/dark/smooth_large, +/area/station/science/ordnance) "lAm" = ( /obj/effect/turf_decal/tile/brown/half/contrasted{ dir = 1 @@ -33146,7 +33158,7 @@ /area/station/engineering/storage/tech) "lHp" = ( /obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "lHx" = ( /obj/machinery/door/airlock/engineering{ @@ -34548,7 +34560,6 @@ /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/sand/plating, /obj/structure/disposalpipe/segment{ dir = 9 }, @@ -34808,9 +34819,7 @@ /turf/open/floor/iron/dark, /area/station/maintenance/department/engine) "mnm" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser, /obj/item/radio/intercom/directional/north, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 1 @@ -34910,6 +34919,10 @@ "mog" = ( /turf/open/openspace, /area/station/engineering/main) +"mol" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/openspace/xenobio, +/area/station/science/xenobiology) "mor" = ( /obj/effect/turf_decal/siding/wood, /obj/machinery/power/apc/auto_name/directional/east, @@ -36010,15 +36023,6 @@ }, /turf/open/floor/wood/large, /area/station/cargo/boutique) -"mIG" = ( -/obj/structure/window/spawner/directional/east, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/iron/dark/smooth_large, -/area/station/science/ordnance) "mIH" = ( /obj/structure/lattice, /obj/effect/turf_decal/stripes/asteroid/line{ @@ -37639,8 +37643,8 @@ /area/station/medical/medbay/central) "nlx" = ( /obj/structure/cable, -/obj/effect/turf_decal/sand/plating, /obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/station/maintenance/department/medical) "nlI" = ( @@ -38012,10 +38016,6 @@ }, /turf/open/floor/plating, /area/station/maintenance/department/medical/central) -"nsH" = ( -/obj/structure/lattice, -/turf/open/space/openspace, -/area/space) "nsI" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -38033,7 +38033,6 @@ /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) "ntd" = ( -/obj/machinery/camera/autoname/directional/north, /turf/open/floor/iron/showroomfloor, /area/station/command/heads_quarters/qm) "ntQ" = ( @@ -38059,8 +38058,7 @@ /area/station/service/chapel) "nur" = ( /obj/structure/chair/wood{ - dir = 1; - layer = 2.89 + dir = 1 }, /obj/machinery/light/small/directional/east, /turf/open/floor/carpet, @@ -39175,7 +39173,7 @@ c_tag = "Secure - AI Upper External East" }, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "nQs" = ( /obj/machinery/light/small/directional/north, /turf/open/misc/asteroid, @@ -39580,7 +39578,7 @@ /mob/living/basic/mothroach, /obj/item/stack/spacecash/c100, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "oaY" = ( /obj/effect/landmark/start/medical_doctor, /obj/effect/turf_decal/trimline/blue/filled/line, @@ -40360,6 +40358,9 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/maintenance/department/cargo) +"orY" = ( +/turf/open/openspace/xenobio, +/area/station/science/xenobiology) "osd" = ( /obj/structure/cable, /obj/effect/turf_decal/trimline/blue/filled/line{ @@ -41246,9 +41247,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/iron/white/textured_corner{ - dir = 1 - }, +/turf/open/openspace/xenobio, /area/station/science/xenobiology) "oID" = ( /obj/structure/lattice, @@ -41907,7 +41906,7 @@ spawn_scatter_radius = 1 }, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "oUm" = ( /obj/effect/turf_decal/tile/red/anticorner/contrasted{ dir = 8 @@ -41989,13 +41988,12 @@ /turf/open/floor/circuit/green, /area/station/ai_monitored/turret_protected/ai_upload) "oVV" = ( -/obj/structure/table, /obj/machinery/camera/directional/east{ c_tag = "Xenobiology Lab - Secure Pen"; network = list("ss13","rd","xeno") }, /obj/structure/sign/warning/biohazard/directional/east, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "oVX" = ( /obj/structure/table, @@ -43319,10 +43317,6 @@ }, /turf/open/space/basic, /area/space/nearstation) -"pti" = ( -/obj/machinery/plumbing/growing_vat, -/turf/open/misc/asteroid, -/area/station/asteroid) "ptq" = ( /obj/structure/disposalpipe/segment, /obj/effect/decal/cleanable/dirt/dust, @@ -43539,7 +43533,7 @@ "pwU" = ( /obj/structure/fluff/iced_abductor, /turf/open/misc/asteroid/airless, -/area/space) +/area/space/nearstation) "pwV" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -43580,9 +43574,15 @@ /turf/open/floor/plating/airless, /area/station/maintenance/department/medical/central) "pxU" = ( -/obj/effect/turf_decal/sand/plating, -/turf/closed/wall, -/area/station/medical/chemistry/minisat) +/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/trimline/yellow/filled/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/turf/open/floor/iron/white, +/area/station/maintenance/department/medical) "pxY" = ( /obj/structure/reagent_dispensers/fueltank, /obj/effect/decal/cleanable/dirt, @@ -43739,7 +43739,7 @@ "pAK" = ( /obj/item/stack/cable_coil, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "pAP" = ( /obj/effect/spawner/random/food_or_drink/seed{ spawn_all_loot = 1; @@ -43924,7 +43924,7 @@ /area/station/medical/chemistry) "pDr" = ( /obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/plating, +/turf/open/floor/iron/white, /area/station/maintenance/department/medical) "pDs" = ( /obj/structure/chair, @@ -44293,9 +44293,7 @@ "pKI" = ( /obj/structure/window/reinforced/spawner/directional/south, /obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/grass, /area/station/science/research) "pLd" = ( @@ -44482,9 +44480,7 @@ /area/station/maintenance/department/cargo) "pNW" = ( /obj/effect/turf_decal/trimline/yellow/filled/line, -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser, /obj/machinery/light/directional/south, /turf/open/floor/iron/white, /area/station/medical/chemistry) @@ -44929,8 +44925,7 @@ /area/station/commons/storage/art) "pVd" = ( /obj/structure/chair/wood{ - dir = 1; - layer = 2.89 + dir = 1 }, /obj/structure/railing, /turf/open/floor/carpet, @@ -45529,6 +45524,7 @@ "qgy" = ( /obj/effect/turf_decal/trimline/green/filled/line, /obj/structure/railing/corner, +/obj/machinery/firealarm/directional/south, /turf/open/floor/iron/white, /area/station/hallway/secondary/entry) "qgA" = ( @@ -45730,7 +45726,7 @@ "qjk" = ( /obj/structure/broken_flooring/singular/directional/south, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "qjp" = ( /obj/structure/flora/bush/flowers_yw/style_random, /obj/structure/window/spawner/directional/north, @@ -46764,10 +46760,8 @@ /turf/open/floor/engine/cult, /area/station/service/library) "qEr" = ( -/obj/structure/table, -/obj/item/electropack, -/obj/item/electropack, -/turf/open/floor/engine, +/obj/machinery/light/floor, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "qEC" = ( /obj/effect/turf_decal/stripes{ @@ -47566,7 +47560,6 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/structure/disposalpipe/segment, /obj/effect/mapping_helpers/airlock/abandoned, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/plating, @@ -48130,9 +48123,7 @@ /turf/open/floor/circuit/green/telecomms/mainframe, /area/station/tcommsat/server) "rdP" = ( -/obj/machinery/chem_dispenser{ - layer = 2.7 - }, +/obj/machinery/chem_dispenser, /obj/machinery/newscaster/directional/east, /obj/effect/turf_decal/trimline/yellow/filled/line{ dir = 6 @@ -49015,7 +49006,7 @@ c_tag = "Secure - AI Upper External South" }, /turf/open/space/openspace, -/area/space) +/area/space/nearstation) "rqJ" = ( /obj/machinery/air_sensor/plasma_tank, /turf/open/floor/engine/plasma, @@ -49897,12 +49888,14 @@ /area/station/cargo/storage) "rEV" = ( /obj/structure/cable, -/obj/machinery/door/airlock/maintenance_hatch, -/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, /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/department/medical) +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 1 + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "rFb" = ( /obj/effect/turf_decal/trimline/green/filled/line{ dir = 9 @@ -50149,6 +50142,7 @@ "rJv" = ( /obj/structure/sign/warning/chem_diamond/directional/south, /obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/girder, /turf/open/floor/plating, /area/station/maintenance/department/medical) "rJy" = ( @@ -51630,9 +51624,12 @@ /turf/open/floor/iron/dark, /area/station/security/lockers) "siU" = ( -/obj/item/pickaxe, -/obj/effect/turf_decal/sand/plating, -/turf/open/floor/plating, +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/obj/effect/turf_decal/trimline/yellow/filled/corner, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/small/dim/directional/north, +/turf/open/floor/iron/white, /area/station/maintenance/department/medical) "siX" = ( /obj/machinery/atmospherics/pipe/smart/manifold/scrubbers/visible, @@ -52059,9 +52056,16 @@ /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/sand/plating, -/turf/open/floor/plating, -/area/station/maintenance/department/medical) +/obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/machinery/door/airlock/research/glass{ + name = "Chemistry Minisat" + }, +/turf/open/floor/iron/white, +/area/station/medical/chemistry) "sqb" = ( /obj/structure/cable, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2, @@ -52263,9 +52267,11 @@ /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/sand/plating, -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance_hatch, +/obj/effect/mapping_helpers/airlock/access/any/medical/maintenance, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 1 }, /turf/open/floor/plating, /area/station/maintenance/department/medical) @@ -52327,16 +52333,10 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "sug" = ( -/obj/structure/table, -/obj/item/assembly/igniter{ - pixel_x = 4; - pixel_y = 3 - }, -/obj/item/assembly/igniter, /obj/machinery/sparker/directional/south{ id = "Xenobio" }, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "suq" = ( /obj/effect/landmark/start/station_engineer, @@ -52833,9 +52833,7 @@ /turf/open/floor/iron, /area/station/engineering/break_room) "sDq" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/light/directional/north, /turf/open/floor/engine, /area/station/science/xenobiology) @@ -54821,6 +54819,10 @@ /obj/machinery/camera/autoname/directional/north{ network = list("ss13","rd") }, +/obj/item/flatpack{ + board = /obj/item/circuitboard/machine/flatpacker + }, +/obj/item/multitool, /turf/open/floor/iron/white, /area/station/science/lab) "tpj" = ( @@ -55088,6 +55090,12 @@ /obj/structure/cable, /turf/open/floor/plating, /area/station/command/gateway) +"tui" = ( +/obj/machinery/vatgrower{ + dir = 4 + }, +/turf/open/misc/asteroid, +/area/station/asteroid) "tus" = ( /obj/machinery/plumbing/sender{ dir = 4 @@ -55480,7 +55488,7 @@ dir = 4 }, /obj/effect/decal/cleanable/blood/drip, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "tBF" = ( /obj/structure/closet/secure_closet/chief_medical, @@ -55715,7 +55723,6 @@ dir = 1 }, /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, -/obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/station/maintenance/central/greater) @@ -56092,9 +56099,7 @@ /turf/open/floor/plating/reinforced, /area/station/command/emergency_closet) "tMu" = ( -/obj/structure/railing{ - layer = 3.01 - }, +/obj/structure/railing, /obj/effect/spawner/random/structure/closet_private, /turf/open/floor/carpet/red, /area/station/command/heads_quarters/qm) @@ -56608,6 +56613,9 @@ /obj/effect/turf_decal/trimline/yellow/filled/corner{ dir = 8 }, +/obj/structure/chair{ + dir = 4 + }, /turf/open/floor/iron/white, /area/station/maintenance/department/medical) "tUD" = ( @@ -56931,8 +56939,13 @@ /turf/open/floor/iron/showroomfloor, /area/station/maintenance/department/engine) "uak" = ( -/obj/structure/table, -/obj/item/restraints/handcuffs, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable, +/obj/machinery/door/poddoor/preopen{ + id = "Xenolab"; + name = "Test Chamber Blast Door" + }, +/obj/structure/sign/warning/gas_mask/directional/south, /turf/open/floor/engine, /area/station/science/xenobiology) "uat" = ( @@ -57661,9 +57674,7 @@ /area/station/hallway/primary/starboard) "umA" = ( /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/engine, /area/station/science/xenobiology) "umK" = ( @@ -58750,6 +58761,7 @@ }, /obj/effect/spawner/random/structure/table_or_rack, /obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/sign/departments/exodrone/directional/east, /turf/open/floor/plating, /area/station/maintenance/department/cargo) "uGS" = ( @@ -59622,7 +59634,7 @@ /area/station/command/heads_quarters/qm) "uWI" = ( /obj/machinery/door/airlock/research/glass{ - name = "Chemistry Lab" + name = "Chemistry Minisat" }, /obj/effect/mapping_helpers/airlock/access/all/medical/chemistry, /obj/effect/mapping_helpers/airlock/unres{ @@ -59869,7 +59881,7 @@ name = "Delaminates-The-Supermatter" }, /turf/open/misc/asteroid/airless, -/area/space) +/area/space/nearstation) "vaY" = ( /obj/effect/decal/cleanable/dirt/dust, /obj/structure/broken_flooring/pile, @@ -60041,6 +60053,7 @@ "veF" = ( /obj/effect/turf_decal/tile/brown/fourcorners, /obj/structure/railing, +/obj/machinery/door/firedoor/border_only, /turf/open/floor/iron, /area/station/cargo/storage) "veW" = ( @@ -60162,7 +60175,7 @@ "vgW" = ( /obj/structure/lattice, /turf/open/floor/engine/airless, -/area/space) +/area/space/nearstation) "vhf" = ( /obj/machinery/atmospherics/pipe/multiz/supply/visible/layer4, /obj/machinery/atmospherics/pipe/multiz/scrubbers/visible/layer2, @@ -61389,9 +61402,7 @@ "vFG" = ( /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/stairs/north, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron/dark/textured_large, /area/station/engineering/storage/tech) "vFH" = ( @@ -61466,6 +61477,14 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/iron/dark, /area/station/command/heads_quarters/hop) +"vGG" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/smart/simple/purple/visible/layer1, +/obj/machinery/portable_atmospherics/pipe_scrubber, +/turf/open/floor/iron/textured, +/area/station/engineering/atmos) "vGJ" = ( /obj/effect/spawner/random/structure/grille, /obj/effect/spawner/random/structure/girder, @@ -61651,9 +61670,7 @@ /area/station/maintenance/department/cargo) "vLa" = ( /obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/grass, /area/station/science/research) "vLs" = ( @@ -62472,9 +62489,7 @@ /turf/open/floor/iron/dark, /area/station/commons/locker) "vZu" = ( -/obj/machinery/atmospherics/components/tank/air{ - piping_layer = 4 - }, +/obj/machinery/atmospherics/components/tank/air/layer4, /obj/effect/turf_decal/tile/green/half/contrasted{ dir = 1 }, @@ -64372,7 +64387,7 @@ "wHl" = ( /obj/structure/girder, /turf/open/misc/asteroid/airless, -/area/space) +/area/space/nearstation) "wHo" = ( /obj/effect/turf_decal/tile/neutral, /obj/effect/spawner/random/entertainment/arcade{ @@ -64460,7 +64475,7 @@ "wJC" = ( /obj/structure/sign/poster/contraband/communist_state/directional/east, /turf/open/space/basic, -/area/space) +/area/space/nearstation) "wJN" = ( /obj/machinery/space_heater/improvised_chem_heater, /turf/open/floor/plating, @@ -64744,19 +64759,38 @@ /area/station/engineering/gravity_generator) "wOJ" = ( /obj/structure/table, -/obj/effect/turf_decal/trimline/yellow/filled/line{ - dir = 9 +/obj/item/stack/sheet/iron/fifty{ + pixel_x = 3; + pixel_y = 6 }, -/obj/item/stack/sheet/iron/fifty, -/obj/item/construction/plumbing, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/item/stack/ducts/fifty, -/obj/machinery/camera/autoname/directional/north{ - network = list("ss13","medbay") +/obj/item/construction/plumbing{ + pixel_x = 34; + pixel_y = 6 + }, +/obj/item/stack/ducts/fifty{ + pixel_x = 26; + pixel_y = 2 + }, +/obj/item/stack/ducts/fifty{ + pixel_x = 25; + pixel_y = 1 + }, +/obj/item/stack/ducts/fifty{ + pixel_x = 24; + pixel_y = -1 + }, +/obj/item/stack/ducts/fifty{ + pixel_x = 23; + pixel_y = -3 + }, +/obj/item/stack/ducts/fifty{ + pixel_x = 23; + pixel_y = -5 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 }, +/obj/machinery/light/small/dim/directional/north, /turf/open/floor/iron/white, /area/station/medical/chemistry) "wOK" = ( @@ -64902,7 +64936,7 @@ /area/station/hallway/primary/central) "wSj" = ( /turf/closed/mineral/asteroid, -/area/space) +/area/space/nearstation) "wSn" = ( /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/carpet, @@ -66081,9 +66115,7 @@ /turf/open/floor/iron, /area/station/maintenance/disposal/incinerator) "xna" = ( -/obj/structure/table, -/obj/item/tank/internals/anesthetic, -/turf/open/floor/engine, +/turf/open/floor/engine/xenobio, /area/station/science/xenobiology) "xnc" = ( /obj/machinery/door/airlock/command/glass{ @@ -66661,9 +66693,7 @@ "xxO" = ( /obj/structure/window/reinforced/spawner/directional/north, /obj/structure/flora/bush/fullgrass/style_random, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/grass, /area/station/science/research) "xxT" = ( @@ -67883,7 +67913,6 @@ "xWR" = ( /obj/effect/landmark/start/ai/secondary, /obj/machinery/door/window/brigdoor/right/directional/south{ - layer = 4.1; name = "Secondary AI Core Access"; req_access = list("ai_upload"); pixel_y = -4 @@ -68338,8 +68367,12 @@ /turf/open/floor/plating/airless, /area/space/nearstation) "yew" = ( -/obj/effect/spawner/random/structure/girder, -/turf/open/floor/plating, +/obj/structure/table, +/obj/effect/spawner/random/trash/crushed_can{ + pixel_x = 7; + pixel_y = 15 + }, +/turf/open/floor/iron/white, /area/station/maintenance/department/medical) "yeO" = ( /obj/machinery/door/firedoor/border_only{ @@ -73281,15 +73314,15 @@ cLf cLf iUF tLg -bwC -bwC -bwC -bwC -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc +dUc +dUc +dUc +dUc tLg iUF cLf @@ -73537,7 +73570,7 @@ cLf cLf cLf iUF -bwC +dUc wfz uuN uuN @@ -73547,7 +73580,7 @@ uuN uuN uuN wfz -bwC +dUc iUF cLf cLf @@ -73794,17 +73827,17 @@ cLf cLf cLf cLf -bwC +dUc uuN cLf cLf cLf -bwC +dUc cLf cLf cLf uuN -bwC +dUc cLf cLf cLf @@ -74051,17 +74084,17 @@ cLf cLf cLf cLf -bwC +dUc uuN cLf cLf cLf -bwC +dUc cLf cLf cLf uuN -bwC +dUc cLf cLf cLf @@ -74308,17 +74341,17 @@ cLf cLf cLf cLf -bwC +dUc uuN cLf cLf cLf -bwC +dUc cLf cLf cLf uuN -bwC +dUc cLf cLf cLf @@ -74565,17 +74598,17 @@ cLf cLf cLf cLf -bwC +dUc uuN -bwC -bwC -bwC +dUc +dUc +dUc itt -bwC -bwC -bwC +dUc +dUc +dUc uuN -bwC +dUc cLf cLf cLf @@ -74822,17 +74855,17 @@ cLf cLf cLf cLf -bwC +dUc uuN cLf cLf cLf -bwC +dUc cLf cLf cLf uuN -bwC +dUc cLf cLf cLf @@ -75079,17 +75112,17 @@ cLf cLf cLf cLf -bwC +dUc uuN cLf cLf cLf -bwC +dUc cLf cLf cLf uuN -bwC +dUc cLf cLf cLf @@ -75336,17 +75369,17 @@ cLf cLf cLf cLf -bwC +dUc uuN cLf cLf cLf -bwC +dUc cLf cLf cLf uuN -bwC +dUc cLf cLf cLf @@ -75593,7 +75626,7 @@ cLf cLf cLf iUF -bwC +dUc wfz uuN uuN @@ -75603,7 +75636,7 @@ uuN uuN uuN wfz -bwC +dUc iUF cLf cLf @@ -75851,15 +75884,15 @@ cLf cLf iUF tLg -bwC -bwC -bwC -bwC -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc +dUc +dUc +dUc +dUc tLg iUF cLf @@ -76068,16 +76101,16 @@ iUF iUF cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf iUF -bwC +dUc iUF cLf cLf @@ -76109,17 +76142,17 @@ cLf iUF iUF cLf -bwC +dUc cLf uuN uuN uuN cLf -bwC +dUc cLf iUF iUF -bwC +dUc cLf cLf cLf @@ -76325,16 +76358,16 @@ iUF cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf iUF -bwC +dUc iUF cLf cLf @@ -76366,17 +76399,17 @@ cLf cLf cLf cLf -bwC +dUc cLf uuN uuN uuN cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -76579,19 +76612,19 @@ cLf cLf cLf iUF -bwC -bwC -bwC +dUc +dUc +dUc rGO cLf qJB cLf rGO -bwC -bwC -bwC +dUc +dUc +dUc iUF -bwC +dUc iUF cLf cLf @@ -76623,22 +76656,22 @@ cLf cLf cLf cLf -bwC +dUc cLf uuN uuN uuN cLf -bwC +dUc cLf cLf cLf -bwC -bwC +dUc +dUc iUF iUF iUF -bwC +dUc cLf cLf cLf @@ -76848,7 +76881,7 @@ cLf cLf cLf iUF -bwC +dUc iUF cLf cLf @@ -76880,22 +76913,22 @@ cLf cLf cLf cLf -bwC +dUc cLf uuN uuN uuN cLf -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -77105,7 +77138,7 @@ cLf cLf cLf iUF -bwC +dUc iUF cLf cLf @@ -77137,71 +77170,71 @@ cLf cLf cLf cLf -bwC -cLf -uuN -uuN -uuN -cLf -bwC -cLf -cLf -cLf -bwC -cLf -cLf -kJV -cLf -bwC -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf -cLf +dUc +cLf +uuN +uuN +uuN +cLf +dUc +cLf +cLf +cLf +dUc +cLf +cLf +kJV +cLf +dUc +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf +cLf cLf cLf cLf @@ -77362,7 +77395,7 @@ rGO cLf cLf iUF -bwC +dUc iUF cLf cLf @@ -77394,24 +77427,24 @@ cLf cLf cLf cLf -bwC +dUc cLf uuN uuN uuN cLf -bwC +dUc cLf cLf cLf iUF iUF -bwC -bwC -bwC +dUc +dUc +dUc iUF iUF -bwC +dUc mPv cLf cLf @@ -77619,7 +77652,7 @@ opZ rGO cLf iUF -bwC +dUc iUF cLf cLf @@ -77628,7 +77661,7 @@ cLf cLf cLf cLf -bwC +dUc iUF cLf cLf @@ -77645,12 +77678,12 @@ cLf cLf cLf iUF -bwC -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc +dUc iUF iUF kYn @@ -77662,18 +77695,18 @@ iUF iUF cLf cLf -bwC +dUc cLf cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -77864,7 +77897,7 @@ cLf cLf cLf iUF -bwC +dUc rGO sKL rGO @@ -77874,18 +77907,18 @@ nMk rGO sKL rGO -bwC +dUc iUF -bwC +dUc iUF -bwC -bwC +dUc +dUc iUF iUF iUF iUF -bwC -bwC +dUc +dUc cLf cLf cLf @@ -77902,7 +77935,7 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -77910,16 +77943,16 @@ cLf cLf iUF cLf -bwC +dUc cLf -bwC +dUc cLf -bwC +dUc cLf iUF cLf cLf -bwC +dUc cLf cLf cLf @@ -78133,14 +78166,14 @@ opZ opZ cLf iUF -bwC +dUc iUF cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -78159,19 +78192,19 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf -bwC +dUc cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -78203,12 +78236,12 @@ kYn cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf shs @@ -78388,16 +78421,16 @@ nMk rGO sKL rGO -bwC +dUc iUF -bwC +dUc iUF cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -78416,19 +78449,19 @@ cLf cLf cLf tyd -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf -bwC +dUc cLf -bwC +dUc cLf -bwC +dUc cLf cLf rnk @@ -78455,8 +78488,8 @@ shs shs kYn shs -bwC -bwC +dUc +dUc cLf cLf oDH @@ -78465,7 +78498,7 @@ oDH cLf cLf cLf -bwC +dUc cLf cLf shs @@ -78635,7 +78668,7 @@ cLf cLf cLf iUF -bwC +dUc opZ opZ opZ @@ -78647,14 +78680,14 @@ opZ fYX cLf iUF -bwC +dUc iUF cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -78673,15 +78706,15 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf -bwC +dUc rnk rnk oFu @@ -78707,13 +78740,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf oDH weu @@ -78721,10 +78754,10 @@ oDH weu oDH bfl -bwC +dUc wfz -bwC -bwC +dUc +dUc shs cLf cLf @@ -78894,24 +78927,24 @@ cLf iUF cLf cLf -bwC +dUc cLf cLf pNk cLf cLf -bwC +dUc cLf cLf iUF -bwC +dUc iUF cLf cLf cLf cLf cLf -bwC +dUc cLf tyd cLf @@ -78930,7 +78963,7 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -78964,14 +78997,14 @@ vxX vxX vxX cLf -bwC +dUc cLf cLf cLf -bwC -bwC +dUc +dUc wfz -bwC +dUc oDH weu oDH @@ -78979,7 +79012,7 @@ weu oDH lTb oDH -bwC +dUc cLf cLf shs @@ -79151,24 +79184,24 @@ cLf iUF cLf cLf -bwC +dUc cLf cLf pNk cLf cLf -bwC +dUc cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -79187,7 +79220,7 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -79225,9 +79258,9 @@ loh loh loh loh -bwC +dUc cLf -bwC +dUc cLf oDH weu @@ -79236,7 +79269,7 @@ weu oDH weu oDH -bwC +dUc cLf cLf shs @@ -79408,24 +79441,24 @@ cLf cLf cLf cLf -bwC +dUc cLf oyS oDZ oyS cLf -bwC +dUc tyd cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -79444,7 +79477,7 @@ cLf cLf cLf cLf -bwC +dUc cLf vxX vxX @@ -79484,8 +79517,8 @@ sRo iFz iFz iFz -bwC -bwC +dUc +dUc lTb weu lTb @@ -79671,12 +79704,12 @@ oyS hPg oyS cLf -bwC +dUc cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -79701,7 +79734,7 @@ cLf cLf cLf cLf -bwC +dUc vxX vxX vxX @@ -79752,7 +79785,7 @@ kqy kqy kqy pBk -bwC +dUc shs cLf cLf @@ -79914,7 +79947,7 @@ cLf cLf cLf mPv -bwC +dUc nAb eSS eSS @@ -79928,12 +79961,12 @@ oyS qjc oyS oyS -bwC +dUc cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -79943,10 +79976,10 @@ vxX vxX vxX cLf -bwC -bwC +dUc +dUc mfA -bwC +dUc fVZ mWe aoL @@ -79998,8 +80031,8 @@ hVs iFz iFz iFz -bwC -bwC +dUc +dUc lTb weu lTb @@ -80188,9 +80221,9 @@ poi poi poi mxq -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -80200,7 +80233,7 @@ poi poi poi cLf -bwC +dUc cLf fsI cLf @@ -80253,9 +80286,9 @@ loh loh loh loh -bwC +dUc cLf -bwC +dUc cLf oDH weu @@ -80264,7 +80297,7 @@ weu oDH weu oDH -bwC +dUc cLf cLf shs @@ -80510,10 +80543,10 @@ sHh xyN nNv rnk -bwC -bwC +dUc +dUc wfz -bwC +dUc oDH weu oDH @@ -80521,7 +80554,7 @@ weu oDH lTb oDH -bwC +dUc cLf cLf shs @@ -80777,10 +80810,10 @@ oDH weu oDH bfl -bwC +dUc wfz dUc -bwC +dUc shs cLf cLf @@ -80942,7 +80975,7 @@ cLf cLf cLf mPv -bwC +dUc nAb eSS eSS @@ -81035,7 +81068,7 @@ oDH cLf cLf cLf -bwC +dUc cLf cLf shs @@ -81287,12 +81320,12 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf shs @@ -81445,22 +81478,22 @@ cLf cLf cLf cLf -bwC +dUc iUF iUF iUF -bwC +dUc iUF iUF iUF -bwC +dUc iUF iUF iUF -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc eSS cro cro @@ -81538,11 +81571,11 @@ fma fma gtK rnk -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc kYn shs shs @@ -81698,21 +81731,21 @@ cLf cLf cLf cLf -bwC +dUc iUF iUF iUF -bwC +dUc cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -81802,7 +81835,7 @@ rnk cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -81955,21 +81988,21 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -82314,8 +82347,8 @@ uoo bMx hiO oFu -bwC -bwC +dUc +dUc iUF cLf cLf @@ -82470,7 +82503,7 @@ cLf cLf cLf iUF -bwC +dUc xrb xrb dEG @@ -82571,7 +82604,7 @@ sEY vJf rnk rnk -bwC +dUc cLf iUF cLf @@ -82743,7 +82776,7 @@ cem cem whY baH -bwC +dUc qhP dJK geh @@ -82983,7 +83016,7 @@ tyd cLf cLf cLf -bwC +dUc cLf xrb nEx @@ -83083,7 +83116,7 @@ lXG rnk cLf cLf -bwC +dUc kYn shs cLf @@ -83498,7 +83531,7 @@ cLf cLf cLf iUF -bwC +dUc xrb iNq oHi @@ -84011,7 +84044,7 @@ cLf cLf cLf cLf -bwC +dUc cLf oPe xch @@ -84111,7 +84144,7 @@ oaP oFu cLf cLf -bwC +dUc cLf cLf cLf @@ -84268,7 +84301,7 @@ cLf cLf cLf cLf -bwC +dUc vxX ubm ubm @@ -84300,10 +84333,10 @@ uZc uZc uZc uZc -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc poi poi poi @@ -84368,7 +84401,7 @@ oqj rnk vxX vxX -bwC +dUc cLf cLf cLf @@ -84564,7 +84597,7 @@ cLf cLf cLf cLf -bwC +dUc htf kpT jdK @@ -84821,7 +84854,7 @@ cLf cLf cLf cLf -bwC +dUc htf iHv rZJ @@ -85078,7 +85111,7 @@ cLf cLf cLf cLf -bwC +dUc poi mhF jdK @@ -85335,7 +85368,7 @@ cLf cLf cLf cLf -bwC +dUc poi htf poi @@ -85592,7 +85625,7 @@ uOf cLf cLf cLf -bwC +dUc iua tdq cTa @@ -85847,8 +85880,8 @@ cLf ved gxu ved -bwC -bwC +dUc +dUc poi poi poi @@ -86423,7 +86456,7 @@ paa pEZ wiK mXM -bwC +dUc gGf cLf cLf @@ -87357,8 +87390,8 @@ cLf cLf cLf cLf -bwC -bwC +dUc +dUc cLf cLf cLf @@ -87449,7 +87482,7 @@ lKh dgp paa rnk -bwC +dUc iUF cLf cLf @@ -87706,7 +87739,7 @@ dgp dgp rFd rnk -bwC +dUc iUF cLf cLf @@ -87954,10 +87987,10 @@ kJT fhL kJT cLf -bwC +dUc cLf -bwC -kkx +dUc +cxg rnk wdV nHm @@ -88131,8 +88164,8 @@ pnS pnS pnS unk -bwC -bwC +dUc +dUc jza mbM mbM @@ -88211,9 +88244,9 @@ kJT kyi kJT cLf -bwC +dUc cLf -bwC +dUc cLf rnk xuD @@ -88390,7 +88423,7 @@ pnS pnS cLf cLf -bwC +dUc uuN uuN plA @@ -88467,11 +88500,11 @@ hDK kJT iTL kJT -bwC +dUc wfz uuN wfz -bwC +dUc jsC xWi jsC @@ -88647,7 +88680,7 @@ unk cLf cLf cLf -bwC +dUc uuN uuN plA @@ -88900,10 +88933,10 @@ cLf cLf cLf cLf -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc rTM rTM rTM @@ -89241,7 +89274,7 @@ pUY kJT hgV wJC -bwC +dUc uuN gJE paa @@ -89498,7 +89531,7 @@ hYg kJT rnk rnk -bwC +dUc wfz gJE paa @@ -89755,7 +89788,7 @@ ndI kJT afV rnk -bwC +dUc uuN gJE paa @@ -90444,7 +90477,7 @@ cLf cLf cLf iUF -bwC +dUc hDo sIM wVz @@ -90781,13 +90814,13 @@ uZx paa lqf rnk -jsI -jsI -jsI +vxX +vxX +vxX cLf cLf -bwC -bwC +dUc +dUc cLf cLf cLf @@ -90958,7 +90991,7 @@ cLf cLf cLf iUF -bwC +dUc hDo fmB rAu @@ -91038,13 +91071,13 @@ uZx paa pDQ rnk -jsI -jsI +vxX +vxX rnk rnk rnk rnk -bwC +dUc cLf cLf cLf @@ -92323,13 +92356,13 @@ uZx rms tcN rnk -bwC -bwC +dUc +dUc rnk rnk rnk rnk -bwC +dUc cLf cLf cLf @@ -92513,14 +92546,14 @@ axD axD axD fYe -bwC -bwC -bwC +dUc +dUc +dUc uuN uuN -bwC -bwC -bwC +dUc +dUc +dUc fYe fYe fri @@ -92582,11 +92615,11 @@ lqf rnk cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -92761,7 +92794,7 @@ cLf cLf cLf cLf -bwC +dUc cLf fZF mGX @@ -92841,9 +92874,9 @@ hzF hzF hzF hzF -bwC -bwC -bwC +dUc +dUc +dUc cLf cLf cLf @@ -93100,7 +93133,7 @@ pCJ hzF cLf cLf -bwC +dUc cLf cLf cLf @@ -93270,11 +93303,11 @@ cLf cLf cLf iUF -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc axD axD axD @@ -93284,15 +93317,15 @@ jxq vEF axD axD -bwC +dUc uuN -bwC +dUc uuN uuN -bwC +dUc uuN -bwC -bwC +dUc +dUc fYe fri nAe @@ -93542,12 +93575,12 @@ dGh jqu hrM cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf fYe fYe @@ -93799,7 +93832,7 @@ nbm iDJ hrM cLf -bwC +dUc cLf cLf cLf @@ -94041,11 +94074,11 @@ cLf cLf cLf iUF -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc axD hnE axD @@ -94296,8 +94329,8 @@ cLf cLf cLf cLf -bwC -bwC +dUc +dUc cLf cLf cLf @@ -95325,11 +95358,11 @@ cLf cLf cLf iUF -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc eKR pVC yhk @@ -96610,11 +96643,11 @@ cLf cLf cLf iUF -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc eKR cNQ kjs @@ -96698,7 +96731,7 @@ tNz nHK cLf cLf -bwC +dUc cLf cLf cLf @@ -96953,8 +96986,8 @@ xcl xrd ppk hzF -bwC -bwC +dUc +dUc wfz cLf cLf @@ -97212,7 +97245,7 @@ azg azg cLf cLf -bwC +dUc cLf cLf cLf @@ -97645,7 +97678,7 @@ cLf cLf cLf cLf -bwC +dUc cLf eKR iSE @@ -97896,13 +97929,13 @@ cLf cLf cLf iUF -bwC -bwC -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc +dUc +dUc cLf eKR tju @@ -98417,7 +98450,7 @@ cLf cLf cLf iUF -bwC +dUc eKR eKR uCw @@ -98681,13 +98714,13 @@ jVy brP jVy eKR -bwC -bwC -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc +dUc +dUc juw vOe vOe @@ -99192,10 +99225,10 @@ ili cLf cLf cLf -bwC +dUc cLf cLf -bwC +dUc dVE pjN hoe @@ -99439,8 +99472,8 @@ kGm aPz aPz xsN -bwC -bwC +dUc +dUc cLf cLf reg @@ -99524,7 +99557,7 @@ vFr vlM uEo cLf -bwC +dUc cLf cLf cLf @@ -99697,7 +99730,7 @@ oOC oOC xsN cLf -bwC +dUc cLf cLf dwF @@ -99706,7 +99739,7 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -99780,7 +99813,7 @@ mUU sLt dnt uEo -bwC +dUc iUF cLf cLf @@ -99948,7 +99981,7 @@ cLf cLf cLf iUF -bwC +dUc srs aPz aPz @@ -100228,7 +100261,7 @@ cLf iWV hJs xqe -bwC +dUc utM utM kOd @@ -100480,8 +100513,8 @@ vBs hfm eVE jEY -bwC -bwC +dUc +dUc vfJ hJs vfJ @@ -100742,7 +100775,7 @@ cLf iWV hJs iWV -bwC +dUc utM utM wWD @@ -101255,8 +101288,8 @@ cLf cLf cLf hJs -bwC -bwC +dUc +dUc obA utM utM @@ -101507,10 +101540,10 @@ eEx sYI sfY srs -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc hJs cLf cLf @@ -101745,8 +101778,8 @@ cLf cLf cLf iUF -bwC -bwC +dUc +dUc unk vxX srs @@ -101766,7 +101799,7 @@ srs srs cLf cLf -bwC +dUc cLf hqF epi @@ -102023,7 +102056,7 @@ skw srs cLf cLf -bwC +dUc cLf cLf cLf @@ -102093,7 +102126,7 @@ uFb jke kiK uFb -bwC +dUc iUF cLf cLf @@ -102280,7 +102313,7 @@ hnL srs cLf cLf -bwC +dUc cLf cLf cLf @@ -102351,7 +102384,7 @@ vBV cpF uFb cLf -bwC +dUc cLf cLf cLf @@ -102537,7 +102570,7 @@ kYu kYu cLf cLf -bwC +dUc cLf cLf cLf @@ -102793,10 +102826,10 @@ pgk ins kYu kYu -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc vxX vxX vxX @@ -103030,9 +103063,9 @@ cLf cLf cLf iUF -bwC -bwC -bwC +dUc +dUc +dUc dZy awB glq @@ -103383,7 +103416,7 @@ jge uFb cLf cLf -bwC +dUc cLf iUF cLf @@ -103868,11 +103901,11 @@ kBM nMI cLf xAy -bwC -bwC +dUc +dUc xAy cLf -bwC +dUc xAy xAy xTw @@ -104124,7 +104157,7 @@ jUU kBM pWw cLf -bwC +dUc cLf cLf uuN @@ -104155,7 +104188,7 @@ wag xzJ kub pUr -bwC +dUc iUF cLf cLf @@ -104381,7 +104414,7 @@ jUU nyQ pWw cLf -bwC +dUc cLf cLf uuN @@ -104638,7 +104671,7 @@ jUU kBM pWw cLf -bwC +dUc cLf cLf axt @@ -104896,11 +104929,11 @@ ajQ nMI cLf xAy -bwC -bwC +dUc +dUc xAy cLf -bwC +dUc xAy xAy qXB @@ -104931,7 +104964,7 @@ ruZ ruZ ruZ fmY -bwC +dUc mPv cLf cLf @@ -105959,7 +105992,7 @@ ykG ykG ykG fdj -bwC +dUc mPv vxX vxX @@ -106940,15 +106973,15 @@ niB hjI crU vxX -bwC -bwC +dUc +dUc nbu nbu nbu nbu nbu -bwC -bwC +dUc +dUc pLB dpU dpU @@ -107197,16 +107230,16 @@ pXS hjI crU vxX -bwC -bwC +dUc +dUc nbu gxw gxw cxN nbu -bwC -bwC -bwC +dUc +dUc +dUc dpU iel hTX @@ -107454,16 +107487,16 @@ niB qAI crU vxX -bwC -bwC +dUc +dUc nbu gxw puQ gxw nbu -bwC -bwC -bwC +dUc +dUc +dUc dpU nav pJw @@ -107711,16 +107744,16 @@ qOs bpy crU vxX -bwC -bwC +dUc +dUc nbu cIx enn tBt nbu -bwC -bwC -bwC +dUc +dUc +dUc dpU iPu eoQ @@ -107968,16 +108001,16 @@ niB aoA crU vxX -bwC -bwC +dUc +dUc nbu wpM wVI bvl nbu -bwC -bwC -bwC +dUc +dUc +dUc dpU ppR mZA @@ -108014,10 +108047,10 @@ pGo ykG ykG ykG -bwC -bwC +dUc +dUc fmr -bwC +dUc cLf cLf vxX @@ -108180,9 +108213,9 @@ cLf cLf cLf cLf -bwC +dUc utU -bwC +dUc cLf cLf cLf @@ -108225,16 +108258,16 @@ ers dsL crU vxX -bwC -bwC -bwC +dUc +dUc +dUc gdP -bwC +dUc mXr -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc dpU kRq kLU @@ -108270,9 +108303,9 @@ ece kcz ykG mXK -bwC -bwC -bwC +dUc +dUc +dUc fmr cLf cLf @@ -108437,9 +108470,9 @@ cLf cLf cLf cLf -bwC +dUc utU -bwC +dUc cLf cLf cLf @@ -108698,14 +108731,14 @@ qVF izr qVF wNk -bwC -bwC -bwC -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc +dUc +dUc +dUc fYe vxX vxX @@ -108733,11 +108766,11 @@ gOY vxX cxg vxX -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc cNc pNi kUb @@ -108947,9 +108980,9 @@ cLf cLf cLf cLf -bwC -bwC -bwC +dUc +dUc +dUc wZz wZz qpj @@ -108958,7 +108991,7 @@ wZz cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -109005,7 +109038,7 @@ oRf sYU hLj syl -nDN +vGG nDN nDN pPv @@ -109211,11 +109244,11 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -109468,7 +109501,7 @@ cLf cLf cLf cLf -bwC +dUc cLf fYe fYe @@ -109509,7 +109542,7 @@ aXt jyO qsa wVI -bwC +dUc rLK vYL jSu @@ -109725,7 +109758,7 @@ cLf cLf cLf cLf -bwC +dUc cLf vxX vxX @@ -109976,12 +110009,12 @@ cLf cLf cLf shs -bwC +dUc wfz -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc vxX vxX vxX @@ -110023,7 +110056,7 @@ nbu nbu nbu nbu -bwC +dUc utf qKj jSu @@ -110234,7 +110267,7 @@ shs shs shs cLf -bwC +dUc cLf cLf cLf @@ -110491,7 +110524,7 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -110500,7 +110533,7 @@ cLf vxX cLf cLf -bwC +dUc cLf cLf cLf @@ -110537,7 +110570,7 @@ pIV mBg rqJ wVI -bwC +dUc rLK nLD jSu @@ -110743,21 +110776,21 @@ cLf shs shs cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf -bwC +dUc cLf cLf cLf @@ -110998,11 +111031,11 @@ cLf cLf cLf shs -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc pbP pih pbP @@ -111011,10 +111044,10 @@ pbP cLf cLf cLf -bwC +dUc cLf cLf -bwC +dUc cLf cLf cLf @@ -111051,7 +111084,7 @@ nbu nbu nbu nbu -bwC +dUc utf hon jSu @@ -111268,10 +111301,10 @@ pih cLf cLf tyd -bwC +dUc cLf cLf -bwC +dUc cLf cLf cLf @@ -111294,7 +111327,7 @@ gOY gOY tTK rFA -mIG +lAl xfQ cAG xXF @@ -111525,10 +111558,10 @@ pih cLf cLf cLf -bwC +dUc cLf cLf -bwC +dUc cLf cLf pkl @@ -111565,7 +111598,7 @@ msY qNM fzM wVI -bwC +dUc rLK fMS jSu @@ -111782,10 +111815,10 @@ pih cLf cLf cLf -bwC +dUc cLf cLf -bwC +dUc rXt rXt rXt @@ -111814,7 +111847,7 @@ cQu wgI vib vMR -bwC +dUc cxg vxX nbu @@ -112071,7 +112104,7 @@ miM awf egV vMR -bwC +dUc cxg vxX nbu @@ -112296,10 +112329,10 @@ pih cLf cLf cLf -bwC +dUc cLf cLf -bwC +dUc rXt rXt rXt @@ -112328,7 +112361,7 @@ nbS nbS nbS vMR -bwC +dUc cLf vxX vxX @@ -112336,7 +112369,7 @@ vxX vxX vxX vxX -bwC +dUc wRN fdC uVP @@ -112553,10 +112586,10 @@ pih cLf cLf cLf -bwC +dUc cLf cLf -bwC +dUc cLf cLf pkl @@ -112585,15 +112618,15 @@ nkM nkM nkM nkM -bwC +dUc cLf -bwC +dUc vxX vxX vxX vxX vxX -bwC +dUc fTX rLK hfp @@ -112810,10 +112843,10 @@ pih cLf cLf cLf -bwC +dUc cLf cLf -bwC +dUc cLf cLf cLf @@ -112842,26 +112875,26 @@ gXw gHL jGy moe -bwC +dUc cLf -bwC +dUc vxX vxX vxX vxX vxX vxX -bwC +dUc eTZ -bwC +dUc xLu rZB pLe -bwC +dUc lfG rZB pLe -bwC +dUc lfG aUx kUX @@ -113054,11 +113087,11 @@ cLf cLf cLf shs -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc pbP pih pbP @@ -113067,14 +113100,14 @@ pbP cLf cLf cLf -bwC +dUc fYe fYe wfz -bwC +dUc vxX -bwC -bwC +dUc +dUc ilp ilp ilp @@ -113099,13 +113132,13 @@ uEV rRO yai moe -bwC -bwC -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc +dUc +dUc vxX vxX nbu @@ -113313,12 +113346,12 @@ cLf shs cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -113356,13 +113389,13 @@ rxn rRO mIa moe -bwC +dUc cLf iUF cLf cLf cLf -bwC +dUc vxX vxX nbu @@ -113570,12 +113603,12 @@ cLf shs shs cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -113613,13 +113646,13 @@ rxn rRO iNC moe -bwC +dUc cLf iUF cLf cLf cLf -bwC +dUc vxX vxX nbu @@ -113831,13 +113864,13 @@ shs shs shs shs -bwC +dUc wfz -bwC +dUc shs shs shs -bwC +dUc vxX vxX vxX @@ -113870,13 +113903,13 @@ hmG gME xGg moe -bwC +dUc cLf iUF cLf cLf cLf -bwC +dUc vxX vxX nbu @@ -114127,13 +114160,13 @@ moe fDj fDj moe -bwC +dUc cLf iUF cLf cLf cLf -bwC +dUc vxX vxX nbu @@ -114152,11 +114185,11 @@ nbu vxX mUQ cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf vxX vxX @@ -114381,16 +114414,16 @@ fDj moe iyE moe -bwC -bwC -bwC +dUc +dUc +dUc nmN cLf iUF cLf cLf cLf -bwC +dUc cLf vxX vxX @@ -114409,18 +114442,18 @@ fYe fYe uVI cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf vxX vxX vxX vxX -bwC +dUc cLf mDV uFC @@ -114632,13 +114665,13 @@ etW cLf cLf cLf -bwC -bwC -bwC +dUc +dUc +dUc moe aub moe -bwC +dUc cLf cLf cLf @@ -114647,12 +114680,12 @@ iUF cLf cLf cLf -bwC +dUc cLf cLf vxX cLf -bwC +dUc vxX vxX vxX @@ -114666,18 +114699,18 @@ fYe vxX mUQ vxX -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf vxX vxX vxX -bwC +dUc cLf mDV uFC @@ -114881,22 +114914,22 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc iUF iUF cLf cLf cLf -bwC +dUc ojz aHZ ojz -bwC -bwC +dUc +dUc iUF iUF iUF @@ -114904,12 +114937,12 @@ iUF cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -114923,19 +114956,19 @@ vxX vxX vxX vxX -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf vxX vxX vxX vxX -bwC -bwC +dUc +dUc mDV uFC ivC @@ -115147,7 +115180,7 @@ cLf iUF iUF iUF -bwC +dUc nmN dXU dXU @@ -115161,17 +115194,17 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -115180,11 +115213,11 @@ cLf cLf vxX vxX -bwC +dUc iUF iUF iUF -bwC +dUc vxX vxX vxX @@ -115208,10 +115241,10 @@ uFC vxX vxX vxX -kkx -kkx -kkx -kkx +cxg +cxg +cxg +cxg vxX vxX vxX @@ -115406,9 +115439,9 @@ cLf cLf cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -115418,17 +115451,17 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -115450,7 +115483,7 @@ mUQ fYe cLf cLf -bwC +dUc uFC kEu kEu @@ -115662,11 +115695,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -115675,17 +115708,17 @@ cLf cLf cLf cLf -bwC -bwC -bwC -bwC -bwC -bwC -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc +dUc +dUc +dUc +dUc +dUc +dUc cLf cLf cLf @@ -115918,13 +115951,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -115932,17 +115965,17 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -116175,13 +116208,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -116189,17 +116222,17 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -116433,11 +116466,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -116446,17 +116479,17 @@ cLf cLf cLf cLf -bwC -bwC +dUc +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC -bwC +dUc +dUc cLf cLf cLf @@ -116691,9 +116724,9 @@ cLf cLf cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -116704,15 +116737,15 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -116947,11 +116980,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -116961,15 +116994,15 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -117203,13 +117236,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -117218,15 +117251,15 @@ cLf cLf cLf shs -bwC -bwC +dUc +dUc jQS jQS jQS jQS jQS -bwC -bwC +dUc +dUc shs cLf cLf @@ -117460,13 +117493,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -117475,7 +117508,7 @@ cLf cLf cLf shs -bwC +dUc cLf jQS lgO @@ -117483,9 +117516,9 @@ czY kOL jQS cLf -bwC +dUc shs -bwC +dUc cLf cLf cLf @@ -117718,11 +117751,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -117730,19 +117763,19 @@ shs shs shs shs -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc jQS pRN kOL sgc jQS -bwC -bwC +dUc +dUc cLf -bwC +dUc shs shs shs @@ -117976,9 +118009,9 @@ cLf cLf cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -118232,15 +118265,15 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf -bwC +dUc cLf cLf cLf @@ -118260,8 +118293,8 @@ jQS uep qDP qDP -bwC -bwC +dUc +dUc cLf cLf cLf @@ -118488,17 +118521,17 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc jQS tLO jQS @@ -118518,7 +118551,7 @@ ifV jQS qDP cLf -bwC +dUc cLf cLf cLf @@ -118745,17 +118778,17 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC -bwC -bwC -bwC -bwC +dUc +dUc +dUc +dUc +dUc jQS xnB jQS @@ -119003,11 +119036,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -119261,9 +119294,9 @@ cLf cLf cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -119517,16 +119550,16 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf shs -bwC +dUc jQS hAL jQS @@ -119544,8 +119577,8 @@ tVV jQS ucG jQS -bwC -bwC +dUc +dUc shs cLf cLf @@ -119773,13 +119806,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf shs @@ -120030,13 +120063,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -120288,11 +120321,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -120546,9 +120579,9 @@ cLf cLf cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -120802,11 +120835,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -121058,13 +121091,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf fZF @@ -121315,13 +121348,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf fZF @@ -121345,7 +121378,7 @@ jQS jQS jQS fZF -bwC +dUc shs cLf cLf @@ -121573,11 +121606,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -121831,9 +121864,9 @@ cLf cLf cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf @@ -121859,7 +121892,7 @@ wTs jQS jQS fZF -bwC +dUc shs cLf cLf @@ -122087,11 +122120,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -122343,13 +122376,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc dUc dUc fZF @@ -122600,13 +122633,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc dUc dUc fZF @@ -122617,11 +122650,11 @@ jQS jQS jQS jQS -pXV +gmm pXV hNP pXV -pXV +uak jQS jQS jQS @@ -122858,11 +122891,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -122873,20 +122906,20 @@ fZF fZF jQS jQS -kOL -kOL +xna +xna fsV bfX -kOL -kOL -kOL +xna +xna +xna jQS jQS fZF fZF fZF fZF -bwC +dUc cLf cLf cLf @@ -123116,34 +123149,34 @@ cLf cLf cLf cLf -bwC +dUc cLf -bwC +dUc cLf cLf cLf cLf cLf cLf -bwC +dUc cLf fZF jQS jQS eFJ -kOL -kOL +xna +xna tBC -kOL -kOL -qEr +xna +xna +xna jQS jQS fZF tyd cLf -bwC -bwC +dUc +dUc cLf cLf cLf @@ -123372,26 +123405,26 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf cLf shs shs -bwC +dUc fZF jQS jQS -gmm -kOL -mvh +xna +xna +qEr hFN -mvh +qEr khJ sug jQS @@ -123628,13 +123661,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -123644,12 +123677,12 @@ cLf fZF jQS jQS -kOL -kOL -kOL -kOL -kOL -kOL +xna +xna +xna +xna +xna +xna lHp jQS jQS @@ -123885,13 +123918,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -123902,7 +123935,7 @@ fZF jQS jQS jQS -uak +xna oVV dJM jvV @@ -124143,11 +124176,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -124167,7 +124200,7 @@ jQS jQS jQS fZF -bwC +dUc cLf cLf cLf @@ -124401,9 +124434,9 @@ cLf cLf cLf cLf -bwC -bwC -bwC +dUc +dUc +dUc cLf cLf cLf @@ -124413,7 +124446,7 @@ cLf cLf cLf cLf -bwC +dUc fZF jQS jQS @@ -124424,7 +124457,7 @@ jQS jQS fZF cLf -bwC +dUc cLf cLf cLf @@ -124657,11 +124690,11 @@ cLf cLf cLf cLf -bwC -bwC +dUc +dUc nmN -bwC -bwC +dUc +dUc cLf cLf cLf @@ -124670,7 +124703,7 @@ cLf cLf cLf cLf -bwC +dUc cLf fZF fZF @@ -124681,7 +124714,7 @@ fZF fZF cLf cLf -bwC +dUc cLf cLf cLf @@ -124914,11 +124947,11 @@ cLf cLf cLf cLf -bwC +dUc xUA uuN oJv -bwC +dUc cLf cLf cLf @@ -124927,18 +124960,18 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -125171,11 +125204,11 @@ cLf cLf cLf cLf -bwC -bwC +dUc +dUc nmN -bwC -bwC +dUc +dUc cLf cLf cLf @@ -125184,18 +125217,18 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -125429,9 +125462,9 @@ cLf cLf cLf cLf -bwC -bwC -bwC +dUc +dUc +dUc cLf cLf cLf @@ -125444,11 +125477,11 @@ shs shs cLf cLf -bwC +dUc cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -125685,11 +125718,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -125941,13 +125974,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -126198,13 +126231,13 @@ cLf cLf cLf cLf -bwC +dUc cLf cLf cLf cLf cLf -bwC +dUc cLf cLf cLf @@ -126456,11 +126489,11 @@ cLf cLf cLf nmN -bwC -bwC +dUc +dUc cLf -bwC -bwC +dUc +dUc nmN cLf cLf @@ -126714,9 +126747,9 @@ cLf cLf cLf cLf -bwC -bwC -bwC +dUc +dUc +dUc cLf cLf cLf @@ -142949,9 +142982,9 @@ hhX hhX hhX hhX -hhX -hhX -hhX +hen +hen +hen hhX hhX hhX @@ -143206,9 +143239,9 @@ hhX hhX hhX hhX -hhX -hhX -hhX +hen +hen +hen hhX hhX hhX @@ -143463,9 +143496,9 @@ vxX hhX hhX fZF -hhX -hhX -hhX +hen +hen +hen fZF hhX hhX @@ -143720,9 +143753,9 @@ fYe fYe qHE fZF -hhX -hhX -hhX +hen +hen +hen fZF hhX hhX @@ -144479,7 +144512,7 @@ cts caH lCA pux -kVh +eYP iJm mUQ mUQ @@ -145504,10 +145537,10 @@ vxX iJm iJm eYP -kVh +eYP qMK tAk -pxU +gHN iJm iJm fnh @@ -145706,11 +145739,11 @@ hhX hhX hhX hhX -hhX -hhX -hhX -hhX -hhX +hen +hen +hen +hen +hen vxX vxX vxX @@ -145963,11 +145996,11 @@ hhX hhX hhX hhX -hhX -fNW -hhX -hhX -hhX +hen +fOe +hen +hen +hen vxX vxX vxX @@ -145994,7 +146027,7 @@ wli aJP iaN sdc -dXh +sdc fVZ fVZ sdc @@ -146220,11 +146253,11 @@ hhX hhX hhX hhX -hhX -hhX -hhX -hhX -hhX +hen +hen +hen +hen +hen vxX vxX vxX @@ -146790,10 +146823,10 @@ hvw jiP uKm yew -stk +jSE hgS jHQ -jHQ +stk jHQ bhV jHQ @@ -147302,9 +147335,9 @@ vxX unk ibx vxX -vxX +unk siU -spU +pxU kYT bUZ vzG @@ -147559,10 +147592,10 @@ wOU vxX ibx vxX -vxX -fnh +bGk +bGk spU -kYT +bGk rRy cOb ycI @@ -147817,9 +147850,9 @@ vxX taj vxX bGk -kYT +kVh rEV -kYT +bGk bGk ncR ncR @@ -156262,10 +156295,10 @@ vxX vxX unk unk -kkx -kkx -kkx -kkx +cxg +cxg +cxg +cxg unk unk vxX @@ -156518,12 +156551,12 @@ vxX vxX vxX unk -kkx -kkx -kkx +cxg +cxg +cxg nQT -kkx -kkx +cxg +cxg unk jCD jCD @@ -156775,12 +156808,12 @@ dsG vxX vxX unk -kkx +cxg joM joM joM joM -kkx +cxg eOx wMY apb @@ -157032,12 +157065,12 @@ dsG dsG dsG any -kkx +cxg joM joM joM joM -kkx +cxg eOx fFt cTH @@ -157289,12 +157322,12 @@ fYe fYe fYe unk -kkx -kkx -kkx -kkx -kkx -kkx +cxg +cxg +cxg +cxg +cxg +cxg unk jCD jCD @@ -157547,10 +157580,10 @@ fYe fYe unk unk -kkx -kkx -kkx -kkx +cxg +cxg +cxg +cxg unk unk vxX @@ -157582,7 +157615,7 @@ oKx oKx dzu oKx -oKx +fuZ mCn cUv nsY @@ -167027,7 +167060,7 @@ oID hhX hhX hhX -kkx +cxg srs bFS bFS @@ -167283,7 +167316,7 @@ hhX oID jVV jVV -kkx +cxg pvT srs upF @@ -167540,8 +167573,8 @@ hhX oID hhX hhX -kkx -kkx +cxg +cxg srs mCt riQ @@ -167798,7 +167831,7 @@ oID hhX hhX hhX -kkx +cxg srs riQ bNI @@ -168607,7 +168640,7 @@ vxX vxX uet gMk -pti +tui gMk gMk gMk @@ -169082,7 +169115,7 @@ hhX oID hhX hhX -kkx +cxg mQE mQE gwF @@ -169338,8 +169371,8 @@ hhX hhX hhX hhX -kkx -kkx +cxg +cxg vxX imZ mQE @@ -169595,7 +169628,7 @@ hhX hhX hhX hhX -kkx +cxg pvT vxX vxX @@ -169871,7 +169904,7 @@ wYj pdo sJT vxX -pvT +uif hhX hhX fYe @@ -170723,9 +170756,9 @@ vxX vxX vxX vxX -hhX -hhX -hhX +hen +hen +hen jVV hhX hhX @@ -172183,7 +172216,7 @@ vAB kWb kWb kWb -cxg +fYe hhX hhX hhX @@ -172547,7 +172580,7 @@ uJc mml mml eLU -nsH +jVV oID hhX hhX @@ -172696,7 +172729,7 @@ kWb kWb kWb kWb -cxg +fYe hhX hhX hhX @@ -179647,8 +179680,8 @@ uif mNZ mNZ fYe -hhX -hhX +hen +hen fYe mNZ mNZ @@ -179904,9 +179937,9 @@ fYe fYe fYe fYe -hhX -hhX -hhX +hen +hen +hen mNZ mNZ mNZ @@ -180161,10 +180194,10 @@ mNZ mNZ mNZ fYe -hhX -hhX -hhX -hCu +hen +hen +hen +umg hhX jVV hhX @@ -180418,9 +180451,9 @@ hhX hhX hhX hhX -hhX -hhX -hhX +hen +hen +hen hhX hhX jVV @@ -180675,9 +180708,9 @@ hhX hhX hhX hhX -hhX -hhX -hhX +hen +hen +hen hhX hhX uOY @@ -180713,9 +180746,9 @@ vxX vxX vxX vxX -cxg -cxg -cxg +fYe +fYe +fYe hhX hhX hhX @@ -186097,9 +186130,9 @@ tIs tPE lKY bBJ -wmO -uHz -uHz +mol +bqs +bqs uHz wmO rmi @@ -186354,9 +186387,9 @@ uVe tPE avA iox -wmO -uHz -uHz +mol +bqs +bqs uHz wmO xGG @@ -186611,9 +186644,9 @@ qZX tPE lKY oIu -wmO -uHz -uHz +mol +bqs +bqs uHz wmO bLI @@ -186867,10 +186900,10 @@ jQS iXn ieU cWL -tMz -jQS -wmO -inz +mol +orY +mol +jTw jgA jQS tMz @@ -187125,9 +187158,9 @@ jEt gdM rdn dck -wnA -wnA -wnA +orY +orY +orY wnA viT bUl @@ -187381,10 +187414,10 @@ fSi fXW jej krO -krO -krO -krO -krO +bLJ +bLJ +bLJ +bLJ krO krO krO @@ -188409,13 +188442,13 @@ hhX hhX fZF jQS -gQq -gQq -gQq -ybO -gQq -gQq -gQq +orY +orY +orY +bqs +orY +orY +orY jQS fZF hhX @@ -188666,13 +188699,13 @@ hhX hhX fZF jQS -gQq -gQq -gQq -ybO -gQq -gQq -gQq +orY +orY +orY +bqs +orY +orY +orY jQS fZF hhX @@ -188923,13 +188956,13 @@ hhX hhX fZF jQS -gQq -gQq -gQq -gQq -gQq -gQq -gQq +orY +orY +orY +orY +orY +orY +orY jQS fZF hhX @@ -189180,13 +189213,13 @@ hhX hhX fZF jQS -gQq -gQq -gQq -gQq -gQq -gQq -gQq +orY +orY +orY +orY +orY +orY +orY jQS fZF hhX @@ -189438,11 +189471,11 @@ hhX fZF jQS jQS -gQq -gQq -gQq -gQq -gQq +orY +orY +orY +orY +orY jQS jQS fZF diff --git a/_maps/modular_generic/ice_l_storage.dmm b/_maps/modular_generic/ice_l_storage.dmm index 5914568908c58..6aca9bec648fb 100644 --- a/_maps/modular_generic/ice_l_storage.dmm +++ b/_maps/modular_generic/ice_l_storage.dmm @@ -38,9 +38,7 @@ /turf/closed/wall/ice, /area/template_noop) "i" = ( -/obj/structure/railing{ - layer = 4 - }, +/obj/structure/railing, /obj/effect/decal/cleanable/dirt, /obj/machinery/space_heater, /turf/open/floor/plastic, @@ -122,17 +120,13 @@ }, /obj/item/trash/can, /obj/effect/decal/cleanable/dirt, -/obj/structure/railing{ - layer = 4 - }, +/obj/structure/railing, /turf/open/floor/plastic, /area/template_noop) "y" = ( /obj/structure/closet/crate/bin, /obj/effect/decal/cleanable/dirt, -/obj/structure/railing{ - layer = 4 - }, +/obj/structure/railing, /turf/open/floor/plastic, /area/template_noop) "z" = ( @@ -164,9 +158,7 @@ /turf/open/floor/plating, /area/template_noop) "D" = ( -/obj/structure/railing{ - layer = 4 - }, +/obj/structure/railing, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plastic, /area/template_noop) @@ -203,9 +195,7 @@ /obj/structure/chair/plastic{ dir = 1 }, -/obj/structure/railing{ - layer = 4 - }, +/obj/structure/railing, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plastic, /area/template_noop) diff --git a/_maps/shuttles/cargo_delta.dmm b/_maps/shuttles/cargo_delta.dmm index 75b2b6cb23270..c12c7c1787841 100644 --- a/_maps/shuttles/cargo_delta.dmm +++ b/_maps/shuttles/cargo_delta.dmm @@ -79,7 +79,8 @@ }, /obj/effect/decal/cleanable/dirt, /obj/docking_port/mobile/supply{ - dir = 4 + dir = 4; + port_direction = 8 }, /obj/effect/mapping_helpers/airlock/access/all/supply/general, /turf/open/floor/plating, diff --git a/_maps/shuttles/cargo_kilo.dmm b/_maps/shuttles/cargo_kilo.dmm index 948369f49085a..e0dc7be8bef72 100644 --- a/_maps/shuttles/cargo_kilo.dmm +++ b/_maps/shuttles/cargo_kilo.dmm @@ -91,7 +91,8 @@ /obj/effect/decal/cleanable/dirt, /obj/effect/mapping_helpers/airlock/access/all/supply/general, /obj/docking_port/mobile/supply{ - dir = 4 + dir = 4; + port_direction = 8 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/supply) diff --git a/_maps/shuttles/cargo_pubby.dmm b/_maps/shuttles/cargo_pubby.dmm index c3d064bc59d17..4ff003c70b3a1 100644 --- a/_maps/shuttles/cargo_pubby.dmm +++ b/_maps/shuttles/cargo_pubby.dmm @@ -140,7 +140,8 @@ /area/shuttle/supply) "R" = ( /obj/docking_port/mobile/supply{ - dir = 4 + dir = 4; + port_direction = 8 }, /obj/machinery/door/airlock/shuttle{ name = "Supply Shuttle Airlock" diff --git a/_maps/shuttles/emergency_birdboat.dmm b/_maps/shuttles/emergency_birdboat.dmm index 41860e3beabd8..fd82a5b0e2bd7 100644 --- a/_maps/shuttles/emergency_birdboat.dmm +++ b/_maps/shuttles/emergency_birdboat.dmm @@ -158,7 +158,8 @@ /obj/docking_port/mobile/emergency{ dir = 8; name = "Birdboat emergency escape shuttle"; - port_direction = 4 + port_direction = 2; + preferred_direction = 8 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) diff --git a/_maps/shuttles/emergency_birdshot.dmm b/_maps/shuttles/emergency_birdshot.dmm index aef9231e620ed..bbcad398257f1 100644 --- a/_maps/shuttles/emergency_birdshot.dmm +++ b/_maps/shuttles/emergency_birdshot.dmm @@ -9,9 +9,6 @@ /obj/machinery/light/small/directional/west, /turf/open/floor/mineral/titanium/white, /area/shuttle/escape) -"ax" = ( -/turf/closed/wall/mineral/titanium/overspace, -/area/shuttle/escape) "aQ" = ( /obj/effect/decal/cleanable/insectguts, /turf/open/floor/mineral/plastitanium/red, @@ -235,7 +232,8 @@ }, /obj/docking_port/mobile/emergency{ dir = 8; - name = "birdshot emergency shuttle" + name = "birdshot emergency shuttle"; + port_direction = 4 }, /turf/open/floor/mineral/titanium, /area/shuttle/escape) @@ -287,7 +285,7 @@ "mU" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/shuttle/escape) "no" = ( /obj/item/trash/popcorn/caramel, /turf/open/floor/mineral/titanium, @@ -552,7 +550,7 @@ /obj/structure/lattice, /obj/item/stack/rods/two, /turf/template_noop, -/area/template_noop) +/area/shuttle/escape) "Ay" = ( /obj/item/shard{ pixel_y = 19 @@ -1001,15 +999,15 @@ nQ nQ nQ nQ -ax +LX LX rZ LX -ax +LX nQ nQ nQ -ax +LX rZ LX LX @@ -1018,7 +1016,7 @@ LX LX LX LX -ax +LX nQ "} (2,1,1) = {" @@ -1030,7 +1028,7 @@ nQ nQ nQ nQ -ax +LX LX LX ON @@ -1058,7 +1056,7 @@ nQ nQ nQ nQ -ax +LX rZ rZ LX @@ -1086,7 +1084,7 @@ vk (4,1,1) = {" nQ nQ -ax +LX LX LX LX @@ -1185,13 +1183,13 @@ ye LX mU nQ -ax +LX LX LX hF LX LX -ax +LX nQ nQ mU @@ -1200,9 +1198,9 @@ hF LX rZ LX -ax +LX nQ -ax +LX LX nQ nQ @@ -1309,13 +1307,13 @@ eR LX mU nQ -ax +LX LX LX hF LX LX -ax +LX nQ nQ mU @@ -1324,7 +1322,7 @@ hF LX rZ LX -ax +LX nQ bo mU @@ -1396,7 +1394,7 @@ ST (14,1,1) = {" nQ nQ -ax +LX LX LX LX @@ -1430,7 +1428,7 @@ nQ nQ nQ nQ -ax +LX rZ rZ LX @@ -1464,7 +1462,7 @@ nQ nQ nQ nQ -ax +LX LX LX dv @@ -1497,15 +1495,15 @@ nQ nQ nQ nQ -ax +LX Xy rZ Xy -ax +LX nQ nQ nQ -ax +LX ll LX lp @@ -1514,6 +1512,6 @@ LX rZ rZ rZ -ax +LX nQ "} diff --git a/_maps/shuttles/emergency_casino.dmm b/_maps/shuttles/emergency_casino.dmm index a3280acfeb7b4..c1332f0ef1ded 100644 --- a/_maps/shuttles/emergency_casino.dmm +++ b/_maps/shuttles/emergency_casino.dmm @@ -753,7 +753,6 @@ /area/shuttle/escape) "wv" = ( /obj/structure/tank_dispenser/oxygen{ - layer = 2.7; pixel_x = -1; pixel_y = 2 }, diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index 8045930388cef..c111505c14789 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -857,7 +857,6 @@ "sz" = ( /obj/machinery/shuttle_manipulator{ desc = "A holographic display of the cruise shuttle we're on right now."; - layer = 2.7; max_integrity = 99999; name = "shuttle holographic display" }, @@ -1345,7 +1344,6 @@ density = 1; icon = 'icons/obj/machines/shuttle_manipulator.dmi'; icon_state = "hologram_on"; - layer = 2.8; light_color = "#2cb2e8"; light_range = 2; max_integrity = 7500; @@ -1358,7 +1356,6 @@ desc = "This is the shuttle we're on. It's amazing what Nanotrasen can do once they actually put more than ten seconds of effort into their projects."; icon = 'icons/obj/machines/shuttle_manipulator.dmi'; icon_state = "hologram_whiteship"; - layer = 4; light_color = "#2cb2e8"; light_range = 7; max_integrity = 75000; diff --git a/_maps/shuttles/emergency_fame.dmm b/_maps/shuttles/emergency_fame.dmm index 368de11546d7a..919a8651b378a 100644 --- a/_maps/shuttles/emergency_fame.dmm +++ b/_maps/shuttles/emergency_fame.dmm @@ -605,7 +605,6 @@ /area/shuttle/escape/brig) "zc" = ( /obj/structure/tank_dispenser/oxygen{ - layer = 2.7; pixel_x = -1; pixel_y = 2 }, diff --git a/_maps/shuttles/emergency_fish.dmm b/_maps/shuttles/emergency_fish.dmm index 3726a7399d9ab..b99aa01b096bf 100644 --- a/_maps/shuttles/emergency_fish.dmm +++ b/_maps/shuttles/emergency_fish.dmm @@ -311,21 +311,18 @@ "qO" = ( /obj/structure/table/wood, /obj/item/fishing_line{ - layer = 4; pixel_x = 6; pixel_y = 3 }, -/obj/item/fishing_hook{ - layer = 5; - pixel_y = 3 - }, /obj/item/bait_can/worm{ - pixel_x = -5; pixel_y = 13 }, /obj/effect/turf_decal/tile/dark/half/contrasted{ dir = 4 }, +/obj/item/fishing_hook{ + pixel_y = 3 + }, /turf/open/floor/wood/tile, /area/shuttle/escape) "rj" = ( @@ -586,12 +583,7 @@ /area/shuttle/escape) "IM" = ( /obj/structure/table/wood, -/obj/item/fishing_hook{ - layer = 5; - pixel_y = 3 - }, /obj/item/fishing_line{ - layer = 4; pixel_x = 6; pixel_y = 3 }, @@ -602,6 +594,9 @@ /obj/effect/turf_decal/tile/dark/half/contrasted{ dir = 4 }, +/obj/item/fishing_hook{ + pixel_y = 3 + }, /turf/open/floor/wood/tile, /area/shuttle/escape) "Jh" = ( diff --git a/_maps/shuttles/emergency_humpback.dmm b/_maps/shuttles/emergency_humpback.dmm index f4c50bf6b84ec..f76d06925a343 100644 --- a/_maps/shuttles/emergency_humpback.dmm +++ b/_maps/shuttles/emergency_humpback.dmm @@ -750,7 +750,10 @@ /obj/machinery/door/airlock/grunge{ name = "Emergency Shuttle Airlock" }, -/obj/docking_port/mobile/emergency, +/obj/docking_port/mobile/emergency{ + port_direction = 4; + preferred_direction = 2 + }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape) "UR" = ( diff --git a/_maps/shuttles/emergency_luxury.dmm b/_maps/shuttles/emergency_luxury.dmm index af17c03a0d8be..74b18ef61b4de 100644 --- a/_maps/shuttles/emergency_luxury.dmm +++ b/_maps/shuttles/emergency_luxury.dmm @@ -138,9 +138,7 @@ name = "Escape Shuttle Cell" }, /obj/effect/mapping_helpers/airlock/access/all/security/general, -/obj/machinery/scanner_gate/luxury_shuttle{ - layer = 2.6 - }, +/obj/machinery/scanner_gate/luxury_shuttle, /turf/open/indestructible/white, /area/shuttle/escape/brig) "gY" = ( @@ -340,9 +338,7 @@ /obj/structure/closet/crate/large, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/item/toy/plush/rouny{ name = "rouny plushie" }, @@ -444,9 +440,7 @@ /obj/machinery/power/shuttle_engine/heater{ dir = 8 }, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating, /area/shuttle/escape) "sH" = ( @@ -630,9 +624,7 @@ /turf/open/floor/mineral/titanium/white, /area/shuttle/escape/luxury) "Bj" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/effect/spawner/random/structure/closet_private, /turf/open/floor/iron/white/herringbone, /area/shuttle/escape/luxury) @@ -653,9 +645,7 @@ /area/shuttle/escape) "BK" = ( /obj/structure/girder, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, @@ -667,9 +657,7 @@ /turf/open/floor/iron, /area/shuttle/escape) "Ck" = ( -/obj/machinery/scanner_gate/luxury_shuttle{ - layer = 2.6 - }, +/obj/machinery/scanner_gate/luxury_shuttle, /obj/machinery/door/airlock/silver{ name = "First Class" }, @@ -695,18 +683,14 @@ dir = 2; name = "Luxurious Emergency Shuttle" }, -/obj/machinery/scanner_gate/luxury_shuttle{ - layer = 2.6 - }, +/obj/machinery/scanner_gate/luxury_shuttle, /obj/machinery/door/airlock/silver{ name = "First Class" }, /turf/open/floor/carpet/blue, /area/shuttle/escape/luxury) "Dj" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/structure/rack, /obj/effect/spawner/random/trash/soap, /turf/open/floor/iron/white/herringbone, @@ -792,9 +776,7 @@ /obj/structure/girder, /obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/iron, /area/shuttle/escape) "EZ" = ( @@ -1080,9 +1062,7 @@ /turf/open/floor/carpet/green, /area/shuttle/escape/luxury) "Rk" = ( -/obj/machinery/scanner_gate/luxury_shuttle{ - layer = 2.6 - }, +/obj/machinery/scanner_gate/luxury_shuttle, /obj/effect/mapping_helpers/airlock/access/all/security/general, /obj/machinery/door/airlock/security/glass{ name = "Escape Shuttle Cell" diff --git a/_maps/shuttles/emergency_meta.dmm b/_maps/shuttles/emergency_meta.dmm index 5a4ca2c48326f..f1064a77fdaf0 100644 --- a/_maps/shuttles/emergency_meta.dmm +++ b/_maps/shuttles/emergency_meta.dmm @@ -160,7 +160,6 @@ /area/shuttle/escape) "aA" = ( /obj/structure/tank_dispenser/oxygen{ - layer = 2.7; pixel_x = -1; pixel_y = 2 }, diff --git a/_maps/shuttles/emergency_meteor.dmm b/_maps/shuttles/emergency_meteor.dmm index 658c290b95684..9d05cf8cc62c4 100644 --- a/_maps/shuttles/emergency_meteor.dmm +++ b/_maps/shuttles/emergency_meteor.dmm @@ -6,9 +6,7 @@ /turf/closed/mineral/asteroid/porous, /area/shuttle/escape/meteor) "c" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /turf/open/misc/asteroid, /area/shuttle/escape/meteor) "d" = ( diff --git a/_maps/shuttles/emergency_monastery.dmm b/_maps/shuttles/emergency_monastery.dmm index dbc203630102b..da8641ee0b1d6 100644 --- a/_maps/shuttles/emergency_monastery.dmm +++ b/_maps/shuttles/emergency_monastery.dmm @@ -8,10 +8,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"af" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/turf/open/space, -/area/shuttle/escape) "ap" = ( /obj/structure/chair/wood/wings{ dir = 1 @@ -25,10 +21,6 @@ }, /turf/open/floor/carpet, /area/shuttle/escape) -"as" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/space, -/area/shuttle/escape) "aF" = ( /obj/machinery/light/small/directional/south, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ @@ -40,13 +32,6 @@ /obj/structure/grille/broken, /turf/open/space/basic, /area/shuttle/escape) -"aN" = ( -/obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, -/turf/open/space/basic, -/area/shuttle/escape) "aO" = ( /obj/structure/sign/plaques/kiddie{ desc = "It reads: PRIVATE EXHIBIT - Please inquire with library staff for guided tours."; @@ -65,19 +50,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/closed/wall, /area/shuttle/escape) -"aT" = ( -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, -/turf/open/space/basic, -/area/shuttle/escape) -"aW" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/shuttle/escape) "bb" = ( /obj/machinery/power/apc/auto_name/directional/east, /obj/structure/cable, @@ -103,9 +75,7 @@ /area/shuttle/escape) "bl" = ( /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/space/basic, /area/shuttle/escape) "bn" = ( @@ -145,13 +115,6 @@ /obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating, /area/shuttle/escape) -"bx" = ( -/obj/machinery/power/shuttle_engine/propulsion, -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, -/turf/open/floor/plating, -/area/shuttle/escape) "by" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/sign/painting/library_private{ @@ -162,13 +125,9 @@ /area/shuttle/escape) "bC" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating, /area/shuttle/escape) "bI" = ( @@ -204,6 +163,10 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /turf/open/floor/plating, /area/shuttle/escape) +"cH" = ( +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/space, +/area/shuttle/escape) "cT" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 1 @@ -378,11 +341,6 @@ /obj/effect/decal/cleanable/cobweb/cobweb2, /turf/open/floor/iron/dark, /area/shuttle/escape) -"fA" = ( -/obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/south, -/turf/open/space, -/area/shuttle/escape) "fL" = ( /obj/structure/window/reinforced/spawner/directional/east, /obj/structure/lattice, @@ -428,13 +386,6 @@ /obj/structure/window/reinforced/spawner/directional/east, /turf/open/space/basic, /area/shuttle/escape) -"hC" = ( -/obj/machinery/power/shuttle_engine/propulsion, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/turf/open/floor/plating, -/area/shuttle/escape) "hI" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 4; @@ -467,9 +418,7 @@ /obj/structure/window/reinforced/spawner/directional/north{ pixel_y = 1 }, -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/west, /turf/open/space/basic, /area/shuttle/escape) "hW" = ( @@ -495,7 +444,6 @@ "hZ" = ( /obj/structure/table/wood, /obj/item/paper_bin{ - layer = 2.9; pixel_x = -2; pixel_y = 4 }, @@ -633,9 +581,7 @@ "jt" = ( /obj/machinery/power/shuttle_engine/heater, /obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating, /area/shuttle/escape) "jx" = ( @@ -755,14 +701,15 @@ /obj/machinery/door/airlock/external/ruin, /turf/open/floor/plating, /area/shuttle/escape) -"lj" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/shuttle/escape) "lm" = ( /obj/machinery/meter, /turf/open/floor/plating, /area/shuttle/escape) +"ln" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/south, +/turf/open/space, +/area/shuttle/escape) "lB" = ( /turf/open/floor/iron/chapel{ dir = 8 @@ -790,6 +737,10 @@ }, /turf/open/floor/iron, /area/shuttle/escape) +"ml" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/turf/open/space, +/area/shuttle/escape) "mm" = ( /obj/structure/lattice/catwalk, /turf/open/space, @@ -910,12 +861,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/iron/dark, /area/shuttle/escape) -"nQ" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/turf/open/space/basic, -/area/shuttle/escape) "oa" = ( /obj/structure/chair/wood, /turf/open/floor/carpet, @@ -932,12 +877,6 @@ /obj/machinery/vending/wardrobe/curator_wardrobe, /turf/open/floor/iron/dark, /area/shuttle/escape) -"om" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/turf/open/space, -/area/shuttle/escape) "ov" = ( /obj/machinery/light/small/directional/east, /obj/machinery/camera/directional/east{ @@ -1078,7 +1017,6 @@ "qi" = ( /obj/structure/table/wood, /obj/item/paper_bin{ - layer = 2.9; pixel_x = -2; pixel_y = 4 }, @@ -1213,6 +1151,11 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) +"rZ" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/lattice, +/turf/open/space/basic, +/area/shuttle/escape) "sa" = ( /obj/structure/chair/wood{ dir = 4 @@ -1311,6 +1254,10 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/iron/dark, /area/shuttle/escape) +"ti" = ( +/obj/structure/lattice/catwalk, +/turf/open/space/basic, +/area/shuttle/escape) "tm" = ( /obj/structure/table/wood/fancy, /obj/item/storage/box/matches{ @@ -1376,6 +1323,10 @@ }, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) +"uP" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/turf/open/space, +/area/shuttle/escape) "uX" = ( /obj/machinery/power/smes, /turf/open/floor/plating, @@ -1632,7 +1583,6 @@ "yP" = ( /obj/structure/table/wood, /obj/item/reagent_containers/condiment/saltshaker{ - layer = 3.1; pixel_x = -2; pixel_y = 2 }, @@ -1662,12 +1612,9 @@ /area/shuttle/escape) "zh" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/item/stack/sheet/glass/fifty{ - layer = 4 - }, +/obj/item/stack/sheet/glass/fifty, /obj/item/stack/sheet/iron{ - amount = 20; - layer = 3.1 + amount = 20 }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4{ dir = 10 @@ -2162,9 +2109,7 @@ pixel_y = 4 }, /obj/item/reagent_containers/condiment/peppermill, -/obj/item/storage/box/ingredients/wildcard{ - layer = 3.1 - }, +/obj/item/storage/box/ingredients/wildcard, /turf/open/floor/iron, /area/shuttle/escape) "FA" = ( @@ -2412,10 +2357,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Jl" = ( -/obj/structure/window/reinforced/spawner/directional/west, -/turf/open/space, -/area/shuttle/escape) "Jp" = ( /obj/structure/table, /obj/item/crowbar, @@ -2506,8 +2447,7 @@ "JZ" = ( /obj/docking_port/mobile/emergency{ movement_force = list("KNOCKDOWN"=3,"THROW"=6); - name = "\proper a monastery with engines strapped to it"; - port_direction = 1 + name = "\proper a monastery with engines strapped to it" }, /turf/closed/mineral, /area/shuttle/escape) @@ -2664,16 +2604,6 @@ }, /turf/open/floor/iron/dark, /area/shuttle/escape) -"Ms" = ( -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, -/turf/open/space, -/area/shuttle/escape) -"Mt" = ( -/obj/structure/lattice, -/turf/open/space, -/area/shuttle/escape) "MC" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -2712,12 +2642,8 @@ /area/shuttle/escape) "Nb" = ( /obj/machinery/power/shuttle_engine/propulsion, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating, /area/shuttle/escape) "Nf" = ( @@ -2869,6 +2795,10 @@ /obj/effect/station_crash/devastating, /turf/open/floor/iron/dark, /area/shuttle/escape) +"OL" = ( +/obj/structure/lattice, +/turf/open/space, +/area/shuttle/escape) "OM" = ( /obj/item/cultivator, /turf/open/floor/grass, @@ -2886,9 +2816,7 @@ "Pb" = ( /obj/machinery/power/shuttle_engine/heater, /obj/structure/window/reinforced/spawner/directional/north, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating, /area/shuttle/escape) "Pe" = ( @@ -2974,7 +2902,6 @@ "Qj" = ( /obj/structure/table/wood, /obj/item/paper_bin{ - layer = 2.9; pixel_x = -2; pixel_y = 4 }, @@ -3254,9 +3181,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "SU" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "SV" = ( @@ -3498,9 +3423,7 @@ /area/shuttle/escape) "VF" = ( /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/west, /obj/machinery/atmospherics/components/unary/outlet_injector/on/layer2{ name = "Outlet Injector" }, @@ -3508,9 +3431,7 @@ /area/shuttle/escape) "VM" = ( /obj/machinery/mass_driver/chapelgun, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /turf/open/floor/iron/dark, /area/shuttle/escape) @@ -3632,9 +3553,7 @@ /turf/open/floor/iron/dark, /area/shuttle/escape) "Xx" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{ dir = 1 }, @@ -3750,9 +3669,7 @@ /obj/structure/window/reinforced/spawner/directional/north{ pixel_y = 1 }, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/space/basic, /area/shuttle/escape) "YZ" = ( @@ -3797,9 +3714,7 @@ /area/shuttle/escape) "Zn" = ( /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "Zr" = ( @@ -4380,8 +4295,8 @@ nr nr nr nr -om -nQ +uP +hq JG JG JG @@ -4917,7 +4832,7 @@ JG JG JG PB -lj +ti iw iw iw @@ -4999,7 +4914,7 @@ JG JG JG PB -lj +ti iw JG JG @@ -5081,10 +4996,10 @@ JG JG JG PB -lj -Mt -af -fA +ti +OL +uP +ln zE zE AJ @@ -5118,8 +5033,8 @@ nr nr nr nr -aT -aT +IM +IM JG JG JG @@ -5158,7 +5073,7 @@ JG JG JG iw -Mt +OL iw iw iw @@ -5243,7 +5158,7 @@ iw JG JG dp -af +uP zE Zf zE @@ -5322,7 +5237,7 @@ JG JG JG bd -Mt +OL bT zE zE @@ -5404,7 +5319,7 @@ aH iw iw iw -as +cH zE zE jc @@ -5481,11 +5396,11 @@ JG JG "} (21,1,1) = {" -af -af -nQ -aW -nQ +uP +uP +hq +rZ +hq bl zE jc @@ -5891,7 +5806,7 @@ JG JG "} (26,1,1) = {" -as +cH zE ox bb @@ -6056,7 +5971,7 @@ JG "} (28,1,1) = {" JG -aN +jS zE wt Mf @@ -6216,7 +6131,7 @@ Ho Ho Ho jt -bx +bv "} (30,1,1) = {" JG @@ -6310,7 +6225,7 @@ LK zE LK dX -Jl +ml fm zE zE @@ -6380,17 +6295,17 @@ Ho Ho Ho Pb -hC +Ye "} (32,1,1) = {" JG JG -aT -aT -Ms -Ms -Ms -aT +IM +IM +ml +ml +ml +IM JG JG JG @@ -6477,7 +6392,7 @@ JG JG JG JG -Jl +ml fm zE zE @@ -6728,8 +6643,8 @@ JG JG JG JG -Jl -Jl +ml +ml jS zE ko @@ -6977,7 +6892,7 @@ JG JG JG JG -Mt +OL mm kJ IM diff --git a/_maps/shuttles/emergency_nature.dmm b/_maps/shuttles/emergency_nature.dmm index a1fa04c1c6a73..0f793c714753e 100644 --- a/_maps/shuttles/emergency_nature.dmm +++ b/_maps/shuttles/emergency_nature.dmm @@ -177,7 +177,6 @@ dir = 10 }, /obj/structure/tank_dispenser/oxygen{ - layer = 2.7; pixel_x = -1; pixel_y = 2 }, diff --git a/_maps/shuttles/emergency_pubby.dmm b/_maps/shuttles/emergency_pubby.dmm index f346fe323c6e4..84780e4332b9d 100644 --- a/_maps/shuttles/emergency_pubby.dmm +++ b/_maps/shuttles/emergency_pubby.dmm @@ -276,9 +276,7 @@ /area/shuttle/escape) "bd" = ( /obj/structure/window/reinforced/spawner/directional/south, -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/west, /obj/structure/table, /obj/item/food/canned/beans{ pixel_x = 3; @@ -395,15 +393,11 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "bB" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "bC" = ( -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "bD" = ( @@ -485,9 +479,7 @@ /area/shuttle/escape) "jO" = ( /obj/structure/closet/secure_closet/freezer/fridge, -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/west, /obj/item/food/butterdog, /obj/item/food/cakeslice/apple, /obj/item/food/cakeslice/brioche, @@ -548,9 +540,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/shuttle/escape/brig) "xt" = ( -/obj/structure/window/reinforced/spawner/directional/west{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/west, /turf/open/floor/plating, /area/shuttle/escape) "Br" = ( @@ -599,9 +589,7 @@ "ZM" = ( /obj/structure/table/glass, /obj/item/storage/medkit/regular, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/machinery/vending/wallmed/directional/north{ use_power = 0 }, diff --git a/_maps/shuttles/emergency_tranquility.dmm b/_maps/shuttles/emergency_tranquility.dmm index 5458e59c84316..3019f72a1d2da 100644 --- a/_maps/shuttles/emergency_tranquility.dmm +++ b/_maps/shuttles/emergency_tranquility.dmm @@ -37,8 +37,7 @@ dir = 4 }, /obj/structure/railing{ - dir = 4; - layer = 4.1 + dir = 4 }, /turf/open/floor/wood, /area/shuttle/escape) @@ -354,8 +353,7 @@ /obj/effect/turf_decal/siding/wood, /obj/structure/railing{ color = "#A47449"; - dir = 2; - layer = 3.1 + dir = 2 }, /obj/structure/table/wood, /obj/machinery/reagentgrinder{ @@ -461,8 +459,7 @@ "jl" = ( /obj/structure/railing{ color = "#A47449"; - dir = 10; - layer = 3.1 + dir = 10 }, /obj/structure/flora/bush/fullgrass/style_2, /obj/effect/turf_decal/siding/wood{ @@ -511,8 +508,7 @@ "jM" = ( /obj/structure/railing{ color = "#A47449"; - dir = 6; - layer = 3.1 + dir = 6 }, /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -537,8 +533,7 @@ }, /obj/structure/railing{ color = "#A47449"; - dir = 10; - layer = 3.1 + dir = 10 }, /obj/structure/flora/bush/fullgrass, /obj/effect/turf_decal/siding/wood{ @@ -695,8 +690,7 @@ "nA" = ( /obj/structure/railing/corner{ dir = 8; - color = "#A47449"; - layer = 3.1 + color = "#A47449" }, /obj/structure/flora/rock/pile/jungle/style_3{ pixel_x = -4 @@ -739,8 +733,7 @@ "oj" = ( /obj/structure/railing{ color = "#A47449"; - dir = 10; - layer = 3.1 + dir = 10 }, /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -767,8 +760,7 @@ }, /obj/structure/railing{ color = "#A47449"; - dir = 10; - layer = 3.1 + dir = 10 }, /turf/open/floor/grass, /area/shuttle/escape) @@ -819,8 +811,7 @@ "pf" = ( /obj/structure/railing{ color = "#A47449"; - dir = 6; - layer = 3.1 + dir = 6 }, /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -1013,8 +1004,7 @@ }, /obj/structure/railing{ color = "#A47449"; - dir = 6; - layer = 3.1 + dir = 6 }, /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -1058,9 +1048,7 @@ /area/shuttle/escape) "uR" = ( /obj/effect/turf_decal/siding/wood, -/obj/structure/railing{ - layer = 3.1 - }, +/obj/structure/railing, /turf/open/floor/wood/large, /area/shuttle/escape) "uT" = ( @@ -1211,16 +1199,14 @@ dir = 4 }, /obj/structure/railing{ - dir = 4; - layer = 4.1 + dir = 4 }, /turf/open/floor/wood, /area/shuttle/escape) "ya" = ( /obj/structure/railing/corner{ dir = 8; - color = "#A47449"; - layer = 3.1 + color = "#A47449" }, /obj/structure/flora/bush/large/style_2{ pixel_x = -6; @@ -1283,8 +1269,7 @@ }, /obj/structure/railing{ color = "#A47449"; - dir = 6; - layer = 3.1 + dir = 6 }, /obj/effect/turf_decal/weather/dirt{ dir = 5 @@ -1315,8 +1300,7 @@ dir = 4 }, /obj/structure/railing{ - dir = 4; - layer = 4.1 + dir = 4 }, /obj/effect/turf_decal/siding/wood/corner{ dir = 8 @@ -1515,8 +1499,7 @@ "Ci" = ( /obj/structure/railing{ color = "#A47449"; - dir = 6; - layer = 3.1 + dir = 6 }, /obj/effect/turf_decal/siding/wood{ dir = 6 @@ -1563,8 +1546,7 @@ }, /obj/structure/railing{ color = "#A47449"; - dir = 2; - layer = 3.1 + dir = 2 }, /obj/machinery/chem_master/condimaster{ desc = "Used to separate out liquids - useful for purifying botanical extracts. Also dispenses condiments."; @@ -1796,9 +1778,7 @@ /turf/open/floor/iron/dark/small, /area/shuttle/escape) "Hq" = ( -/obj/structure/railing{ - layer = 3.1 - }, +/obj/structure/railing, /obj/effect/turf_decal/siding/dark, /obj/effect/turf_decal/trimline/blue/line, /turf/open/floor/iron/dark/small, @@ -1944,9 +1924,7 @@ /turf/open/water, /area/shuttle/escape) "Kk" = ( -/obj/structure/railing{ - layer = 3.1 - }, +/obj/structure/railing, /obj/effect/turf_decal/siding/dark, /obj/effect/turf_decal/trimline/blue/line, /obj/machinery/light/floor, @@ -2011,8 +1989,7 @@ }, /obj/structure/railing{ color = "#A47449"; - dir = 4; - layer = 3.2 + dir = 4 }, /obj/structure/flora/bush/flowers_pp, /obj/structure/flora/bush/flowers_pp/style_2, @@ -2122,8 +2099,7 @@ /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/railing{ color = "#A47449"; - dir = 8; - layer = 3.2 + dir = 8 }, /turf/open/floor/grass, /area/shuttle/escape) @@ -2176,8 +2152,7 @@ "Oj" = ( /obj/structure/railing{ color = "#A47449"; - dir = 10; - layer = 3.1 + dir = 10 }, /obj/effect/turf_decal/siding/wood{ dir = 10 @@ -2357,8 +2332,7 @@ /obj/structure/table/wood, /obj/item/flashlight/lamp/green{ pixel_x = 7; - pixel_y = 14; - layer = 3.1 + pixel_y = 14 }, /obj/item/paper_bin{ pixel_x = -5; @@ -2377,15 +2351,11 @@ /area/shuttle/escape) "Sl" = ( /obj/effect/turf_decal/siding/wood, -/obj/structure/railing{ - layer = 3.1 - }, +/obj/structure/railing, /turf/open/floor/wood/tile, /area/shuttle/escape) "St" = ( -/obj/structure/railing{ - layer = 3.1 - }, +/obj/structure/railing, /obj/machinery/computer/communications{ dir = 8 }, @@ -2454,7 +2424,6 @@ /area/shuttle/escape) "Tw" = ( /obj/structure/statue/sandstone/venus{ - layer = 4; anchored = 1 }, /turf/open/floor/wood, @@ -2540,8 +2509,7 @@ /obj/effect/turf_decal/siding/wood, /obj/structure/railing{ color = "#A47449"; - dir = 2; - layer = 3.1 + dir = 2 }, /obj/machinery/microwave, /obj/structure/table/wood, diff --git a/_maps/shuttles/emergency_venture.dmm b/_maps/shuttles/emergency_venture.dmm index 6b72f22dc295a..29ad2a695d191 100644 --- a/_maps/shuttles/emergency_venture.dmm +++ b/_maps/shuttles/emergency_venture.dmm @@ -647,7 +647,6 @@ /area/shuttle/escape) "Jz" = ( /obj/structure/tank_dispenser/oxygen{ - layer = 2.7; pixel_x = -1; pixel_y = 2 }, diff --git a/_maps/shuttles/emergency_wawa.dmm b/_maps/shuttles/emergency_wawa.dmm index 01d03aa7c5d9c..458ffa8a17902 100644 --- a/_maps/shuttles/emergency_wawa.dmm +++ b/_maps/shuttles/emergency_wawa.dmm @@ -111,7 +111,7 @@ /obj/structure/lattice, /obj/structure/marker_beacon/burgundy, /turf/template_noop, -/area/template_noop) +/area/shuttle/escape) "au" = ( /obj/structure/chair/comfy/shuttle{ dir = 1 @@ -210,8 +210,7 @@ }, /obj/structure/fans/tiny/shield{ max_integrity = 400; - name = "recycling shield"; - layer = 2.61 + name = "recycling shield" }, /turf/open/floor/plating, /area/shuttle/escape) @@ -573,8 +572,7 @@ }, /obj/structure/fans/tiny/shield{ max_integrity = 400; - name = "recycling shield"; - layer = 2.61 + name = "recycling shield" }, /turf/open/floor/plating, /area/shuttle/escape) @@ -728,7 +726,7 @@ "Pw" = ( /obj/structure/lattice, /turf/template_noop, -/area/template_noop) +/area/shuttle/escape) "QP" = ( /obj/machinery/conveyor/auto/inverted{ dir = 1 diff --git a/_maps/shuttles/ert_bounty.dmm b/_maps/shuttles/ert_bounty.dmm index 03be12a36a771..b1fbf895fa586 100644 --- a/_maps/shuttles/ert_bounty.dmm +++ b/_maps/shuttles/ert_bounty.dmm @@ -18,7 +18,9 @@ movement_force = list("KNOCKDOWN"=0,"THROW"=0); name = "hunter shuttle"; rechargeTime = 1800; - shuttle_id = "huntership" + shuttle_id = "huntership"; + port_direction = 4; + preferred_direction = 4 }, /obj/structure/fans/tiny, /turf/open/floor/pod/dark, @@ -205,7 +207,9 @@ /area/shuttle/hunter) "H" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ - dir = 8 + dir = 8; + y_offset = 6; + x_offset = 3 }, /turf/open/floor/pod/dark, /area/shuttle/hunter) diff --git a/_maps/shuttles/escape_pod_large.dmm b/_maps/shuttles/escape_pod_large.dmm index d803a681abe8c..9877e44bf1241 100644 --- a/_maps/shuttles/escape_pod_large.dmm +++ b/_maps/shuttles/escape_pod_large.dmm @@ -58,7 +58,9 @@ /obj/machinery/door/airlock/titanium{ name = "Shuttle Airlock" }, -/obj/docking_port/mobile/monastery, +/obj/docking_port/mobile/monastery{ + port_direction = 2 + }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/pod_1) "W" = ( diff --git a/_maps/shuttles/ferry_base.dmm b/_maps/shuttles/ferry_base.dmm index 69a4d6fa18cec..42366d373d8d3 100644 --- a/_maps/shuttles/ferry_base.dmm +++ b/_maps/shuttles/ferry_base.dmm @@ -48,7 +48,7 @@ dir = 8; shuttle_id = "ferry"; name = "ferry shuttle"; - port_direction = 2 + preferred_direction = 4 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) diff --git a/_maps/shuttles/ferry_lighthouse.dmm b/_maps/shuttles/ferry_lighthouse.dmm index 18197d61f1401..5bb79a3e56ed7 100644 --- a/_maps/shuttles/ferry_lighthouse.dmm +++ b/_maps/shuttles/ferry_lighthouse.dmm @@ -142,7 +142,7 @@ dir = 8; shuttle_id = "ferry"; name = "The Lighthouse"; - port_direction = 2 + preferred_direction = 4 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/transport) @@ -192,8 +192,7 @@ "bb" = ( /obj/machinery/conveyor{ dir = 1; - id = "garbage"; - layer = 2.5 + id = "garbage" }, /turf/open/floor/wood, /area/shuttle/transport) diff --git a/_maps/shuttles/ferry_meat.dmm b/_maps/shuttles/ferry_meat.dmm index fc986bcda5030..a4fd0c9e19b74 100644 --- a/_maps/shuttles/ferry_meat.dmm +++ b/_maps/shuttles/ferry_meat.dmm @@ -105,7 +105,7 @@ dir = 8; shuttle_id = "ferry"; name = "ferry shuttle"; - port_direction = 2 + preferred_direction = 4 }, /turf/open/floor/iron/freezer, /area/shuttle/transport) diff --git a/_maps/shuttles/hunter_bounty.dmm b/_maps/shuttles/hunter_bounty.dmm index 3087fa376fee5..ba752de932b9b 100644 --- a/_maps/shuttles/hunter_bounty.dmm +++ b/_maps/shuttles/hunter_bounty.dmm @@ -149,7 +149,9 @@ /area/shuttle/hunter) "I" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ - dir = 8 + dir = 8; + y_offset = 6; + x_offset = 3 }, /turf/open/floor/pod/dark, /area/shuttle/hunter) @@ -232,7 +234,9 @@ movement_force = list("KNOCKDOWN"=0,"THROW"=0); name = "hunter shuttle"; rechargeTime = 1800; - shuttle_id = "huntership" + shuttle_id = "huntership"; + port_direction = 4; + preferred_direction = 4 }, /obj/structure/fans/tiny, /obj/effect/mapping_helpers/airlock/access/all/hunter, diff --git a/_maps/shuttles/hunter_mi13_foodtruck.dmm b/_maps/shuttles/hunter_mi13_foodtruck.dmm new file mode 100644 index 0000000000000..5fe7324e8e83b --- /dev/null +++ b/_maps/shuttles/hunter_mi13_foodtruck.dmm @@ -0,0 +1,998 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/machinery/door/poddoor/shutters{ + id = "foodtruck_backroom_shutters"; + dir = 4 + }, +/turf/open/floor/plating, +/area/shuttle/hunter/mi13_foodtruck) +"ab" = ( +/obj/machinery/computer/operating{ + dir = 1 + }, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"af" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/surgery_tray/full, +/obj/structure/sign/poster/contraband/hacking_guide/directional/south, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"ag" = ( +/obj/structure/tank_dispenser/oxygen, +/obj/structure/cable/layer1, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"ah" = ( +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/access/any/syndicate/general, +/obj/machinery/door/airlock/vault{ + normalspeed = 0; + name = "Secure Door"; + desc = "An imposing looking door. It looks reinforced." + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"aj" = ( +/obj/machinery/power/shuttle_engine/heater, +/turf/closed/wall/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"al" = ( +/obj/structure/railing{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"ao" = ( +/obj/structure/sign/poster/contraband/bountyhunters/directional/north, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"bY" = ( +/turf/open/floor/iron/kitchen/small, +/area/shuttle/hunter/mi13_foodtruck) +"cm" = ( +/obj/structure/lattice, +/obj/structure/marker_beacon/burgundy, +/turf/template_noop, +/area/shuttle/hunter/mi13_foodtruck) +"dg" = ( +/obj/structure/closet/secure_closet/freezer/empty, +/obj/machinery/light/dim/directional/east, +/obj/item/food/fries{ + pixel_x = -2; + pixel_y = -8 + }, +/obj/item/food/fries{ + pixel_y = -11 + }, +/obj/item/food/fries{ + pixel_x = 3; + pixel_y = -7 + }, +/obj/item/food/fries{ + pixel_x = -3; + pixel_y = -3 + }, +/obj/item/food/fries{ + pixel_x = -3 + }, +/obj/item/food/fries{ + pixel_x = 5; + pixel_y = -2 + }, +/obj/item/food/burger/cheese{ + pixel_y = 7; + pixel_x = -5 + }, +/obj/item/food/burger/cheese{ + pixel_y = 7; + pixel_x = 5 + }, +/obj/item/food/fishandchips{ + pixel_y = -8 + }, +/turf/open/floor/iron/kitchen/small, +/area/shuttle/hunter/mi13_foodtruck) +"dB" = ( +/obj/machinery/vending/clothing, +/obj/structure/sign/poster/official/high_class_martini/directional/north, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"dC" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/binoculars{ + pixel_y = 10 + }, +/obj/item/traitor_bug{ + pixel_y = 6; + pixel_x = 6 + }, +/obj/item/traitor_bug{ + pixel_y = 3; + pixel_x = -5 + }, +/obj/item/storage/box/zipties{ + pixel_y = -4; + pixel_x = 4 + }, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"dJ" = ( +/obj/machinery/computer/records/security/syndie, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"eA" = ( +/obj/machinery/vending/medical/syndicate_access/cybersun, +/obj/machinery/airalarm/directional/west, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"eP" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/light/dim/directional/north, +/obj/structure/cable/layer1, +/obj/machinery/button/door{ + id = "foodtruck_right_window"; + pixel_x = 6; + name = "SHUTTERS - R" + }, +/obj/machinery/button/door{ + id = "foodtruck_left_window"; + pixel_x = -6; + name = "SHUTTERS - L" + }, +/obj/item/reagent_containers/cup/glass/mug/tea{ + pixel_x = 8; + pixel_y = -9 + }, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"fo" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"gc" = ( +/obj/structure/closet/crate/cardboard/mothic, +/obj/item/storage/box/mothic_rations{ + pixel_x = -6; + pixel_y = 7 + }, +/obj/item/storage/box/mothic_rations{ + pixel_x = 8; + pixel_y = 7 + }, +/obj/item/storage/box/mothic_rations{ + pixel_x = -6; + pixel_y = -1 + }, +/obj/item/storage/box/mothic_rations{ + pixel_x = 8; + pixel_y = -1 + }, +/obj/item/poster/random_contraband{ + poster_type = /obj/structure/sign/poster/contraband/mothic_rations; + name = "mothic ration poster"; + desc = "A rolled up poster."; + pixel_y = 7 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"gs" = ( +/obj/structure/cable/layer1, +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark_red{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"gv" = ( +/obj/structure/closet/crate/freezer, +/obj/machinery/button/door/directional/west{ + name = "External Shutter Switch"; + id = "foodtruck_backroom_shutters" + }, +/obj/item/pizzabox/margherita{ + pixel_y = 5 + }, +/obj/item/food/burrito{ + pixel_x = -9; + pixel_y = 2 + }, +/obj/item/food/burrito{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/food/burrito{ + pixel_x = 8; + pixel_y = 2 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"hB" = ( +/obj/machinery/power/shuttle_engine/propulsion, +/turf/template_noop, +/area/shuttle/hunter/mi13_foodtruck) +"iO" = ( +/obj/structure/noticeboard/directional/north, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"jb" = ( +/obj/machinery/light/dim/directional/south, +/obj/structure/cable/layer1, +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/obj/machinery/power/terminal{ + dir = 1; + cable_layer = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"jc" = ( +/obj/machinery/light/floor, +/obj/structure/table/reinforced, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"jw" = ( +/obj/structure/closet/cardboard, +/obj/structure/cable/layer1, +/obj/item/cardboard_cutout, +/obj/item/cardboard_cutout, +/obj/item/cardboard_cutout, +/obj/item/cardboard_cutout, +/obj/item/storage/crayons, +/obj/item/soap/syndie{ + pixel_y = -7 + }, +/obj/item/mop{ + pixel_y = 2; + pixel_x = 4 + }, +/obj/effect/spawner/random/trash/bucket, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"jA" = ( +/obj/effect/turf_decal/siding/dark_red/corner, +/obj/item/storage/toolbox/syndicate, +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"kf" = ( +/obj/effect/turf_decal/box, +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/hunter/mi13_foodtruck) +"kj" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/ammo_box/c9mm{ + pixel_x = 5; + pixel_y = 8 + }, +/obj/item/ammo_box/magazine/m9mm/ap{ + pixel_x = -7 + }, +/obj/item/ammo_box/magazine/m9mm/ap, +/obj/item/ammo_box/magazine/m9mm/ap{ + pixel_x = 7 + }, +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"ku" = ( +/turf/closed/wall/mineral/titanium/nodiagonal, +/area/shuttle/hunter/mi13_foodtruck) +"kv" = ( +/obj/machinery/door/window/brigdoor/right/directional/east{ + req_access = list("syndicate") + }, +/obj/effect/turf_decal/caution/stand_clear{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"lp" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark_red{ + dir = 8 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"lX" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/structure/sign/poster/contraband/kss13/directional/north, +/obj/machinery/reagentgrinder, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"mT" = ( +/obj/machinery/power/smes/magical{ + cable_layer = 1; + name = "cybersun power storage unit"; + desc = "A high-capacity superconducting magnetic energy storage (SMES) unit. Produces power via a top-secret method." + }, +/obj/structure/cable/layer1, +/turf/open/floor/circuit/red, +/area/shuttle/hunter/mi13_foodtruck) +"nh" = ( +/obj/structure/sign/poster/ripped/directional/south, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"oA" = ( +/obj/structure/railing{ + dir = 8 + }, +/obj/effect/turf_decal/arrows{ + pixel_y = 16 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"pQ" = ( +/obj/structure/cable/layer1, +/obj/machinery/computer/shuttle/hunter{ + req_access = list("syndicate") + }, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"pU" = ( +/obj/structure/chair/comfy/shuttle/tactical{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark_red/end{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"pZ" = ( +/obj/structure/railing/corner{ + dir = 1 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"sN" = ( +/obj/structure/table/reinforced, +/obj/machinery/computer/security/telescreen/entertainment/directional/north, +/obj/structure/railing{ + dir = 4 + }, +/obj/item/reagent_containers/condiment/vinegar{ + pixel_y = 9 + }, +/obj/item/reagent_containers/condiment/mayonnaise{ + pixel_x = 5; + pixel_y = 6 + }, +/obj/item/reagent_containers/condiment/ketchup{ + pixel_x = -5; + pixel_y = 6 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -2; + pixel_y = -3 + }, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_y = -4; + pixel_x = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"te" = ( +/obj/structure/fans/tiny, +/obj/docking_port/stationary{ + dir = 4; + dwidth = 7; + height = 15; + name = "Deep Space"; + shuttle_id = "huntership_home"; + width = 13 + }, +/obj/docking_port/mobile{ + name = "food truck"; + rechargeTime = 1800; + dir = 4; + shuttle_id = "huntership"; + port_direction = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + id = "foodtruck_shutters"; + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/hunter/mi13_foodtruck) +"tW" = ( +/obj/structure/table/optable, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"ua" = ( +/obj/structure/sign/poster/contraband/donk_co/directional/south, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"ui" = ( +/obj/structure/table/reinforced, +/obj/item/food/classic_hard_shell_taco{ + pixel_x = 2; + pixel_y = 10 + }, +/obj/item/food/classic_hard_shell_taco{ + pixel_y = 8 + }, +/obj/item/food/classic_hard_shell_taco{ + pixel_y = 6; + pixel_x = -2 + }, +/obj/item/food/classic_hard_shell_taco{ + pixel_y = 4; + pixel_x = -4 + }, +/obj/item/food/classic_hard_shell_taco{ + pixel_y = 2; + pixel_x = -6 + }, +/obj/item/food/classic_hard_shell_taco{ + pixel_x = -8 + }, +/obj/structure/sign/poster/contraband/eat/directional/east, +/turf/open/floor/iron/kitchen/small, +/area/shuttle/hunter/mi13_foodtruck) +"uq" = ( +/obj/effect/mob_spawn/ghost_role/human/fugitive/mi13/chef{ + dir = 4 + }, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"we" = ( +/obj/machinery/power/apc/auto_name/directional/south{ + cable_layer = 1 + }, +/obj/structure/cable/layer1, +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 1 + }, +/obj/effect/mapping_helpers/apc/syndicate_access, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"wA" = ( +/obj/structure/lattice/catwalk, +/turf/template_noop, +/area/shuttle/hunter/mi13_foodtruck) +"xg" = ( +/obj/structure/chair/comfy/shuttle/tactical{ + dir = 1 + }, +/obj/structure/cable/layer1, +/obj/effect/turf_decal/siding/dark_red/end{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"xG" = ( +/obj/structure/railing/corner{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"zJ" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"Ak" = ( +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ + x_offset = 6; + y_offset = 1 + }, +/obj/structure/cable/layer1, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"Am" = ( +/obj/structure/lattice, +/turf/template_noop, +/area/shuttle/hunter/mi13_foodtruck) +"An" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/structure/cable/layer1, +/obj/machinery/door/poddoor{ + id = "foodtruck_right_window" + }, +/turf/open/floor/plating, +/area/shuttle/hunter/mi13_foodtruck) +"Ay" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/obj/effect/turf_decal/siding/dark_red, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"AF" = ( +/obj/structure/fans/tiny, +/obj/machinery/door/poddoor/shutters{ + id = "foodtruck_shutters"; + dir = 8 + }, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/hunter/mi13_foodtruck) +"AP" = ( +/obj/effect/turf_decal/arrows, +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"Bn" = ( +/obj/machinery/computer/crew/syndie, +/turf/open/floor/circuit/red, +/area/shuttle/hunter/mi13_foodtruck) +"CF" = ( +/obj/structure/fans/tiny, +/obj/effect/turf_decal/stripes{ + dir = 8 + }, +/obj/machinery/door/poddoor/shutters{ + id = "foodtruck_shutters"; + dir = 8 + }, +/turf/open/floor/plating, +/area/shuttle/hunter/mi13_foodtruck) +"CY" = ( +/obj/machinery/deepfryer, +/obj/structure/noticeboard/directional/north, +/turf/open/floor/iron/kitchen/small, +/area/shuttle/hunter/mi13_foodtruck) +"Dp" = ( +/obj/effect/turf_decal/arrows{ + dir = 8; + pixel_x = 16 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"Ev" = ( +/obj/effect/spawner/structure/window/reinforced/shuttle, +/obj/structure/cable/layer1, +/obj/machinery/door/poddoor{ + id = "foodtruck_left_window" + }, +/turf/open/floor/plating, +/area/shuttle/hunter/mi13_foodtruck) +"Ff" = ( +/obj/effect/turf_decal/siding/dark_red, +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"Fv" = ( +/obj/machinery/light/dim/directional/west, +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"IG" = ( +/obj/structure/marker_beacon/burgundy, +/obj/structure/lattice, +/turf/template_noop, +/area/shuttle/hunter/mi13_foodtruck) +"Jv" = ( +/obj/structure/cable/layer1, +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 1 + }, +/obj/machinery/airalarm/directional/south, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"KV" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/reagent_containers/cup/glass/mug/tea{ + pixel_x = 8; + pixel_y = 9 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = 8 + }, +/obj/item/reagent_containers/cup/beaker{ + pixel_x = -5; + pixel_y = 3 + }, +/obj/item/reagent_containers/pill/cyanide{ + pixel_y = -9; + pixel_x = -2 + }, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"Lm" = ( +/obj/machinery/vending/dinnerware, +/obj/machinery/airalarm/directional/east, +/obj/effect/mapping_helpers/airalarm/syndicate_access, +/turf/open/floor/iron/kitchen/small, +/area/shuttle/hunter/mi13_foodtruck) +"Ml" = ( +/obj/machinery/computer/camera_advanced/syndie{ + dir = 1 + }, +/turf/open/floor/circuit/red, +/area/shuttle/hunter/mi13_foodtruck) +"MZ" = ( +/obj/effect/mob_spawn/ghost_role/human/fugitive/mi13{ + dir = 4 + }, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"NJ" = ( +/obj/effect/turf_decal/siding/dark_red, +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 1 + }, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"OU" = ( +/obj/machinery/fugitive_locator, +/turf/open/floor/circuit/red, +/area/shuttle/hunter/mi13_foodtruck) +"Pq" = ( +/turf/template_noop, +/area/template_noop) +"PE" = ( +/obj/machinery/fugitive_capture, +/turf/open/floor/circuit/red, +/area/shuttle/hunter/mi13_foodtruck) +"QV" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark_red, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"RO" = ( +/obj/machinery/button/door/directional/east{ + id = "foodtruck_shutters"; + name = "External Shutter Switch" + }, +/obj/structure/table/reinforced, +/obj/item/storage/cans/sixsoda, +/turf/open/floor/iron/kitchen/small, +/area/shuttle/hunter/mi13_foodtruck) +"Sw" = ( +/obj/machinery/door/airlock/vault{ + normalspeed = 0; + name = "Secure Door"; + desc = "An imposing looking door. It looks reinforced." + }, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/effect/mapping_helpers/airlock/access/any/syndicate/general, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"SP" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/pinpointer/shuttle, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"UF" = ( +/obj/machinery/door/airlock/external{ + name = "Fire Escape"; + desc = "If you really need to escape in a hurry, try this door."; + id_tag = "foodtruck_firescape" + }, +/obj/structure/fans/tiny, +/obj/effect/mapping_helpers/airlock/access/any/syndicate/general, +/obj/effect/mapping_helpers/airlock/locked, +/obj/effect/mapping_helpers/airlock/cutaiwire, +/turf/open/floor/mineral/plastitanium, +/area/shuttle/hunter/mi13_foodtruck) +"Xc" = ( +/obj/effect/turf_decal/arrows{ + dir = 4 + }, +/obj/structure/railing/corner, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) +"XE" = ( +/obj/machinery/suit_storage_unit/syndicate{ + mod_type = null; + suit_type = /obj/item/clothing/suit/space/syndicate/black; + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black + }, +/obj/machinery/button/door/directional/east{ + id = "foodtruck_firescape"; + normaldoorcontrol = 1; + specialfunctions = 4; + pixel_y = -10; + name = "Fire Escape Bolt Switch" + }, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"Yi" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/reagent_containers/syringe{ + pixel_y = -3; + pixel_x = -5 + }, +/obj/item/reagent_containers/dropper{ + pixel_y = 6; + pixel_x = -3 + }, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_y = 6; + pixel_x = 8 + }, +/obj/item/reagent_containers/pill/cyanide{ + pixel_y = -6; + pixel_x = 10 + }, +/turf/open/floor/circuit/red/off, +/area/shuttle/hunter/mi13_foodtruck) +"YW" = ( +/obj/structure/table/reinforced, +/obj/structure/railing{ + dir = 4 + }, +/obj/effect/turf_decal/siding/dark{ + dir = 4 + }, +/turf/open/floor/mineral/titanium, +/area/shuttle/hunter/mi13_foodtruck) + +(1,1,1) = {" +Pq +Pq +Pq +Pq +Pq +ku +AF +CF +te +CF +CF +CF +ku +Pq +Pq +"} +(2,1,1) = {" +Pq +Pq +Pq +cm +Am +ku +ao +Xc +al +al +Dp +ua +ku +IG +Pq +"} +(3,1,1) = {" +Pq +Pq +Pq +Pq +wA +ku +iO +xG +oA +AP +pZ +nh +ku +aj +hB +"} +(4,1,1) = {" +cm +Ev +Ev +ku +ku +ku +sN +jc +YW +YW +jc +kv +ku +aj +hB +"} +(5,1,1) = {" +Ev +Ev +jw +MZ +zJ +Sw +bY +bY +bY +bY +bY +bY +ku +cm +Pq +"} +(6,1,1) = {" +Ev +Ak +xg +gs +Jv +ku +CY +ui +dg +Lm +bY +RO +ku +Pq +Pq +"} +(7,1,1) = {" +ku +eP +SP +mT +jb +ku +ku +ku +ku +ku +ah +kf +ku +Pq +Pq +"} +(8,1,1) = {" +An +pQ +xg +gs +we +ku +eA +jA +Fv +fo +QV +gv +ku +Pq +Pq +"} +(9,1,1) = {" +An +An +ag +XE +zJ +ah +lp +NJ +PE +OU +Ay +gc +ku +cm +Pq +"} +(10,1,1) = {" +cm +An +An +ku +UF +ku +dB +Ff +MZ +uq +Ay +tW +ku +aj +hB +"} +(11,1,1) = {" +Pq +Pq +Pq +Pq +wA +ku +dJ +pU +Ml +Bn +pU +ab +ku +aj +hB +"} +(12,1,1) = {" +Pq +Pq +Pq +cm +Am +ku +lX +KV +Yi +dC +kj +af +ku +IG +Pq +"} +(13,1,1) = {" +Pq +Pq +Pq +Pq +Pq +ku +aa +aa +aa +aa +aa +aa +ku +Pq +Pq +"} diff --git a/_maps/shuttles/hunter_psyker.dmm b/_maps/shuttles/hunter_psyker.dmm index e4b8ed5447822..980bb55212260 100644 --- a/_maps/shuttles/hunter_psyker.dmm +++ b/_maps/shuttles/hunter_psyker.dmm @@ -180,7 +180,9 @@ movement_force = list("KNOCKDOWN" = 0, "THROW" = 0); name = "hunter shuttle"; rechargeTime = 1800; - shuttle_id = "huntership" + shuttle_id = "huntership"; + port_direction = 8; + preferred_direction = 8 }, /turf/open/floor/catwalk_floor, /area/shuttle/hunter) @@ -395,7 +397,9 @@ /area/shuttle/hunter) "tT" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter/psyker{ - dir = 4 + dir = 4; + view_range = 12; + y_offset = 12 }, /obj/effect/turf_decal/box/white, /turf/open/floor/iron/dark/textured, diff --git a/_maps/shuttles/hunter_russian.dmm b/_maps/shuttles/hunter_russian.dmm index 214705cfb1719..3f3f24fee5730 100644 --- a/_maps/shuttles/hunter_russian.dmm +++ b/_maps/shuttles/hunter_russian.dmm @@ -686,7 +686,9 @@ movement_force = list("KNOCKDOWN"=0,"THROW"=0); name = "hunter shuttle"; rechargeTime = 1800; - shuttle_id = "huntership" + shuttle_id = "huntership"; + port_direction = 4; + preferred_direction = 4 }, /obj/docking_port/stationary{ dwidth = 11; @@ -724,8 +726,8 @@ "Zu" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ dir = 8; - x_offset = 0; - y_offset = 3 + x_offset = -2; + y_offset = 6 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/mineral/plastitanium/red, diff --git a/_maps/shuttles/hunter_space_cop.dmm b/_maps/shuttles/hunter_space_cop.dmm index 50e2093174d08..a215ff7091612 100644 --- a/_maps/shuttles/hunter_space_cop.dmm +++ b/_maps/shuttles/hunter_space_cop.dmm @@ -3,7 +3,7 @@ /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/hunter{ dir = 8; view_range = 7; - x_offset = 6 + x_offset = 5 }, /turf/open/floor/mineral/titanium/blue, /area/shuttle/hunter) @@ -125,7 +125,9 @@ dir = 4; name = "hunter shuttle"; rechargeTime = 1800; - shuttle_id = "huntership" + shuttle_id = "huntership"; + port_direction = 2; + preferred_direction = 4 }, /obj/machinery/door/poddoor/shutters{ id = "Interpolship" diff --git a/_maps/shuttles/labour_box.dmm b/_maps/shuttles/labour_box.dmm index f1eeb8e5b04d9..4adb12a5321b2 100644 --- a/_maps/shuttles/labour_box.dmm +++ b/_maps/shuttles/labour_box.dmm @@ -104,9 +104,7 @@ /area/shuttle/labor) "r" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating/airless, /area/shuttle/labor) "s" = ( diff --git a/_maps/shuttles/labour_delta.dmm b/_maps/shuttles/labour_delta.dmm index 62b590b8c82fc..aa4e90090d985 100644 --- a/_maps/shuttles/labour_delta.dmm +++ b/_maps/shuttles/labour_delta.dmm @@ -242,9 +242,7 @@ /area/shuttle/labor) "x" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/labor) diff --git a/_maps/shuttles/labour_generic.dmm b/_maps/shuttles/labour_generic.dmm index 82b20d6f5ed28..fe7c0b4b12ebc 100644 --- a/_maps/shuttles/labour_generic.dmm +++ b/_maps/shuttles/labour_generic.dmm @@ -99,9 +99,7 @@ /area/shuttle/labor) "r" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating/airless, /area/shuttle/labor) "s" = ( diff --git a/_maps/shuttles/mining_box.dmm b/_maps/shuttles/mining_box.dmm index c9771c932e5a2..98607ead77fc3 100644 --- a/_maps/shuttles/mining_box.dmm +++ b/_maps/shuttles/mining_box.dmm @@ -45,9 +45,7 @@ /area/shuttle/mining) "j" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating, diff --git a/_maps/shuttles/mining_common_meta.dmm b/_maps/shuttles/mining_common_meta.dmm index 0acf76371b881..f8aee42a870a7 100644 --- a/_maps/shuttles/mining_common_meta.dmm +++ b/_maps/shuttles/mining_common_meta.dmm @@ -45,9 +45,7 @@ /area/shuttle/mining) "j" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/plating, diff --git a/_maps/shuttles/mining_delta.dmm b/_maps/shuttles/mining_delta.dmm index 8b731c6f024d2..7ee1e5662e812 100644 --- a/_maps/shuttles/mining_delta.dmm +++ b/_maps/shuttles/mining_delta.dmm @@ -224,9 +224,7 @@ /area/shuttle/mining) "t" = ( /obj/machinery/power/shuttle_engine/propulsion/burst, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, /area/shuttle/mining) diff --git a/_maps/shuttles/mining_freight.dmm b/_maps/shuttles/mining_freight.dmm index 70605f222e7fd..ead08ff80ac31 100644 --- a/_maps/shuttles/mining_freight.dmm +++ b/_maps/shuttles/mining_freight.dmm @@ -106,7 +106,7 @@ /obj/effect/spawner/structure/window/reinforced/shuttle, /obj/machinery/power/shuttle_engine/heater, /turf/open/floor/plating, -/area/template_noop) +/area/shuttle/mining) "q" = ( /obj/structure/ore_box, /obj/effect/turf_decal/delivery, diff --git a/_maps/shuttles/mining_large.dmm b/_maps/shuttles/mining_large.dmm index 56cf2ef7d3333..f1c0d3a4cf2e6 100644 --- a/_maps/shuttles/mining_large.dmm +++ b/_maps/shuttles/mining_large.dmm @@ -322,9 +322,7 @@ /area/shuttle/mining/large) "G" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating/airless, /area/shuttle/mining/large) "H" = ( diff --git a/_maps/shuttles/pirate_default.dmm b/_maps/shuttles/pirate_default.dmm index b60aae281e0f8..43c72a9d2bfa3 100644 --- a/_maps/shuttles/pirate_default.dmm +++ b/_maps/shuttles/pirate_default.dmm @@ -837,8 +837,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/structure/rack{ - dir = 8; - layer = 2.9 + dir = 8 }, /obj/item/storage/box/lethalshot, /obj/item/gun/ballistic/shotgun/automatic/combat{ diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate_dutchman.dmm index b599698bc6f5c..1d1a0b0902b86 100644 --- a/_maps/shuttles/pirate_dutchman.dmm +++ b/_maps/shuttles/pirate_dutchman.dmm @@ -487,8 +487,9 @@ "xA" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ dir = 1; - x_offset = -4; - y_offset = -8 + x_offset = 7; + y_offset = -3; + view_range = 10 }, /turf/open/floor/carpet/royalblack/airless, /area/shuttle/pirate/flying_dutchman) diff --git a/_maps/shuttles/pirate_ex_interdyne.dmm b/_maps/shuttles/pirate_ex_interdyne.dmm index e5e576e3d65f9..dce984f19c993 100644 --- a/_maps/shuttles/pirate_ex_interdyne.dmm +++ b/_maps/shuttles/pirate_ex_interdyne.dmm @@ -169,7 +169,7 @@ "aF" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ dir = 4; - x_offset = -3; + x_offset = 0; y_offset = 7 }, /turf/open/floor/iron/dark, diff --git a/_maps/shuttles/pirate_geode.dmm b/_maps/shuttles/pirate_geode.dmm index afb582e432203..2f6a573aae050 100644 --- a/_maps/shuttles/pirate_geode.dmm +++ b/_maps/shuttles/pirate_geode.dmm @@ -430,8 +430,7 @@ "vY" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ dir = 8; - x_offset = 10; - y_offset = 5 + x_offset = -8 }, /obj/effect/turf_decal/weather/dirt{ dir = 3 @@ -487,7 +486,7 @@ /obj/effect/turf_decal/stripes/white/line{ dir = 8 }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/pirate) "yz" = ( /obj/structure/flora/lunar_plant/style_3, @@ -838,7 +837,7 @@ /obj/machinery/power/shuttle_engine/propulsion{ dir = 8 }, -/turf/open/floor/plating, +/turf/open/floor/plating/airless, /area/shuttle/pirate) "Pr" = ( /obj/structure/table/wood, diff --git a/_maps/shuttles/pirate_grey.dmm b/_maps/shuttles/pirate_grey.dmm index 23bc06b5dc922..22356be732c36 100644 --- a/_maps/shuttles/pirate_grey.dmm +++ b/_maps/shuttles/pirate_grey.dmm @@ -353,8 +353,9 @@ /obj/machinery/light/small/directional/west, /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ dir = 4; - x_offset = -3; - y_offset = 7 + x_offset = -5; + y_offset = 12; + view_range = 10 }, /obj/effect/decal/cleanable/dirt, /obj/machinery/firealarm/directional/south, @@ -854,7 +855,7 @@ }, /obj/effect/mapping_helpers/airlock/cutaiwire, /obj/docking_port/mobile/pirate{ - dir = 4 + dir = 8 }, /obj/structure/fans/tiny, /turf/open/floor/pod/light, @@ -1231,7 +1232,7 @@ /area/shuttle/pirate) "Pn" = ( /turf/closed/wall, -/area/template_noop) +/area/shuttle/pirate) "PM" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/spawner/random/trash/grille_or_waste, diff --git a/_maps/shuttles/pirate_irs.dmm b/_maps/shuttles/pirate_irs.dmm index e01639a9a9fe6..4fd5a8c357342 100644 --- a/_maps/shuttles/pirate_irs.dmm +++ b/_maps/shuttles/pirate_irs.dmm @@ -1027,9 +1027,7 @@ /obj/structure/railing{ dir = 10 }, -/obj/machinery/shower/directional/south{ - layer = 4 - }, +/obj/machinery/shower/directional/south, /obj/effect/turf_decal/box, /obj/structure/fluff/shower_drain, /turf/open/floor/iron/dark, @@ -1420,7 +1418,11 @@ }, /area/shuttle/pirate) "LV" = ( -/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate, +/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ + y_offset = 11; + x_offset = -4; + view_range = 10 + }, /obj/effect/turf_decal/trimline/dark_blue/filled/line{ dir = 5 }, diff --git a/_maps/shuttles/pirate_silverscale.dmm b/_maps/shuttles/pirate_silverscale.dmm index f32e70b1e451d..6d9c7537bde18 100644 --- a/_maps/shuttles/pirate_silverscale.dmm +++ b/_maps/shuttles/pirate_silverscale.dmm @@ -11,8 +11,11 @@ /turf/open/floor/pod/light, /area/shuttle/pirate) "aZ" = ( -/obj/machinery/suit_storage_unit/pirate, /obj/effect/turf_decal/bot_red, +/obj/machinery/suit_storage_unit/pirate{ + helmet_type = /obj/item/clothing/head/helmet/space/pirate/tophat; + suit_type = /obj/item/clothing/suit/space/pirate/silverscale + }, /turf/open/floor/pod/dark, /area/shuttle/pirate) "bp" = ( @@ -30,9 +33,6 @@ /turf/open/floor/pod/light, /area/shuttle/pirate) "de" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "pirateportexternal" - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -40,6 +40,9 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "pirateportexternal" + }, /turf/open/floor/pod/light, /area/shuttle/pirate) "dI" = ( @@ -51,20 +54,18 @@ anchored = 1 }, /obj/structure/cable, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, /obj/effect/turf_decal/bot, /turf/open/floor/pod/dark, /area/shuttle/pirate) "dT" = ( -/obj/item/ammo_box/strilka310{ - pixel_y = 2 +/obj/structure/table, +/obj/item/grenade/c4, +/obj/item/grenade/c4{ + pixel_x = 9 }, -/obj/item/ammo_box/strilka310, /obj/item/grenade/c4{ - pixel_x = -13 + pixel_x = -9 }, -/obj/structure/table, /turf/open/floor/iron/dark, /area/shuttle/pirate) "ei" = ( @@ -79,10 +80,6 @@ /obj/effect/turf_decal/trimline/yellow/warning, /turf/open/floor/plating/airless, /area/shuttle/pirate) -"eK" = ( -/obj/machinery/power/shuttle_engine/propulsion, -/turf/open/floor/plating/airless, -/area/shuttle/pirate) "eU" = ( /obj/structure/chair/comfy/shuttle, /turf/open/floor/carpet/royalblack, @@ -123,6 +120,14 @@ }, /turf/open/floor/iron/dark, /area/shuttle/pirate) +"gw" = ( +/mob/living/basic/bot/medbot/nukie{ + name = "Mortimer"; + faction = list("pirate"); + desc = "A lowly medibot serving as the Silverscales' live-in manservant/butler/coat rack. They recently discovered it can heal people as well." + }, +/turf/open/floor/carpet/royalblack, +/area/shuttle/pirate) "ht" = ( /obj/machinery/door/airlock/silver, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden, @@ -247,13 +252,13 @@ /turf/open/floor/plating/airless, /area/shuttle/pirate) "nY" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "pirateportexternal" - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, /obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "pirateportexternal" + }, /turf/open/floor/pod/light, /area/shuttle/pirate) "pk" = ( @@ -337,10 +342,13 @@ dir = 6 }, /turf/open/floor/plating/airless, -/area/template_noop) +/area/shuttle/pirate) "xj" = ( /obj/structure/table/glass, /obj/item/storage/medkit/brute, +/obj/item/storage/medkit/fire{ + pixel_y = 5 + }, /turf/open/floor/carpet/royalblack, /area/shuttle/pirate) "xs" = ( @@ -355,8 +363,7 @@ /area/shuttle/pirate) "xR" = ( /obj/structure/rack{ - dir = 8; - layer = 2.9 + dir = 8 }, /obj/item/melee/energy/sword/saber/purple{ pixel_y = 12 @@ -402,9 +409,6 @@ /turf/open/floor/pod/dark, /area/shuttle/pirate) "zQ" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "piratestarboardexternal" - }, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, @@ -412,6 +416,9 @@ dir = 8 }, /obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "piratestarboardexternal" + }, /turf/open/floor/pod/light, /area/shuttle/pirate) "Ae" = ( @@ -450,9 +457,6 @@ /turf/open/floor/pod/dark, /area/shuttle/pirate) "Bl" = ( -/obj/machinery/door/airlock/external/glass/ruin{ - id_tag = "piratestarboardexternal" - }, /obj/docking_port/stationary{ dir = 4; dwidth = 13; @@ -462,7 +466,7 @@ width = 26 }, /obj/docking_port/mobile/pirate{ - dir = 4; + dir = 8; launch_status = 0; movement_force = list("KNOCKDOWN"=0,"THROW"=0); name = "Silverscale Cruiser"; @@ -472,6 +476,9 @@ dir = 4 }, /obj/effect/mapping_helpers/airlock/cutaiwire, +/obj/machinery/door/airlock/external/glass/ruin{ + id_tag = "piratestarboardexternal" + }, /turf/open/floor/pod/light, /area/shuttle/pirate) "Ch" = ( @@ -500,8 +507,12 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ dir = 4 }, -/obj/machinery/airalarm/directional/north, -/obj/effect/mapping_helpers/airalarm/all_access, +/obj/machinery/button/door/directional/north{ + specialfunctions = 4; + normaldoorcontrol = 1; + name = "External Bolt Control"; + id = "piratestarboardexternal" + }, /turf/open/floor/pod/dark, /area/shuttle/pirate) "Fl" = ( @@ -544,6 +555,14 @@ }, /turf/open/floor/plating, /area/shuttle/pirate) +"Id" = ( +/obj/structure/guncase, +/obj/item/gun/energy/laser/luxurypaywall{ + projectile_damage_multiplier = 1.30; + desc = "A laser gun modified to cost 20 credits to fire. Someone on the station should have an ID that works with this thing." + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) "Ig" = ( /obj/structure/table/glass, /obj/machinery/chem_dispenser/drinks{ @@ -652,8 +671,9 @@ "Mo" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/pirate{ dir = 8; - x_offset = 10; - y_offset = 5 + x_offset = 12; + y_offset = 5; + view_range = 10 }, /turf/open/floor/iron/dark/side{ dir = 8 @@ -695,12 +715,10 @@ pixel_y = 10 }, /obj/item/reagent_containers/cup/glass/bottle/hcider{ - layer = 3.1; pixel_x = -6; pixel_y = 8 }, /obj/item/reagent_containers/cup/glass/bottle/rum{ - layer = 3.2; pixel_x = -15; pixel_y = 4 }, @@ -713,7 +731,6 @@ pixel_y = 15 }, /obj/item/reagent_containers/cup/glass/bottle/wine{ - layer = 3.1; pixel_x = 3; pixel_y = 5 }, @@ -784,18 +801,27 @@ /area/shuttle/pirate) "RO" = ( /obj/structure/rack{ - dir = 8; - layer = 2.9 - }, -/obj/item/ammo_box/strilka310, -/obj/item/ammo_box/strilka310{ - pixel_y = 3 + dir = 8 }, /obj/effect/turf_decal/bot, -/obj/item/gun/ballistic/rifle/boltaction/prime, +/obj/item/ammo_box/strilka310/phasic{ + pixel_y = -5; + pixel_x = 5 + }, +/obj/item/ammo_box/strilka310/phasic{ + pixel_x = 5 + }, +/obj/item/ammo_box/strilka310/phasic{ + pixel_x = -5; + pixel_y = -5 + }, +/obj/item/ammo_box/strilka310/phasic{ + pixel_x = -5 + }, /obj/item/gun/ballistic/rifle/boltaction/prime{ pixel_y = 4 }, +/obj/item/gun/ballistic/rifle/boltaction/prime, /turf/open/floor/pod/dark, /area/shuttle/pirate) "RU" = ( @@ -887,6 +913,8 @@ /area/shuttle/pirate) "UV" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/airalarm/directional/north, +/obj/effect/mapping_helpers/airalarm/all_access, /turf/open/floor/pod/dark, /area/shuttle/pirate) "Vw" = ( @@ -894,6 +922,18 @@ /obj/machinery/recharger, /turf/open/floor/iron/dark, /area/shuttle/pirate) +"Wd" = ( +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden{ + dir = 4 + }, +/obj/machinery/button/door/directional/south{ + id = "pirateportexternal"; + name = "External Bolt Control"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/pod/dark, +/area/shuttle/pirate) "Ww" = ( /obj/machinery/power/shuttle_engine/heater{ dir = 8 @@ -942,8 +982,7 @@ /area/shuttle/pirate) "Yj" = ( /obj/structure/rack{ - dir = 8; - layer = 2.9 + dir = 8 }, /obj/item/storage/box/lethalshot, /obj/item/storage/box/lethalshot, @@ -1022,7 +1061,7 @@ rB Ww Ww Ww -eK +Ww Ww Ww Ww @@ -1055,7 +1094,7 @@ TV rB rB dQ -Si +Wd rB aZ aZ @@ -1101,7 +1140,7 @@ fR Ox Qm wa -Qm +Id rB UV wa @@ -1193,7 +1232,7 @@ xs Ai am am -am +gw am am Ai diff --git a/_maps/shuttles/ruin_cyborg_mothership.dmm b/_maps/shuttles/ruin_cyborg_mothership.dmm index 8ee4eb11a6a32..4e0fff656e83d 100644 --- a/_maps/shuttles/ruin_cyborg_mothership.dmm +++ b/_maps/shuttles/ruin_cyborg_mothership.dmm @@ -43,9 +43,7 @@ /area/shuttle/ruin/cyborg_mothership) "dI" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) "dO" = ( @@ -232,9 +230,7 @@ /turf/open/floor/plating/airless, /area/shuttle/ruin/cyborg_mothership) "nM" = ( -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/closet/crate/preopen, /obj/effect/turf_decal/stripes/asteroid/line{ dir = 8 @@ -733,9 +729,7 @@ /area/shuttle/ruin/cyborg_mothership) "OY" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/west, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) @@ -796,9 +790,7 @@ /area/shuttle/ruin/cyborg_mothership) "SV" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/window/reinforced/spawner/directional/east, /turf/template_noop, /area/shuttle/ruin/cyborg_mothership) @@ -809,9 +801,7 @@ /area/shuttle/ruin/cyborg_mothership) "TH" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/effect/turf_decal/stripes/asteroid/line{ dir = 4 }, diff --git a/_maps/shuttles/starfury_corvette.dmm b/_maps/shuttles/starfury_corvette.dmm index 498f8198cb421..877375fa4e785 100644 --- a/_maps/shuttles/starfury_corvette.dmm +++ b/_maps/shuttles/starfury_corvette.dmm @@ -58,7 +58,9 @@ /area/shuttle/sbc_corvette) "ai" = ( /obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/corvette{ - dir = 8 + dir = 8; + y_offset = 0; + x_offset = -3 }, /obj/effect/turf_decal/stripes/red/line{ dir = 4 @@ -70,7 +72,10 @@ id_tag = "SBC_corvette_bolt"; name = "Syndicate Corvette Airlock" }, -/obj/docking_port/mobile/syndicate_corvette, +/obj/docking_port/mobile/syndicate_corvette{ + preferred_direction = 1; + port_direction = 4 + }, /obj/structure/fans/tiny, /obj/effect/mapping_helpers/airlock/access/all/syndicate/general, /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -290,8 +295,7 @@ /area/shuttle/sbc_corvette) "aO" = ( /obj/machinery/door/poddoor/preopen{ - id = "SBC_corvette_blast"; - layer = 3 + id = "SBC_corvette_blast" }, /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /turf/open/floor/plating, diff --git a/_maps/shuttles/whiteship_birdshot.dmm b/_maps/shuttles/whiteship_birdshot.dmm index f6b31535db634..ed1936e3a1cf8 100644 --- a/_maps/shuttles/whiteship_birdshot.dmm +++ b/_maps/shuttles/whiteship_birdshot.dmm @@ -361,9 +361,7 @@ /area/shuttle/abandoned/crew) "nz" = ( /obj/structure/closet/secure_closet/freezer/fridge/open, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /obj/item/food/meat/slab/synthmeat{ pixel_x = -3; pixel_y = 3 diff --git a/_maps/shuttles/whiteship_donut.dmm b/_maps/shuttles/whiteship_donut.dmm index daf150b4cdf2f..1c28cd3481875 100644 --- a/_maps/shuttles/whiteship_donut.dmm +++ b/_maps/shuttles/whiteship_donut.dmm @@ -36,9 +36,7 @@ /area/shuttle/abandoned) "aX" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating/airless, /area/shuttle/abandoned) "be" = ( diff --git a/_maps/shuttles/whiteship_meta.dmm b/_maps/shuttles/whiteship_meta.dmm index 9939b4b55ff87..1557622647809 100644 --- a/_maps/shuttles/whiteship_meta.dmm +++ b/_maps/shuttles/whiteship_meta.dmm @@ -1361,7 +1361,6 @@ pixel_y = 14 }, /obj/item/reagent_containers/condiment/enzyme{ - layer = 5; pixel_x = -5; pixel_y = 6 }, diff --git a/_maps/shuttles/whiteship_pubby.dmm b/_maps/shuttles/whiteship_pubby.dmm index db7f00e5149c6..491aac07280c5 100644 --- a/_maps/shuttles/whiteship_pubby.dmm +++ b/_maps/shuttles/whiteship_pubby.dmm @@ -82,9 +82,8 @@ /area/shuttle/abandoned) "cE" = ( /obj/effect/turf_decal/bot_white, -/obj/machinery/atmospherics/components/tank/air{ - dir = 1; - piping_layer = 4 +/obj/machinery/atmospherics/components/tank/air/layer4{ + dir = 1 }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, @@ -595,9 +594,7 @@ /area/shuttle/abandoned) "zw" = ( /obj/machinery/power/shuttle_engine/heater, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /turf/open/floor/plating/airless, /area/shuttle/abandoned) "zY" = ( diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm index dae5d84a869b4..59d6b325fdaac 100644 --- a/_maps/templates/battlecruiser_starfury.dmm +++ b/_maps/templates/battlecruiser_starfury.dmm @@ -21,8 +21,7 @@ /area/shuttle/sbc_starfury) "ad" = ( /obj/machinery/door/poddoor/preopen{ - id = "syndie_battlecruier_bridge_blast"; - layer = 3 + id = "syndie_battlecruier_bridge_blast" }, /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, @@ -409,8 +408,7 @@ /area/shuttle/sbc_starfury) "bx" = ( /obj/machinery/door/poddoor/preopen{ - id = "syndie_battlecruier_bridge_blast"; - layer = 3 + id = "syndie_battlecruier_bridge_blast" }, /obj/effect/spawner/structure/window/reinforced/plasma/plastitanium, /obj/structure/cable, @@ -989,7 +987,6 @@ /obj/structure/sign/warning/secure_area/directional/east{ desc = "A warning sign which reads 'KEEP CLEAR: SHUTTLE BAY'"; icon_state = "space"; - layer = 4; name = "KEEP CLEAR: SHUTTLE BAY" }, /obj/effect/turf_decal/stripes/red/line, @@ -999,7 +996,6 @@ /obj/structure/sign/warning/secure_area/directional/west{ desc = "A warning sign which reads 'KEEP CLEAR: SHUTTLE BAY'"; icon_state = "space"; - layer = 4; name = "KEEP CLEAR: SHUTTLE BAY" }, /obj/effect/turf_decal/stripes/red/line, @@ -1650,7 +1646,6 @@ /obj/structure/sign/warning/secure_area/directional/east{ desc = "A warning sign which reads 'KEEP CLEAR: SHUTTLE BAY'"; icon_state = "space"; - layer = 4; name = "KEEP CLEAR: SHUTTLE BAY" }, /obj/effect/turf_decal/stripes/red/line{ @@ -1691,7 +1686,6 @@ /obj/structure/sign/warning/secure_area/directional/west{ desc = "A warning sign which reads 'KEEP CLEAR: SHUTTLE BAY'"; icon_state = "space"; - layer = 4; name = "KEEP CLEAR: SHUTTLE BAY" }, /obj/effect/turf_decal/stripes/line{ @@ -2192,8 +2186,7 @@ /area/shuttle/sbc_starfury) "hZ" = ( /obj/structure/rack{ - dir = 8; - layer = 2.9 + dir = 8 }, /obj/item/gun/ballistic/automatic/m90{ pixel_x = -3; @@ -2208,8 +2201,7 @@ /area/shuttle/sbc_starfury) "ia" = ( /obj/structure/rack{ - dir = 8; - layer = 2.9 + dir = 8 }, /obj/item/gun/ballistic/shotgun/bulldog{ pixel_x = -3; @@ -2370,8 +2362,7 @@ /area/shuttle/sbc_starfury) "io" = ( /obj/structure/rack{ - dir = 8; - layer = 2.9 + dir = 8 }, /obj/item/gun/ballistic/revolver/syndicate{ pixel_x = 2; @@ -2451,8 +2442,7 @@ /area/shuttle/sbc_starfury) "ix" = ( /obj/structure/rack{ - dir = 8; - layer = 2.9 + dir = 8 }, /obj/item/storage/belt/military, /obj/item/ammo_box/magazine/m7mm, @@ -2559,8 +2549,7 @@ /area/shuttle/sbc_starfury) "iN" = ( /obj/structure/rack{ - dir = 8; - layer = 2.9 + dir = 8 }, /obj/item/mod/control/pre_equipped/elite{ pixel_x = 1; @@ -3176,7 +3165,6 @@ /obj/structure/sign/warning/secure_area/directional/north{ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; - layer = 4; name = "EXTERNAL AIRLOCK" }, /obj/effect/turf_decal/stripes/line{ @@ -3248,7 +3236,6 @@ /obj/structure/sign/warning/secure_area/directional/north{ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; - layer = 4; name = "EXTERNAL AIRLOCK" }, /obj/effect/turf_decal/stripes/line{ @@ -4887,8 +4874,7 @@ /area/shuttle/sbc_starfury) "Jl" = ( /obj/structure/rack{ - dir = 8; - layer = 2.9 + dir = 8 }, /obj/machinery/airalarm/directional/east, /obj/item/storage/belt/military, @@ -4928,8 +4914,7 @@ /area/shuttle/sbc_starfury) "JL" = ( /obj/structure/rack{ - dir = 8; - layer = 2.9 + dir = 8 }, /obj/item/card/emag{ pixel_x = -2; diff --git a/_maps/templates/holodeck_basketball.dmm b/_maps/templates/holodeck_basketball.dmm index 7af2c536439bb..3260193010956 100644 --- a/_maps/templates/holodeck_basketball.dmm +++ b/_maps/templates/holodeck_basketball.dmm @@ -9,8 +9,7 @@ /area/template_noop) "b" = ( /obj/structure/hoop{ - dir = 1; - layer = 4.1 + dir = 1 }, /obj/effect/turf_decal/tile/green/half/contrasted, /turf/open/floor/holofloor, @@ -44,9 +43,7 @@ /turf/open/floor/holofloor, /area/template_noop) "k" = ( -/obj/structure/hoop{ - layer = 3.9 - }, +/obj/structure/hoop, /obj/effect/turf_decal/tile/red/half/contrasted{ dir = 1 }, diff --git a/_maps/templates/holodeck_kobayashi.dmm b/_maps/templates/holodeck_kobayashi.dmm index babaeaac2a0d1..bb8c5c297acf1 100644 --- a/_maps/templates/holodeck_kobayashi.dmm +++ b/_maps/templates/holodeck_kobayashi.dmm @@ -5,14 +5,12 @@ "c" = ( /obj/machinery/button/massdriver/indestructible{ id = "trektorpedo1"; - layer = 3.9; name = "photon torpedo button"; pixel_x = -16; pixel_y = -5 }, /obj/machinery/button/massdriver/indestructible{ id = "trektorpedo2"; - layer = 3.9; name = "photon torpedo button"; pixel_x = 16; pixel_y = -5 @@ -131,9 +129,7 @@ /obj/structure/rack, /obj/item/clothing/under/trek/engsec, /obj/item/clothing/under/trek/engsec, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, @@ -144,9 +140,7 @@ /turf/open/floor/holofloor/plating, /area/template_noop) "J" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /obj/effect/turf_decal/tile/neutral/half/contrasted{ dir = 1 }, diff --git a/_maps/templates/holodeck_lounge.dmm b/_maps/templates/holodeck_lounge.dmm index defc5771555d5..1bcec197d7b66 100644 --- a/_maps/templates/holodeck_lounge.dmm +++ b/_maps/templates/holodeck_lounge.dmm @@ -33,9 +33,7 @@ /area/template_noop) "f" = ( /obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - layer = 3.3 - }, +/obj/item/flashlight/lamp/green, /turf/open/floor/holofloor{ dir = 9; icon_state = "wood" @@ -56,9 +54,7 @@ }, /area/template_noop) "j" = ( -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/holofloor{ dir = 9; icon_state = "wood" @@ -74,9 +70,7 @@ /area/template_noop) "l" = ( /obj/structure/chair/stool/bar/directional/south, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/holofloor{ dir = 9; icon_state = "wood" @@ -279,9 +273,7 @@ /area/template_noop) "Y" = ( /obj/structure/table/wood/shuttle_bar, -/obj/structure/window/reinforced/spawner/directional/east{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/east, /turf/open/floor/holofloor{ dir = 9; icon_state = "wood" diff --git a/_maps/templates/lazy_templates/ninja_den.dmm b/_maps/templates/lazy_templates/ninja_den.dmm index b1506b72efed5..88f4bce19d45a 100644 --- a/_maps/templates/lazy_templates/ninja_den.dmm +++ b/_maps/templates/lazy_templates/ninja_den.dmm @@ -1691,7 +1691,6 @@ pixel_y = 4 }, /obj/item/reagent_containers/condiment/enzyme{ - layer = 5; pixel_x = 10; pixel_y = 2 }, @@ -2040,9 +2039,7 @@ /obj/item/food/grown/cabbage, /obj/item/food/grown/cherries, /obj/item/food/grown/cherries, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /obj/item/food/grown/redbeet, /turf/open/floor/catwalk_floor, /area/centcom/central_command_areas/holding) diff --git a/_maps/templates/lazy_templates/nukie_base.dmm b/_maps/templates/lazy_templates/nukie_base.dmm index bc136b886becf..60c5b1dcb5825 100644 --- a/_maps/templates/lazy_templates/nukie_base.dmm +++ b/_maps/templates/lazy_templates/nukie_base.dmm @@ -1487,9 +1487,7 @@ /obj/item/food/grown/tomato, /obj/item/food/grown/tomato, /obj/item/food/grown/tomato, -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /obj/item/storage/fancy/egg_box, /obj/item/storage/fancy/egg_box, /obj/item/reagent_containers/condiment/milk, diff --git a/_maps/templates/lazy_templates/wizard_den.dmm b/_maps/templates/lazy_templates/wizard_den.dmm index 2415fe227c6b0..887e1c0817639 100644 --- a/_maps/templates/lazy_templates/wizard_den.dmm +++ b/_maps/templates/lazy_templates/wizard_den.dmm @@ -328,11 +328,8 @@ /turf/open/floor/iron, /area/centcom/wizard_station) "qg" = ( +/obj/structure/railing, /obj/structure/railing{ - layer = 3.1 - }, -/obj/structure/railing{ - layer = 3.1; dir = 1 }, /turf/open/floor/engine/cult, @@ -511,9 +508,7 @@ /turf/open/floor/plastic, /area/centcom/wizard_station) "yX" = ( -/obj/structure/railing{ - layer = 3.1 - }, +/obj/structure/railing, /obj/structure/railing/corner{ dir = 4 }, diff --git a/_maps/templates/shelter_2.dmm b/_maps/templates/shelter_2.dmm index b12848b01daf6..38a742b85fd53 100644 --- a/_maps/templates/shelter_2.dmm +++ b/_maps/templates/shelter_2.dmm @@ -62,9 +62,7 @@ /turf/open/floor/pod, /area/misc/survivalpod) "n" = ( -/obj/structure/window/reinforced/survival_pod/spawner/directional/west{ - layer = 3 - }, +/obj/structure/window/reinforced/survival_pod/spawner/directional/west, /obj/machinery/door/window/survival_pod/left/directional/north, /turf/open/floor/carpet/black, /area/misc/survivalpod) diff --git a/_maps/virtual_domains/README.md b/_maps/virtual_domains/README.md index 6e9abc6556825..f0a8a1ebfd216 100644 --- a/_maps/virtual_domains/README.md +++ b/_maps/virtual_domains/README.md @@ -1,11 +1,12 @@ # Making new virtual domains ## REQUIRED: -1. One way that the encrypted cache can spawn. This can be from a mob drop, a landmark (place a few, it'll pick one), or a signable landmark if you have a points system. +1. One way that the encrypted cache can spawn. This can be from a mob drop, a landmark (place a few, it'll pick one), or a signal landmark if you have a points system. 2. Place a virtual domain baseturf helper in each area. 3. If you're using modular safehouses, ensure that the map has ONE tile marked with the safehouse modular map loader (and set the KEY). it will need an open 7x6 area. 4. Placing a safehouse area is redundant, but it will ensure there is power in the starting safehouse. 5. Create the dm file that defines the map qualities. You can use the existing ones as a template. +6. Place a virtual domain baseturf helper in each area. ## Converting an existing map 1. Create a new map using the existing map's size - give yourself enough room to enclose it with a binary wall. There's no need for any space outside of it, so ensure that it fits and is enclosed, nothing outside of this. @@ -18,7 +19,7 @@ You shouldn't need to fully enclose your map in 15 tiles of binary filler. Using For areas, ideally just one on the map and one for the safehouse. Vdoms should never last so long as to need individual area power and atmos unless you're specifically going for a gimmick. -Use modular mob segments! Use modular map segments! Add some variety to your maps! Just make sure you've set your map to have "is_modular" afterwards. +Make it modular: Add modular map and mob segments! It adds variety. Just make sure you've set your map to have "is_modular" afterwards. Adding some open tile padding around the safehouse is a good touch. About 7 tiles West/East for the visual effect of a larger map. diff --git a/_maps/virtual_domains/beach_bar.dmm b/_maps/virtual_domains/beach_bar.dmm index 6368168416193..5e1c6f753b8ac 100644 --- a/_maps/virtual_domains/beach_bar.dmm +++ b/_maps/virtual_domains/beach_bar.dmm @@ -491,9 +491,7 @@ /area/virtual_domain/fullbright) "xR" = ( /obj/structure/window/reinforced/spawner/directional/east, -/obj/structure/window/reinforced/spawner/directional/north{ - layer = 2.9 - }, +/obj/structure/window/reinforced/spawner/directional/north, /obj/structure/chair/stool/directional/south, /obj/item/storage/backpack/duffelbag, /obj/item/clothing/under/shorts/red, @@ -685,9 +683,7 @@ /turf/closed/wall/mineral/sandstone, /area/virtual_domain/fullbright) "Em" = ( -/obj/item/reagent_containers/condiment/enzyme{ - layer = 5 - }, +/obj/item/reagent_containers/condiment/enzyme, /obj/item/reagent_containers/cup/beaker{ pixel_x = 5 }, diff --git a/_maps/virtual_domains/island_brawl.dmm b/_maps/virtual_domains/island_brawl.dmm new file mode 100644 index 0000000000000..2c8a12c6c5793 --- /dev/null +++ b/_maps/virtual_domains/island_brawl.dmm @@ -0,0 +1,12259 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"al" = ( +/obj/structure/flora/coconuts{ + pixel_x = -5; + pixel_y = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"as" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"aw" = ( +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"aA" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"aD" = ( +/obj/item/storage/medkit/regular{ + pixel_y = 15; + pixel_x = -2 + }, +/obj/structure/table/glass, +/obj/item/emergency_bed{ + pixel_y = 6 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"aE" = ( +/obj/structure/chair/stool/directional/south, +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"aQ" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/sailor, +/turf/open/floor/wood, +/area/virtual_domain) +"aY" = ( +/obj/structure/table/wood, +/obj/item/tape{ + pixel_y = 7; + pixel_x = 11 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = -3; + pixel_y = -2 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"aZ" = ( +/obj/structure/table/wood, +/obj/item/food/grown/watermelon{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/item/food/watermelonslice, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ba" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"bb" = ( +/obj/item/circular_saw{ + pixel_y = 4 + }, +/obj/item/scalpel{ + pixel_y = 15 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"bp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"bx" = ( +/obj/machinery/defibrillator_mount/directional/west, +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + dir = 4; + name = "medical bed" + }, +/obj/machinery/iv_drip{ + pixel_y = 21; + pixel_x = -4 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"bD" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/item/reagent_containers/cup/soda_cans/melon_soda{ + pixel_y = 13; + pixel_x = -9 + }, +/obj/item/fishing_rod{ + pixel_x = 8; + pixel_y = -6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"bE" = ( +/turf/open/floor/wood, +/area/virtual_domain) +"bK" = ( +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"bT" = ( +/obj/item/cigbutt{ + pixel_y = -4; + pixel_x = 2 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"bX" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"bY" = ( +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"cc" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/vending/cigarette/beach, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"ce" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plating, +/area/virtual_domain) +"cg" = ( +/obj/machinery/medical_kiosk, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ch" = ( +/obj/machinery/recharge_station, +/obj/machinery/light/directional/east, +/turf/open/floor/carpet/cyan, +/area/virtual_domain) +"cp" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ + pixel_x = 15 + }, +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"cr" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/north{ + id = "beach_room_9"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/claymore/cutlass{ + desc = "A piratey, foam sword used by kids to train themselves in the business of \"negotiating\" the transfer of treasure."; + force = 0; + name = "foam cutlass"; + throwforce = 0 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"ct" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"cB" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/pirate, +/turf/open/floor/wood, +/area/virtual_domain) +"cC" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/virtual_domain) +"cE" = ( +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"cH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Room 7"; + id_tag = "beach_room_7" + }, +/turf/open/floor/wood, +/area/virtual_domain) +"cK" = ( +/obj/item/reagent_containers/cup/glass/bottle/wine{ + pixel_y = 16; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 3; + pixel_x = -8 + }, +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 10; + pixel_x = 6 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"cO" = ( +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"cW" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/carpet/cyan, +/area/virtual_domain) +"db" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 11"; + id_tag = "beach_room_11" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/virtual_domain) +"de" = ( +/obj/effect/turf_decal/sand, +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"dj" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Hotel's Facilities" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"dl" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/bbqsauce{ + pixel_y = 13; + pixel_x = 3 + }, +/obj/item/reagent_containers/condiment/hotsauce{ + pixel_y = 9; + pixel_x = -3 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"dp" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"du" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"dv" = ( +/obj/structure/table, +/obj/item/wrench{ + pixel_y = 4 + }, +/obj/item/storage/toolbox/emergency, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"dA" = ( +/obj/structure/table/bronze, +/obj/item/paper_bin/carbon{ + pixel_y = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"dB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"dD" = ( +/obj/item/trash/can{ + pixel_y = -9; + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"dG" = ( +/obj/effect/turf_decal/siding/blue, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"dH" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood, +/area/virtual_domain) +"dS" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/item/table_clock{ + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"dW" = ( +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" + }, +/turf/open/floor/wood, +/area/virtual_domain) +"dX" = ( +/obj/item/toy/seashell{ + pixel_y = -5 + }, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"dY" = ( +/obj/structure/table/wood/poker, +/obj/item/stack/spacecash/c100{ + pixel_y = 5 + }, +/obj/item/toy/cards/deck{ + pixel_y = 13; + pixel_x = -5 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"ee" = ( +/obj/structure/table/reinforced, +/obj/item/defibrillator/loaded{ + pixel_y = 7 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"ef" = ( +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"eh" = ( +/obj/structure/table/wood/fancy, +/obj/effect/turf_decal/tile/dark_red/full, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -13; + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = 7; + pixel_y = 8 + }, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/fullbright) +"en" = ( +/turf/open/floor/eighties, +/area/virtual_domain) +"ev" = ( +/obj/structure/mineral_door/sandstone{ + name = "Sandcastle" + }, +/obj/effect/turf_decal/sand/plating, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ew" = ( +/obj/effect/landmark/bitrunning/cache_goal_turf, +/obj/effect/landmark/bitrunning/loot_signal, +/turf/open/indestructible/binary, +/area/virtual_domain/protected_space/fullbright) +"eH" = ( +/turf/open/misc/beach/coast{ + dir = 9 + }, +/area/virtual_domain/fullbright) +"eJ" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"eK" = ( +/turf/closed/wall/mineral/wood, +/area/virtual_domain/fullbright) +"eM" = ( +/obj/item/trash/can{ + pixel_y = -5; + pixel_x = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"eO" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 8; + pixel_x = -3 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"eP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/food_cart, +/turf/open/floor/plating, +/area/virtual_domain) +"fe" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -2; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"fg" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/wall/mineral/wood, +/area/virtual_domain) +"fv" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = -9 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"fH" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 8; + pixel_x = 6 + }, +/obj/item/pen/blue{ + pixel_x = -11; + pixel_y = 2 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"fI" = ( +/turf/open/misc/beach/sand, +/area/virtual_domain/protected_space/fullbright) +"fJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain) +"fL" = ( +/obj/machinery/computer/order_console/cook, +/turf/open/floor/wood/large, +/area/virtual_domain) +"fY" = ( +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/window/reinforced/spawner/directional/south, +/obj/item/binoculars{ + pixel_y = 20 + }, +/obj/item/megaphone{ + pixel_y = 2; + pixel_x = 1 + }, +/obj/structure/table/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"gc" = ( +/obj/structure/table/bronze, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"gf" = ( +/obj/machinery/button/door/directional/south{ + id = "beach_room_5"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"gi" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/item/stack/arcadeticket{ + pixel_y = 12; + pixel_x = -16 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"gs" = ( +/obj/structure/closet/crate, +/obj/item/clothing/suit/hooded/carp_costume, +/obj/item/clothing/head/hooded/carp_hood, +/obj/item/toy/plush/carpplushie, +/obj/item/toy/plush/shark, +/turf/open/floor/eighties, +/area/virtual_domain) +"gw" = ( +/turf/open/floor/carpet/cyan, +/area/virtual_domain) +"gA" = ( +/obj/effect/turf_decal/sand{ + density = 1 + }, +/obj/effect/decal/fakelattice, +/turf/open/floor/pod/light{ + density = 1 + }, +/area/virtual_domain/fullbright) +"gB" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/plastic, +/area/virtual_domain) +"gC" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -5; + pixel_y = -5 + }, +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"gH" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/wood/large, +/area/virtual_domain) +"gI" = ( +/obj/item/storage/toolbox/fishing{ + pixel_x = 2; + pixel_y = -13 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"gK" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/hos/double{ + name = "bedsheet"; + desc = "A bedsheet from the beach hotel." + }, +/turf/open/floor/carpet, +/area/virtual_domain) +"gL" = ( +/turf/open/misc/beach/coast/corner, +/area/virtual_domain/fullbright) +"gN" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"gP" = ( +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"gV" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 25 + }, +/obj/structure/flora/coconuts{ + pixel_x = -7; + pixel_y = 7 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"hh" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/shovel{ + pixel_y = 15; + pixel_x = -8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ho" = ( +/obj/structure/chair/stool/bar/directional/west, +/turf/open/floor/wood/large, +/area/virtual_domain) +"hu" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/misc/beach/sand, +/area/virtual_domain/protected_space/fullbright) +"hA" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/fullupgrade{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"hB" = ( +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = -12 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"hD" = ( +/obj/effect/decal/cleanable/oil, +/obj/machinery/button/door/directional/south{ + id = "BeachGarage" + }, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"hM" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/button/door/directional/south{ + id = "BeachBoats" + }, +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"hT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/mapping_helpers/broken_floor, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/power/smes/full, +/turf/open/floor/plating, +/area/virtual_domain) +"hZ" = ( +/obj/structure/table/bronze, +/obj/item/storage/bag/tray, +/turf/open/floor/wood/large, +/area/virtual_domain) +"ii" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ij" = ( +/turf/open/misc/beach/coast{ + dir = 10 + }, +/area/virtual_domain/fullbright) +"ik" = ( +/obj/structure/dresser, +/obj/machinery/digital_clock/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"il" = ( +/obj/structure/chair/plastic, +/obj/item/fishing_rod{ + pixel_x = 11; + pixel_y = -8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"io" = ( +/obj/structure/railing{ + dir = 10 + }, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 9; + pixel_x = 6 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"iy" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/chair/stool/directional/south, +/obj/item/clothing/glasses/sunglasses{ + pixel_y = -2; + pixel_x = 2 + }, +/obj/item/bikehorn/airhorn{ + pixel_y = -15; + pixel_x = -13 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"iF" = ( +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = -11; + pixel_y = 9 + }, +/obj/item/phone{ + pixel_y = 9; + pixel_x = 8 + }, +/turf/open/floor/carpet, +/area/virtual_domain) +"iP" = ( +/obj/structure/chair/plastic, +/obj/item/clothing/head/collectable/paper{ + desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from fire, Curators, and ocean waves."; + pixel_y = -4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"iQ" = ( +/obj/machinery/button/door/directional/north{ + id = "beach_room_3"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"iU" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"iY" = ( +/obj/item/storage/bag/tray, +/obj/item/food/grown/watermelon{ + pixel_y = 4; + pixel_x = -1 + }, +/obj/effect/turf_decal/stripes/red/box, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"jb" = ( +/obj/structure/tank_holder/extinguisher{ + pixel_y = 11 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"jm" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/light/small/directional/west, +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/plating, +/area/virtual_domain) +"jn" = ( +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 + }, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"jp" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/neck/necklace/dope, +/obj/item/clothing/suit/jacket/letterman, +/turf/open/floor/wood, +/area/virtual_domain) +"jq" = ( +/obj/structure/musician/piano, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"jr" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 10; + pixel_x = 7 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"jw" = ( +/obj/machinery/space_heater, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"jK" = ( +/obj/machinery/reagentgrinder{ + pixel_y = 15; + pixel_x = -1 + }, +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = 12; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"jL" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"jP" = ( +/turf/open/indestructible/binary, +/area/virtual_domain/protected_space/fullbright) +"jV" = ( +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"jW" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/floor/wood/large, +/area/virtual_domain) +"ka" = ( +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ke" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"ky" = ( +/obj/machinery/vending/snack, +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"kD" = ( +/obj/machinery/door/airlock/maintenance, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/plating, +/area/virtual_domain) +"kI" = ( +/obj/effect/turf_decal/sand, +/turf/closed/wall/mineral/wood, +/area/virtual_domain) +"kJ" = ( +/obj/machinery/shower/directional/south, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"kL" = ( +/obj/structure/billboard/space_cola, +/obj/effect/turf_decal/siding/dark_red, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"kN" = ( +/obj/effect/turf_decal/sand/plating, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"lc" = ( +/obj/machinery/space_heater, +/obj/machinery/button/door/directional/north{ + id = "beach_room_2"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"lh" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/toolbox/mechanical/old, +/turf/open/floor/plating, +/area/virtual_domain) +"lk" = ( +/obj/effect/turf_decal/siding/dark_red/corner, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"lx" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain/fullbright) +"lz" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"lA" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"lF" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/o2{ + pixel_y = 17; + pixel_x = -1 + }, +/obj/item/storage/medkit/brute{ + pixel_y = 23; + pixel_x = -1 + }, +/obj/item/food/lollipop{ + pixel_y = 8; + pixel_x = 12 + }, +/obj/item/food/lollipop{ + pixel_y = 5; + pixel_x = 12 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -9; + pixel_y = 9 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"lG" = ( +/obj/item/toy/seashell{ + pixel_y = 11; + pixel_x = -7 + }, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"lI" = ( +/obj/structure/table/wood/poker, +/turf/open/floor/wood/large, +/area/virtual_domain) +"lJ" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/cup/beaker/large{ + pixel_y = 7 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"lP" = ( +/obj/structure/chair, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"lS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"lU" = ( +/obj/machinery/door/airlock/security/glass{ + name = "Temporary Holding Cell" + }, +/obj/effect/mapping_helpers/airlock/unres{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock/access/all/security/entrance, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"lW" = ( +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"mi" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 24 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"mv" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"mx" = ( +/obj/machinery/door/airlock/wood{ + name = "Arcade" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"mJ" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -10; + pixel_x = -5 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -2; + pixel_x = 9 + }, +/obj/item/stack/sheet/mineral/sandstone/thirty{ + pixel_y = -4; + pixel_x = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"mL" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/airlock/wood{ + name = "Tropical Kitchen" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"mP" = ( +/obj/structure/chair/plastic{ + dir = 8 + }, +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_y = 10; + pixel_x = -17 + }, +/obj/item/fishing_rod{ + pixel_x = -13; + pixel_y = 2 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"mV" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"mW" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"nc" = ( +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/virtual_domain/fullbright) +"nk" = ( +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" + }, +/obj/structure/railing/corner/end/flip{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"nR" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"nX" = ( +/obj/structure/table/wood, +/obj/item/melee/baseball_bat{ + pixel_y = 3; + pixel_x = 6 + }, +/obj/item/clothing/glasses/blindfold/white{ + pixel_y = 7; + pixel_x = -5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"oa" = ( +/turf/open/misc/beach/coast{ + dir = 1 + }, +/area/virtual_domain/fullbright) +"ob" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"og" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain) +"oq" = ( +/obj/structure/table/wood, +/obj/item/food/grown/watermelon{ + pixel_y = 13; + pixel_x = 6 + }, +/obj/item/food/grown/watermelon{ + pixel_y = 8; + pixel_x = -4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"os" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 12; + pixel_x = -7 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ot" = ( +/turf/template_noop, +/area/template_noop) +"ow" = ( +/obj/structure/reagent_dispensers/watertank, +/turf/open/floor/wood/large, +/area/virtual_domain) +"oC" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = 13 + }, +/turf/open/floor/carpet/blue, +/area/virtual_domain/fullbright) +"oE" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/glasses/heat, +/obj/item/clothing/head/cowboy/brown, +/turf/open/floor/wood, +/area/virtual_domain) +"oJ" = ( +/obj/item/flashlight/flare/torch{ + pixel_x = -11; + pixel_y = -6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"oQ" = ( +/obj/structure/table/bronze, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 2 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"oX" = ( +/obj/effect/baseturf_helper/virtual_domain, +/turf/closed/indestructible/binary, +/area/virtual_domain/fullbright) +"oZ" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"pj" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 12; + pixel_x = -10 + }, +/obj/item/camera{ + pixel_y = 4; + pixel_x = 1 + }, +/obj/item/camera_film{ + pixel_y = -11; + pixel_x = -10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"pq" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_syndie, +/turf/open/floor/wood, +/area/virtual_domain) +"pv" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood/large, +/area/virtual_domain) +"py" = ( +/turf/open/floor/iron/stairs, +/area/virtual_domain/fullbright) +"pz" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/under/costume/lobster, +/obj/item/clothing/head/costume/lobsterhat, +/turf/open/floor/wood, +/area/virtual_domain) +"pC" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"pE" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Rooms" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"pJ" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_red, +/turf/open/floor/wood, +/area/virtual_domain) +"pV" = ( +/obj/item/stack/arcadeticket{ + pixel_y = 5; + pixel_x = 13 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"pX" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"qa" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"qb" = ( +/obj/machinery/button/door/directional/west{ + id = "beach_room_1"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"qc" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/vending/clothing, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"qB" = ( +/obj/item/toy/seashell{ + pixel_x = 5; + pixel_y = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"qH" = ( +/obj/structure/bed/medical/emergency, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"qR" = ( +/obj/structure/chair/office{ + dir = 8 + }, +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"qZ" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ra" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 11 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rj" = ( +/obj/machinery/grill, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rl" = ( +/obj/structure/rack, +/obj/item/melee/skateboard/hoverboard{ + pixel_x = -7 + }, +/obj/item/melee/skateboard/hoverboard, +/obj/item/melee/skateboard/hoverboard{ + pixel_x = 7 + }, +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"rn" = ( +/obj/machinery/computer/operating{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"ro" = ( +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"rw" = ( +/obj/structure/table/bronze, +/obj/machinery/button/door/directional/south{ + id = "beach_room_4"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"rz" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rB" = ( +/obj/item/toy/seashell{ + pixel_x = -10; + pixel_y = -4 + }, +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rD" = ( +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rE" = ( +/obj/structure/table/bronze, +/obj/machinery/button/door/directional/south{ + id = "beach_room_11"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"rG" = ( +/obj/machinery/telecomms/allinone, +/obj/item/wirecutters{ + pixel_y = 9 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"rI" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 12"; + id_tag = "beach_room_12" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"rK" = ( +/obj/machinery/vending/cigarette/beach, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rQ" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 7; + pixel_x = 9 + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"rR" = ( +/obj/structure/table/bronze, +/turf/open/floor/wood/large, +/area/virtual_domain) +"rW" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"sa" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet3beach" + }, +/turf/open/floor/iron/white, +/area/virtual_domain) +"sh" = ( +/obj/structure/statue/sandstone/venus{ + pixel_y = 9; + dir = 1; + anchored = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/virtual_domain) +"si" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/condiment/enzyme{ + pixel_x = 9; + pixel_y = 5 + }, +/obj/item/food/seaweedsheet{ + pixel_y = 6; + pixel_x = -4 + }, +/obj/item/food/seaweedsheet{ + pixel_x = -15; + pixel_y = 2 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"sl" = ( +/obj/effect/turf_decal/sand/plating, +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = 17; + pixel_x = -6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"st" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/button/door/directional/south{ + id = "beach_room_8"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"sz" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"sC" = ( +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"sI" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 2; + pixel_x = 5 + }, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 6; + pixel_x = -4 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"sO" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -6 + }, +/obj/item/reagent_containers/cup/soda_cans/thirteenloko{ + pixel_x = 15; + pixel_y = -11 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"sR" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"sV" = ( +/obj/structure/table, +/obj/item/storage/belt/utility, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 14; + pixel_x = -8 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"sW" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 5"; + id_tag = "beach_room_5" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/virtual_domain) +"ta" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"tf" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/lights/mixed{ + pixel_x = -4; + pixel_y = 18 + }, +/obj/item/storage/box/lights/mixed{ + pixel_x = 6; + pixel_y = 12 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 12 + }, +/obj/structure/table, +/obj/item/reagent_containers/cup/bucket{ + pixel_x = 10; + pixel_y = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"th" = ( +/obj/structure/flora/tree/palm, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"tk" = ( +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"tw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"ty" = ( +/obj/item/trash/boritos/purple{ + pixel_y = -16; + pixel_x = -5 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"tI" = ( +/obj/structure/sign/departments/custodian/directional/north{ + pixel_x = -32 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"tM" = ( +/obj/structure/table/wood, +/obj/item/book/manual/chef_recipes{ + pixel_x = 2; + pixel_y = 6 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"tQ" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"tW" = ( +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"tX" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/ketchup{ + pixel_y = 14; + pixel_x = 1 + }, +/obj/item/reagent_containers/condiment/mayonnaise{ + pixel_y = 8; + pixel_x = 8 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/virtual_domain) +"up" = ( +/obj/item/storage/box/syringes{ + pixel_y = 14; + pixel_x = -5 + }, +/obj/item/clothing/neck/stethoscope{ + pixel_y = 3; + pixel_x = 4 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"ut" = ( +/obj/structure/window/reinforced/spawner/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"uu" = ( +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"uz" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"uC" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 14 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"uD" = ( +/obj/structure/table/wood, +/obj/item/food/seaweedsheet, +/obj/item/kitchen/rollingpin{ + pixel_x = -12; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"uH" = ( +/obj/structure/bonfire, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"uI" = ( +/obj/structure/bed, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"uX" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/obj/item/trash/can{ + pixel_y = -9; + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"uY" = ( +/turf/open/floor/carpet, +/area/virtual_domain) +"vx" = ( +/obj/structure/table/glass, +/obj/item/storage/box/coffeepack{ + pixel_x = 2; + pixel_y = 4 + }, +/obj/item/storage/box/donkpockets{ + pixel_y = 10; + pixel_x = 11 + }, +/obj/item/storage/fancy/donut_box{ + pixel_y = 18; + pixel_x = -11 + }, +/obj/item/food/donut/berry{ + pixel_y = 5; + pixel_x = -6 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"vF" = ( +/obj/structure/railing{ + dir = 9 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"vM" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"vU" = ( +/obj/machinery/chem_master/condimaster{ + name = "CondiMaster Neo" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"wb" = ( +/turf/open/misc/beach/coast{ + dir = 5 + }, +/area/virtual_domain/fullbright) +"wf" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ww" = ( +/obj/structure/chair/stool/directional/south{ + dir = 8 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"wx" = ( +/obj/structure/closet/crate/bin, +/obj/structure/sign/clock/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"wz" = ( +/obj/structure/rack, +/obj/item/mop, +/obj/item/extinguisher, +/turf/open/floor/wood/large, +/area/virtual_domain) +"wC" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/reagent_dispensers/fueltank/large, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"wH" = ( +/obj/structure/table/wood/fancy, +/obj/effect/turf_decal/tile/dark_red/full, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -5; + pixel_y = 14 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 13; + pixel_x = 6 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_y = 6; + pixel_x = 11 + }, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/fullbright) +"wI" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/obj/machinery/shower/directional/south, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"wN" = ( +/obj/item/cigbutt{ + pixel_y = 21; + pixel_x = -13 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"wO" = ( +/obj/structure/dresser, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"wT" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 8 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"wZ" = ( +/obj/item/clothing/head/soft/green, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"xe" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toiletfarbeach" + }, +/turf/open/floor/iron/white, +/area/virtual_domain) +"xg" = ( +/turf/open/misc/beach/sand, +/area/virtual_domain) +"xj" = ( +/obj/item/toy/seashell{ + pixel_x = -8; + pixel_y = 9 + }, +/turf/open/misc/beach/coast/corner{ + dir = 1 + }, +/area/virtual_domain/fullbright) +"xk" = ( +/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/chicken, +/obj/item/food/meat/slab/chicken, +/obj/item/food/meat/slab/chicken, +/obj/item/food/meat/slab, +/obj/item/food/meat/slab, +/obj/item/food/meat/slab, +/obj/item/stack/sheet/mineral/coal/ten, +/obj/item/stack/sheet/mineral/coal/ten, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"xw" = ( +/obj/item/kirbyplants/organic/applebush{ + pixel_x = 7 + }, +/obj/item/kirbyplants/organic/plant17{ + pixel_y = 2; + pixel_x = -8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"xx" = ( +/obj/item/stack/arcadeticket{ + pixel_y = 6; + pixel_x = -7 + }, +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/eighties, +/area/virtual_domain) +"xJ" = ( +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"xO" = ( +/obj/structure/chair/stool/directional/south, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"xP" = ( +/obj/structure/chair/plastic{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"xR" = ( +/obj/structure/railing{ + dir = 5 + }, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 3; + pixel_x = -2 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"xT" = ( +/obj/machinery/oven/range, +/turf/open/floor/wood/large, +/area/virtual_domain) +"yc" = ( +/obj/structure/closet/gmcloset, +/turf/open/floor/plastic, +/area/virtual_domain) +"yg" = ( +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/virtual_domain) +"yy" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/carpet/red, +/area/virtual_domain/fullbright) +"yz" = ( +/obj/structure/table/bronze, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"yB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_y = -1; + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"yG" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/virtual_domain) +"yI" = ( +/obj/structure/dresser, +/obj/structure/sign/calendar/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"yJ" = ( +/obj/structure/closet/crate/hydroponics, +/obj/item/popsicle_stick, +/obj/item/popsicle_stick, +/obj/item/popsicle_stick, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/flour, +/obj/item/reagent_containers/condiment/rice, +/obj/item/reagent_containers/condiment/rice, +/obj/item/food/grown/banana/bunch, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"yN" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"yQ" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/machinery/button/door/directional/south{ + id = "beach_room_10"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/table_clock{ + pixel_y = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"ze" = ( +/obj/effect/turf_decal/tile/dark_red/full, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/fullbright) +"zg" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 6; + pixel_x = 4 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"zm" = ( +/obj/structure/table/reinforced, +/obj/item/stack/medical/mesh{ + pixel_y = 1; + pixel_x = 1 + }, +/obj/item/clothing/suit/toggle/labcoat{ + pixel_y = 9; + pixel_x = -8 + }, +/obj/item/storage/box/bodybags{ + pixel_y = 17; + pixel_x = 8 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"zn" = ( +/obj/structure/table/optable, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"zp" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"zq" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -11; + pixel_y = -2 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"zH" = ( +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = -12; + pixel_y = 14 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"zK" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"zL" = ( +/obj/structure/table/bronze, +/obj/item/paper/paperslip{ + pixel_y = 6; + pixel_x = 10 + }, +/obj/item/pen/fourcolor{ + pixel_y = 7; + pixel_x = 1 + }, +/turf/open/floor/carpet, +/area/virtual_domain) +"zO" = ( +/obj/item/retractor{ + pixel_y = 8; + pixel_x = -2 + }, +/obj/item/cautery{ + pixel_y = 10 + }, +/obj/item/hemostat{ + pixel_y = -11 + }, +/obj/item/bonesetter{ + pixel_y = -12 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"zS" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 18; + pixel_x = -8 + }, +/obj/item/cigbutt{ + pixel_y = -4; + pixel_x = 2 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Ac" = ( +/obj/machinery/chem_dispenser/drinks/beer/fullupgrade{ + dir = 4 + }, +/obj/structure/table/wood, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Ae" = ( +/obj/machinery/space_heater, +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"Ag" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 6 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/eighties, +/area/virtual_domain) +"Ai" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"Aj" = ( +/obj/structure/railing/corner/end{ + dir = 8 + }, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain) +"Al" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Aq" = ( +/obj/structure/table/wood/poker, +/obj/item/storage/dice{ + pixel_y = 3; + pixel_x = 5 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Ay" = ( +/obj/structure/table/reinforced, +/obj/item/storage/medkit/brute{ + pixel_y = 9; + pixel_x = 2 + }, +/obj/item/storage/medkit/o2{ + pixel_y = 15; + pixel_x = 2 + }, +/obj/item/reagent_containers/cup/bottle/multiver{ + pixel_x = -9; + pixel_y = 3 + }, +/obj/item/reagent_containers/syringe{ + pixel_y = -4; + pixel_x = 3 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"AG" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/turf_decal/tile/dark/half{ + pixel_x = 5; + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"AK" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/plastic, +/area/virtual_domain) +"AX" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"AZ" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/virtual_domain/fullbright) +"Bc" = ( +/obj/item/reagent_containers/cup/bucket/wooden{ + pixel_y = -5; + pixel_x = -11 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Bf" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Bk" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 2"; + id_tag = "beach_room_2" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/virtual_domain) +"Bq" = ( +/turf/closed/wall/mineral/wood, +/area/virtual_domain) +"Bx" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_x = -12; + pixel_y = -6 + }, +/obj/structure/fluff/beach_umbrella/cap, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Bz" = ( +/obj/structure/closet, +/obj/item/key/atv{ + pixel_x = -4 + }, +/obj/item/key/atv{ + pixel_x = 5; + pixel_y = 3 + }, +/obj/item/key/atv{ + pixel_x = 1; + pixel_y = 1 + }, +/obj/item/clothing/head/soft/black, +/obj/item/clothing/head/soft/black, +/obj/item/clothing/head/soft/black, +/obj/effect/decal/cleanable/oil, +/obj/item/clothing/glasses/sunglasses, +/obj/item/clothing/glasses/heat, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"BB" = ( +/obj/item/toy/plush/moth{ + pixel_y = 5 + }, +/turf/open/floor/carpet/red, +/area/virtual_domain/fullbright) +"BD" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"BI" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"BM" = ( +/obj/structure/closet/crate/bin, +/obj/item/flashlight/glowstick/yellow, +/obj/item/trash/candy, +/turf/open/floor/eighties, +/area/virtual_domain) +"BU" = ( +/obj/item/storage/toolbox/fishing{ + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"BV" = ( +/obj/structure/sign/directions/dorms/directional/north{ + pixel_y = 35 + }, +/obj/structure/sign/directions/medical/directional/north{ + pixel_y = 29 + }, +/obj/machinery/computer/slot_machine, +/turf/open/floor/wood/large, +/area/virtual_domain) +"BW" = ( +/obj/structure/dresser, +/obj/structure/sign/clock/directional/east, +/turf/open/floor/wood, +/area/virtual_domain) +"Co" = ( +/obj/machinery/processor, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Cw" = ( +/obj/structure/sign/poster/official/fruit_bowl/directional/north, +/turf/open/floor/carpet, +/area/virtual_domain) +"CA" = ( +/obj/item/reagent_containers/cup/soda_cans/sol_dry{ + pixel_y = 18; + pixel_x = 9 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"CH" = ( +/obj/machinery/light/directional/north, +/turf/open/floor/wood, +/area/virtual_domain) +"CP" = ( +/obj/structure/table/reinforced, +/obj/item/toy/plush/slimeplushie{ + pixel_y = 8; + pixel_x = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"CQ" = ( +/obj/structure/closet/crate/trashcart/laundry, +/turf/open/floor/plastic, +/area/virtual_domain) +"CR" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/virtual_domain/fullbright) +"CS" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 1"; + id_tag = "beach_room_1" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"CU" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/west{ + id = "beach_room_6"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/clothing/suit/jacket/leather/biker, +/turf/open/floor/wood, +/area/virtual_domain) +"CV" = ( +/obj/item/toy/seashell{ + pixel_x = 8; + pixel_y = 14 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Dg" = ( +/obj/item/toy/beach_ball, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Do" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Dq" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain) +"Dt" = ( +/obj/machinery/icecream_vat, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Dx" = ( +/obj/structure/chair/stool/bar/directional/east, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/virtual_domain) +"DA" = ( +/obj/item/cigbutt{ + pixel_y = -7; + pixel_x = 14 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"DG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/mapping_helpers/broken_floor, +/turf/open/floor/plating, +/area/virtual_domain) +"DL" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 12; + pixel_x = 3 + }, +/obj/item/stock_parts/power_store/cell/emproof{ + pixel_x = -4; + pixel_y = 6 + }, +/obj/item/clothing/head/soft/mime{ + pixel_y = 3; + pixel_x = 5 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"DP" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/virtual_domain) +"DR" = ( +/turf/open/floor/carpet/blue, +/area/virtual_domain/fullbright) +"DS" = ( +/obj/machinery/door/airlock/wood{ + name = "Changing Room" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"DT" = ( +/obj/structure/table/wood, +/obj/item/knife/kitchen{ + pixel_y = 12; + pixel_x = -13 + }, +/obj/item/clothing/head/utility/chefhat, +/turf/open/floor/wood/large, +/area/virtual_domain) +"DU" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 10"; + id_tag = "beach_room_10" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/virtual_domain) +"Eb" = ( +/obj/item/reagent_containers/cup/soda_cans/cola{ + pixel_x = -8; + pixel_y = -4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Ej" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 7 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Er" = ( +/obj/effect/turf_decal/sand, +/obj/structure/bedsheetbin{ + pixel_y = 3; + pixel_x = -1 + }, +/obj/structure/table, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Et" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/virtual_domain/fullbright) +"EA" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toiletfarbeach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/floor/iron/white, +/area/virtual_domain) +"EI" = ( +/turf/open/misc/beach/coast{ + dir = 8 + }, +/area/virtual_domain/fullbright) +"EP" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 3"; + id_tag = "beach_room_3" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"EQ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain) +"ET" = ( +/obj/item/reagent_containers/cup/glass/bottle/beer/light{ + pixel_x = -14; + pixel_y = 15 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"EY" = ( +/obj/structure/statue/sandstone/venus{ + dir = 4; + pixel_y = 9; + anchored = 1 + }, +/obj/structure/flora/bush/flowers_br/style_random, +/turf/open/floor/grass, +/area/virtual_domain) +"Fk" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/storage/box/mousetraps{ + pixel_x = -5; + pixel_y = 14 + }, +/obj/structure/table, +/obj/item/storage/box/mousetraps{ + pixel_x = 12; + pixel_y = 15 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -7; + pixel_y = 6 + }, +/obj/item/grenade/chem_grenade/cleaner{ + pixel_x = -1; + pixel_y = 3 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Fp" = ( +/obj/structure/closet/crate/bin, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Fx" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 6 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"FB" = ( +/obj/machinery/medical_kiosk, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"FE" = ( +/obj/machinery/washing_machine, +/obj/machinery/light/directional/north, +/turf/open/floor/plastic, +/area/virtual_domain) +"FO" = ( +/obj/structure/chair/plastic, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"FX" = ( +/turf/open/floor/carpet/green, +/area/virtual_domain/fullbright) +"Ga" = ( +/obj/item/stack/arcadeticket{ + pixel_y = -1; + pixel_x = -6 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Gm" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/closed/wall/mineral/wood, +/area/virtual_domain) +"Go" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/letterman_nanotrasen, +/obj/item/clothing/glasses/salesman, +/turf/open/floor/wood, +/area/virtual_domain) +"Gp" = ( +/obj/structure/no_effect_signpost{ + pixel_y = 6; + desc = "Northwest: Hotel. South: Seaside Bar. East: Dressing Rooms." + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Gq" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/closed/wall/mineral/wood, +/area/virtual_domain) +"Gw" = ( +/turf/open/indestructible/binary, +/area/virtual_domain/fullbright) +"Gx" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/closet_empty/crate, +/obj/effect/spawner/random/maintenance/two, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/plating, +/area/virtual_domain) +"GD" = ( +/obj/effect/landmark/bitrunning/permanent_exit, +/turf/open/floor/bitrunning_transport, +/area/virtual_domain/protected_space/fullbright) +"GI" = ( +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"GK" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/wood/large, +/area/virtual_domain) +"GQ" = ( +/obj/item/toy/seashell{ + pixel_y = 3; + pixel_x = -6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"GX" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet, +/area/virtual_domain) +"GY" = ( +/obj/effect/turf_decal/siding/wood, +/obj/machinery/shower/directional/south, +/obj/structure/sink/directional/east, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"Hd" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/structure/railing/corner/end{ + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain) +"Ho" = ( +/obj/structure/table/wood, +/obj/item/modular_computer/laptop{ + pixel_y = 5 + }, +/obj/item/multitool{ + pixel_x = -8; + pixel_y = -8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Hp" = ( +/obj/structure/table/wood, +/obj/item/clothing/suit/apron/chef{ + pixel_y = 5; + pixel_x = 2 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"HE" = ( +/obj/machinery/griddle, +/turf/open/floor/wood/large, +/area/virtual_domain) +"HH" = ( +/obj/effect/turf_decal/siding/wood/corner, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"HI" = ( +/obj/structure/statue/sandstone/venus{ + dir = 4; + pixel_y = 9 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"HK" = ( +/obj/structure/closet/crate/bin, +/obj/effect/spawner/random/trash/cigbutt, +/obj/effect/spawner/random/trash/food_packaging, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"HO" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 9"; + id_tag = "beach_room_9" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"HP" = ( +/turf/open/water/beach, +/area/virtual_domain) +"HR" = ( +/obj/structure/sign/poster/official/tactical_game_cards/directional/west, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/eighties, +/area/virtual_domain) +"HT" = ( +/obj/structure/bed/pod{ + desc = "An old medical bed, just waiting for replacement with something up to date."; + dir = 4; + name = "medical bed" + }, +/obj/machinery/defibrillator_mount/directional/east, +/obj/machinery/iv_drip{ + pixel_y = 21; + pixel_x = -4 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"HV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/plating, +/area/virtual_domain) +"Ib" = ( +/obj/structure/tank_holder/extinguisher{ + pixel_y = 11 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"If" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"In" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 4; + pixel_x = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"It" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Iw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/machinery/door/poddoor/shutters{ + id = "BeachBoats" + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"IA" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"IF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"IG" = ( +/obj/machinery/door/poddoor/shutters{ + dir = 4; + id = "BeachGarage" + }, +/turf/open/floor/plating, +/area/virtual_domain/fullbright) +"II" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"IJ" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/blood_filter{ + pixel_y = 8; + pixel_x = -6 + }, +/obj/item/surgical_drapes{ + pixel_x = -1; + pixel_y = 2 + }, +/obj/item/surgical_drapes{ + pixel_x = 13; + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"IL" = ( +/obj/effect/turf_decal/siding/dark_red, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"IS" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/virtual_domain) +"IX" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 18; + pixel_x = -8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Jb" = ( +/obj/structure/table/glass, +/obj/machinery/coffeemaker/impressa{ + pixel_y = 13; + pixel_x = -1 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -6; + pixel_y = 2 + }, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = 11; + pixel_y = -1 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Jc" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Jd" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Je" = ( +/obj/structure/table/bronze, +/obj/item/table_clock{ + pixel_y = 13 + }, +/obj/structure/sign/poster/random/directional/east, +/turf/open/floor/wood, +/area/virtual_domain) +"Jp" = ( +/obj/effect/turf_decal/siding/wood, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Jv" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_x = -6 + }, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Jw" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = 5 + }, +/turf/open/misc/beach/coast{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"JF" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"JG" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/large, +/area/virtual_domain) +"JH" = ( +/obj/structure/marker_beacon/burgundy, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"JJ" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 8"; + id_tag = "beach_room_8" + }, +/turf/open/floor/wood, +/area/virtual_domain) +"JN" = ( +/obj/effect/turf_decal/sand, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"JU" = ( +/obj/item/instrument/guitar{ + pixel_y = 4; + pixel_x = -1 + }, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"Ka" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/machinery/button/door/directional/west{ + id = "beach_room_7"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/item/clothing/suit/apron/overalls, +/turf/open/floor/wood, +/area/virtual_domain) +"Ko" = ( +/obj/item/toy/beach_ball, +/turf/open/misc/beach/coast/corner{ + dir = 4 + }, +/area/virtual_domain/fullbright) +"Ks" = ( +/obj/structure/table/glass, +/obj/machinery/microwave{ + pixel_y = 15 + }, +/obj/item/cigbutt{ + pixel_y = 2; + pixel_x = -12 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"KH" = ( +/obj/structure/closet/athletic_mixed, +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"KI" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/spawner/random/structure/crate, +/turf/open/floor/plating, +/area/virtual_domain) +"KJ" = ( +/obj/machinery/vending/coffee, +/turf/open/floor/wood/large, +/area/virtual_domain) +"KL" = ( +/obj/structure/closet/secure_closet/freezer/empty, +/obj/item/food/popsicle/creamsicle_berry, +/obj/item/food/popsicle/creamsicle_berry, +/obj/item/food/popsicle/creamsicle_orange, +/obj/item/food/popsicle/creamsicle_orange, +/obj/item/food/popsicle/jumbo, +/obj/item/food/popsicle/pineapple_pop, +/obj/item/food/popsicle/pineapple_pop, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/obj/item/food/fishmeat, +/turf/open/floor/wood/large, +/area/virtual_domain) +"KP" = ( +/obj/item/clothing/head/soft/black{ + pixel_x = -1; + pixel_y = -3 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"KS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/structure/railing{ + dir = 1 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"KT" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"KZ" = ( +/obj/structure/railing{ + dir = 1 + }, +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"La" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/wood, +/area/virtual_domain) +"Ld" = ( +/obj/structure/table/wood, +/obj/item/cigarette/cigar{ + pixel_y = 16; + pixel_x = -2 + }, +/obj/item/reagent_containers/cup/glass/coffee{ + pixel_x = 8; + pixel_y = 9 + }, +/obj/machinery/cell_charger, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Lm" = ( +/obj/machinery/door/airlock/wood{ + name = "Balcony"; + id_tag = "beach_room_x" + }, +/turf/open/floor/wood, +/area/virtual_domain) +"LD" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet1beach" + }, +/turf/open/floor/iron/white, +/area/virtual_domain) +"LN" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/carpet/blue, +/area/virtual_domain/fullbright) +"LR" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"LV" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"LY" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Ma" = ( +/obj/machinery/vending/games, +/turf/open/floor/eighties, +/area/virtual_domain) +"Mb" = ( +/turf/open/floor/wood/large, +/area/virtual_domain) +"Md" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/obj/item/reagent_containers/cup/soda_cans/wellcheers{ + pixel_y = -10; + pixel_x = -6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Mj" = ( +/obj/structure/table, +/obj/item/weldingtool{ + pixel_y = -7; + pixel_x = 4 + }, +/obj/item/trash/can{ + pixel_y = 10; + pixel_x = -5 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Ml" = ( +/obj/machinery/washing_machine, +/turf/open/floor/plastic, +/area/virtual_domain) +"Mo" = ( +/obj/machinery/door/airlock/wood{ + name = "Docks" + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Mr" = ( +/obj/structure/table/wood, +/obj/item/stack/arcadeticket{ + pixel_y = 6; + pixel_x = -7 + }, +/obj/item/pen{ + pixel_y = 5; + pixel_x = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Mx" = ( +/obj/structure/table/reinforced, +/obj/machinery/cell_charger{ + pixel_y = 13; + pixel_x = 21 + }, +/obj/item/clothing/glasses/hud/health{ + pixel_y = 1; + pixel_x = 18 + }, +/obj/item/stack/medical/gauze{ + pixel_x = -15; + pixel_y = 10 + }, +/obj/item/storage/belt/medical{ + pixel_y = 3; + pixel_x = -3 + }, +/obj/machinery/light/directional/north, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"MA" = ( +/obj/effect/turf_decal/siding/dark_red/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"MH" = ( +/obj/item/toy/seashell{ + pixel_x = -7; + pixel_y = 5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"MO" = ( +/obj/structure/table/wood, +/obj/machinery/recharger, +/obj/item/reagent_containers/cup/glass/mug{ + pixel_x = -12; + pixel_y = 9 + }, +/obj/effect/spawner/random/bureaucracy/stamp{ + pixel_y = 14; + pixel_x = 8 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"MR" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"MT" = ( +/turf/open/misc/beach/coast/corner{ + dir = 8 + }, +/area/virtual_domain/fullbright) +"MV" = ( +/obj/item/radio/off{ + pixel_y = 16; + pixel_x = -5 + }, +/obj/item/storage/box/monkeycubes{ + pixel_y = 10; + pixel_x = 4 + }, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 2 + }, +/obj/structure/table/glass, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"MX" = ( +/obj/effect/turf_decal/stripes/red/box, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"MZ" = ( +/obj/machinery/button/door/directional/north{ + id = "beach_room_12"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"Nc" = ( +/obj/item/tank/internals/anesthetic{ + pixel_y = 4 + }, +/obj/item/stack/medical/bone_gel{ + pixel_y = 16; + pixel_x = -7 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 3; + pixel_x = 3 + }, +/obj/structure/table/bronze, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"Ne" = ( +/obj/machinery/light/directional/east, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Nj" = ( +/obj/structure/fluff/beach_umbrella/cap, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Np" = ( +/obj/structure/chair/stool/bamboo{ + dir = 4 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"Nt" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/eighties, +/area/virtual_domain) +"NB" = ( +/obj/item/storage/box/fishing_hooks{ + pixel_y = 14 + }, +/obj/item/storage/box/fishing_lines{ + pixel_y = 12; + pixel_x = 18 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"NC" = ( +/mob/living/basic/crab, +/obj/effect/turf_decal/stripes/red/line{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"NH" = ( +/obj/structure/closet/crate/bin, +/obj/item/trash/candy, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"NT" = ( +/obj/item/toy/seashell, +/turf/open/misc/beach/coast, +/area/virtual_domain/fullbright) +"NU" = ( +/obj/machinery/vending/medical{ + req_access = "201" + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"NZ" = ( +/obj/effect/turf_decal/sand, +/turf/closed/wall/mineral/wood, +/area/virtual_domain/fullbright) +"Of" = ( +/obj/item/reagent_containers/cup/soda_cans/space_mountain_wind{ + pixel_x = -17; + pixel_y = 17 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Og" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/condiment/peppermill{ + pixel_y = 12 + }, +/obj/item/reagent_containers/condiment/saltshaker{ + pixel_x = -5; + pixel_y = 9 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Ol" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/power/port_gen/pacman, +/turf/open/floor/plating, +/area/virtual_domain) +"Om" = ( +/obj/structure/bed/double, +/obj/item/bedsheet/hop/double{ + desc = "A blue bedsheet. Likely from the beach hotel."; + name = "blue bedsheet" + }, +/turf/open/floor/carpet/cyan, +/area/virtual_domain) +"Or" = ( +/obj/effect/turf_decal/siding/dark_red{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Oy" = ( +/mob/living/basic/crab, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"OA" = ( +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"OK" = ( +/obj/item/storage/box/gloves{ + pixel_y = 14; + pixel_x = 7 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"OM" = ( +/turf/open/floor/iron/stairs/old, +/area/virtual_domain/fullbright) +"OO" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 16; + pixel_x = 12 + }, +/obj/structure/flora/coconuts, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"OV" = ( +/mob/living/basic/crab/kreb, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Po" = ( +/obj/structure/sink/kitchen/directional/east, +/turf/open/floor/plastic, +/area/virtual_domain) +"Pq" = ( +/obj/structure/table/bronze, +/obj/item/reagent_containers/cup/rag{ + pixel_y = 5 + }, +/obj/item/reagent_containers/condiment/coconut_milk{ + pixel_y = 14; + pixel_x = 5 + }, +/obj/machinery/light/directional/east, +/turf/open/floor/wood/large, +/area/virtual_domain) +"PD" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 9; + pixel_x = 6 + }, +/obj/structure/railing{ + dir = 10 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"PE" = ( +/obj/machinery/space_heater, +/turf/open/floor/wood, +/area/virtual_domain) +"PG" = ( +/obj/structure/table/bronze, +/obj/item/food/grown/banana/bunch{ + pixel_y = 10; + offset_at_init = 0 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"PH" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = 5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"PJ" = ( +/obj/item/cigbutt{ + pixel_y = -11; + pixel_x = -15 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"PR" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"PZ" = ( +/obj/structure/table/bronze, +/obj/item/camera{ + pixel_y = 12; + pixel_x = 6 + }, +/obj/item/camera_film{ + pixel_y = 4; + pixel_x = -2 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Qc" = ( +/obj/item/kirbyplants/organic/plant8{ + pixel_y = 5 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Qj" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/iron/freezer, +/area/virtual_domain) +"Qk" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet2beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/iron/white, +/area/virtual_domain) +"Qm" = ( +/obj/structure/sink/kitchen/directional/south, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Qq" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Qu" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Qv" = ( +/obj/machinery/door/airlock/command/glass{ + name = "Admin" + }, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/effect/mapping_helpers/airlock_note_placer{ + note_info = "Dear IT: Please fix the fax machine" + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Qx" = ( +/obj/effect/spawner/random/entertainment/arcade{ + dir = 4 + }, +/turf/open/floor/eighties, +/area/virtual_domain) +"QG" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/obj/item/wrench{ + pixel_y = -1; + pixel_x = 6 + }, +/obj/item/storage/toolbox/fishing{ + pixel_y = -8; + pixel_x = -3 + }, +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"QH" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Room 6"; + id_tag = "beach_room_6" + }, +/turf/open/floor/wood, +/area/virtual_domain) +"QI" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"QN" = ( +/obj/item/cigbutt{ + pixel_y = -6; + pixel_x = -12 + }, +/obj/item/clothing/head/soft/black, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"QX" = ( +/obj/machinery/vending/boozeomat/all_access{ + desc = "A technological marvel, supposedly able to mix just the mixture you'd like to drink the moment you ask for one. May not work for bartenders that don't have Nanotrasen bank accounts." + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"QY" = ( +/obj/structure/window/reinforced/spawner/directional/north, +/obj/structure/window/reinforced/spawner/directional/west, +/obj/structure/table/wood, +/obj/item/storage/medkit/o2{ + pixel_y = 4; + pixel_x = 1 + }, +/obj/effect/turf_decal/siding/wood{ + dir = 9 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"Rc" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 31 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Rd" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/carpet, +/area/virtual_domain) +"Re" = ( +/obj/structure/table/wood, +/obj/item/stack/arcadeticket{ + pixel_y = 3; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/soda_cans/pwr_game{ + pixel_y = 12; + pixel_x = -8 + }, +/obj/item/paper_bin/carbon{ + pixel_y = 6; + pixel_x = 4 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Rf" = ( +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Rk" = ( +/obj/structure/table/glass, +/obj/machinery/fax{ + fax_name = "Beach Hotel Fax"; + name = "Beach Hotel's Fax Machine"; + pixel_y = 8; + visible_to_network = 0 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Rs" = ( +/obj/machinery/door/airlock/wood{ + name = "Garage" + }, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"Rw" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/obj/machinery/door/airlock/wood{ + name = "Room 1" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Ry" = ( +/obj/structure/closet{ + name = "Holding Cell Storage" + }, +/obj/item/taperecorder, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Rz" = ( +/obj/item/kirbyplants/organic/plant21{ + pixel_y = 3; + pixel_x = -6 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"RB" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"RF" = ( +/obj/effect/turf_decal/siding/wood, +/turf/closed/wall/mineral/wood, +/area/virtual_domain/fullbright) +"RJ" = ( +/obj/item/reagent_containers/cup/soda_cans/starkist{ + pixel_y = 16; + pixel_x = 10 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"RM" = ( +/obj/effect/baseturf_helper/beach/water, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"RO" = ( +/obj/item/reagent_containers/cup/soda_cans/lemon_lime{ + pixel_x = -12; + pixel_y = -7 + }, +/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ + pixel_x = 13; + pixel_y = -7 + }, +/obj/structure/fluff/beach_umbrella, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"RP" = ( +/obj/structure/table, +/obj/item/book/manual/wiki/engineering_guide{ + pixel_y = 7; + pixel_x = -6 + }, +/obj/item/pen{ + pixel_x = 7; + pixel_y = 6 + }, +/obj/item/clothing/head/utility/welding{ + pixel_x = -10; + pixel_y = -8 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"RS" = ( +/obj/structure/table/wood, +/obj/item/food/donut/plain{ + pixel_y = -2; + pixel_x = 14 + }, +/obj/item/assembly/signaler{ + pixel_x = -6; + pixel_y = -5 + }, +/obj/effect/spawner/random/bureaucracy/folder{ + pixel_y = 11; + pixel_x = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Sb" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 19; + pixel_x = 10 + }, +/obj/machinery/hydroponics/constructable, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Sc" = ( +/obj/structure/table/wood, +/obj/item/storage/box/drinkingglasses{ + pixel_y = 18; + pixel_x = -5 + }, +/obj/item/reagent_containers/cup/glass/shaker{ + pixel_y = 12; + pixel_x = -7 + }, +/obj/item/clothing/head/hats/tophat{ + pixel_y = 2; + pixel_x = 3 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Se" = ( +/obj/structure/table/wood, +/obj/effect/spawner/random/entertainment/lighter, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Sf" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"So" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Sr" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/rack, +/obj/effect/spawner/random/maintenance/three, +/obj/effect/decal/cleanable/cobweb, +/obj/item/wheelchair, +/turf/open/floor/plating, +/area/virtual_domain) +"Su" = ( +/obj/machinery/door/airlock/wood{ + name = "Room 4"; + id_tag = "beach_room_4" + }, +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood, +/area/virtual_domain) +"Sx" = ( +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Sz" = ( +/obj/structure/chair/stool/bamboo{ + dir = 1 + }, +/obj/effect/turf_decal/siding/wood/corner, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"SJ" = ( +/obj/structure/rack, +/obj/effect/turf_decal/sand, +/obj/item/clothing/shoes/sandal{ + pixel_y = 4; + pixel_x = 8 + }, +/obj/item/clothing/shoes/sandal{ + pixel_x = 4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -4 + }, +/obj/item/clothing/shoes/sandal{ + pixel_y = -7; + pixel_x = -3 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"SL" = ( +/obj/machinery/door/airlock/wood{ + name = "Trash Disposal" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"SM" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"SO" = ( +/obj/structure/table/bronze, +/obj/structure/desk_bell{ + pixel_x = 7; + pixel_y = 8 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"SR" = ( +/turf/closed/indestructible/binary, +/area/virtual_domain/fullbright) +"Ta" = ( +/obj/machinery/light/directional/south, +/turf/open/floor/carpet, +/area/virtual_domain) +"Tb" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"Tq" = ( +/obj/machinery/light/small/directional/north, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"Tr" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Tt" = ( +/obj/machinery/recharge_station, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Tw" = ( +/obj/effect/turf_decal/stripes/white/full, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Ty" = ( +/turf/open/floor/carpet, +/area/virtual_domain/fullbright) +"TB" = ( +/obj/effect/turf_decal/tile/dark_red/full, +/obj/machinery/vending/cola/red, +/turf/open/floor/iron/smooth_large, +/area/virtual_domain/fullbright) +"TC" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"TK" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 1; + pixel_x = 7 + }, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_x = -14 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"TM" = ( +/obj/effect/turf_decal/siding/blue/corner, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"TO" = ( +/obj/structure/closet/crate/bin, +/obj/item/reagent_containers/syringe{ + pixel_y = -4; + pixel_x = 3 + }, +/obj/effect/spawner/random/trash/food_packaging, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"TR" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/virtual_domain) +"TS" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 7; + pixel_x = -9 + }, +/obj/item/clothing/mask/breath/medical{ + pixel_y = 4; + pixel_x = 3 + }, +/obj/item/clothing/gloves/latex, +/obj/structure/table/glass, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"TW" = ( +/obj/structure/table/bronze, +/obj/item/clothing/suit/costume/hawaiian{ + pixel_y = 7; + pixel_x = -3 + }, +/obj/machinery/light/directional/west, +/turf/open/floor/wood/parquet, +/area/virtual_domain/fullbright) +"TY" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Clinic" + }, +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"TZ" = ( +/obj/structure/fluff/beach_umbrella/science, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Ub" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Ud" = ( +/obj/effect/turf_decal/siding/wood, +/obj/item/cigbutt{ + pixel_y = -9; + pixel_x = 13 + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Uf" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/door/airlock/wood{ + name = "Bathroom"; + id_tag = "toilet2beach" + }, +/turf/open/floor/iron/white, +/area/virtual_domain) +"Ug" = ( +/obj/structure/chair/office{ + dir = 4 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"Uk" = ( +/obj/machinery/vending/autodrobe/all_access, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Um" = ( +/obj/structure/closet/secure_closet/personal/cabinet, +/obj/item/clothing/suit/jacket/miljacket, +/turf/open/floor/wood, +/area/virtual_domain) +"Uy" = ( +/obj/machinery/door/airlock/medical/glass{ + name = "Medbay Clinic" + }, +/obj/effect/turf_decal/siding/blue{ + dir = 4 + }, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"UE" = ( +/obj/effect/turf_decal/siding/wood, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"UI" = ( +/obj/machinery/door/airlock/wood{ + name = "Janitorial" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"UJ" = ( +/obj/vehicle/ridden/atv{ + dir = 4 + }, +/obj/effect/decal/cleanable/oil, +/turf/open/floor/iron/dark/herringbone, +/area/virtual_domain) +"UO" = ( +/obj/machinery/vending/cola/pwr_game, +/turf/open/floor/eighties, +/area/virtual_domain) +"US" = ( +/obj/machinery/shower/directional/west, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"UW" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 1 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"UZ" = ( +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -8 + }, +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 5 + }, +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = 1; + pixel_y = 7 + }, +/obj/item/stack/sheet/mineral/sandstone{ + pixel_x = -12; + pixel_y = 6 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Va" = ( +/obj/machinery/door/airlock/wood{ + name = "Employees' Only" + }, +/turf/open/floor/plastic, +/area/virtual_domain) +"Vs" = ( +/obj/structure/table/wood, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 3; + pixel_x = 10 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"VD" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood/corner{ + dir = 1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"VI" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/wood/large, +/area/virtual_domain) +"VK" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Cabin" + }, +/turf/open/floor/carpet, +/area/virtual_domain) +"VL" = ( +/turf/open/misc/beach/coast{ + dir = 6 + }, +/area/virtual_domain/fullbright) +"We" = ( +/obj/structure/table/bronze, +/obj/item/book/manual/wiki/barman_recipes{ + pixel_x = 9; + pixel_y = 7; + name = "Tropical Mixing for Tropical Bartenders" + }, +/obj/item/reagent_containers/cup/glass/drinkingglass/shotglass{ + pixel_y = 10; + pixel_x = -12 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Wg" = ( +/obj/structure/closet/crate/trashcart/filled, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"Wm" = ( +/obj/effect/landmark/bitrunning/curiosity_spawn, +/turf/open/floor/iron/white/textured_large, +/area/virtual_domain) +"Ws" = ( +/obj/machinery/vending/cigarette/beach, +/turf/open/floor/wood/large, +/area/virtual_domain) +"WG" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"WX" = ( +/obj/structure/marker_beacon/teal, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Xe" = ( +/obj/structure/table/bronze, +/obj/structure/sign/poster/random/directional/east, +/obj/item/camera{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"Xl" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Xt" = ( +/turf/open/floor/plastic, +/area/virtual_domain) +"Xu" = ( +/obj/effect/turf_decal/siding/blue{ + dir = 8 + }, +/obj/structure/chair/plastic{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Xx" = ( +/obj/machinery/door/airlock/wood/glass{ + name = "Beach Access" + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"XJ" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Locker Room" + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"XO" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 25 + }, +/obj/structure/chair/plastic{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"XP" = ( +/obj/structure/mop_bucket/janitorialcart{ + dir = 8 + }, +/obj/machinery/light/directional/south, +/turf/open/floor/wood/large, +/area/virtual_domain) +"XT" = ( +/obj/machinery/light/directional/west, +/turf/open/floor/carpet/cyan, +/area/virtual_domain) +"XW" = ( +/obj/structure/fluff/beach_umbrella/syndi, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Yb" = ( +/obj/structure/sign/poster/contraband/pwr_game/directional/west, +/turf/open/floor/eighties, +/area/virtual_domain) +"Yd" = ( +/obj/structure/flora/tree/palm/style_2{ + pixel_y = 3; + pixel_x = -4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Yo" = ( +/turf/closed/wall/mineral/sandstone, +/area/virtual_domain/fullbright) +"Yr" = ( +/obj/item/reagent_containers/cup/watering_can{ + pixel_y = 19; + pixel_x = -6 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Yz" = ( +/obj/item/trash/candy{ + pixel_y = 9; + pixel_x = -9 + }, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"YD" = ( +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/siding/wood{ + dir = 8 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"YI" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet1beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/machinery/light/small/directional/west, +/turf/open/floor/iron/white, +/area/virtual_domain) +"YM" = ( +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"YN" = ( +/obj/item/toy/seashell{ + pixel_x = 12; + pixel_y = -5 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"YP" = ( +/obj/structure/table/glass, +/obj/item/paper{ + pixel_y = 7; + pixel_x = 2 + }, +/obj/item/screwdriver{ + pixel_y = 13; + pixel_x = 3 + }, +/obj/item/paper_bin/carbon{ + pixel_y = 4; + pixel_x = -6 + }, +/obj/effect/spawner/random/bureaucracy/pen{ + pixel_x = 7 + }, +/turf/open/floor/iron/dark/diagonal, +/area/virtual_domain) +"YR" = ( +/obj/effect/turf_decal/siding/wood{ + dir = 10 + }, +/obj/machinery/vending/cola/red, +/turf/open/floor/wood/large, +/area/virtual_domain/fullbright) +"YW" = ( +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/iron/dark/textured_large, +/area/virtual_domain) +"YZ" = ( +/obj/structure/railing/corner/end/flip{ + dir = 4 + }, +/turf/open/floor/wood/parquet, +/area/virtual_domain) +"Zd" = ( +/obj/structure/railing{ + dir = 8 + }, +/turf/open/floor/wood, +/area/virtual_domain/fullbright) +"Zj" = ( +/obj/structure/flora/tree/palm{ + pixel_y = 16 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Zn" = ( +/obj/item/reagent_containers/cup/soda_cans/dr_gibb{ + pixel_x = -9; + pixel_y = -9 + }, +/obj/structure/fluff/beach_umbrella/engine, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"Zp" = ( +/obj/structure/dresser, +/turf/open/floor/wood, +/area/virtual_domain) +"Zs" = ( +/obj/machinery/door/poddoor/shutters{ + id = "BeachBoats" + }, +/turf/open/water/beach, +/area/virtual_domain/fullbright) +"Zy" = ( +/obj/structure/sign/chalkboard_menu{ + pixel_y = 32 + }, +/turf/open/floor/wood/large, +/area/virtual_domain) +"Zz" = ( +/obj/effect/turf_decal/siding/wood/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ZB" = ( +/obj/effect/turf_decal/sand, +/obj/machinery/button/door/directional/east{ + id = "toilet3beach"; + name = "restroom lock"; + normaldoorcontrol = 1; + specialfunctions = 4 + }, +/obj/structure/toilet{ + pixel_y = 8 + }, +/obj/structure/sink/directional/west, +/obj/item/cigbutt{ + pixel_y = -7; + pixel_x = -13 + }, +/obj/machinery/light/small/directional/west, +/obj/effect/baseturf_helper/virtual_domain, +/turf/open/floor/iron/white, +/area/virtual_domain) +"ZE" = ( +/obj/structure/table/bronze, +/turf/open/floor/carpet, +/area/virtual_domain) +"ZH" = ( +/obj/item/kirbyplants/organic/plant24{ + pixel_x = 7; + pixel_y = 10 + }, +/obj/item/reagent_containers/cup/watering_can{ + pixel_x = -3; + pixel_y = 15 + }, +/obj/structure/table, +/turf/open/floor/wood/large, +/area/virtual_domain) +"ZI" = ( +/obj/effect/baseturf_helper/beach/sand, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ZV" = ( +/obj/structure/chair/plastic, +/obj/item/pai_card{ + desc = "A real Nanotrasen success, these personal AIs provide all of the companionship of an AI without any law related red-tape."; + name = "\improper Nanotrasen-brand personal AI device exhibit"; + pixel_y = 3; + pixel_x = -1 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) +"ZX" = ( +/obj/structure/table/bronze, +/obj/item/storage/toolbox/fishing{ + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/virtual_domain) +"ZY" = ( +/obj/effect/turf_decal/siding/blue/corner{ + dir = 4 + }, +/turf/open/misc/beach/sand, +/area/virtual_domain/fullbright) + +(1,1,1) = {" +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(2,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(3,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(4,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(5,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(6,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(7,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(8,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +LR +Bf +Bf +Bf +qa +cO +LR +Bf +Bf +Bf +HH +Bf +Bf +Bf +qa +cO +LR +Bf +Bf +Bf +qa +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(9,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +Jd +vF +Zd +io +tw +cO +Jd +vF +Zd +io +Jp +vF +Zd +io +tw +cO +Jd +vF +Zd +PD +tw +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(10,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +Lm +AZ +AZ +eK +cO +eK +Lm +AZ +AZ +eK +Lm +AZ +AZ +eK +cO +eK +Lm +AZ +AZ +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(11,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +CH +uY +PE +Bq +eK +Bq +MZ +gw +PE +Bq +bE +uY +oE +Bq +eK +Bq +iQ +gw +jp +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(12,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +cB +Rd +bE +db +Mb +rI +bE +cW +aQ +Bq +jw +Rd +bE +Su +Mb +EP +bE +cW +La +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(13,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +yI +gK +rE +Bq +Mb +Bq +yI +ch +Xe +Bq +wO +gK +rw +Bq +Mb +Bq +Je +Om +Zp +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(14,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +Bq +Bq +Bq +Bq +pv +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Mb +Bq +Bq +Bq +Bq +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +SR +SR +SR +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(15,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +vF +nk +bE +XT +PE +Bq +Mb +Mb +yg +Mb +Mb +Mb +Mb +yg +Mb +Mb +Mb +Mb +yg +gH +Bq +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(16,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +aw +AZ +Go +cW +bE +DU +Mb +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Mb +Bq +Bq +Bq +Bq +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(17,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +xR +AZ +Zp +Om +yQ +Bq +Mb +Bq +cr +uY +dH +Bq +Um +gw +gf +Bq +pv +Bq +lc +uY +pq +eK +cO +eH +EI +EI +EI +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(18,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +Bq +Gm +Bq +Bq +Mb +HO +bE +Rd +La +Bq +Ae +cW +bE +sW +Mb +Bk +bE +Rd +La +eK +eH +tk +qB +ka +MH +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +oX +"} +(19,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +vF +dW +bE +GX +dH +Bq +Mb +Bq +ik +gK +ZX +Bq +yI +Om +dS +Bq +Mb +Bq +ik +gK +ZX +eK +tk +CV +wZ +QI +gI +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(20,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +KZ +AZ +pz +Rd +bE +JJ +Mb +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Mb +Bq +Bq +Bq +Bq +eK +BI +ka +mP +rB +bD +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(21,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +xR +AZ +BW +gK +st +Bq +Mb +Mb +yg +Mb +Bq +xg +Bq +Mb +Mb +Mb +Mb +yg +Mb +Mb +Xx +TC +JN +ka +ka +ka +ka +ka +rD +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(22,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +Bq +Bq +Bq +Bq +Mb +Bq +Bq +cH +Bq +Bq +Bq +QH +Bq +Bq +Mb +Bq +Bq +Bq +Bq +eK +NB +rD +ka +ka +ka +BI +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(23,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +eK +eK +Bq +Fk +Yr +wz +Bq +Mb +Bq +Ka +gw +PE +Bq +CU +uY +bE +Bq +Mb +CS +qb +gw +pJ +eK +ka +ka +eK +Rw +eK +eK +eK +Ej +nc +EI +EI +EI +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(24,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +tf +GK +XP +Bq +pv +Bq +bE +cW +La +Bq +PE +Rd +La +Bq +Mb +Bq +wx +cW +La +eK +Sf +eK +Bq +Mb +Dx +Mb +Bq +eK +Ej +ka +ka +ka +nc +EI +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(25,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +IX +Mb +Mb +Bq +pE +Bq +ik +Om +gc +Bq +yI +gK +ZX +Bq +pE +Bq +Zp +Om +eJ +Bq +eK +Bq +jb +dY +lI +Aq +MR +Bq +eK +th +ka +ka +ka +ka +nc +EI +EI +EI +EI +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(26,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +ow +Bq +UI +Bq +Mb +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Bq +Mb +Bq +Bq +Bq +Bq +Bq +BV +Mb +Mb +ho +ho +ho +Mb +Rz +AZ +ka +sz +ka +ka +yy +ka +ka +ka +ka +ka +nc +EI +ij +cO +cO +cO +cO +eH +EI +EI +EI +EI +EI +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(27,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +LR +Bf +eK +Bq +Bq +tI +Mb +Mb +Mb +Mb +Mb +Mb +JG +Mb +Mb +Mb +Mb +Mb +Mb +JG +Mb +dj +Mb +Mb +IS +gN +Al +Mb +Mb +Mb +xw +AZ +ka +ka +ka +Md +BB +ka +ka +ka +rD +ka +ka +ka +nc +ij +cO +cO +cO +oa +sz +th +ka +ka +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(28,1,1) = {" +SR +cO +cO +cO +cO +cO +LR +lS +wN +xJ +SL +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +Mb +dj +Mb +Mb +So +EY +UW +Mb +Mb +ZH +AZ +AZ +JN +ka +ka +ka +ka +ka +ka +DR +ka +ka +BD +ka +sz +nc +EI +EI +EI +tk +ka +ka +ka +ka +ka +sz +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(29,1,1) = {" +SR +cO +cO +cO +cO +cO +Jd +Yz +xJ +eK +Bq +Bq +yG +yG +Bq +Qv +Bq +Bq +Bq +Bq +Bq +DP +TY +DP +Bq +Bq +Bq +Bq +Bq +Bq +pv +LV +II +Qq +Mb +Mb +AZ +AZ +JN +JN +ka +ka +ka +ka +ka +TZ +oC +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +Oy +ka +Dg +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(30,1,1) = {" +SR +cO +cO +cO +cO +cO +Jd +mV +xJ +eK +Jb +zS +lW +lW +PJ +lW +Qu +Bq +lF +bx +jL +qH +gP +FB +NU +Bq +CQ +CQ +Bq +cK +Mb +dA +Mb +Mb +Mb +Mb +eK +sR +JN +de +JN +ka +ka +ka +rD +ka +ka +ka +ka +eK +AZ +AZ +eK +ka +eK +AZ +AZ +eK +uC +ka +ka +Nj +ka +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(31,1,1) = {" +SR +cO +cO +cO +cO +cO +Ud +bT +Wg +eK +vx +lW +Ug +aY +Ug +lW +YP +Gq +zm +Wm +gP +gP +gP +gP +gP +Va +Xt +Xt +Bq +Cw +uY +zL +uY +uY +uY +uY +VK +Ty +JN +JN +JN +ka +ka +th +ka +ka +ka +ka +eK +Bq +Qx +Qx +Bq +AZ +Bq +BM +gs +Bq +eK +rD +ka +DR +LN +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(32,1,1) = {" +SR +cO +cO +cO +cO +cO +Jc +If +Wg +eK +Ks +lW +Ho +RS +Ld +lW +Rk +Bq +Mx +gP +gP +up +gP +gP +TO +Bq +Ml +Xt +Bq +uY +Rd +ZE +uY +uY +uY +Ta +eK +Ty +Ty +JN +JN +ka +ka +ka +ka +ka +ka +ka +eK +UO +en +ty +Yb +en +HR +gi +Ai +Ga +eK +ka +ka +ka +nR +ka +gL +VL +JH +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(33,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +Jc +IF +eK +HK +lW +qR +MO +pX +PJ +rG +Bq +CP +HT +gP +aD +OK +gP +Ay +Bq +Ml +Xt +Bq +Cw +uY +iF +uY +uY +uY +uY +VK +Ty +Ty +Ty +JN +ka +ka +ka +ka +ka +ka +ka +eK +Bq +Ma +xx +en +pV +Nt +dB +Mr +Mb +AZ +ka +ka +ka +rD +ka +cE +cO +cO +cO +cO +WX +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(34,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +eK +Bq +lW +lW +KT +DA +In +Bq +eK +AZ +Bq +gP +gP +gP +Bq +Bq +Bq +FE +Xt +Bq +PG +Mb +oQ +Mb +Mb +Mb +eK +eK +wf +Ty +Ty +Ty +ka +ka +ka +rD +ka +ka +sz +ka +eK +AZ +Bq +wT +wT +Ag +Mb +Vs +Mb +eK +ka +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(35,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +lW +rW +Ry +MV +Bq +eK +zO +bb +eK +Uy +Bq +ee +Bq +Ml +Po +gB +Xt +Bq +Bq +Mb +IS +gN +Al +Mb +AZ +wf +SJ +JN +Ty +Ty +Ty +ka +ka +ka +ka +ka +ka +th +ka +JN +eK +AZ +AZ +Bq +Mb +Re +fg +eK +as +ka +ka +ka +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +cO +cO +cO +SR +"} +(36,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +lU +yG +yG +Bq +eK +IJ +xJ +xJ +xJ +xJ +eK +AZ +Bq +Ml +AK +Xt +Xt +Xt +Va +Mb +So +sh +UW +Mb +AZ +AZ +SJ +JN +JN +Ty +Ty +Ty +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +JN +eK +mx +AZ +eK +Ib +JN +ka +ka +ka +Oy +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(37,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +GI +GI +YW +eK +cO +TS +mV +xJ +xJ +xJ +tw +cO +eK +Bq +yc +yc +yc +Bq +Bq +Bq +LV +Ne +Qq +Mb +Qc +AZ +SJ +JN +JN +ka +Ty +Ty +Ty +ka +ka +ka +ka +ka +ka +ka +JN +ka +ka +ta +YD +dp +ct +ka +ka +ka +JN +ka +ka +ka +NT +cO +cO +cO +cO +cO +cO +cO +cO +cO +WX +cO +cO +cO +SR +"} +(38,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +lx +uI +ba +YW +lx +cO +bp +rn +zn +Nc +yB +pC +cO +cO +eK +Bq +Bq +Bq +Bq +Sr +Bq +kD +Bq +Mb +Mb +Tt +AZ +Er +JN +rD +ka +ka +Ty +Ty +Ty +ka +ka +ka +rD +ka +JN +JN +JN +ka +JN +ka +JN +ka +JN +ka +ka +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(39,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +Bq +zp +Bq +eK +cO +Jc +fe +du +AG +pC +cO +cO +cO +eK +hT +lh +TR +jm +TR +TR +TR +Bq +Ws +KJ +fg +eK +JN +ka +ka +ka +ka +ka +Ty +Ty +Ty +ka +ka +ka +JN +JN +JN +ka +JN +ka +JN +JN +ka +ka +ka +JN +ka +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +JH +cO +SR +"} +(40,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +eK +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +TR +TR +HV +TR +TR +eP +KI +Bq +eK +eK +eK +ka +ka +Xl +ka +sz +ka +ka +Gp +Ty +Ty +JN +JN +JN +JN +JN +ka +ka +JN +JN +ka +ka +JN +ka +ka +ka +ka +ka +RO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(41,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +Ol +TR +TR +DG +Gx +Bq +eK +eK +rD +ka +ka +ka +ka +ka +ka +ka +ka +th +ka +JN +JN +JN +JN +JN +JN +ka +NH +eK +eK +AZ +AZ +eK +eK +ky +ka +JN +ka +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(42,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +eK +Bq +ce +cC +Bq +eK +mJ +ka +ka +ka +Yo +Yo +Yo +ka +ka +ka +ka +ka +rD +JN +JN +JN +ka +ka +JN +JN +yJ +eK +QX +hA +Ac +Sc +eK +YR +ka +ka +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +WX +SR +"} +(43,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eK +eK +eK +eK +bY +Et +ka +ra +Yo +Yo +bX +Yo +Yo +sz +ka +ka +ka +ka +JN +JN +jr +ka +ka +ka +JN +eK +Bq +Qm +Mb +Mb +Mb +jK +aA +JF +ka +ka +FO +ka +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(44,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +UZ +Yo +bX +hh +bX +Yo +sz +ka +lA +US +IA +JN +JN +ka +ka +ka +ka +JN +mL +Mb +GK +Se +vU +Mb +rR +yN +UE +ka +ka +Bx +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(45,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +zq +Yo +bX +kN +bX +ev +ka +ka +NZ +NZ +eK +JN +JN +ka +ka +ka +ka +Sb +eK +Zy +lJ +tM +Hp +Mb +rR +yN +UE +ka +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +JH +SR +"} +(46,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +Bc +Yo +sl +bX +bX +Yo +sz +ka +NZ +YI +LD +JN +JN +rD +ka +ka +ka +eK +eK +pv +uD +DT +Mb +Mb +We +yN +UE +ka +ka +Eb +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(47,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +Yo +Yo +bX +Yo +Yo +sz +ka +NZ +kI +eK +JN +JN +ka +ka +ka +GQ +eK +VI +Mb +si +Co +Mb +Fp +Pq +Sz +Fx +ka +ka +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(48,1,1) = {" +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +Yo +Yo +Yo +ka +ka +ka +NZ +Qk +Uf +JN +JN +ka +ka +ka +ka +AZ +HE +Mb +jW +Mb +Mb +dl +eK +Fx +ka +ka +ka +th +Zn +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(49,1,1) = {" +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +sz +ka +ka +ka +th +ka +eK +kI +kI +eK +JN +JN +ka +ka +ka +ka +AZ +fL +Mb +Mb +Mb +hZ +rR +UE +ka +ka +ka +ka +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(50,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +rD +ka +ka +ka +ka +ka +NZ +ZB +sa +JN +JN +ka +th +ka +ka +AZ +xT +Mb +Mb +Og +SO +Np +Fx +ka +as +ka +ka +ka +sC +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +WX +SR +"} +(51,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +th +ka +ka +ka +ka +ka +ka +eK +eK +eK +JN +JN +ka +ka +rD +ka +eK +xT +Do +KL +tX +Np +Fx +ka +ka +ka +ka +ka +ka +ka +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(52,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +ka +RM +ka +ka +ka +eK +rK +JN +JN +JN +ka +ka +ka +ka +eK +eK +AZ +AZ +eK +cc +ka +ka +ka +ka +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(53,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +ka +ZI +ka +ka +as +ka +cg +JN +JN +ka +ka +ka +ka +ka +ka +os +ka +eM +ka +rD +ka +ka +ka +ka +ka +rj +ka +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(54,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +tW +ka +ka +th +ka +ka +ka +ka +ka +JN +JN +ka +ka +ka +ka +th +ka +BI +ka +ka +as +ka +ka +ka +ka +ka +ka +xk +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +JH +SR +"} +(55,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +Rc +Of +ka +ka +rD +ka +ka +ka +ka +JN +JN +ka +ka +ka +ka +ka +ka +sz +ka +ka +ka +ka +ka +QY +fY +gA +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(56,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +ka +ka +ka +ka +ka +ka +ka +JN +JN +JN +lk +Or +uX +qZ +ka +ka +ka +rD +ka +ka +ka +iy +ut +OM +ka +ka +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(57,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +XO +ka +ka +ka +ka +ka +ka +ka +as +JN +JN +kL +TB +ze +mv +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +th +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(58,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ET +tW +ka +XW +CA +ka +ka +ka +JN +JN +IL +wH +ze +mv +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +ka +rD +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +WX +cO +SR +"} +(59,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +bY +CR +ka +zH +LN +DR +ka +ka +ka +JN +JN +IL +eh +ze +mv +ka +rD +ka +ka +th +ka +ka +th +ka +ka +Oy +ka +ka +BU +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(60,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +cO +wb +bY +MT +ka +ka +ka +ka +ka +JN +JN +uz +It +It +MA +ka +ka +ka +ka +ka +ka +tW +tW +tW +tW +ka +ka +ka +il +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(61,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +TZ +RJ +ka +JN +JN +JN +Yd +ka +ka +ka +ka +dD +ka +ka +ka +TM +SM +SM +SM +SM +LY +ZY +ka +cp +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +cO +SR +"} +(62,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +WX +cO +cO +cO +cO +cO +cO +oa +ka +FX +FX +ka +JN +JN +ka +ka +ka +ka +ka +ka +ka +sz +ZV +FO +dG +ka +ka +ka +ka +ka +PR +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(63,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +ka +ka +JN +JN +ka +ka +ka +ka +ka +ka +OO +ka +FO +FO +dG +ka +ka +ka +ka +ka +PR +ka +ka +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(64,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +ka +JN +JN +ka +mi +ka +ka +ka +ka +ka +ka +FO +FO +dG +ka +ka +ka +ka +ka +PR +th +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +WX +cO +cO +cO +cO +SR +"} +(65,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +cO +cO +cO +cO +cO +oa +rD +ka +ka +JN +JN +ka +ka +ka +ka +rD +ka +JN +ka +ka +ka +dG +ka +Dg +ka +ka +ka +PR +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(66,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +ka +JN +JN +JN +JN +JN +ka +ka +ka +fI +jP +fI +lP +dG +ka +ka +ka +ka +ka +PR +Oy +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(67,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +th +ka +ka +JN +JN +JN +ka +JN +JN +ka +JN +GD +ew +fI +sO +dG +Tw +Tw +Tw +Tw +Tw +PR +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +cO +cO +cO +cO +SR +"} +(68,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +WX +cO +cO +cO +cO +cO +cO +eH +Ko +ka +ka +rD +JN +JN +ka +yz +ka +ka +ka +Gw +fI +jP +hu +lP +dG +ka +ka +ka +ka +ka +PR +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(69,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eH +tk +ka +ka +Dt +ka +JN +JN +ka +ka +ka +ka +JN +ka +ka +th +ka +ka +dG +ka +ka +ka +ka +ka +PR +ka +cE +cO +cO +cO +cO +cO +cO +WX +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(70,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +JH +cO +cO +eH +EI +rl +ka +ka +ka +ka +ka +JN +JN +JN +ka +ka +ka +ka +ka +ka +rD +FO +FO +dG +ka +ka +ka +ka +ka +PR +al +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(71,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +eH +tk +th +ka +ka +eK +eK +eK +eK +qc +JN +JN +ka +ka +ka +ka +ka +JN +ka +FO +FO +dG +ka +ka +ka +ka +ka +PR +ka +xj +ij +cO +cO +JH +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(72,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +Oy +eK +eK +Bq +ro +ro +fg +eK +oZ +tQ +ka +ka +eO +PZ +ka +ka +ka +FO +FO +dG +ka +ka +ka +ka +ka +PR +ka +ka +nc +ij +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(73,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +eH +tk +ka +eK +Bq +ro +Ub +Sx +Sx +Sx +XJ +bK +ii +tQ +ka +pj +fH +ka +ka +ka +ka +ka +mW +Xu +Xu +Xu +Xu +WG +lz +ka +iP +ka +lG +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(74,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +eH +tk +ka +ka +eK +ro +Sx +Sx +Sx +Sx +Sx +XJ +bK +bK +TC +ka +ka +ka +rD +ka +ka +ka +ka +th +iU +iU +iU +iU +ka +ka +ka +hB +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(75,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +oa +sz +ka +ka +eK +Bq +DS +Bq +Bq +ro +Sx +eK +bK +bK +TC +ka +ka +ka +ka +ka +ka +ka +ka +rD +ka +ka +ka +ka +ka +rD +ka +FO +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(76,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +eH +tk +ka +sz +JN +eK +KH +uu +KH +Bq +ro +Sx +TW +bK +bK +TC +ka +ka +th +ka +ka +ka +ka +ka +ka +ka +ka +ka +th +ka +ka +ka +gC +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(77,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +eK +Rs +Bq +Bq +uu +uu +Bq +Bq +Sx +TK +bK +bK +TC +ka +ka +ka +tW +tW +tW +ka +tW +tW +ka +ka +ka +ka +ka +ka +ka +FO +ka +dX +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(78,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +eK +jV +dv +Bq +KH +uu +Qj +Bq +Sx +sI +bK +bK +TC +ka +ka +ka +tW +tW +tW +ka +tW +tW +ka +ka +ka +ka +ka +sR +ka +Jv +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(79,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +oa +th +ka +eK +Tq +hD +Bq +Bq +xO +uu +Bq +Bq +zg +bK +vM +VD +ka +ka +rD +ka +ka +ka +ka +ka +ka +ka +ka +ka +tW +ka +ka +ka +Oy +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(80,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +eK +Bz +Tb +UJ +Bq +aE +uu +KH +Bq +RF +YD +VD +ka +ka +ka +ka +ka +Rf +Tr +Tr +Tr +Zz +ka +ka +FO +uH +xP +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +"} +(81,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +eK +eK +jV +ke +Bq +aE +uu +KH +eK +GY +ka +ka +ka +ka +th +ka +Rf +zK +OA +OA +OA +RB +Zz +Oy +oJ +iU +ka +ka +ka +YN +gL +VL +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +SR +SR +SR +SR +"} +(82,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +oa +sz +AX +eK +IG +IG +eK +Bq +KH +Bq +eK +wI +ka +ka +ka +ka +ka +ka +rz +jq +OA +OA +OA +OA +ob +ka +ka +ka +ka +Zj +rD +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +"} +(83,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +ka +ka +ka +ka +eK +eK +eK +kJ +ka +OV +ka +ka +ka +ka +ka +rQ +ww +OA +OA +OA +OA +py +ka +Dg +ka +ka +ka +ka +cE +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +"} +(84,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +ka +ka +ka +ka +ka +sR +ka +ka +ka +ka +ka +ka +ka +KP +eK +eK +eK +eK +eK +eK +eK +Uk +ka +ka +ka +ka +gL +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +"} +(85,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +Oy +ka +ka +ka +ka +ka +ka +tW +tW +ka +tW +tW +Rf +eK +Bq +RP +YM +Ub +Mj +sV +fg +eK +ka +ka +gL +bY +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +"} +(86,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +th +ka +NZ +NZ +eK +ka +ka +ka +ka +ka +ka +ka +rz +Mo +Sx +jn +YZ +YZ +jn +YZ +QG +Bq +eK +bY +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +ot +ot +ot +ot +ot +ot +"} +(87,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +ka +NZ +EA +xe +ka +ka +ef +ef +ef +ef +NC +ta +eK +DL +Dq +Dq +Dq +Dq +Dq +KS +QN +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +"} +(88,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +eK +eK +eK +ka +oq +ka +ka +ka +ka +ka +ka +eK +Bq +Aj +Aj +Aj +Aj +Aj +Hd +hM +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +"} +(89,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +PH +ka +ka +aZ +iY +ka +ka +ka +MX +ka +JU +eK +fJ +og +HP +HP +HP +HP +wC +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +"} +(90,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +oa +ka +ka +Oy +ka +ka +ka +ka +nX +gL +Jw +VL +eK +HI +EQ +HP +HP +HP +HP +Bq +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(91,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +MT +gV +ka +ka +fv +gL +bY +bY +VL +cO +cO +eK +eK +Zs +Iw +Iw +Iw +eK +eK +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(92,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +wb +bY +bY +bY +bY +VL +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(93,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(94,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(95,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(96,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(97,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +cO +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} +(98,1,1) = {" +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +SR +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +ot +"} diff --git a/code/__DEFINES/_flags.dm b/code/__DEFINES/_flags.dm index a9b42840fdb71..72d28ca6bca9d 100644 --- a/code/__DEFINES/_flags.dm +++ b/code/__DEFINES/_flags.dm @@ -132,6 +132,8 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define QUIET_LOGS (1<<15) /// This area does not allow virtual entities to enter. #define VIRTUAL_SAFE_AREA (1<<16) +/// This area does not allow the Binary channel +#define BINARY_JAMMING (1<<17) /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 42ac2e01398fe..fb3c14f556ea9 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -365,6 +365,7 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list( #define HUNTER_PACK_RUSSIAN "Russian Fugitive Hunters" #define HUNTER_PACK_BOUNTY "Bounty Fugitive Hunters" #define HUNTER_PACK_PSYKER "Psyker Fugitive Hunters" +#define HUNTER_PACK_MI13 "MI13 Fugitive Hunters" /// Changeling abilities with DNA cost = this are innately given to all changelings #define CHANGELING_POWER_INNATE -1 diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 6246e25e93b56..4c7a9c169623b 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -163,13 +163,13 @@ DEFINE_BITFIELD(status_flags, list( #define DEFAULT_MESSAGE_RANGE 7 //Shove knockdown lengths (deciseconds) -#define SHOVE_KNOCKDOWN_SOLID 20 -#define SHOVE_KNOCKDOWN_HUMAN 20 -#define SHOVE_KNOCKDOWN_TABLE 20 +#define SHOVE_KNOCKDOWN_SOLID 2 SECONDS +#define SHOVE_KNOCKDOWN_HUMAN 2 SECONDS +#define SHOVE_KNOCKDOWN_TABLE 2 SECONDS #define SHOVE_KNOCKDOWN_COLLATERAL 1 -#define SHOVE_CHAIN_PARALYZE 30 +#define SHOVE_CHAIN_PARALYZE 3 SECONDS //Staggered slowdown, an effect caused by shoving and a few other features, such as tackling -#define STAGGERED_SLOWDOWN_LENGTH 30 +#define STAGGERED_SLOWDOWN_LENGTH 3 SECONDS #define STAGGERED_SLOWDOWN_STRENGTH 0.85 //multiplier //Shove disarming item list GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( @@ -180,38 +180,11 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list( #define UNARMED_MISS_CHANCE_MAX 80 //Combat object defines - -//Embedded objects -///Chance for embedded objects to cause pain (damage user) -#define EMBEDDED_PAIN_CHANCE 15 -///Chance for embedded object to fall out (causing pain but removing the object) -#define EMBEDDED_ITEM_FALLOUT 5 -///Chance for an object to embed into somebody when thrown -#define EMBED_CHANCE 45 -///Coefficient of multiplication for the damage the item does while embedded (this*item.w_class) -#define EMBEDDED_PAIN_MULTIPLIER 2 -///Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) -#define EMBEDDED_IMPACT_PAIN_MULTIPLIER 4 -///The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) +/// The minimum value of an item's throw_speed for it to embed (Unless it has embedded_ignore_throwspeed_threshold set to 1) #define EMBED_THROWSPEED_THRESHOLD 4 -///Coefficient of multiplication for the damage the item does when it falls out or is removed without a surgery (this*item.w_class) -#define EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER 6 -///A Time in ticks, total removal time = (this*item.w_class) -#define EMBEDDED_UNSAFE_REMOVAL_TIME 30 -///Chance for embedded objects to cause pain every time they move (jostle) -#define EMBEDDED_JOSTLE_CHANCE 5 -///Coefficient of multiplication for the damage the item does while -#define EMBEDDED_JOSTLE_PAIN_MULTIPLIER 1 -///This percentage of all pain will be dealt as stam damage rather than brute (0-1) -#define EMBEDDED_PAIN_STAM_PCT 0.0 -///For thrown weapons, every extra speed it's thrown at above its normal throwspeed will add this to the embed chance +/// For thrown embedding weapons, every extra speed it's thrown at above its normal throwspeed will add this to the embed chance #define EMBED_CHANCE_SPEED_BONUS 10 -#define EMBED_HARMLESS list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE) -#define EMBED_HARMLESS_SUPERIOR list("pain_mult" = 0, "jostle_pain_mult" = 0, "ignore_throwspeed_threshold" = TRUE, "embed_chance" = 100, "fall_chance" = 0.1) -#define EMBED_POINTY list("ignore_throwspeed_threshold" = TRUE) -#define EMBED_POINTY_SUPERIOR list("embed_chance" = 100, "ignore_throwspeed_threshold" = TRUE) - //Gun weapon weight #define WEAPON_LIGHT 1 #define WEAPON_MEDIUM 2 @@ -381,7 +354,7 @@ GLOBAL_LIST_INIT(leg_zones, list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG)) ///If the obstacle is an object at the border of the turf (so no signal from being sent to the other turf) #define SHOVE_DIRECTIONAL_BLOCKED (1<<6) -///Bitfield returned by listeners for COMSIG_CARBON_ENTER_STAMCRIT when they perform some action that prevents a mob going into stamcrit. +///Bitfield returned by listeners for COMSIG_LIVING_ENTER_STAMCRIT when they perform some action that prevents a mob going into stamcrit. #define STAMCRIT_CANCELLED (1<<0) ///Deathmatch lobby current status diff --git a/code/__DEFINES/dcs/signals/signals_area.dm b/code/__DEFINES/dcs/signals/signals_area.dm index 762431788f258..b136f46467f56 100644 --- a/code/__DEFINES/dcs/signals/signals_area.dm +++ b/code/__DEFINES/dcs/signals/signals_area.dm @@ -35,3 +35,6 @@ #define COMSIG_WEATHER_BEGAN_IN_AREA(event_type) "weather_began_in_area_[event_type]" /// Called when some weather ends in this area #define COMSIG_WEATHER_ENDED_IN_AREA(event_type) "weather_ended_in_area_[event_type]" + +///From base of area/update_beauty() +#define COMSIG_AREA_BEAUTY_UPDATED "area_beauty_updated" diff --git a/code/__DEFINES/dcs/signals/signals_bitrunning.dm b/code/__DEFINES/dcs/signals/signals_bitrunning.dm index 150c26080221c..23461a90a1108 100644 --- a/code/__DEFINES/dcs/signals/signals_bitrunning.dm +++ b/code/__DEFINES/dcs/signals/signals_bitrunning.dm @@ -42,8 +42,14 @@ #define COMSIG_BITRUNNER_STATION_SPAWN "bitrunner_station_spawn" // Ladder + /// from /obj/structure/hololadder/disconnect() #define COMSIG_BITRUNNER_LADDER_SEVER "bitrunner_ladder_sever" /// Sent when a server console is emagged #define COMSIG_BITRUNNER_SERVER_EMAGGED "bitrunner_server_emagged" + +// Spawners + +/// from /obj/effect/mob_spawn/ghost_role/human/virtual_domain/proc/artificial_spawn() : (mob/living/runner) +#define COMSIG_BITRUNNER_SPAWNED "bitrunner_spawned" diff --git a/code/__DEFINES/dcs/signals/signals_fish.dm b/code/__DEFINES/dcs/signals/signals_fish.dm index c70cdfde1a3f3..5b01bd7d61299 100644 --- a/code/__DEFINES/dcs/signals/signals_fish.dm +++ b/code/__DEFINES/dcs/signals/signals_fish.dm @@ -1,6 +1,12 @@ // Aquarium related signals #define COMSIG_AQUARIUM_SURFACE_CHANGED "aquarium_surface_changed" #define COMSIG_AQUARIUM_FLUID_CHANGED "aquarium_fluid_changed" +///Called on aquarium/attackby: (aquarium) +#define COMSIG_TRY_INSERTING_IN_AQUARIUM "item_try_inserting_in_aquarium" + ///The item will be inserted into the aquarium + #define COMSIG_CAN_INSERT_IN_AQUARIUM (1<<0) + ///The item won't be inserted into the aquarium, but will early return attackby anyway. + #define COMSIG_CANNOT_INSERT_IN_AQUARIUM (1<<1) // Fish signals #define COMSIG_FISH_STATUS_CHANGED "fish_status_changed" 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 598ddc5187852..051953bd7e508 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -57,8 +57,6 @@ /// Called from bodypart being removed /obj/item/bodypart/proc/drop_limb(mob/living/carbon/old_owner, special, dismembered) #define COMSIG_BODYPART_REMOVED "bodypart_removed" -/// from /mob/living/carbon/enter_stamcrit() -#define COMSIG_CARBON_ENTER_STAMCRIT "carbon_enter_stamcrit" ///from base of mob/living/carbon/soundbang_act(): (list(intensity)) #define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" ///from /item/organ/proc/Insert() (/obj/item/organ/) @@ -163,3 +161,8 @@ /// from /datum/status_effect/limp/proc/check_step(mob/whocares, OldLoc, Dir, forced) iodk where it shuld go #define COMSIG_CARBON_LIMPING "mob_limp_check" #define COMPONENT_CANCEL_LIMP (1<<0) + +///Called from on_acquiring(mob/living/carbon/human/acquirer) +#define COMSIG_MUTATION_GAINED "mutation_gained" +///Called from on_losing(mob/living/carbon/human/owner) +#define COMSIG_MUTATION_LOST "mutation_lost" 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 517048bbd4d1d..4c79c9ad8147d 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -21,6 +21,8 @@ ///from base of mob/update_transform() #define COMSIG_LIVING_POST_UPDATE_TRANSFORM "living_post_update_transform" +/// from /datum/status_effect/incapacitating/stamcrit/on_apply() +#define COMSIG_LIVING_ENTER_STAMCRIT "living_enter_stamcrit" ///from /obj/structure/door/crush(): (mob/living/crushed, /obj/machinery/door/crushing_door) #define COMSIG_LIVING_DOORCRUSHED "living_doorcrush" ///from base of mob/living/resist() (/mob/living) 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 8ada1c30be3c3..8be5b1fdb64aa 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm @@ -155,7 +155,7 @@ ///Mob is trying to open the wires of a target [/atom], from /datum/wires/interactable(): (atom/target) #define COMSIG_TRY_WIRES_INTERACT "try_wires_interact" #define COMPONENT_CANT_INTERACT_WIRES (1<<0) -///Mob is trying to emote, from /datum/emote/proc/run_emote(): (key, params, type_override, intentional) +///Mob is trying to emote, from /datum/emote/proc/run_emote(): (key, params, type_override, intentional, emote) #define COMSIG_MOB_PRE_EMOTED "mob_pre_emoted" #define COMPONENT_CANT_EMOTE (1<<0) #define COMSIG_MOB_EMOTED(emote_key) "mob_emoted_[emote_key]" @@ -205,7 +205,7 @@ ///Sent by pilot of mech in /obj/vehicle/sealed/mecha/on_mouseclick when using mech equipment : (/obj/vehicle/sealed/mecha/mech) #define COMSIG_MOB_USED_MECH_EQUIPMENT "mob_used_mech_equipment" ///Sent by pilot of mech in /obj/vehicle/sealed/mecha/on_mouseclick when triggering mech punch : (/obj/vehicle/sealed/mecha/mech) -#define COMSIG_MOB_USED_MECH_MELEE "mob_used_mech_melee" +#define COMSIG_MOB_USED_CLICK_MECH_MELEE "mob_used_click_mech_melee" ///from living/flash_act(), when a mob is successfully flashed. #define COMSIG_MOB_FLASHED "mob_flashed" diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm index d92408f2192e7..d34de1e356792 100644 --- a/code/__DEFINES/dcs/signals/signals_object.dm +++ b/code/__DEFINES/dcs/signals/signals_object.dm @@ -340,6 +340,10 @@ #define COMSIG_GUN_CHAMBER_PROCESSED "gun_chamber_processed" ///called in /obj/item/gun/ballistic/process_chamber (casing) #define COMSIG_CASING_EJECTED "casing_ejected" +///called in /obj/item/gun/ballistic/sawoff(mob/user, obj/item/saw, handle_modifications) : (mob/user) +#define COMSIG_GUN_BEING_SAWNOFF "gun_being_sawnoff" + #define COMPONENT_CANCEL_SAWING_OFF (1<<0) +#define COMSIG_GUN_SAWN_OFF "gun_sawn_off" // Jetpack things // Please kill me diff --git a/code/__DEFINES/door.dm b/code/__DEFINES/door.dm new file mode 100644 index 0000000000000..198d38a3af6dc --- /dev/null +++ b/code/__DEFINES/door.dm @@ -0,0 +1,18 @@ +// Door animation defines +#define DOOR_OPENING_ANIMATION "opening" +#define DOOR_CLOSING_ANIMATION "closing" +#define DOOR_DENY_ANIMATION "deny" + +// Door animation STEP defines +// These are used to mark points in the animtion when things in game should change +#define DOOR_OPENING_PASSABLE "opening_passable" +#define DOOR_OPENING_FINISHED "opening_finished" +#define DOOR_CLOSING_UNPASSABLE "closing_unpassable" +#define DOOR_CLOSING_FINISHED "closing_finished" + +#define AIRLOCK_OPENING_TRANSPARENT "airlock_opening_transparent" +#define AIRLOCK_OPENING_PASSABLE "airlock_opening_passable" +#define AIRLOCK_OPENING_FINISHED "airlock_opening_finished" +#define AIRLOCK_CLOSING_OPAQUE "airlock_closing_opaque" +#define AIRLOCK_CLOSING_UNPASSABLE "airlock_closing_unpassable" +#define AIRLOCK_CLOSING_FINISHED "airlock_closing_finished" diff --git a/code/__DEFINES/exosuit_fab.dm b/code/__DEFINES/exosuit_fab.dm index 4cc21f210d61d..4fd921bdeb777 100644 --- a/code/__DEFINES/exosuit_fab.dm +++ b/code/__DEFINES/exosuit_fab.dm @@ -35,10 +35,12 @@ #define EXOSUIT_MODULE_MARAUDER (1<<10) /// Module is compatible with Paddy models #define EXOSUIT_MODULE_PADDY (1<<11) +/// Module is compatible with Justice models +#define EXOSUIT_MODULE_JUSTICE (1<<12) /// Module is compatible with "Working" Exosuit models - Ripley and Clarke #define EXOSUIT_MODULE_WORKING (EXOSUIT_MODULE_RIPLEY | EXOSUIT_MODULE_CLARKE) /// Module is compatible with "Combat" Exosuit models - Gygax, H.O.N.K, Durand and Phazon, or any Exosuit with an empty Concealed Weapon Bay -#define EXOSUIT_MODULE_COMBAT (EXOSUIT_MODULE_GYGAX | EXOSUIT_MODULE_HONK | EXOSUIT_MODULE_DURAND | EXOSUIT_MODULE_PHAZON | EXOSUIT_MODULE_SAVANNAH | EXOSUIT_MODULE_RETICENCE | EXOSUIT_MODULE_MARAUDER | EXOSUIT_MODULE_PADDY | EXOSUIT_MODULE_CONCEALED_WEP_BAY) +#define EXOSUIT_MODULE_COMBAT (EXOSUIT_MODULE_GYGAX | EXOSUIT_MODULE_HONK | EXOSUIT_MODULE_DURAND | EXOSUIT_MODULE_PHAZON | EXOSUIT_MODULE_SAVANNAH | EXOSUIT_MODULE_RETICENCE | EXOSUIT_MODULE_MARAUDER | EXOSUIT_MODULE_PADDY | EXOSUIT_MODULE_JUSTICE | EXOSUIT_MODULE_CONCEALED_WEP_BAY) /// Module is compatible with "Medical" Exosuit modelsm - Odysseus #define EXOSUIT_MODULE_MEDICAL EXOSUIT_MODULE_ODYSSEUS diff --git a/code/__DEFINES/fish.dm b/code/__DEFINES/fish.dm index 8e03c920d248d..36903049e895b 100644 --- a/code/__DEFINES/fish.dm +++ b/code/__DEFINES/fish.dm @@ -152,3 +152,12 @@ #define ELECTROGENESIS_DURATION 40 SECONDS /// a random range the electrogenesis cooldown varies by #define ELECTROGENESIS_VARIANCE (rand(-10 SECONDS, 10 SECONDS)) + +#define FISH_BEAUTY_DISGUSTING -500 +#define FISH_BEAUTY_UGLY -300 +#define FISH_BEAUTY_BAD -200 +#define FISH_BEAUTY_NULL 0 +#define FISH_BEAUTY_GENERIC 250 +#define FISH_BEAUTY_GOOD 450 +#define FISH_BEAUTY_GREAT 600 +#define FISH_BEAUTY_EXCELLENT 700 diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 94e9105f4a387..a853fde0c5dee 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -3,34 +3,33 @@ #define SMOOTH_CORNERS (1<<0) /// Smoothing system in where adjacencies are calculated and used to select a pre-baked icon_state, encoded by bitmasking. #define SMOOTH_BITMASK (1<<1) +/// Limits SMOOTH_BITMASK to only cardinal directions, for use with cardinal smoothing +#define SMOOTH_BITMASK_CARDINALS (1<<2) /// Atom has diagonal corners, with underlays under them. -#define SMOOTH_DIAGONAL_CORNERS (1<<2) +#define SMOOTH_DIAGONAL_CORNERS (1<<3) /// Atom will smooth with the borders of the map. -#define SMOOTH_BORDER (1<<3) +#define SMOOTH_BORDER (1<<4) /// Atom is currently queued to smooth. -#define SMOOTH_QUEUED (1<<4) +#define SMOOTH_QUEUED (1<<5) /// Smooths with objects, and will thus need to scan turfs for contents. -#define SMOOTH_OBJ (1<<5) +#define SMOOTH_OBJ (1<<6) /// Uses directional object smoothing, so we care not only about something being on the right turf, but also its direction /// Changes the meaning of smoothing_junction, instead of representing the directions we are smoothing in /// it represents the sides of our directional border object that have a neighbor /// Is incompatible with SMOOTH_CORNERS because border objects don't have corners -#define SMOOTH_BORDER_OBJECT (1<<6) -/// Has a smooth broken sprite, used to decide whether to apply an offset to the broken overlay or not. For /turf/open only. -#define SMOOTH_BROKEN_TURF (1<<7) -/// Has a smooth burnt sprite, used to decide whether to apply an offset to the burnt overlay or not. For /turf/open only. -#define SMOOTH_BURNT_TURF (1<<8) +#define SMOOTH_BORDER_OBJECT (1<<7) + +#define USES_SMOOTHING (SMOOTH_CORNERS|SMOOTH_BITMASK|SMOOTH_BITMASK_CARDINALS) DEFINE_BITFIELD(smoothing_flags, list( "SMOOTH_CORNERS" = SMOOTH_CORNERS, "SMOOTH_BITMASK" = SMOOTH_BITMASK, + "SMOOTH_BITMASK_CARDINALS" = SMOOTH_BITMASK_CARDINALS, "SMOOTH_DIAGONAL_CORNERS" = SMOOTH_DIAGONAL_CORNERS, "SMOOTH_BORDER" = SMOOTH_BORDER, "SMOOTH_QUEUED" = SMOOTH_QUEUED, "SMOOTH_OBJ" = SMOOTH_OBJ, "SMOOTH_BORDER_OBJECT" = SMOOTH_BORDER_OBJECT, - "SMOOTH_BROKEN_TURF" = SMOOTH_BROKEN_TURF, - "SMOOTH_BURNT_TURF" = SMOOTH_BURNT_TURF, )) /// Components of a smoothing junction @@ -44,6 +43,9 @@ DEFINE_BITFIELD(smoothing_flags, list( #define SOUTHWEST_JUNCTION (1<<6) #define NORTHWEST_JUNCTION (1<<7) +#define CARDINAL_SMOOTHING_JUNCTIONS (NORTH_JUNCTION|SOUTH_JUNCTION|EAST_JUNCTION|WEST_JUNCTION) +#define ALL_SMOOTHING_JUNCTIONS (NORTH_JUNCTION|SOUTH_JUNCTION|EAST_JUNCTION|WEST_JUNCTION|NORTHEAST_JUNCTION|SOUTHEAST_JUNCTION|SOUTHWEST_JUNCTION|NORTHWEST_JUNCTION) + DEFINE_BITFIELD(smoothing_junction, list( "NORTH_JUNCTION" = NORTH_JUNCTION, "SOUTH_JUNCTION" = SOUTH_JUNCTION, @@ -57,7 +59,7 @@ DEFINE_BITFIELD(smoothing_junction, list( /*smoothing macros*/ -#define QUEUE_SMOOTH(thing_to_queue) if(thing_to_queue.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) {SSicon_smooth.add_to_queue(thing_to_queue)} +#define QUEUE_SMOOTH(thing_to_queue) if(thing_to_queue.smoothing_flags & USES_SMOOTHING) {SSicon_smooth.add_to_queue(thing_to_queue)} #define QUEUE_SMOOTH_NEIGHBORS(thing_to_queue) for(var/atom/atom_neighbor as anything in orange(1, thing_to_queue)) {QUEUE_SMOOTH(atom_neighbor)} diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index ba467347e87d2..0d9d28d4d858a 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -49,6 +49,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isspaceturf(A) (istype(A, /turf/open/space)) +#define is_space_or_openspace(A) (isopenspaceturf(A) || isspaceturf(A)) + #define isfloorturf(A) (istype(A, /turf/open/floor)) #define ismiscturf(A) (istype(A, /turf/open/misc)) diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index 08a771bf7ddf6..999d7886cf466 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -122,23 +122,36 @@ // PLANE_SPACE layer(s) #define SPACE_LAYER 1.8 -//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define. Most floors (FLOOR_PLANE) and walls (WALL_PLANE) use this. - -//FLOOR_PLANE layers -#define TURF_PLATING_DECAL_LAYER 2.001 -#define TURF_DECAL_LAYER 2.009 //Makes turf decals appear in DM how they will look inworld. -#define CULT_OVERLAY_LAYER 2.01 -#define MID_TURF_LAYER 2.02 -#define HIGH_TURF_LAYER 2.03 -#define LATTICE_LAYER 2.04 -#define DISPOSAL_PIPE_LAYER 2.042 -#define WIRE_LAYER 2.044 -#define GLASS_FLOOR_LAYER 2.046 -#define TRAM_RAIL_LAYER 2.047 -#define ABOVE_OPEN_TURF_LAYER 2.049 +// placed here for documentation. Byond's default turf layer +// We do not use it, as different turfs render on different planes +// #define TURF_LAYER 2 +#define TURF_LAYER 2 #error TURF_LAYER is no longer supported, please be more specific + +// FLOOR_PLANE layer(s) +// We need to force this plane to render as if we were not using sidemap +// this allows larger then bound floors to layer as we'd expect +// ANYTHING on the floor plane needs TOPDOWN_LAYER, and nothing that isn't on the floor plane can have it + +// NOTICE: we break from the pattern of increasing in steps of like 0.01 here +// Because TOPDOWN_LAYER is 10000 and that's enough to floating point our modifications away +#define LOW_FLOOR_LAYER (1 + TOPDOWN_LAYER) +#define TURF_PLATING_DECAL_LAYER (2 + TOPDOWN_LAYER) +#define TURF_DECAL_LAYER (3 + TOPDOWN_LAYER) //Makes turf decals appear in DM how they will look inworld. +#define CULT_OVERLAY_LAYER (4 + TOPDOWN_LAYER) +#define MID_TURF_LAYER (5 + TOPDOWN_LAYER) +#define HIGH_TURF_LAYER (6 + TOPDOWN_LAYER) +#define LATTICE_LAYER (7 + TOPDOWN_LAYER) +#define DISPOSAL_PIPE_LAYER (8 + TOPDOWN_LAYER) +#define WIRE_LAYER (9 + TOPDOWN_LAYER) +#define GLASS_FLOOR_LAYER (10 + TOPDOWN_LAYER) +#define TRAM_RAIL_LAYER (11 + TOPDOWN_LAYER) +///catwalk overlay of /turf/open/floor/plating/catwalk_floor +#define CATWALK_LAYER (12 + TOPDOWN_LAYER) +#define ABOVE_OPEN_TURF_LAYER (13 + TOPDOWN_LAYER) //WALL_PLANE layers -#define CLOSED_TURF_LAYER 2.05 +#define BELOW_CLOSED_TURF_LAYER 2.053 +#define CLOSED_TURF_LAYER 2.058 // GAME_PLANE layers #define BULLET_HOLE_LAYER 2.06 @@ -153,8 +166,6 @@ #define PLUMBING_PIPE_VISIBILE_LAYER 2.495//layer = initial(layer) + ducting_layer / 3333 in atmospherics/handle_layer() to determine order of duct overlap #define BOT_PATH_LAYER 2.497 #define LOW_OBJ_LAYER 2.5 -///catwalk overlay of /turf/open/floor/plating/catwalk_floor -#define CATWALK_LAYER 2.51 #define LOW_SIGIL_LAYER 2.52 #define SIGIL_LAYER 2.53 #define HIGH_PIPE_LAYER 2.54 diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index c050c73f23133..9f575de9fbc55 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -75,20 +75,18 @@ #define DANGEROUS_OBJECT (1<<10) /// Clothes that use large icons, for applying the proper overlays like blood #define LARGE_WORN_ICON (1<<11) -/// Clothes that block speech (i.e the muzzle). Can be applied to any clothing piece. -#define BLOCKS_SPEECH (1<<12) /// prevents from placing on plasmaman helmet or modsuit hat holder -#define STACKABLE_HELMET_EXEMPT (1<<13) +#define STACKABLE_HELMET_EXEMPT (1<<12) /// Prevents plasmamen from igniting when wearing this -#define PLASMAMAN_PREVENT_IGNITION (1<<14) +#define PLASMAMAN_PREVENT_IGNITION (1<<13) /// Usable as casting clothes by wizards (matters for suits, glasses and headwear) -#define CASTING_CLOTHES (1<<15) +#define CASTING_CLOTHES (1<<14) ///Moths can't eat the clothing that has this flag. -#define INEDIBLE_CLOTHING (1<<16) +#define INEDIBLE_CLOTHING (1<<15) /// Headgear/helmet allows internals -#define HEADINTERNALS (1<<17) +#define HEADINTERNALS (1<<16) /// Prevents masks from getting adjusted from enabling internals -#define INTERNALS_ADJUST_EXEMPT (1<<18) +#define INTERNALS_ADJUST_EXEMPT (1<<17) /// Integrity defines for clothing (not flags but close enough) #define CLOTHING_PRISTINE 0 // We have no damage on the clothing diff --git a/code/__DEFINES/reagents.dm b/code/__DEFINES/reagents.dm index 93ffdbf04c9d9..0f8b41be999c6 100644 --- a/code/__DEFINES/reagents.dm +++ b/code/__DEFINES/reagents.dm @@ -33,6 +33,8 @@ #define PATCH (1<<3) /// Used for direct injection of reagents. #define INJECT (1<<4) +/// Exclusive to just plumbing. if set we use the round robin technique else we use proportional +#define LINEAR (1<<5) /// When returned by on_mob_life(), on_mob_dead(), overdose_start() or overdose_processed(), will cause the mob to updatehealth() afterwards #define UPDATE_MOB_HEALTH 1 diff --git a/code/__DEFINES/research/research_categories.dm b/code/__DEFINES/research/research_categories.dm index 3f6428eb73178..cd7a216bc9c9d 100644 --- a/code/__DEFINES/research/research_categories.dm +++ b/code/__DEFINES/research/research_categories.dm @@ -134,6 +134,7 @@ #define RND_CATEGORY_MECHFAB_PHAZON "/Phazon" #define RND_CATEGORY_MECHFAB_CLARKE "/Clarke" #define RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV "/Savannah-Ivanov" +#define RND_CATEGORY_MECHFAB_JUSTICE "/Justice" #define RND_SUBCATEGORY_MECHFAB_CHASSIS "/Chassis" #define RND_SUBCATEGORY_MECHFAB_SUPPORTED_EQUIPMENT "/Supported Equipment" #define RND_SUBCATEGORY_MECHFAB_CONTROL_INTERFACES "/Control Interfaces" diff --git a/code/__DEFINES/research/techweb_nodes.dm b/code/__DEFINES/research/techweb_nodes.dm index a31c3e1a2f278..6199918bc0183 100644 --- a/code/__DEFINES/research/techweb_nodes.dm +++ b/code/__DEFINES/research/techweb_nodes.dm @@ -117,6 +117,5 @@ #define TECHWEB_NODE_SYNDICATE_BASIC "syndicate_basic" #define TECHWEB_NODE_TACKLE_ADVANCED "tackle_advanced" #define TECHWEB_NODE_TELECOMS "telecoms" -#define TECHWEB_NODE_TOYS "toys" #define TECHWEB_NODE_UNREGULATED_BLUESPACE "unregulated_bluespace" #define TECHWEB_NODE_XENOBIOLOGY "xenobiology" diff --git a/code/__DEFINES/tools.dm b/code/__DEFINES/tools.dm index 7809610e6abec..2348bd49f194b 100644 --- a/code/__DEFINES/tools.dm +++ b/code/__DEFINES/tools.dm @@ -8,6 +8,7 @@ #define TOOL_ANALYZER "analyzer" #define TOOL_MINING "mining" #define TOOL_SHOVEL "shovel" +#define TOOL_DRAPES "surgicaldrapes" #define TOOL_RETRACTOR "retractor" #define TOOL_HEMOSTAT "hemostat" #define TOOL_CAUTERY "cautery" diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm index f3b6020b051ba..e216652fe3d7e 100644 --- a/code/__DEFINES/traits/declarations.dm +++ b/code/__DEFINES/traits/declarations.dm @@ -563,6 +563,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Makes the player appear as their respective job in Binary Talk rather than being a 'Default Cyborg'. #define TRAIT_DISPLAY_JOB_IN_BINARY "display job in binary" +/// Trait that determines vulnerability to being stunned from a shove +#define TRAIT_STUN_ON_NEXT_SHOVE "stun on next shove" + // METABOLISMS // Various jobs on the station have historically had better reactions // to various drinks and foodstuffs. Security liking donuts is a classic @@ -617,6 +620,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_CHEF_KISS "chefs_kiss" /// Allows clowns to bend balloons into animals #define TRAIT_BALLOON_SUTRA "balloon_sutra" +/// Allows detectives to identify chemicals by taste +#define TRAIT_DETECTIVES_TASTE "detectives_taste" ///Movement type traits for movables. See elements/movetype_handler.dm #define TRAIT_MOVE_GROUND "move_ground" @@ -1014,8 +1019,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// things with this trait are treated as having no access in /atom/movable/proc/check_access(obj/item) #define TRAIT_ALWAYS_NO_ACCESS "alwaysnoaccess" -/// This human wants to see the color of their glasses, for some reason -#define TRAIT_SEE_GLASS_COLORS "see_glass_colors" +///Used by wearable_client_colour to determine whether the mob wants to have the colours of the screen affected by worn items (some still do regardless). +#define TRAIT_SEE_WORN_COLOURS "see_worn_colour" // Radiation defines @@ -1181,4 +1186,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///Trait given to the birthday boy #define TRAIT_BIRTHDAY_BOY "birthday_boy" + +///Trait given to a turf that should not be allowed to be terraformed, such as turfs holding ore vents. +#define TRAIT_NO_TERRAFORM "no_terraform" + + // END TRAIT DEFINES diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index 278510bd23fbe..759101dc2abd5 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -190,6 +190,8 @@ #define MOD_TRAIT "mod" /// Trait applied to tram passengers #define TRAM_PASSENGER_TRAIT "tram-passenger" +/// Trait given by a fulton extraction pack +#define FULTON_PACK_TRAIT "fulton-pack" /// Trait granted by the berserker hood. #define BERSERK_TRAIT "berserk_trait" diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm index bb92f0672c3a7..67df6fc0e6295 100644 --- a/code/__DEFINES/uplink.dm +++ b/code/__DEFINES/uplink.dm @@ -15,6 +15,17 @@ /// Can be randomly given to spies for their bounties #define UPLINK_SPY (1 << 4) +#define UPLINK_LONE_OP (1 << 5) + +/// A blanket define for an item being purchasable by all types of nukie +#define UPLINK_ALL_SYNDIE_OPS (UPLINK_NUKE_OPS | UPLINK_LONE_OP | UPLINK_CLOWN_OPS) + +/// A blanket define for an item being purchasable by all operatives that spawn at the nukie firebase +#define UPLINK_FIREBASE_OPS (UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + +/// A define that excludes clown ops from the regular nukeop gear lineup +#define UPLINK_SERIOUS_OPS (UPLINK_NUKE_OPS | UPLINK_LONE_OP) + /// Progression gets turned into a user-friendly form. This is just an abstract equation that makes progression not too large. #define DISPLAY_PROGRESSION(time) round(time/60, 0.01) diff --git a/code/__HELPERS/_planes.dm b/code/__HELPERS/_planes.dm index 769c4283ea626..779319114076f 100644 --- a/code/__HELPERS/_planes.dm +++ b/code/__HELPERS/_planes.dm @@ -86,3 +86,19 @@ // This is solvable with lowspec preferences, which would not be hard to implement // Player popups will now render their effects, like overlay lights. this is fixable, but I've not gotten to it // I think overlay lights can render on the wrong z layer. s fucked + +/// Whitelist of planes allowed to use TOPDOWN_LAYER +GLOBAL_LIST_INIT(topdown_planes, list( + "[FLOOR_PLANE]" = TRUE, + )) + +/// Checks if a passed in MA or atom is allowed to have its current plane/layer matchup +/proc/check_topdown_validity(mutable_appearance/thing_to_check) + if(istype(thing_to_check, /atom/movable/screen/plane_master)) + return + var/topdown_plane = GLOB.topdown_planes["[PLANE_TO_TRUE(thing_to_check.plane)]"] + if(topdown_plane) + if(thing_to_check.layer - TOPDOWN_LAYER < 0 || thing_to_check.layer >= BACKGROUND_LAYER) + stack_trace("[thing_to_check] ([thing_to_check.type]) was expected to have a TOPDOWN_LAYER layer due to its plane, but it DID NOT! layer: ([thing_to_check.layer]) plane: ([thing_to_check.plane])") + else if(thing_to_check.layer - TOPDOWN_LAYER >= 0 && thing_to_check.layer < BACKGROUND_LAYER) + stack_trace("[thing_to_check] ([thing_to_check.type] is NOT ALLOWED to have a TOPDOWN_LAYER layer due to its plane, but it did! layer: ([thing_to_check.layer]) plane: ([thing_to_check.plane])") diff --git a/code/__HELPERS/areas.dm b/code/__HELPERS/areas.dm index dc2f66c2ed0dd..f81464013e01c 100644 --- a/code/__HELPERS/areas.dm +++ b/code/__HELPERS/areas.dm @@ -148,7 +148,7 @@ GLOBAL_LIST_INIT(typecache_powerfailure_safe_areas, typecacheof(list( * A list of all machinery tied to an area along with the area itself. key=area name,value=list(area,list of machinery) * we use this to keep track of what areas are affected by the blueprints & what machinery of these areas needs to be reconfigured accordingly */ - var/area/affected_areas = list() + var/list/area/affected_areas = list() for(var/turf/the_turf as anything in turfs) var/area/old_area = the_turf.loc diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 5c5ff5a059a30..88ca3dbe11c8c 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -177,7 +177,7 @@ xxx xxx xxx corners_diagonal_smooth(calculate_adjacencies()) else corners_cardinal_smooth(calculate_adjacencies()) - else if(smoothing_flags & SMOOTH_BITMASK) + else if(smoothing_flags & (SMOOTH_BITMASK|SMOOTH_BITMASK_CARDINALS)) bitmask_smooth() else CRASH("smooth_icon called for [src] with smoothing_flags == [smoothing_flags]") @@ -430,7 +430,7 @@ xxx xxx xxx SET_ADJ_IN_DIR(WEST, WEST) // If there's nothing going on already - if(!(new_junction & (NORTH|SOUTH)) || !(new_junction & (EAST|WEST))) + if(smoothing_flags & SMOOTH_BITMASK_CARDINALS || !(new_junction & (NORTH|SOUTH)) || !(new_junction & (EAST|WEST))) set_smoothed_icon_state(new_junction) return @@ -493,7 +493,7 @@ xxx xxx xxx var/junction_dir = reverse_ndir(smoothing_junction) var/turned_adjacency = REVERSE_DIR(junction_dir) var/turf/neighbor_turf = get_step(src, turned_adjacency & (NORTH|SOUTH)) - var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, offset_spokesman = src, plane = FLOOR_PLANE) + var/mutable_appearance/underlay_appearance = mutable_appearance(layer = LOW_FLOOR_LAYER, offset_spokesman = src, plane = FLOOR_PLANE) if(!neighbor_turf.get_smooth_underlay_icon(underlay_appearance, src, turned_adjacency)) neighbor_turf = get_step(src, turned_adjacency & (EAST|WEST)) @@ -518,13 +518,13 @@ xxx xxx xxx /proc/smooth_zlevel(zlevel, now = FALSE) var/list/away_turfs = Z_TURFS(zlevel) for(var/turf/turf_to_smooth as anything in away_turfs) - if(turf_to_smooth.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(turf_to_smooth.smoothing_flags & USES_SMOOTHING) if(now) turf_to_smooth.smooth_icon() else QUEUE_SMOOTH(turf_to_smooth) for(var/atom/movable/movable_to_smooth as anything in turf_to_smooth) - if(movable_to_smooth.smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(movable_to_smooth.smoothing_flags & USES_SMOOTHING) if(now) movable_to_smooth.smooth_icon() else @@ -655,15 +655,6 @@ xxx xxx xxx smoothing_groups = null canSmoothWith = null -#undef NORTH_JUNCTION -#undef SOUTH_JUNCTION -#undef EAST_JUNCTION -#undef WEST_JUNCTION -#undef NORTHEAST_JUNCTION -#undef NORTHWEST_JUNCTION -#undef SOUTHEAST_JUNCTION -#undef SOUTHWEST_JUNCTION - #undef NO_ADJ_FOUND #undef ADJ_FOUND #undef NULLTURF_BORDER diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index a67c78a12cc28..d5b3ecb16aff2 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -420,6 +420,10 @@ world } \ current_layer = base_layer + appearance.layer + current_layer / 1000; \ } \ + /* If we are using topdown rendering, chop that part off so things layer together as expected */ \ + if((current_layer >= TOPDOWN_LAYER && current_layer < EFFECTS_LAYER) || current_layer > TOPDOWN_LAYER + EFFECTS_LAYER) { \ + current_layer -= TOPDOWN_LAYER; \ + } \ for (var/index_to_compare_to in 1 to layers.len) { \ var/compare_to = layers[index_to_compare_to]; \ if (current_layer < layers[compare_to]) { \ @@ -431,9 +435,10 @@ world } var/static/icon/flat_template = icon('icons/blanks/32x32.dmi', "nothing") + var/icon/flat = icon(flat_template) if(!appearance || appearance.alpha <= 0) - return icon(flat_template) + return flat if(start) if(!defdir) @@ -474,10 +479,15 @@ world if(!base_icon_dir) base_icon_dir = curdir + // Expand our canvas to fit if we're too big + if(render_icon) + var/icon/active_icon = icon(curicon) + if(active_icon.Width() != 32 || active_icon.Height() != 32) + flat.Scale(active_icon.Width(), active_icon.Height()) + var/curblend = appearance.blend_mode || defblend if(appearance.overlays.len || appearance.underlays.len) - var/icon/flat = icon(flat_template) // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed var/list/layers = list() var/image/copy diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 5604ec78e3bff..dd81fff2a97ee 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -28,6 +28,20 @@ else return COLOR_BLACK +/proc/random_hair_color() + var/static/list/natural_hair_colors = list( + "#111111", "#362925", "#3B3831", "#41250C", "#412922", + "#544C49", "#583322", "#593029", "#703b30", "#714721", + "#744729", "#74482a", "#7b746e", "#855832", "#863019", + "#8c4734", "#9F550E", "#A29A96", "#A4381C", "#B17B41", + "#C0BAB7", "#EFE5E4", "#F7F3F1", "#FFF2D6", "#a15537", + "#a17e61", "#b38b67", "#ba673c", "#c89f73", "#d9b380", + "#dbc9b8", "#e1621d", "#e17d17", "#e1af93", "#f1cc8f", + "#fbe7a1", + ) + + return pick(natural_hair_colors) + /proc/random_underwear(gender) if(length(SSaccessories.underwear_list) == 0) CRASH("No underwear to choose from!") diff --git a/code/__HELPERS/paths/path.dm b/code/__HELPERS/paths/path.dm index 61e50601e7848..189120b76c3bc 100644 --- a/code/__HELPERS/paths/path.dm +++ b/code/__HELPERS/paths/path.dm @@ -370,7 +370,7 @@ GLOBAL_LIST_INIT(can_pass_info_vars, GLOBAL_PROC_REF(can_pass_check_vars)) /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])) + if(!(vars[comparable_var] ~= check_against.vars[comparable_var])) return FALSE if(!pulling_info != !check_against.pulling_info) return FALSE diff --git a/code/__HELPERS/records.dm b/code/__HELPERS/records.dm deleted file mode 100644 index 288ef5284d21f..0000000000000 --- a/code/__HELPERS/records.dm +++ /dev/null @@ -1,6 +0,0 @@ - -/proc/overwrite_field_if_available(datum/record/base, datum/record/other, field_name) - if(other[field_name]) - base[field_name] = other[field_name] - - diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index b0d38a624fb83..54022589d1528 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -241,12 +241,7 @@ if(last_char_group == SPACES_DETECTED) t_out = copytext_char(t_out, 1, -1) //removes the last character (in this case a space) - for(var/bad_name in list("space","floor","wall","r-wall","monkey","unknown","inactive ai")) //prevents these common metagamey names - if(cmptext(t_out,bad_name)) - return //(not case sensitive) - - // Protects against names containing IC chat prohibited words. - if(is_ic_filtered(t_out) || is_soft_ic_filtered(t_out)) + if(!filter_name_ic(t_out)) return return t_out @@ -257,6 +252,39 @@ #undef LETTERS_DETECTED +/// Much more permissive version of reject_bad_name(). +/// Returns a trimmed string or null if the name is invalid. +/// Allows most characters except for IC chat prohibited words. +/proc/permissive_sanitize_name(value) + if(!istext(value)) // Not a string + return + + var/name_length = length(value) + if(name_length < 3) // Too short + return + + if(name_length > 3 * MAX_NAME_LEN) // Bad input + return + + var/trimmed = trim(value, MAX_NAME_LEN) + if(!filter_name_ic(trimmed)) // Contains IC chat prohibited words + return + + return trim_reduced(trimmed) + + +/// Helper proc to check if a name is valid for the IC filter +/proc/filter_name_ic(name) + for(var/bad_name in list("space", "floor", "wall", "r-wall", "monkey", "unknown", "inactive ai")) //prevents these common metagamey names + if(cmptext(name, bad_name)) + return FALSE //(not case sensitive) + + // Protects against names containing IC chat prohibited words. + if(is_ic_filtered(name) || is_soft_ic_filtered(name)) + return FALSE + + return TRUE + //html_encode helper proc that returns the smallest non null of two numbers //or 0 if they're both null (needed because of findtext returning 0 when a value is not present) diff --git a/code/_globalvars/admin.dm b/code/_globalvars/admin.dm index 363b84b923d32..96f07e3cca870 100644 --- a/code/_globalvars/admin.dm +++ b/code/_globalvars/admin.dm @@ -28,3 +28,123 @@ GLOBAL_LIST_INIT(vv_special_lists, init_special_list_names()) if(isnull(locate(REF(value)))) output += varname return output + +///A giant associative list of span names, and the associated key to create the text span. Used for narrate verbs. +GLOBAL_LIST_INIT(spanname_to_formatting, list( + "Abductor" = "abductor", + "Admin" = "admin", + "Adminhelp" = "adminhelp", + "Admin Notice" = "adminnotice", + "Admin Observer OOC" = "adminobserverooc", + "Admin OOC" = "adminooc", + "Adminsay" = "adminsay", + "AI Private Radio" = "aiprivradio", + "Alert" = "alert", + "Alien Alert" = "alertalien", + "Syndie Alert" = "alertsyndie", + "Alert Warning" = "alertwarning", + "Alien" = "alien", + "Average" = "average", + "Bad" = "bad", + "Big" = "big", + "Binary Say" = "binarysay", + "Blob" = "blob", + "Blob Announce" = "blobannounce", + "Blue" = "blue", + "Blue Team Radio" = "blueteamradio", + "Bold" = "bold", + "Bold Announce" = "boldannounce", + "Bold Danger" = "bolddanger", + "Bold Italic" = "bolditalic", + "Bold Nice Green" = "boldnicegreen", + "Bold Notice" = "boldnotice", + "Bold Warning" = "boldwarning", + "Big Bold" = "big bold", + "Centcom Radio" = "centcomradio", + "Changeling" = "changeling", + "Clown" = "clown", + "Colossus" = "colossus", + "Command Headset" = "command_headset", + "Cult" = "cult", + "Cult Bold" = "cult_bold", + "Cult Bold Italic" = "cult_bold_italic", + "Cult Italic" = "cult_italic", + "Cult Large" = "cult_large", + "Danger" = "danger", + "Deadchat" = "deadsay", + "Deconversion Message" = "deconversion_message", + "Drone Radio" = "drone", + "Engineering Radio" = "engradio", + "Extremely Big" = "extremelybig", + "Game Say" = "game say", + "Ghost Alert" = "ghostalert", + "Green" = "green", + "Green Announce" = "greenannounce", + "Green Team Radio" = "greenteamradio", + "Greentext" = "greentext", + "Grey" = "grey", + "Hierophant" = "hierophant", + "Hierophant Warning" = "hierophant_warning", + "Highlight" = "highlight", + "His Grace" = "his_grace", + "Holoparasite" = "holoparasite", + "Holoparasite Bold" = "holoparasite bold", + "Hypnosis" = "hypnophrase", + "Icon" = "icon", + "Info" = "info", + "Info Plain" = "infoplain", + "Interface" = "interface", + "Looc" = "looc", + "Medal" = "medal", + "Medradio" = "medradio", + "Message" = "message", + "Mind Control" = "mind_control", + "Monkey" = "monkey", + "Narsie" = "narsie", + "Narsie Small" = "narsiesmall", + "Nice Green" = "nicegreen", + "Notice" = "notice", + "Notice Alien" = "noticealien", + "OOC" = "ooc", + "Papyrus" = "papyrus", + "Phobia" = "phobia", + "Prefix" = "prefix", + "Purple" = "purple", + "Radio" = "radio", + "Really Big" = "reallybig", + "Red" = "red", + "Red Team Radio" = "redteamradio", + "Red Text" = "redtext", + "Golem Resonate" = "resonate", + "Revenant Big Notice" = "revenbignotice", + "Revenant Bold Notice" = "revenboldnotice", + "Revenant Danger" = "revendanger", + "Revenant Minor" = "revenminor", + "Revenant Notice" = "revennotice", + "Revenant Warning" = "revenwarning", + "Robot" = "robot", + "Rose" = "rose", + "Comic Sans" = "sans", + "Science Radio" = "sciradio", + "Security Radio" = "secradio", + "Service Radio" = "servradio", + "Singing" = "singing", + "Slime" = "slime", + "Small" = "small", + "Small Notice" = "smallnotice", + "Small Notice Italic" = "smallnoticeital", + "Spider Broodmother" = "spiderbroodmother", + "Spider Scout" = "spiderscout", + "Spider Breacher" = "spiderbreacher", + "Suicide" = "suicide", + "Supply Radio" = "suppradio", + "Syndicate Radio" = "syndradio", + "Tape Recorder" = "tape_recorder", + "Tiny Notice" = "tinynotice", + "Tiny Notice Italic" = "tinynoticeital", + "Unconcious" = "unconscious", + "User Danger" = "userdanger", + "Warning" = "warning", + "Yelling" = "yell", + "Yellow Team Radio" = "yellowteamradio", + )) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index f98178d537fa3..ea1b16d71cef8 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -83,7 +83,6 @@ DEFINE_BITFIELD(car_traits, list( DEFINE_BITFIELD(clothing_flags, list( "ANTI_TINFOIL_MANEUVER" = ANTI_TINFOIL_MANEUVER, - "BLOCKS_SPEECH" = BLOCKS_SPEECH, "BLOCK_GAS_SMOKE_EFFECT" = BLOCK_GAS_SMOKE_EFFECT, "CASTING_CLOTHES" = CASTING_CLOTHES, "GAS_FILTERING" = GAS_FILTERING, diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm index e43d803fc4f29..5bece07319c78 100644 --- a/code/_globalvars/configuration.dm +++ b/code/_globalvars/configuration.dm @@ -11,10 +11,6 @@ GLOBAL_VAR_INIT(hub_visibility, FALSE) GLOBAL_VAR_INIT(ooc_allowed, TRUE) // used with admin verbs to disable ooc - not a config option apparently GLOBAL_VAR_INIT(dooc_allowed, TRUE) -GLOBAL_VAR_INIT(enter_allowed, TRUE) -GLOBAL_VAR_INIT(shuttle_frozen, FALSE) -GLOBAL_VAR_INIT(shuttle_left, FALSE) -GLOBAL_VAR_INIT(tinted_weldhelh, TRUE) // Debug is used exactly once (in living.dm) but is commented out in a lot of places. It is not set anywhere and only checked. diff --git a/code/_globalvars/game_modes.dm b/code/_globalvars/game_modes.dm index 8a1493e383dbc..10d923343717e 100644 --- a/code/_globalvars/game_modes.dm +++ b/code/_globalvars/game_modes.dm @@ -1,8 +1,6 @@ GLOBAL_VAR(common_report) //Contains common part of roundend report GLOBAL_VAR(survivor_report) //Contains shared survivor report for roundend report (part of personal report) - -GLOBAL_VAR_INIT(wavesecret, 0) // meteor mode, delays wave progression, terrible name GLOBAL_DATUM(start_state, /datum/station_state) // Used in round-end report /// We want reality_smash_tracker to exist only once and be accessible from anywhere. diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index e7c6368d4d5fd..faaabd77ba134 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -149,6 +149,7 @@ GLOBAL_LIST_INIT(scarySounds, list( 'sound/weapons/armbomb.ogg', 'sound/weapons/taser.ogg', 'sound/weapons/thudswoosh.ogg', + 'sound/weapons/shove.ogg', )) diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 45f59fb447514..a7c7584d23aad 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -132,9 +132,6 @@ GLOBAL_LIST_EMPTY(bar_areas) /// List of all the maps that have been cached for /proc/load_map GLOBAL_LIST_EMPTY(cached_maps) -/// Away missions -GLOBAL_LIST_EMPTY(vr_spawnpoints) - /// Just a list of all the area objects in the game /// Note, areas can have duplicate types GLOBAL_LIST_EMPTY(areas) diff --git a/code/_globalvars/lists/mobs.dm b/code/_globalvars/lists/mobs.dm index 942c8cbf6b121..d91eec6e1bc87 100644 --- a/code/_globalvars/lists/mobs.dm +++ b/code/_globalvars/lists/mobs.dm @@ -43,7 +43,6 @@ GLOBAL_LIST_INIT(abstract_mob_types, list( GLOBAL_LIST_EMPTY(player_list) //all mobs **with clients attached**. GLOBAL_LIST_EMPTY(keyloop_list) //as above but can be limited to boost performance GLOBAL_LIST_EMPTY(mob_list) //all mobs, including clientless -GLOBAL_LIST_EMPTY(mob_directory) //mob_id -> mob GLOBAL_LIST_EMPTY(alive_mob_list) //all alive mobs, including clientless. Excludes /mob/dead/new_player GLOBAL_LIST_EMPTY(suicided_mob_list) //contains a list of all mobs that suicided, including their associated ghosts. GLOBAL_LIST_EMPTY(drones_list) @@ -56,7 +55,6 @@ GLOBAL_LIST_EMPTY(mob_living_list) //all instances of /mob/living and subtypes GLOBAL_LIST_EMPTY(carbon_list) //all instances of /mob/living/carbon and subtypes, notably does not contain brains or simple animals GLOBAL_LIST_EMPTY(human_list) //all instances of /mob/living/carbon/human and subtypes GLOBAL_LIST_EMPTY(ai_list) -GLOBAL_LIST_EMPTY(pai_list) GLOBAL_LIST_EMPTY(available_ai_shells) GLOBAL_LIST_INIT(simple_animals, list(list(),list(),list())) // One for each AI_* status define GLOBAL_LIST_EMPTY(spidermobs) //all sentient spider mobs @@ -133,8 +131,6 @@ GLOBAL_LIST_INIT_TYPED(species_prototypes, /datum/species, init_species_prototyp species_list[species_type] = new species_type() return species_list -GLOBAL_LIST_EMPTY(sentient_disease_instances) - GLOBAL_LIST_EMPTY(latejoin_ai_cores) GLOBAL_LIST_EMPTY(mob_config_movespeed_type_lookup) diff --git a/code/_globalvars/lists/quirks.dm b/code/_globalvars/lists/quirks.dm index 882e556a801f6..22ef830ea773d 100644 --- a/code/_globalvars/lists/quirks.dm +++ b/code/_globalvars/lists/quirks.dm @@ -11,7 +11,7 @@ GLOBAL_LIST_INIT(nearsighted_glasses, list( )) ///Options for the prosthetic limb quirk to choose from -GLOBAL_LIST_INIT(limb_choice, list( +GLOBAL_LIST_INIT(prosthetic_limb_choice, list( "Left Arm" = /obj/item/bodypart/arm/left/robot/surplus, "Right Arm" = /obj/item/bodypart/arm/right/robot/surplus, "Left Leg" = /obj/item/bodypart/leg/left/robot/surplus, diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 87092adcff080..a8f0d8fcb8e06 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -184,6 +184,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DEATHCOMA" = TRAIT_DEATHCOMA, "TRAIT_DEFIB_BLACKLISTED" = TRAIT_DEFIB_BLACKLISTED, "TRAIT_DEPRESSION" = TRAIT_DEPRESSION, + "TRAIT_DETECTIVES_TASTE" = TRAIT_DETECTIVES_TASTE, "TRAIT_DETECT_STORM" = TRAIT_DETECT_STORM, "TRAIT_DIAGNOSTIC_HUD" = TRAIT_DIAGNOSTIC_HUD, "TRAIT_DISCOORDINATED_TOOL_USER" = TRAIT_DISCOORDINATED_TOOL_USER, @@ -428,7 +429,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ROUGHRIDER" = TRAIT_ROUGHRIDER, "TRAIT_SABRAGE_PRO" = TRAIT_SABRAGE_PRO, "TRAIT_SECURITY_HUD" = TRAIT_SECURITY_HUD, - "TRAIT_SEE_GLASS_COLORS" = TRAIT_SEE_GLASS_COLORS, + "TRAIT_SEE_WORN_COLOURS" = TRAIT_SEE_WORN_COLOURS, "TRAIT_SELF_AWARE" = TRAIT_SELF_AWARE, "TRAIT_SETTLER" = TRAIT_SETTLER, "TRAIT_SHAVED" = TRAIT_SHAVED, @@ -461,6 +462,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_STRONG_STOMACH" = TRAIT_STRONG_STOMACH, "TRAIT_STUBBY_BODY" = TRAIT_STUBBY_BODY, "TRAIT_STUNIMMUNE" = TRAIT_STUNIMMUNE, + "TRAIT_STUN_ON_NEXT_SHOVE" = TRAIT_STUN_ON_NEXT_SHOVE, "TRAIT_STURDY_FRAME" = TRAIT_STURDY_FRAME, "TRAIT_SUCCUMB_OVERRIDE" = TRAIT_SUCCUMB_OVERRIDE, "TRAIT_SUICIDED" = TRAIT_SUICIDED, @@ -631,15 +633,16 @@ GLOBAL_LIST_INIT(traits_by_type, list( /turf = list( "TRAIT_CHASM_STOPPED" = TRAIT_CHASM_STOPPED, "TRAIT_CONTAINMENT_FIELD" = TRAIT_CONTAINMENT_FIELD, + "TRAIT_ELEVATED_TURF" = TRAIT_ELEVATED_TURF, "TRAIT_FIREDOOR_STOP" = TRAIT_FIREDOOR_STOP, + "TRAIT_FISHING_SPOT" = TRAIT_FISHING_SPOT, "TRAIT_HYPERSPACE_STOPPED" = TRAIT_HYPERSPACE_STOPPED, "TRAIT_IMMERSE_STOPPED" = TRAIT_IMMERSE_STOPPED, "TRAIT_LAVA_STOPPED" = TRAIT_LAVA_STOPPED, + "TRAIT_NO_TERRAFORM" = TRAIT_NO_TERRAFORM, "TRAIT_SPINNING_WEB_TURF" = TRAIT_SPINNING_WEB_TURF, "TRAIT_TURF_IGNORE_SLIPPERY" = TRAIT_TURF_IGNORE_SLIPPERY, "TRAIT_TURF_IGNORE_SLOWDOWN" = TRAIT_TURF_IGNORE_SLOWDOWN, - "TRAIT_ELEVATED_TURF" = TRAIT_ELEVATED_TURF, - "TRAIT_FISHING_SPOT" = TRAIT_FISHING_SPOT, ), )) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 117c8e162d607..1d7e07f7b9912 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -197,7 +197,7 @@ * A backwards depth-limited breadth-first-search to see if the target is * logically "in" anything adjacent to us. */ -/atom/movable/proc/CanReach(atom/ultimate_target, obj/item/tool, view_only = FALSE) +/atom/proc/CanReach(atom/ultimate_target, obj/item/tool, view_only = FALSE) var/list/direct_access = DirectAccess() var/depth = 1 + (view_only ? STORAGE_VIEW_DEPTH : INVENTORY_DEPTH) @@ -231,7 +231,7 @@ return FALSE -/atom/movable/proc/DirectAccess() +/atom/proc/DirectAccess() return list(src, loc) /mob/DirectAccess(atom/target) diff --git a/code/_onclick/click_ctrl.dm b/code/_onclick/click_ctrl.dm index 72f67b4271ed7..ebb22b9eafd11 100644 --- a/code/_onclick/click_ctrl.dm +++ b/code/_onclick/click_ctrl.dm @@ -34,7 +34,7 @@ SHOULD_NOT_OVERRIDE(TRUE) . = ..() - if(. || world.time < next_move || !can_perform_action(target, NOT_INSIDE_TARGET | SILENT_ADJACENCY)) + if(. || world.time < next_move || !can_perform_action(target, NOT_INSIDE_TARGET | SILENT_ADJACENCY | ALLOW_RESTING | FORBID_TELEKINESIS_REACH)) return . = TRUE diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 1bbc20d49133f..aa23d5a57eaa0 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -37,17 +37,13 @@ // only if both dragged object & receiver agree to do checks do we proceed var/combined_atom_flags = interaction_flags_atom | over.interaction_flags_atom if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_CHECKS)) - if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT)) - if(!Adjacent(user) || !over.Adjacent(user)) - return // should stop you from dragging through windows + //Check for adjacency + if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT) && (!CanReach(user) || !over.CanReach(user))) + return // should stop you from dragging through windows if(!(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_USABILITY)) - var/combined_flags = interaction_flags_mouse_drop | over.interaction_flags_mouse_drop - if(combined_atom_flags & INTERACT_ATOM_MOUSEDROP_IGNORE_ADJACENT) - combined_flags |= BYPASS_ADJACENCY - else - combined_flags |= SILENT_ADJACENCY - if(!user.can_perform_action(src, combined_flags)) + //Bypass adjacency cause we already checked for it above + if(!user.can_perform_action(src, interaction_flags_mouse_drop | over.interaction_flags_mouse_drop | BYPASS_ADJACENCY)) return // is the mob not able to drag the object with both sides conditions applied mouse_drop_dragged(over, user, src_location, over_location, params) diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index f3bb3713225c9..b6ac49446fc80 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -1,6 +1,7 @@ /atom/movable/screen/movable/pic_in_pic name = "Picture-in-picture" screen_loc = "CENTER" + layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE var/atom/center var/width = 0 diff --git a/code/_onclick/hud/rendering/plane_master_group.dm b/code/_onclick/hud/rendering/plane_master_group.dm index 63c202b64fba8..894190984e652 100644 --- a/code/_onclick/hud/rendering/plane_master_group.dm +++ b/code/_onclick/hud/rendering/plane_master_group.dm @@ -34,6 +34,14 @@ stack_trace("Hey brother, our key [key] is already in use by a plane master group on the passed in hud, belonging to [viewing_hud.mymob]. Ya fucked up, why are there dupes") return +#if MIN_COMPILER_VERSION > 516 + #warn Fully change default relay_loc to "1,1", rather than changing it based on client version +#endif + + if(viewing_hud.mymob?.client?.byond_version > 515) + relay_loc = "1,1" + rebuild_plane_masters() + our_hud = viewing_hud our_hud.master_groups[key] = src show_hud() diff --git a/code/_onclick/hud/rendering/render_plate.dm b/code/_onclick/hud/rendering/render_plate.dm index d33162a5b5fa6..aa7f9fe30c516 100644 --- a/code/_onclick/hud/rendering/render_plate.dm +++ b/code/_onclick/hud/rendering/render_plate.dm @@ -382,7 +382,7 @@ render_relay_planes = list(RENDER_PLANE_MASTER) /** - * Plane master proc called in Initialize() that creates relay objects, and sets them uo as needed + * Plane master proc called in Initialize() that creates relay objects, and sets them up as needed * Sets: * * layer from plane to avoid z-fighting * * planes to relay the render to @@ -392,6 +392,9 @@ * Other vars such as alpha will automatically be applied with the render source */ /atom/movable/screen/plane_master/proc/generate_render_relays() +#if MIN_COMPILER_VERSION > 516 + #warn Fully change default relay_loc to "1,1" +#endif var/relay_loc = home?.relay_loc || "CENTER" // If we're using a submap (say for a popup window) make sure we draw onto it if(home?.map) @@ -426,7 +429,7 @@ if(!length(relays) && !initial(render_target)) render_target = OFFSET_RENDER_TARGET(get_plane_master_render_base(name), offset) if(!relay_loc) - relay_loc = "CENTER" + relay_loc = (show_to?.byond_version > 515) ? "1,1" : "CENTER" // If we're using a submap (say for a popup window) make sure we draw onto it if(home?.map) relay_loc = "[home.map]:[relay_loc]" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index beeb1599f2038..a5c2035b9394d 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -8,6 +8,11 @@ * * [/obj/item/proc/afterattack]. The return value does not matter. */ /obj/item/proc/melee_attack_chain(mob/user, atom/target, params) + //Proxy replaces src cause it returns an atom that will attack the target on our behalf + var/obj/item/source_atom = get_proxy_attacker_for(target, user) + if(source_atom != src) //if we are someone else then call that attack chain else we can proceed with the usual stuff + return source_atom.melee_attack_chain(user, target, params) + var/list/modifiers = params2list(params) var/is_right_clicking = LAZYACCESS(modifiers, RIGHT_CLICK) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 068f857c8cb31..8297085dbcf01 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -464,3 +464,12 @@ /datum/config_entry/number/max_positive_quirks default = 6 min_val = -1 + +/** + * A config that skews with the random spawners weights + * If the value is lower than 1, it'll tend to even out the odds + * If higher than 1, it'll lean toward common spawns even more. + */ +/datum/config_entry/number/random_loot_weight_modifier + default = 1 + min_val = 0.05 diff --git a/code/controllers/subsystem/ambience.dm b/code/controllers/subsystem/ambience.dm index 712a8cd80f5de..cae5d85246d80 100644 --- a/code/controllers/subsystem/ambience.dm +++ b/code/controllers/subsystem/ambience.dm @@ -86,3 +86,52 @@ SUBSYSTEM_DEF(ambience) if(!M.has_light_nearby() && prob(0.5)) return ..(M, pick(minecraft_cave_noises)) return ..() + +/** + * Ambience buzz handling called by either area/Enter() or refresh_looping_ambience() + */ + +/mob/proc/update_ambience_area(area/new_area) + + var/old_tracked_area = ambience_tracked_area + if(old_tracked_area) + UnregisterSignal(old_tracked_area, COMSIG_AREA_POWER_CHANGE) + ambience_tracked_area = null + if(!client) + return + if(new_area) + ambience_tracked_area = new_area + RegisterSignal(ambience_tracked_area, COMSIG_AREA_POWER_CHANGE, PROC_REF(refresh_looping_ambience), TRUE) + + refresh_looping_ambience() + +/mob/proc/refresh_looping_ambience() + SIGNAL_HANDLER + + if(!client) // If a tree falls in the woods. + return + + var/area/my_area = get_area(src) + var/sound_to_use = my_area.ambient_buzz + + if(!sound_to_use || !(client.prefs.read_preference(/datum/preference/toggle/sound_ship_ambience))) + SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = CHANNEL_BUZZ)) + client.current_ambient_sound = null + return + + if(!can_hear()) // Can the mob hear? + SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = CHANNEL_BUZZ)) + client.current_ambient_sound = null + return + + //Station ambience is dependant on a functioning and charged APC with enviorment power enabled. + if(!is_mining_level(my_area.z) && ((!my_area.apc || !my_area.apc.operating || !my_area.apc.cell?.charge && my_area.requires_power || !my_area.power_environ))) + SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = CHANNEL_BUZZ)) + client.current_ambient_sound = null + return + else + if(sound_to_use == client.current_ambient_sound) // Don't reset current loops + return + + client.current_ambient_sound = sound_to_use + SEND_SOUND(src, sound(my_area.ambient_buzz, repeat = 1, wait = 0, volume = my_area.ambient_buzz_vol, channel = CHANNEL_BUZZ)) diff --git a/code/controllers/subsystem/bitrunning.dm b/code/controllers/subsystem/bitrunning.dm index 2b303911e42c9..78afb101945b0 100644 --- a/code/controllers/subsystem/bitrunning.dm +++ b/code/controllers/subsystem/bitrunning.dm @@ -24,7 +24,8 @@ SUBSYSTEM_DEF(bitrunning) var/can_view = domain.difficulty < scanner_tier && domain.cost <= points + 5 var/can_view_reward = domain.difficulty < (scanner_tier + 1) && domain.cost <= points + 3 - levels += list(list( + UNTYPED_LIST_ADD(levels, list( + "announce_ghosts"= domain.announce_to_ghosts, "cost" = domain.cost, "desc" = can_view ? domain.desc : "Limited scanning capabilities. Cannot infer domain details.", "difficulty" = domain.difficulty, diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index bd782968abef2..45354d4bd6164 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -13,7 +13,8 @@ GLOBAL_LIST_INIT_TYPED(quirk_blacklist, /list/datum/quirk, list( list(/datum/quirk/item_quirk/clown_enjoyer, /datum/quirk/item_quirk/mime_fan), list(/datum/quirk/bad_touch, /datum/quirk/friendly), list(/datum/quirk/extrovert, /datum/quirk/introvert), - list(/datum/quirk/prosthetic_limb, /datum/quirk/quadruple_amputee, /datum/quirk/transhumanist, /datum/quirk/body_purist), + list(/datum/quirk/prosthetic_limb, /datum/quirk/quadruple_amputee, /datum/quirk/body_purist), + list(/datum/quirk/transhumanist, /datum/quirk/body_purist), list(/datum/quirk/prosthetic_organ, /datum/quirk/tin_man, /datum/quirk/body_purist), list(/datum/quirk/quadruple_amputee, /datum/quirk/paraplegic, /datum/quirk/hemiplegic), list(/datum/quirk/quadruple_amputee, /datum/quirk/frail), diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index b51e686c6a644..db3f9aa3a0db5 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -7,7 +7,7 @@ SUBSYSTEM_DEF(research) //TECHWEB STATIC var/list/techweb_nodes = list() //associative id = node datum var/list/techweb_designs = list() //associative id = node datum - var/list/datum/design/item_to_design = list() //typepath = list of design datums + var/list/list/datum/design/item_to_design = list() //typepath = list of design datums ///List of all techwebs, generating points or not. ///Autolathes, Mechfabs, and others all have shared techwebs, for example. diff --git a/code/controllers/subsystem/spatial_gridmap.dm b/code/controllers/subsystem/spatial_gridmap.dm index 81ae29f6bad4f..76aa484bf92ce 100644 --- a/code/controllers/subsystem/spatial_gridmap.dm +++ b/code/controllers/subsystem/spatial_gridmap.dm @@ -234,7 +234,7 @@ SUBSYSTEM_DEF(spatial_grid) . = list() //technically THIS list only contains lists, but inside those lists are grid cell datums and we can go without a SINGLE var init if we do this - var/list/datum/spatial_grid_cell/grid_level = grids_by_z_level[center_turf.z] + var/list/list/datum/spatial_grid_cell/grid_level = grids_by_z_level[center_turf.z] switch(type) if(SPATIAL_GRID_CONTENTS_TYPE_CLIENTS) diff --git a/code/datums/actions/items/toggles.dm b/code/datums/actions/items/toggles.dm index 53c9e4f53cc9f..449cf11124abf 100644 --- a/code/datums/actions/items/toggles.dm +++ b/code/datums/actions/items/toggles.dm @@ -116,3 +116,36 @@ /datum/action/item_action/call_link name = "Call MODlink" +/datum/action/item_action/toggle_nv + name = "Toggle Night Vision" + var/stored_cutoffs + var/stored_colour + +/datum/action/item_action/toggle_nv/New(obj/item/clothing/glasses/target) + . = ..() + target.AddElement(/datum/element/update_icon_updates_onmob) + +/datum/action/item_action/toggle_nv/Trigger(trigger_flags) + if(!istype(target, /obj/item/clothing/glasses)) + return ..() + var/obj/item/clothing/glasses/goggles = target + var/mob/holder = goggles.loc + if(!istype(holder) || holder.get_slot_by_item(goggles) != ITEM_SLOT_EYES) + holder = null + if(stored_cutoffs) + goggles.color_cutoffs = stored_cutoffs + goggles.flash_protect = FLASH_PROTECTION_SENSITIVE + stored_cutoffs = null + if(stored_colour) + goggles.change_glass_color(stored_colour) + playsound(goggles, 'sound/items/night_vision_on.ogg', 30, TRUE, -3) + else + stored_cutoffs = goggles.color_cutoffs + stored_colour = goggles.glass_colour_type + goggles.color_cutoffs = list() + goggles.flash_protect = FLASH_PROTECTION_NONE + if(stored_colour) + goggles.change_glass_color(null) + playsound(goggles, 'sound/machines/click.ogg', 30, TRUE, -3) + holder?.update_sight() + goggles.update_appearance() diff --git a/code/datums/ai/_ai_controller.dm b/code/datums/ai/_ai_controller.dm index 7b46a7b06e803..33b63f09a01dc 100644 --- a/code/datums/ai/_ai_controller.dm +++ b/code/datums/ai/_ai_controller.dm @@ -176,7 +176,15 @@ multiple modular subtrees with behaviors if(ai_status == AI_STATUS_OFF) return - if(exited && (get_dist(pawn, (islist(exited) ? exited[1] : exited)) <= interesting_dist)) //is our target in between interesting cells? + var/distance = INFINITY + if(islist(exited)) + var/list/exited_list = exited + distance = get_dist(pawn, exited_list[1]) + else if(isatom(exited)) + var/atom/exited_atom = exited + distance = get_dist(pawn, exited_atom) + + if(distance <= interesting_dist) //is our target in between interesting cells? return if(should_idle()) diff --git a/code/datums/ai/basic_mobs/basic_subtrees/go_for_swim.dm b/code/datums/ai/basic_mobs/basic_subtrees/go_for_swim.dm index 12c77119f3e18..e6427455c4edf 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/go_for_swim.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/go_for_swim.dm @@ -35,7 +35,7 @@ var/look_for_land = controller.blackboard[BB_CURRENTLY_SWIMMING] var/list/possible_turfs = list() for(var/turf/possible_turf in oview(search_range, living_pawn)) - if(isclosedturf(possible_turf) || isspaceturf(possible_turf) || isopenspaceturf(possible_turf)) + if(isclosedturf(possible_turf) || is_space_or_openspace(possible_turf)) continue if(possible_turf.is_blocked_turf()) continue diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index acf9ceead56ce..b258abed65dda 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -273,17 +273,17 @@ */ /datum/proc/GetExactComponent(datum/component/c_type) RETURN_TYPE(c_type) - if(initial(c_type.dupe_mode) == COMPONENT_DUPE_ALLOWED || initial(c_type.dupe_mode) == COMPONENT_DUPE_SELECTIVE) + var/initial_type_mode = initial(c_type.dupe_mode) + if(initial_type_mode == COMPONENT_DUPE_ALLOWED || initial_type_mode == COMPONENT_DUPE_SELECTIVE) stack_trace("GetComponent was called to get a component of which multiple copies could be on an object. This can easily break and should be changed. Type: \[[c_type]\]") - var/list/dc = _datum_components - if(!dc) + var/list/all_components = _datum_components + if(!all_components) return null - var/datum/component/C = dc[c_type] - if(C) - if(length(C)) - C = C[1] - if(C.type == c_type) - return C + var/datum/component/potential_component + if(length(all_components)) + potential_component = all_components[c_type] + if(potential_component?.type == c_type) + return potential_component return null /** diff --git a/code/datums/components/aquarium_content.dm b/code/datums/components/aquarium_content.dm index 21e082399a882..21c6c75ca169a 100644 --- a/code/datums/components/aquarium_content.dm +++ b/code/datums/components/aquarium_content.dm @@ -1,3 +1,14 @@ +///Malus to the beauty value if the fish content is dead +#define DEAD_FISH_BEAUTY -500 +///Prevents more impressive fishes from providing a positive beauty even when dead. +#define MAX_DEAD_FISH_BEAUTY -200 +///Some fish are already so ugly, they can't get much worse when dead +#define MIN_DEAD_FISH_BEAUTY -600 + +///Defines that clamp the beauty of the aquarium, to prevent it from making most areas great or horrid all by itself. +#define MIN_AQUARIUM_BEAUTY -3500 +#define MAX_AQUARIUM_BEAUTY 6000 + /// Allows movables to be inserted/displayed in aquariums. /datum/component/aquarium_content /// Keeps track of our current aquarium. @@ -60,13 +71,19 @@ /// Signals of the parent that will trigger animation update var/animation_update_signals + /// The current beauty this component gives to the aquarium it's in + var/beauty -/datum/component/aquarium_content/Initialize(icon, animation_getter, animation_update_signals) + /// The original value of the beauty this component had when initialized + var/original_beauty + +/datum/component/aquarium_content/Initialize(icon, animation_getter, animation_update_signals, beauty) if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE src.animation_getter = animation_getter src.animation_update_signals = animation_update_signals + src.beauty = original_beauty = beauty if(animation_update_signals) RegisterSignals(parent, animation_update_signals, PROC_REF(generate_animation)) @@ -78,6 +95,7 @@ InitializeOther() ADD_TRAIT(parent, TRAIT_FISH_CASE_COMPATIBILE, REF(src)) + RegisterSignal(parent, COMSIG_TRY_INSERTING_IN_AQUARIUM, PROC_REF(is_ready_to_insert)) RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(enter_aquarium)) //If component is added to something already in aquarium at the time initialize it properly. @@ -109,6 +127,18 @@ randomize_position = TRUE + RegisterSignal(fish, COMSIG_FISH_STATUS_CHANGED, PROC_REF(on_fish_status_changed)) + +/datum/component/aquarium_content/proc/on_fish_status_changed(obj/item/fish/source) + SIGNAL_HANDLER + var/old_beauty = beauty + beauty = original_beauty + if(source.status == FISH_DEAD) + beauty = clamp(beauty + DEAD_FISH_BEAUTY, MIN_DEAD_FISH_BEAUTY, MAX_DEAD_FISH_BEAUTY) + if(current_aquarium) + change_aquarium_beauty(beauty - old_beauty) + generate_animation() + /// Sets visuals properties for fish /datum/component/aquarium_content/proc/InitializeFromProp() var/obj/item/aquarium_prop/prop = parent @@ -150,15 +180,16 @@ if(istype(movable_parent.loc, /obj/structure/aquarium)) on_inserted(movable_parent.loc) -/datum/component/aquarium_content/proc/is_ready_to_insert(obj/structure/aquarium/aquarium) +/datum/component/aquarium_content/proc/is_ready_to_insert(datum/source, obj/structure/aquarium/aquarium) + SIGNAL_HANDLER //This is kinda awful but we're unaware of other fish if(unique) for(var/atom/movable/fish_or_prop in aquarium) if(fish_or_prop == parent) continue if(fish_or_prop.type == parent.type) - return FALSE - return TRUE + return COMSIG_CANNOT_INSERT_IN_AQUARIUM + return COMSIG_CAN_INSERT_IN_AQUARIUM /datum/component/aquarium_content/proc/on_inserted(atom/aquarium) current_aquarium = aquarium @@ -180,6 +211,22 @@ //Finally add it to to objects vis_contents current_aquarium.vis_contents |= vc_obj + change_aquarium_beauty(beauty) + +///Modifies the beauty of the aquarium when content is added or removed, or when fishes die or live again somehow. +/datum/component/aquarium_content/proc/change_aquarium_beauty(change) + if(QDELETED(current_aquarium) || !change) + return + var/old_clamped_beauty = clamp(current_aquarium.current_beauty, MIN_AQUARIUM_BEAUTY, MAX_AQUARIUM_BEAUTY) + current_aquarium.current_beauty += change + var/new_clamped_beauty = clamp(current_aquarium.current_beauty, MIN_AQUARIUM_BEAUTY, MAX_AQUARIUM_BEAUTY) + if(new_clamped_beauty == old_clamped_beauty) + return + if(current_aquarium.current_beauty) + current_aquarium.RemoveElement(/datum/element/beauty, current_aquarium.current_beauty) + if(current_aquarium.current_beauty) + current_aquarium.AddElement(/datum/element/beauty, current_aquarium.current_beauty) + /// Aquarium surface changed in some way, we need to recalculate base position and aninmation /datum/component/aquarium_content/proc/on_surface_changed() SIGNAL_HANDLER @@ -293,13 +340,20 @@ vc_obj.pixel_x = base_px vc_obj.pixel_y = base_py -/datum/component/aquarium_content/proc/on_removed(datum/source, atom/movable/gone, direction) +/datum/component/aquarium_content/proc/on_removed(obj/structure/aquarium/source, atom/movable/gone, direction) SIGNAL_HANDLER if(parent != gone) return remove_from_aquarium() /datum/component/aquarium_content/proc/remove_from_aquarium() + change_aquarium_beauty(-beauty) UnregisterSignal(current_aquarium, list(COMSIG_AQUARIUM_SURFACE_CHANGED, COMSIG_AQUARIUM_FLUID_CHANGED, COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXITED)) remove_visual_from_aquarium() current_aquarium = null + +#undef DEAD_FISH_BEAUTY +#undef MIN_DEAD_FISH_BEAUTY +#undef MAX_DEAD_FISH_BEAUTY +#undef MIN_AQUARIUM_BEAUTY +#undef MAX_AQUARIUM_BEAUTY diff --git a/code/datums/components/bayonet_attachable.dm b/code/datums/components/bayonet_attachable.dm new file mode 100644 index 0000000000000..4b2442bea50bd --- /dev/null +++ b/code/datums/components/bayonet_attachable.dm @@ -0,0 +1,212 @@ +/** + * Component which allows you to attach a bayonet to an item, + * be it a piece of clothing or a tool. + */ +/datum/component/bayonet_attachable + /// Whenever we can remove the bayonet with a screwdriver + var/removable = TRUE + /// If passed, we wil simply update our item's icon_state when a bayonet is attached. + /// Formatted as parent_base_state-[bayonet_icon_state-state] + var/bayonet_icon_state + /// If passed, we will use a specific overlay instead of using the knife itself + /// The state to take from the bayonet overlay icon if supplied. + var/bayonet_overlay + /// This is the icon file it grabs the overlay from. + var/bayonet_overlay_icon + /// Offsets for the bayonet overlay + var/offset_x = 0 + var/offset_y = 0 + /// If this component allows sawing off the parent gun/should be deleted when the parent gun is sawn off + var/allow_sawnoff = FALSE + + // Internal vars + /// Currently attached bayonet + var/obj/item/bayonet + /// Static typecache of all knives that can become bayonets + var/static/list/valid_bayonets = typecacheof(list(/obj/item/knife/combat)) + +/datum/component/bayonet_attachable/Initialize( + obj/item/starting_bayonet, + offset_x = 0, + offset_y = 0, + removable = TRUE, + bayonet_icon_state = null, + bayonet_overlay = "bayonet", + bayonet_overlay_icon = 'icons/obj/weapons/guns/bayonets.dmi', + allow_sawnoff = FALSE +) + + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + src.removable = removable + src.bayonet_icon_state = bayonet_icon_state + src.bayonet_overlay = bayonet_overlay + src.bayonet_overlay_icon = bayonet_overlay_icon + src.offset_x = offset_x + src.offset_y = offset_y + src.allow_sawnoff = allow_sawnoff + + if (istype(starting_bayonet)) + add_bayonet(starting_bayonet) + +/datum/component/bayonet_attachable/Destroy(force) + if(bayonet) + remove_bayonet() + return ..() + +/datum/component/bayonet_attachable/RegisterWithParent() + RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, PROC_REF(on_parent_deconstructed)) + RegisterSignal(parent, COMSIG_ATOM_EXITED, PROC_REF(on_item_exit)) + RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), PROC_REF(on_screwdriver)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON_STATE, PROC_REF(on_update_icon_state)) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_parent_deleted)) + RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK, PROC_REF(on_pre_attack)) + RegisterSignal(parent, COMSIG_GUN_BEING_SAWNOFF, PROC_REF(on_being_sawnoff)) + RegisterSignal(parent, COMSIG_GUN_SAWN_OFF, PROC_REF(on_sawn_off)) + +/datum/component/bayonet_attachable/UnregisterFromParent() + UnregisterSignal(parent, list( + COMSIG_OBJ_DECONSTRUCT, + COMSIG_ATOM_EXITED, + COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), + COMSIG_ATOM_UPDATE_ICON_STATE, + COMSIG_ATOM_UPDATE_OVERLAYS, + COMSIG_ATOM_ATTACKBY, + COMSIG_ATOM_EXAMINE, + COMSIG_QDELETING, + COMSIG_ITEM_PRE_ATTACK, + COMSIG_GUN_BEING_SAWNOFF, + COMSIG_GUN_SAWN_OFF, + )) + +/datum/component/bayonet_attachable/proc/on_examine(obj/item/source, mob/examiner, list/examine_list) + SIGNAL_HANDLER + + if(isnull(bayonet)) + examine_list += "It has a bayonet lug on it." + return + + examine_list += "It has \a [bayonet] [removable ? "" : "permanently "]affixed to it." + if(removable) + examine_list += span_info("[bayonet] looks like it can be unscrewed from [bayonet].") + +/datum/component/bayonet_attachable/proc/on_pre_attack(obj/item/source, atom/target, mob/living/user, params) + SIGNAL_HANDLER + + if (isnull(bayonet) || !user.combat_mode) + return NONE + + INVOKE_ASYNC(bayonet, TYPE_PROC_REF(/obj/item, melee_attack_chain), user, target, params) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/datum/component/bayonet_attachable/proc/on_attackby(obj/item/source, obj/item/attacking_item, mob/attacker, params) + SIGNAL_HANDLER + + if(!is_type_in_typecache(attacking_item, valid_bayonets)) + return + + if(bayonet) + source.balloon_alert(attacker, "already has \a [bayonet]!") + return + + if(!attacker.transferItemToLoc(attacking_item, source)) + return + + add_bayonet(attacking_item, attacker) + source.balloon_alert(attacker, "attached") + return COMPONENT_NO_AFTERATTACK + +/datum/component/bayonet_attachable/proc/add_bayonet(obj/item/new_bayonet, mob/attacher) + if(bayonet) + CRASH("[type] tried to add a new bayonet when it already had one.") + + bayonet = new_bayonet + if(bayonet.loc != parent) + bayonet.forceMove(parent) + var/obj/item/item_parent = parent + item_parent.update_appearance() + +/datum/component/bayonet_attachable/proc/remove_bayonet() + bayonet = null + var/obj/item/item_parent = parent + item_parent.update_appearance() + +/datum/component/bayonet_attachable/proc/on_item_exit(obj/item/source, atom/movable/gone, direction) + SIGNAL_HANDLER + + if(gone == bayonet) + remove_bayonet() + +/datum/component/bayonet_attachable/proc/on_parent_deconstructed(obj/item/source, disassembled) + SIGNAL_HANDLER + + if(QDELETED(bayonet) || !removable) + remove_bayonet() + return + + bayonet.forceMove(source.drop_location()) + +/datum/component/bayonet_attachable/proc/on_screwdriver(obj/item/source, mob/user, obj/item/tool) + SIGNAL_HANDLER + + if(!bayonet || !removable) + return + + INVOKE_ASYNC(src, PROC_REF(unscrew_bayonet), source, user, tool) + return ITEM_INTERACT_BLOCKING + +/datum/component/bayonet_attachable/proc/unscrew_bayonet(obj/item/source, mob/user, obj/item/tool) + tool?.play_tool_sound(source) + source.balloon_alert(user, "unscrewed [bayonet]") + + var/obj/item/to_remove = bayonet + to_remove.forceMove(source.drop_location()) + if(source.Adjacent(user) && !issilicon(user)) + user.put_in_hands(to_remove) + +/datum/component/bayonet_attachable/proc/on_update_overlays(obj/item/source, list/overlays) + SIGNAL_HANDLER + + if(!bayonet_overlay || !bayonet_overlay_icon) + return + + if(!bayonet) + return + + var/mutable_appearance/bayonet_appearance = mutable_appearance(bayonet_overlay_icon, bayonet_overlay) + bayonet_appearance.pixel_x = offset_x + bayonet_appearance.pixel_y = offset_y + overlays += bayonet_appearance + +/datum/component/bayonet_attachable/proc/on_update_icon_state(obj/item/source) + SIGNAL_HANDLER + + if(!bayonet_icon_state) + return + + var/base_state = source.base_icon_state || initial(source.icon_state) + if(bayonet) + source.icon_state = "[base_state]-[bayonet_icon_state]" + else if(source.icon_state != base_state) + source.icon_state = base_state + +/datum/component/bayonet_attachable/proc/on_parent_deleted(obj/item/source) + SIGNAL_HANDLER + QDEL_NULL(bayonet) + +/datum/component/bayonet_attachable/proc/on_being_sawnoff(obj/item/source, mob/user) + SIGNAL_HANDLER + + if (!bayonet || allow_sawnoff) + return + source.balloon_alert(user, "bayonet must be removed!") + return COMPONENT_CANCEL_SAWING_OFF + +/datum/component/bayonet_attachable/proc/on_sawn_off(obj/item/source, mob/user) + SIGNAL_HANDLER + if (!allow_sawnoff) + qdel(src) diff --git a/code/datums/components/bloodysoles.dm b/code/datums/components/bloodysoles.dm index ef882a5f96f28..461cfcff3aae4 100644 --- a/code/datums/components/bloodysoles.dm +++ b/code/datums/components/bloodysoles.dm @@ -1,3 +1,5 @@ +/// The percentage of blood we lose on each step +#define BLOOD_PERCENT_LOSS_ON_STEP 0.33 /** * Component for clothing items that can pick up blood from decals and spread it around everywhere when walking, such as shoes or suits with integrated shoes. @@ -172,10 +174,11 @@ if(wielder.body_position == LYING_DOWN || !wielder.has_gravity(wielder.loc)) return - var/half_our_blood = bloody_shoes[last_blood_state] / 2 + var/blood_lost = bloody_shoes[last_blood_state] * BLOOD_PERCENT_LOSS_ON_STEP + var/theoretical_new_blood = bloody_shoes[last_blood_state] - blood_lost var/footprint_sprite = wielder.get_footprint_sprite() // Add footprints in old loc if we have enough cream - if(half_our_blood >= BLOOD_FOOTPRINTS_MIN) + if(theoretical_new_blood >= BLOOD_FOOTPRINTS_MIN) var/turf/oldLocTurf = get_turf(OldLoc) var/obj/effect/decal/cleanable/blood/footprints/oldLocFP = find_pool_by_blood_state(oldLocTurf, /obj/effect/decal/cleanable/blood/footprints, footprint_sprite) if(oldLocFP) @@ -186,7 +189,7 @@ oldLocFP.update_appearance() else if(find_pool_by_blood_state(oldLocTurf, footprint_sprite = footprint_sprite)) // No footprints in the tile we left, but there was some other blood pool there. Add exit footprints on it - adjust_bloody_shoes(last_blood_state, half_our_blood) + adjust_bloody_shoes(last_blood_state, blood_lost) update_icon() oldLocFP = new(oldLocTurf, footprint_sprite) @@ -194,19 +197,20 @@ oldLocFP.blood_state = last_blood_state oldLocFP.exited_dirs |= wielder.dir add_parent_to_footprint(oldLocFP) - oldLocFP.bloodiness = half_our_blood + oldLocFP.bloodiness = blood_lost oldLocFP.add_blood_DNA(GET_ATOM_BLOOD_DNA(parent_atom)) oldLocFP.update_appearance() - half_our_blood = bloody_shoes[last_blood_state] / 2 + blood_lost = bloody_shoes[last_blood_state] * BLOOD_PERCENT_LOSS_ON_STEP + theoretical_new_blood = theoretical_new_blood - blood_lost // If we picked up the blood on this tick in on_step_blood, don't make footprints at the same place if(last_pickup && last_pickup == world.time) return // Create new footprints - if(half_our_blood >= BLOOD_FOOTPRINTS_MIN) - adjust_bloody_shoes(last_blood_state, half_our_blood) + if(theoretical_new_blood >= BLOOD_FOOTPRINTS_MIN) + adjust_bloody_shoes(last_blood_state, blood_lost) update_icon() var/obj/effect/decal/cleanable/blood/footprints/FP = new(get_turf(parent_atom), footprint_sprite) @@ -214,7 +218,7 @@ FP.blood_state = last_blood_state FP.entered_dirs |= wielder.dir add_parent_to_footprint(FP) - FP.bloodiness = half_our_blood + FP.bloodiness = blood_lost FP.add_blood_DNA(GET_ATOM_BLOOD_DNA(parent_atom)) FP.update_appearance() @@ -234,10 +238,11 @@ // The pool we stepped in was actually footprints with the same type var/obj/effect/decal/cleanable/blood/footprints/pool_FP = pool add_parent_to_footprint(pool_FP) - if((bloody_shoes[last_blood_state] / 2) >= BLOOD_FOOTPRINTS_MIN && !(pool_FP.entered_dirs & wielder.dir)) + if((bloody_shoes[last_blood_state] - (bloody_shoes[last_blood_state] * BLOOD_PERCENT_LOSS_ON_STEP)) >= BLOOD_FOOTPRINTS_MIN && !(pool_FP.entered_dirs & wielder.dir)) // If our feet are bloody enough, add an entered dir pool_FP.entered_dirs |= wielder.dir pool_FP.update_appearance() + return share_blood(pool) @@ -328,3 +333,5 @@ SIGNAL_HANDLER update_icon() + +#undef BLOOD_PERCENT_LOSS_ON_STEP diff --git a/code/datums/components/combustible_flooder.dm b/code/datums/components/combustible_flooder.dm index a4260a9641a9f..07df03671c16c 100644 --- a/code/datums/components/combustible_flooder.dm +++ b/code/datums/components/combustible_flooder.dm @@ -11,6 +11,9 @@ src.gas_amount = initialize_gas_amount src.temp_amount = initialize_temp_amount +// Any item made of plasma is going to have this component, making it extremely difficult to blacklist fire hazards during create_and_destroy. +// So let's just completely neuter them during unit tests so we don't burn down the testing area and cause spurious runtimes. +#ifndef UNIT_TESTS RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(attackby_react)) RegisterSignal(parent, COMSIG_ATOM_FIRE_ACT, PROC_REF(flame_react)) RegisterSignal(parent, COMSIG_ATOM_TOUCHED_SPARKS, PROC_REF(sparks_react)) @@ -18,6 +21,7 @@ RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_WELDER), PROC_REF(welder_react)) if(isturf(parent)) RegisterSignal(parent, COMSIG_TURF_EXPOSE, PROC_REF(hotspots_react)) +#endif /datum/component/combustible_flooder/UnregisterFromParent() UnregisterSignal(parent, COMSIG_ATOM_ATTACKBY) diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 7a56f89c8e924..a2e710b762ec6 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -75,8 +75,14 @@ if(contents[requirement_path] < R.chem_catalysts[requirement_path]) return FALSE + var/mech_found = FALSE for(var/machinery_path in R.machinery) - if(!machines[machinery_path])//We don't care for volume with machines, just if one is there or not + mech_found = FALSE + for(var/obj/machinery/machine as anything in machines) + if(ispath(machine, machinery_path))//We don't care for volume with machines, just if one is there or not + mech_found = TRUE + break + if(!mech_found) return FALSE for(var/required_structure_path in R.structures) diff --git a/code/datums/components/crafting/entertainment.dm b/code/datums/components/crafting/entertainment.dm index 7bc2222b142f5..f1aa865e0cbc1 100644 --- a/code/datums/components/crafting/entertainment.dm +++ b/code/datums/components/crafting/entertainment.dm @@ -249,3 +249,18 @@ /obj/item/stack/cable_coil = 2, ) category = CAT_EQUIPMENT + +/datum/crafting_recipe/violin + name = "Violin" + result = /obj/item/instrument/violin + reqs = list( + /obj/item/stack/sheet/mineral/wood = 4, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/iron = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 30 SECONDS + category = CAT_ENTERTAINMENT + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED diff --git a/code/datums/components/crafting/equipment.dm b/code/datums/components/crafting/equipment.dm index bd2b8b1d8b60b..eeea4205a4d29 100644 --- a/code/datums/components/crafting/equipment.dm +++ b/code/datums/components/crafting/equipment.dm @@ -260,3 +260,14 @@ ) category = CAT_EQUIPMENT tool_behaviors = list(TOOL_WELDER, TOOL_WIRECUTTER) + +/datum/crafting_recipe/arrow_quiver + name = "Archery Quiver" + result = /obj/item/storage/bag/quiver/lesser + time = 10 + reqs = list( + /obj/item/stack/sheet/leather = 4, + /obj/item/stack/sheet/cardboard = 4 + ) + category = CAT_EQUIPMENT + tool_behaviors = list(TOOL_WELDER, TOOL_WIRECUTTER) diff --git a/code/datums/components/crafting/guncrafting.dm b/code/datums/components/crafting/guncrafting.dm index dcf42ee47b1a5..1bd0b0b2419ee 100644 --- a/code/datums/components/crafting/guncrafting.dm +++ b/code/datums/components/crafting/guncrafting.dm @@ -18,8 +18,8 @@ /obj/item/weaponcrafting/receiver/create_slapcraft_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/pipegun) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -34,8 +34,8 @@ /obj/item/weaponcrafting/stock/create_slapcraft_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/smoothbore_disabler, /datum/crafting_recipe/laser_musket) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -48,8 +48,8 @@ /obj/item/weaponcrafting/giant_wrench/create_slapcraft_component() // slappycraft var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/giant_wrench) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -94,3 +94,7 @@ /obj/item/weaponcrafting/gunkit/hellgun name = "hellfire laser gun degradation kit (warcrime lethal)" desc = "Take a perfectly functioning laser gun. Butcher the inside of the gun so it runs hot and mean. You now have a hellfire laser. You monster." + +/obj/item/weaponcrafting/gunkit/photon + name = "photon cannon parts kit (nonlethal)" + desc = "A suitcase containing the necessary gun parts to construct a photon cannon around a stabilized flux anomaly. Harness the power of the sun, in the palms of your hands." diff --git a/code/datums/components/crafting/melee_weapon.dm b/code/datums/components/crafting/melee_weapon.dm index 1c4150585fccc..594ff7aefd387 100644 --- a/code/datums/components/crafting/melee_weapon.dm +++ b/code/datums/components/crafting/melee_weapon.dm @@ -171,3 +171,23 @@ ) time = 10 SECONDS category = CAT_WEAPON_MELEE + +/datum/crafting_recipe/singulo_hammer + name = "Singularity Hammer" + result = /obj/item/singularityhammer + reqs = list( + /obj/item/assembly/signaler/anomaly/pyro = 1, + /obj/item/assembly/signaler/anomaly/grav = 1, + /obj/item/assembly/signaler/anomaly/flux = 1, + /obj/item/assembly/signaler/anomaly/bluespace = 1, + /obj/item/assembly/signaler/anomaly/vortex = 1, + /obj/item/assembly/signaler/anomaly/bioscrambler = 1, + /obj/item/assembly/signaler/anomaly/hallucination = 1, + /obj/item/assembly/signaler/anomaly/dimensional = 1, + /obj/item/assembly/signaler/anomaly/ectoplasm = 1, + ) + machinery = list( + /obj/machinery/power/supermatter_crystal = CRAFTING_MACHINERY_CONSUME, + ) + time = 10 SECONDS + category = CAT_WEAPON_MELEE diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index c49900df07ab4..0e3c7b119169b 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -374,3 +374,28 @@ time = 20 SECONDS category = CAT_WEAPON_RANGED crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + +/datum/crafting_recipe/shortbow + name = "Shortbow" + result = /obj/item/gun/ballistic/bow/shortbow + reqs = list( + /obj/item/stack/sheet/mineral/wood = 4, + /obj/item/stack/sheet/cloth = 2, + /obj/item/stack/sheet/iron = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 30 SECONDS + category = CAT_WEAPON_RANGED + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + +/datum/crafting_recipe/photoncannon + name = "Photon Cannon" + result = /obj/item/gun/energy/photon + reqs = list( + /obj/item/assembly/signaler/anomaly/flux = 1, + /obj/item/weaponcrafting/gunkit/photon = 1, + ) + time = 10 SECONDS + category = CAT_WEAPON_RANGED diff --git a/code/datums/components/crafting/tiles.dm b/code/datums/components/crafting/tiles.dm index 5f7c41e012e0c..3125f4c1e85cf 100644 --- a/code/datums/components/crafting/tiles.dm +++ b/code/datums/components/crafting/tiles.dm @@ -7,3 +7,23 @@ result = /obj/item/stack/tile/carpet/black result_amount = 50 category = CAT_TILES + +/datum/crafting_recipe/wired_glass + name = "Wired Glass Tile" + result = /obj/item/stack/tile/light + reqs = list( + /obj/item/stack/sheet/iron = 1, + /obj/item/stack/sheet/glass = 1, + /obj/item/stack/cable_coil = 5, + ) + category = CAT_TILES + +/datum/crafting_recipe/circuit + name = "Circuit Tile" + result = /obj/item/stack/tile/circuit + reqs = list( + /obj/item/stack/sheet/iron = 1, + /obj/item/stack/sheet/glass = 1, + /obj/item/stack/cable_coil = 5, + ) + category = CAT_TILES diff --git a/code/datums/components/crafting/weapon_ammo.dm b/code/datums/components/crafting/weapon_ammo.dm index f68ff58072c67..2ba01802e7cdd 100644 --- a/code/datums/components/crafting/weapon_ammo.dm +++ b/code/datums/components/crafting/weapon_ammo.dm @@ -111,3 +111,46 @@ ) category = CAT_WEAPON_AMMO crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + +/datum/crafting_recipe/arrow + name = "Arrow" + result = /obj/item/ammo_casing/arrow + reqs = list( + /obj/item/stack/sheet/mineral/wood = 1, + /obj/item/stack/sheet/cloth = 1, + /obj/item/stack/sheet/iron = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + +/datum/crafting_recipe/plastic_arrow + name = "Plastic Arrow" + result = /obj/item/ammo_casing/arrow/plastic + reqs = list( + /obj/item/stack/sheet/plastic = 1, + ) + tool_paths = list( + /obj/item/hatchet, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED + + +/datum/crafting_recipe/holy_arrow + name = "Holy Arrow" + result = /obj/item/ammo_casing/arrow/holy + reqs = list( + /obj/item/ammo_casing/arrow = 1, + /datum/reagent/water/holywater = 10, + ) + tool_paths = list( + /obj/item/gun/ballistic/bow/divine, + ) + time = 5 SECONDS + category = CAT_WEAPON_AMMO + crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED diff --git a/code/datums/components/dart_insert.dm b/code/datums/components/dart_insert.dm index 19eea67ab3a8d..ad869903051d2 100644 --- a/code/datums/components/dart_insert.dm +++ b/code/datums/components/dart_insert.dm @@ -142,11 +142,8 @@ projectile.wound_bonus += var_modifiers["wound_bonus"] projectile.bare_wound_bonus += var_modifiers["bare_wound_bonus"] projectile.demolition_mod += var_modifiers["demolition_mod"] - if(islist(var_modifiers["embedding"])) - var/list/embed_params = var_modifiers["embedding"] - for(var/embed_param in embed_params - "ignore_throwspeed_threshold") - LAZYADDASSOC(projectile.embedding, embed_param, embed_params[embed_param]) - projectile.updateEmbedding() + if(var_modifiers["embedding"]) + projectile.set_embed(var_modifiers["embedding"]) /datum/component/dart_insert/proc/remove_var_modifiers(obj/projectile/projectile) projectile.damage -= var_modifiers["damage"] @@ -155,9 +152,6 @@ projectile.wound_bonus -= var_modifiers["wound_bonus"] projectile.bare_wound_bonus -= var_modifiers["bare_wound_bonus"] projectile.demolition_mod -= var_modifiers["demolition_mod"] - if(islist(var_modifiers["embedding"])) - var/list/embed_params = var_modifiers["embedding"] - for(var/embed_param in embed_params - "ignore_throwspeed_threshold") - LAZYADDASSOC(projectile.embedding, embed_param, -embed_params[embed_param]) - projectile.updateEmbedding() + if(var_modifiers["embedding"]) + projectile.set_embed(initial(projectile.embed_type)) var_modifiers.Cut() diff --git a/code/datums/components/effect_remover.dm b/code/datums/components/effect_remover.dm index a02be73f5684e..a67962250dbe1 100644 --- a/code/datums/components/effect_remover.dm +++ b/code/datums/components/effect_remover.dm @@ -46,7 +46,7 @@ return ..() /datum/component/effect_remover/RegisterWithParent() - RegisterSignal(parent, COMSIG_ITEM_ATTACK_EFFECT, PROC_REF(try_remove_effect)) + RegisterSignal(parent, COMSIG_ITEM_INTERACTING_WITH_ATOM, PROC_REF(try_remove_effect)) if(tip_text) var/obj/item/item_parent = parent @@ -54,20 +54,21 @@ RegisterSignal(parent, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET, PROC_REF(add_item_context)) /datum/component/effect_remover/UnregisterFromParent() - UnregisterSignal(parent, list(COMSIG_ITEM_ATTACK_EFFECT, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET)) + UnregisterSignal(parent, list(COMSIG_ITEM_INTERACTING_WITH_ATOM, COMSIG_ITEM_REQUESTING_CONTEXT_FOR_TARGET)) /* - * Signal proc for [COMSIG_ITEM_ATTACK_EFFECT]. + * Signal proc for [COMSIG_ITEM_INTERACTING_WITH_ATOM]. */ -/datum/component/effect_remover/proc/try_remove_effect(datum/source, obj/effect/target, mob/living/user, params) + +/datum/component/effect_remover/proc/try_remove_effect(datum/source, mob/living/user, atom/target, params) SIGNAL_HANDLER if(!isliving(user)) - return + return NONE - if(effects_we_clear[target.type]) // Make sure we get all subtypes and everything + if(is_type_in_typecache(target, effects_we_clear)) // Make sure we get all subtypes and everything INVOKE_ASYNC(src, PROC_REF(do_remove_effect), target, user) - return COMPONENT_NO_AFTERATTACK + return ITEM_INTERACT_SUCCESS /* * Actually removes the effect, invoking our on_clear_callback before it's deleted. diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index 45a3c07298ff0..84bfa8dfad0f0 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -27,63 +27,28 @@ dupe_mode = COMPONENT_DUPE_ALLOWED var/obj/item/bodypart/limb var/obj/item/weapon - - // all of this stuff is explained in _DEFINES/combat.dm - var/embed_chance // not like we really need it once we're already stuck in but hey - var/fall_chance - var/pain_chance - var/pain_mult - var/impact_pain_mult - var/remove_pain_mult - var/rip_time - var/ignore_throwspeed_threshold - var/jostle_chance - var/jostle_pain_mult - var/pain_stam_pct - ///if both our pain multiplier and jostle pain multiplier are 0, we're harmless and can omit most of the damage related stuff var/harmful -/datum/component/embedded/Initialize(obj/item/I, +/datum/component/embedded/Initialize(obj/item/weapon, datum/thrownthing/throwingdatum, - obj/item/bodypart/part, - embed_chance = EMBED_CHANCE, - fall_chance = EMBEDDED_ITEM_FALLOUT, - pain_chance = EMBEDDED_PAIN_CHANCE, - pain_mult = EMBEDDED_PAIN_MULTIPLIER, - remove_pain_mult = EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER, - impact_pain_mult = EMBEDDED_IMPACT_PAIN_MULTIPLIER, - rip_time = EMBEDDED_UNSAFE_REMOVAL_TIME, - ignore_throwspeed_threshold = FALSE, - jostle_chance = EMBEDDED_JOSTLE_CHANCE, - jostle_pain_mult = EMBEDDED_JOSTLE_PAIN_MULTIPLIER, - pain_stam_pct = EMBEDDED_PAIN_STAM_PCT) - - if(!iscarbon(parent) || !isitem(I)) + obj/item/bodypart/part) + + if(!iscarbon(parent) || !isitem(weapon)) return COMPONENT_INCOMPATIBLE + src.weapon = weapon + if(part) limb = part - src.embed_chance = embed_chance - src.fall_chance = fall_chance - src.pain_chance = pain_chance - src.pain_mult = pain_mult - src.remove_pain_mult = remove_pain_mult - src.rip_time = rip_time - src.impact_pain_mult = impact_pain_mult - src.ignore_throwspeed_threshold = ignore_throwspeed_threshold - src.jostle_chance = jostle_chance - src.jostle_pain_mult = jostle_pain_mult - src.pain_stam_pct = pain_stam_pct - src.weapon = I - - if(!weapon.isEmbedHarmless()) + + if(!weapon.is_embed_harmless()) harmful = TRUE weapon.embedded(parent, part) START_PROCESSING(SSdcs, src) var/mob/living/carbon/victim = parent - + var/datum/embed_data/embed_data = weapon.get_embed() limb._embed_object(weapon) // on the inside... on the inside... weapon.forceMove(victim) RegisterSignals(weapon, list(COMSIG_MOVABLE_MOVED, COMSIG_QDELETING), PROC_REF(weaponDeleted)) @@ -95,13 +60,13 @@ playsound(victim,'sound/weapons/bladeslice.ogg', 40) 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 + damage += weapon.w_class * embed_data.impact_pain_mult victim.add_mood_event("embedded", /datum/mood_event/embedded) if(damage > 0) - var/armor = victim.run_armor_check(limb.body_zone, MELEE, "Your armor has protected your [limb.plaintext_zone].", "Your armor has softened a hit to your [limb.plaintext_zone].",I.armour_penetration, weak_against_armour = I.weak_against_armour) - limb.receive_damage(brute=(1-pain_stam_pct) * damage, blocked=armor, wound_bonus = I.wound_bonus, bare_wound_bonus = I.bare_wound_bonus, sharpness = I.get_sharpness()) - victim.adjustStaminaLoss(pain_stam_pct * damage) + var/armor = victim.run_armor_check(limb.body_zone, MELEE, "Your armor has protected your [limb.plaintext_zone].", "Your armor has softened a hit to your [limb.plaintext_zone].", weapon.armour_penetration, weak_against_armour = weapon.weak_against_armour) + limb.receive_damage(brute = (1 - embed_data.pain_stam_pct) * damage, blocked = armor, wound_bonus = weapon.wound_bonus, bare_wound_bonus = weapon.bare_wound_bonus, sharpness = weapon.get_sharpness()) + victim.adjustStaminaLoss(embed_data.pain_stam_pct * damage) /datum/component/embedded/Destroy() var/mob/living/carbon/victim = parent @@ -135,20 +100,21 @@ if(victim.stat == DEAD) return - var/damage = weapon.w_class * pain_mult - var/pain_chance_current = SPT_PROB_RATE(pain_chance / 100, seconds_per_tick) * 100 - if(pain_stam_pct && HAS_TRAIT_FROM(victim, TRAIT_INCAPACITATED, STAMINA)) //if it's a less-lethal embed, give them a break if they're already stamcritted + var/datum/embed_data/embed_data = weapon.get_embed() + var/damage = weapon.w_class * embed_data.pain_mult + var/pain_chance_current = SPT_PROB_RATE(embed_data.pain_chance / 100, seconds_per_tick) * 100 + if(embed_data.pain_stam_pct && HAS_TRAIT_FROM(victim, TRAIT_INCAPACITATED, STAMINA)) //if it's a less-lethal embed, give them a break if they're already stamcritted pain_chance_current *= 0.2 damage *= 0.5 else if(victim.body_position == LYING_DOWN) pain_chance_current *= 0.2 if(harmful && prob(pain_chance_current)) - limb.receive_damage(brute=(1-pain_stam_pct) * damage, wound_bonus = CANT_WOUND) - victim.adjustStaminaLoss(pain_stam_pct * damage) + limb.receive_damage(brute = (1 - embed_data.pain_stam_pct) * damage, wound_bonus = CANT_WOUND) + victim.adjustStaminaLoss(embed_data.pain_stam_pct * damage) to_chat(victim, span_userdanger("[weapon] embedded in your [limb.plaintext_zone] hurts!")) - var/fall_chance_current = SPT_PROB_RATE(fall_chance / 100, seconds_per_tick) * 100 + var/fall_chance_current = SPT_PROB_RATE(embed_data.fall_chance / 100, seconds_per_tick) * 100 if(victim.body_position == LYING_DOWN) fall_chance_current *= 0.2 @@ -165,25 +131,27 @@ SIGNAL_HANDLER var/mob/living/carbon/victim = parent - var/chance = jostle_chance + var/datum/embed_data/embed_data = weapon.get_embed() + var/chance = embed_data.jostle_chance if(victim.move_intent == MOVE_INTENT_WALK || victim.body_position == LYING_DOWN) chance *= 0.5 if(harmful && prob(chance)) - var/damage = weapon.w_class * jostle_pain_mult - limb.receive_damage(brute=(1-pain_stam_pct) * damage, wound_bonus = CANT_WOUND) - victim.adjustStaminaLoss(pain_stam_pct * damage) + var/damage = weapon.w_class * embed_data.jostle_pain_mult + limb.receive_damage(brute = (1 - embed_data.pain_stam_pct) * damage, wound_bonus = CANT_WOUND) + victim.adjustStaminaLoss(embed_data.pain_stam_pct * damage) to_chat(victim, span_userdanger("[weapon] embedded in your [limb.plaintext_zone] jostles and stings!")) /// Called when then item randomly falls out of a carbon. This handles the damage and descriptors, then calls safe_remove() /datum/component/embedded/proc/fallOut() var/mob/living/carbon/victim = parent + var/datum/embed_data/embed_data = weapon.get_embed() if(harmful) - var/damage = weapon.w_class * remove_pain_mult - limb.receive_damage(brute=(1-pain_stam_pct) * damage, wound_bonus = CANT_WOUND) - victim.adjustStaminaLoss(pain_stam_pct * damage) + var/damage = weapon.w_class * embed_data.remove_pain_mult + limb.receive_damage(brute= (1 - embed_data.pain_stam_pct) * damage, wound_bonus = CANT_WOUND) + victim.adjustStaminaLoss(embed_data.pain_stam_pct * damage) victim.visible_message(span_danger("[weapon] falls [harmful ? "out" : "off"] of [victim.name]'s [limb.plaintext_zone]!"), span_userdanger("[weapon] falls [harmful ? "out" : "off"] of your [limb.plaintext_zone]!")) safeRemove() @@ -195,7 +163,8 @@ if(I != weapon || src.limb != limb) return var/mob/living/carbon/victim = parent - var/time_taken = rip_time * weapon.w_class + var/datum/embed_data/embed_data = weapon.get_embed() + var/time_taken = embed_data.rip_time * weapon.w_class INVOKE_ASYNC(src, PROC_REF(complete_rip_out), victim, I, limb, time_taken) /// everything async that ripOut used to do @@ -214,9 +183,10 @@ /// Proc that actually does the damage associated with ripping something out of yourself. Call this before safeRemove. /datum/component/embedded/proc/damaging_removal(mob/living/carbon/victim, obj/item/removed, obj/item/bodypart/limb, ouch_multiplier = 1) - var/damage = weapon.w_class * remove_pain_mult * ouch_multiplier - limb.receive_damage(brute=(1-pain_stam_pct) * damage, sharpness=SHARP_EDGED) //It hurts to rip it out, get surgery you dingus. unlike the others, this CAN wound + increase slash bloodflow - victim.adjustStaminaLoss(pain_stam_pct * damage) + var/datum/embed_data/embed_data = weapon.get_embed() + var/damage = weapon.w_class * embed_data.remove_pain_mult * ouch_multiplier + limb.receive_damage(brute= (1 - embed_data.pain_stam_pct) * damage, sharpness = SHARP_EDGED) //It hurts to rip it out, get surgery you dingus. unlike the others, this CAN wound + increase slash bloodflow + victim.adjustStaminaLoss(embed_data.pain_stam_pct * damage) victim.emote("scream") /// This proc handles the final step and actual removal of an embedded/stuck item from a carbon, whether or not it was actually removed safely. @@ -271,12 +241,13 @@ /// The actual action for pulling out an embedded object with a hemostat /datum/component/embedded/proc/tweezePluck(obj/item/possible_tweezers, mob/user) var/mob/living/carbon/victim = parent + var/datum/embed_data/embed_data = weapon.get_embed() var/self_pluck = (user == victim) // quality of the tool we're using var/tweezer_speed = possible_tweezers.toolspeed // is this an actual piece of medical equipment var/tweezer_safe = (possible_tweezers.tool_behaviour == TOOL_HEMOSTAT) - var/pluck_time = rip_time * (weapon.w_class * 0.3) * (self_pluck ? 1.5 : 1) * tweezer_speed * (tweezer_safe ? 1 : 1.5) + var/pluck_time = embed_data.rip_time * (weapon.w_class * 0.3) * (self_pluck ? 1.5 : 1) * tweezer_speed * (tweezer_safe ? 1 : 1.5) if(self_pluck) user.visible_message(span_danger("[user] begins plucking [weapon] from [user.p_their()] [limb.plaintext_zone] with [possible_tweezers]..."), span_notice("You start plucking [weapon] from your [limb.plaintext_zone] with [possible_tweezers]... (It will take [DisplayTimeText(pluck_time)])"),\ @@ -313,10 +284,12 @@ if(!harmful) victim.visible_message(span_danger("[marked_item] vanishes from [victim.name]'s [limb.plaintext_zone]!"), span_userdanger("[weapon] vanishes from [limb.plaintext_zone]!")) 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 + + var/datum/embed_data/embed_data = weapon.get_embed() + var/damage = weapon.w_class * embed_data.remove_pain_mult + limb.receive_damage(brute = (1 - embed_data.pain_stam_pct) * damage * 1.5, sharpness = SHARP_EDGED) // Performs exit wounds and flings the user to the caster if nearby victim.cause_wound_of_type_and_severity(WOUND_PIERCE, limb, WOUND_SEVERITY_MODERATE) - victim.adjustStaminaLoss(pain_stam_pct * damage) + victim.adjustStaminaLoss(embed_data.pain_stam_pct * damage) playsound(get_turf(victim), 'sound/effects/wounds/blood2.ogg', 50, TRUE) var/dist = get_dist(caster, victim) //Check if the caster is close enough to yank them in diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index 414c17b6d15e3..481f965059f52 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -42,7 +42,7 @@ return var/has_known_fishes = FALSE - for(var/reward in fish_source.fish_counts) + for(var/reward in fish_source.fish_table) if(!ispath(reward, /obj/item/fish)) continue var/obj/item/fish/prototype = reward @@ -60,7 +60,7 @@ return var/list/known_fishes = list() - for(var/reward in fish_source.fish_counts) + for(var/reward in fish_source.fish_table) if(!ispath(reward, /obj/item/fish)) continue var/obj/item/fish/prototype = reward diff --git a/code/datums/components/knockoff.dm b/code/datums/components/knockoff.dm index db72072789c45..3fe007736a1d0 100644 --- a/code/datums/components/knockoff.dm +++ b/code/datums/components/knockoff.dm @@ -23,6 +23,10 @@ /datum/component/knockoff/RegisterWithParent() RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped)) RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_dropped)) + var/atom/movable/atom_parent = parent + var/mob/living/as_mob = atom_parent.loc + if(ismob(as_mob)) + on_equipped(atom_parent, as_mob, as_mob.get_slot_by_item(atom_parent)) // lie a little /datum/component/knockoff/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) diff --git a/code/datums/components/material/material_container.dm b/code/datums/components/material/material_container.dm index ffcf81feacefd..6ee50f5d78c94 100644 --- a/code/datums/components/material/material_container.dm +++ b/code/datums/components/material/material_container.dm @@ -207,8 +207,9 @@ * - [weapon][obj/item]: the item you are trying to insert * - multiplier: The multiplier for the materials being inserted * - context: the atom performing the operation, this is the last argument sent in COMSIG_MATCONTAINER_ITEM_CONSUMED and is used mostly for silo logging + * * - delete_item: should we delete the item after its materials are consumed. does not apply to stacks if they were split due to lack of space */ -/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, atom/context = parent) +/datum/component/material_container/proc/insert_item(obj/item/weapon, multiplier = 1, atom/context = parent, delete_item = TRUE) if(QDELETED(weapon)) return MATERIAL_INSERT_ITEM_NO_MATS multiplier = CEILING(multiplier, 0.01) @@ -232,14 +233,11 @@ material_amount = get_item_material_amount(target) * multiplier material_amount = OPTIMAL_COST(material_amount) - //not enough space, time to bail - if(!has_space(material_amount)) - return MATERIAL_INSERT_ITEM_NO_SPACE - //do the insert var/last_inserted_id = insert_item_materials(target, multiplier, context) if(!isnull(last_inserted_id)) - qdel(target) //item gone + if(delete_item || target != weapon) //we could have split the stack ourself + qdel(target) //item gone return material_amount else if(!isnull(item_stack) && item_stack != target) //insertion failed, merge the split stack back into the original var/obj/item/stack/inserting_stack = target @@ -266,188 +264,180 @@ . = 0 //All items that do not have any contents - var/list/obj/item/child_items = list() - //All items that do have contents but they were already processed by the above list - var/list/obj/item/parent_items = list(held_item) + var/list/obj/item/items = list(held_item) //is this the first item we are ever processing var/first_checks = TRUE + //list of items to delete + var/list/obj/item/to_delete = list() //The status of the last insert attempt var/inserted = 0 //All messages to be displayed to chat var/list/chat_msgs = list() //differs from held_item when using TK - var/active_held = user.get_active_held_item() - //storage items to retrive items from - var/static/list/storage_items - if(isnull(storage_items)) - storage_items = list( - /obj/item/storage/backpack, - /obj/item/storage/bag, - /obj/item/storage/box, - ) - - //1st iteration consumes all items that do not have contents inside - //2nd iteration consumes items who do have contents inside(but they were consumed in the 1st iteration so its empty now) - for(var/i in 1 to 2) + var/obj/item/active_held = user.get_active_held_item() + //omni tools can act as any tool so get its real behaviour + active_held = active_held.get_proxy_attacker_for(held_item) + + while(items.len) //no point inserting more items if(inserted == MATERIAL_INSERT_ITEM_NO_SPACE) break - //transfer all items for processing - if(!parent_items.len) - break - child_items += parent_items - parent_items.Cut() - - while(child_items.len) - //Pop the 1st item out from the list - var/obj/item/target_item = child_items[1] - child_items -= target_item + //Pop the 1st item out from the list + var/obj/item/target_item = items[1] + items -= target_item - //e.g. projectiles inside bullets are not objects - if(!istype(target_item)) - continue - //can't allow abstract, hologram items - if((target_item.item_flags & ABSTRACT) || (target_item.flags_1 & HOLOGRAM_1)) + //e.g. projectiles inside bullets are not objects + if(!istype(target_item)) + continue + //can't allow abstract, hologram items + if((target_item.item_flags & ABSTRACT) || (target_item.flags_1 & HOLOGRAM_1)) + continue + //user defined conditions + if(SEND_SIGNAL(src, COMSIG_MATCONTAINER_PRE_USER_INSERT, target_item, user) & MATCONTAINER_BLOCK_INSERT) + continue + //item is either indestructible, not allowed for redemption or not in the allowed types + if((target_item.resistance_flags & INDESTRUCTIBLE) || (target_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target_item, allowed_item_typecache))) + if(!(mat_container_flags & MATCONTAINER_SILENT)) + var/list/status_data = chat_msgs["[MATERIAL_INSERT_ITEM_FAILURE]"] || list() + var/list/item_data = status_data[target_item.name] || list() + item_data["count"] += 1 + status_data[target_item.name] = item_data + chat_msgs["[MATERIAL_INSERT_ITEM_FAILURE]"] = status_data + + if(target_item.resistance_flags & INDESTRUCTIBLE) + if(target_item != active_held) //move it out of any storage medium its in so it doesn't get consumed with its parent, but only if that storage medium is not our hand + target_item.forceMove(get_turf(context)) continue - //user defined conditions - if(SEND_SIGNAL(src, COMSIG_MATCONTAINER_PRE_USER_INSERT, target_item, user) & MATCONTAINER_BLOCK_INSERT) + + //storage items usually come here + //this is so players can insert items from their bags into machines for convinience + if(!target_item.atom_storage || !target_item.contents.len) continue - //item is either indestructible, not allowed for redemption or not in the allowed types - if((target_item.resistance_flags & INDESTRUCTIBLE) || (target_item.item_flags & NO_MAT_REDEMPTION) || (allowed_item_typecache && !is_type_in_typecache(target_item, allowed_item_typecache))) - if(!(mat_container_flags & MATCONTAINER_SILENT) && i == 1) //count only child items the 1st time around - var/list/status_data = chat_msgs["[MATERIAL_INSERT_ITEM_FAILURE]"] || list() - var/list/item_data = status_data[target_item.name] || list() - item_data["count"] += 1 - status_data[target_item.name] = item_data - chat_msgs["[MATERIAL_INSERT_ITEM_FAILURE]"] = status_data - - if(target_item.resistance_flags & INDESTRUCTIBLE) - if(i == 1 && target_item != active_held) //move it out of any storage medium its in so it doesn't get consumed with its parent, but only if that storage medium is not our hand - target_item.forceMove(get_turf(context)) - continue - //storage items usually come here but we make the exception only on the 1st iteration - //this is so players can insert items from their bags into machines for convinience - if(!is_type_in_list(target_item, storage_items)) - continue - else if(!target_item.contents.len || i == 2) - continue - //at this point we can check if we have enough for all items & other stuff - if(first_checks) - //duffle bags needs to be unzipped - if(target_item.atom_storage?.locked) + //at this point we can check if we have enough for all items & other stuff + if(first_checks) + //duffle bags needs to be unzipped + if(target_item.atom_storage?.locked) + if(!(mat_container_flags & MATCONTAINER_SILENT)) + to_chat(user, span_warning("[target_item] has its storage locked")) + return + + //anything that isn't a stack cannot be split so find out if we have enough space, we don't want to consume half the contents of an object & leave it in a broken state + //for duffle bags and other storage items we can check for space 1 item at a time + if(!isstack(target_item) && !target_item.atom_storage) + var/total_amount = 0 + for(var/obj/item/weapon as anything in target_item.get_all_contents_type(/obj/item)) + total_amount += get_item_material_amount(weapon) + if(!has_space(total_amount)) if(!(mat_container_flags & MATCONTAINER_SILENT)) - to_chat(user, span_warning("[target_item] has its storage locked")) + to_chat(user, span_warning("[parent] does not have enough space for [target_item]!")) return - //anything that isn't a stack cannot be split so find out if we have enough space, we don't want to consume half the contents of an object & leave it in a broken state - //for duffle bags and other storage items we can check for space 1 item at a time - if(!isstack(target_item) && !is_type_in_list(target_item, storage_items)) - var/total_amount = 0 - for(var/obj/item/weapon as anything in target_item.get_all_contents_type(/obj/item)) - total_amount += get_item_material_amount(weapon) - if(!has_space(total_amount)) - if(!(mat_container_flags & MATCONTAINER_SILENT)) - to_chat(user, span_warning("[parent] does not have enough space for [target_item]!")) - return - - first_checks = FALSE - - //All hard checks have passed, at this point we can consume the item - //If it has children then we will process them first and then the item in the 2nd round - //This is done so we don't delete the children when the parent is consumed - //We only do this on the 1st iteration so we don't re-iterate through its children again - if(target_item.contents.len && i == 1) - if(target_item.atom_storage?.locked) //can't access contents of locked storage(like duffle bags) - continue - //process children - child_items += target_item.contents - //in the 2nd round only after its children are consumed do we consume this next, FIFO order - parent_items.Insert(1, target_item) - //leave it here till we get to its children - continue + first_checks = FALSE - //if stack, check if we want to read precise amount of sheets to insert - var/obj/item/stack/item_stack = null - if(isstack(target_item) && precise_insertion) - var/atom/current_parent = parent - item_stack = target_item - var/requested_amount = tgui_input_number(user, "How much do you want to insert?", "Inserting [item_stack.singular_name]s", item_stack.amount, item_stack.amount) - if(!requested_amount || QDELETED(target_item) || QDELETED(user) || QDELETED(src)) - continue - if(parent != current_parent || user.get_active_held_item() != active_held) - continue - if(requested_amount != item_stack.amount) //only split if its not the whole amount - target_item = fast_split_stack(item_stack, requested_amount) //split off the requested amount - requested_amount = 0 - - //is this item a stack and was it split by the player? - var/was_stack_split = !isnull(item_stack) && item_stack != target_item - //if it was split then item_stack has the reference to the original stack/item - var/original_item = was_stack_split ? item_stack : target_item - //if this item is not the one the player is holding then don't remove it from their hand - if(original_item != active_held) - original_item = null - if(!isnull(original_item) && !user.temporarilyRemoveItemFromInventory(original_item)) //remove from hand(if split remove the original stack else the target) - return - - //insert the item - var/item_name = target_item.name - var/item_count = 1 - var/is_stack = FALSE - if(isstack(target_item)) - var/obj/item/stack/the_stack = target_item - item_name = the_stack.singular_name - item_count = the_stack.amount - is_stack = TRUE - inserted = insert_item(target_item, 1, context) - if(inserted > 0) - . += inserted - inserted /= SHEET_MATERIAL_AMOUNT // display units inserted as sheets for improved readability - - //stack was either split by the container(!QDELETED(target_item) means the container only consumed a part of it) or by the player, put whats left back of the original stack back in players hand - if((!QDELETED(target_item) || was_stack_split)) - - //stack was split by player and that portion was not fully consumed, merge whats left back with the original stack - if(!QDELETED(target_item) && was_stack_split) - var/obj/item/stack/inserting_stack = target_item - item_stack.add(inserting_stack.amount) - qdel(inserting_stack) - - //was this the original item in the players hand? put what's left back in the player's hand - if(!isnull(original_item)) - user.put_in_active_hand(original_item) - - //collect all messages to print later - var/list/status_data = chat_msgs["[MATERIAL_INSERT_ITEM_SUCCESS]"] || list() - var/list/item_data = status_data[item_name] || list() - item_data["count"] += item_count - item_data["amount"] += inserted - item_data["stack"] = is_stack - status_data[item_name] = item_data - chat_msgs["[MATERIAL_INSERT_ITEM_SUCCESS]"] = status_data - - else - //collect all messages to print later - var/list/status_data = chat_msgs["[inserted]"] || list() - var/list/item_data = status_data[item_name] || list() - item_data["count"] += item_count - status_data[item_name] = item_data - chat_msgs["[inserted]"] = status_data - - //player split the stack by the requested amount but even that split amount could not be salvaged. merge it back with the original - if(!isnull(item_stack) && was_stack_split) + //if stack, check if we want to read precise amount of sheets to insert + var/obj/item/stack/item_stack = null + if(isstack(target_item) && precise_insertion) + var/atom/current_parent = parent + item_stack = target_item + var/requested_amount = tgui_input_number(user, "How much do you want to insert?", "Inserting [item_stack.singular_name]s", item_stack.amount, item_stack.amount) + if(!requested_amount || QDELETED(target_item) || QDELETED(user) || QDELETED(src)) + continue + if(parent != current_parent || user.get_active_held_item() != active_held) + continue + if(requested_amount != item_stack.amount) //only split if its not the whole amount + target_item = fast_split_stack(item_stack, requested_amount) //split off the requested amount + requested_amount = 0 + + //is this item a stack and was it split by the player? + var/was_stack_split = !isnull(item_stack) && item_stack != target_item + //if it was split then item_stack has the reference to the original stack/item + var/obj/item/original_item = was_stack_split ? item_stack : target_item + //if this item is not the one the player is holding then don't remove it from their hand + if(original_item != active_held) + original_item = null + if(!isnull(original_item) && !user.temporarilyRemoveItemFromInventory(original_item)) //remove from hand(if split remove the original stack else the target) + return + + //insert the item + var/item_name = target_item.name + var/item_count = 1 + var/is_stack = FALSE + var/obj/item/stack/the_stack + if(isstack(target_item)) + the_stack = target_item + item_name = the_stack.singular_name + item_count = the_stack.amount + is_stack = TRUE + + //we typically don't want to consume bags, boxes but only their contents. so we skip processing + inserted = !target_item.atom_storage ? insert_item(target_item, 1, context, is_stack) : 0 + if(inserted > 0) + . += inserted + inserted /= SHEET_MATERIAL_AMOUNT // display units inserted as sheets for improved readability + + //collect all messages to print later + var/list/status_data = chat_msgs["[MATERIAL_INSERT_ITEM_SUCCESS]"] || list() + var/list/item_data = status_data[item_name] || list() + item_data["count"] += item_count + item_data["amount"] += inserted + item_data["stack"] = is_stack + status_data[item_name] = item_data + chat_msgs["[MATERIAL_INSERT_ITEM_SUCCESS]"] = status_data + + //delete the item or merge stacks if any left over + if(is_stack) + //player split it & machine further split that due to lack of space? merge with remaining stack + if(!QDELETED(target_item) && was_stack_split) var/obj/item/stack/inserting_stack = target_item item_stack.add(inserting_stack.amount) qdel(inserting_stack) - //was this the original item in the players hand? put it back because we coudn't salvage it - if(!isnull(original_item)) + //was this the original item in the players hand? put what's left back in the player's hand + if(!QDELETED(original_item)) user.put_in_active_hand(original_item) - //we can stop here as remaining items will fail to insert as well - if(inserted == MATERIAL_INSERT_ITEM_NO_SPACE) - break + //skip processing children & other stuff. irrelevant for stacks + continue + + //queue the object for deletion + to_delete += target_item + else + //collect all messages to print later + var/list/status_data = chat_msgs["[inserted]"] || list() + var/list/item_data = status_data[item_name] || list() + item_data["count"] += item_count + status_data[item_name] = item_data + chat_msgs["[inserted]"] = status_data + + //player split the stack by the requested amount but even that split amount could not be salvaged. merge it back with the original + if(was_stack_split) + var/obj/item/stack/inserting_stack = target_item + item_stack.add(inserting_stack.amount) + qdel(inserting_stack) + + //was this the original item in the players hand? put it back because we coudn't salvage it + if(!QDELETED(original_item)) + user.put_in_active_hand(original_item) + + //we can stop here as remaining items will fail to insert as well + if(inserted == MATERIAL_INSERT_ITEM_NO_SPACE) + break + + //we failed to process the item so don't bother going into its contents + //but if we are dealing with storage items like bags, boxes etc then we make a exception + if(!target_item.atom_storage) + continue + + //If any mats were consumed we can proceed to delete the parent + //If it has children then we will process them first in the 2nd round + //This is done so we don't delete the children when the parent is consumed + //We only do this on the 1st iteration so we don't re-iterate through its children again + if(target_item.contents.len) + if(target_item.atom_storage?.locked) //can't access contents of locked storage(like duffle bags) + continue + //process children + items += target_item.contents //we now summarize the chat msgs collected if(!(mat_container_flags & MATCONTAINER_SILENT)) @@ -475,6 +465,11 @@ if(MATERIAL_INSERT_ITEM_FAILURE) //could be because the material type was not accepted or other stuff to_chat(user, span_warning("[item_name][count > 1 ? "s were" : " was"] rejected by [parent]!")) + //finally delete the items + for(var/obj/item/deleting as anything in to_delete) + if(!QDELETED(deleting)) //deleting parents also delete their children so we check + qdel(deleting) + /// Proc that allows players to fill the parent with mats /datum/component/material_container/proc/on_attackby(datum/source, obj/item/weapon, mob/living/user) SIGNAL_HANDLER diff --git a/code/datums/components/material/remote_materials.dm b/code/datums/components/material/remote_materials.dm index 568b018e58b2b..d2804f97df120 100644 --- a/code/datums/components/material/remote_materials.dm +++ b/code/datums/components/material/remote_materials.dm @@ -144,12 +144,10 @@ handles linking back and forth. return COMPONENT_NO_AFTERATTACK -/datum/component/remote_materials/proc/OnMultitool(datum/source, mob/user, obj/item/I) +/datum/component/remote_materials/proc/OnMultitool(datum/source, mob/user, obj/item/multitool/M) SIGNAL_HANDLER - if(!I.multitool_check_buffer(user, I)) - return ITEM_INTERACT_BLOCKING - var/obj/item/multitool/M = I + . = ITEM_INTERACT_BLOCKING if (!QDELETED(M.buffer) && istype(M.buffer, /obj/machinery/ore_silo)) if (silo == M.buffer) to_chat(user, span_warning("[parent] is already connected to [silo]!")) diff --git a/code/datums/components/mind_linker.dm b/code/datums/components/mind_linker.dm index 848dc7b832b2a..433ba7b9e721f 100644 --- a/code/datums/components/mind_linker.dm +++ b/code/datums/components/mind_linker.dm @@ -239,7 +239,6 @@ return ..() && (owner.stat != DEAD) /datum/action/innate/linked_speech/Activate() - var/datum/component/mind_linker/linker = target var/mob/living/linker_parent = linker.parent @@ -257,7 +256,8 @@ var/list/all_who_can_hear = assoc_to_keys(linker.linked_mobs) + linker_parent for(var/mob/living/recipient as anything in all_who_can_hear) - to_chat(recipient, formatted_message) + var/avoid_highlighting = (recipient == owner) || (recipient == linker_parent) + to_chat(recipient, formatted_message, type = MESSAGE_TYPE_RADIO, avoid_highlighting = avoid_highlighting) for(var/mob/recipient as anything in GLOB.dead_mob_list) - to_chat(recipient, "[FOLLOW_LINK(recipient, owner)] [formatted_message]") + to_chat(recipient, "[FOLLOW_LINK(recipient, owner)] [formatted_message]", type = MESSAGE_TYPE_RADIO) diff --git a/code/datums/components/plumbing/_plumbing.dm b/code/datums/components/plumbing/_plumbing.dm index 3e5528b1095a3..490f88d39b25e 100644 --- a/code/datums/components/plumbing/_plumbing.dm +++ b/code/datums/components/plumbing/_plumbing.dm @@ -94,7 +94,7 @@ process_request(dir = dir) ///check who can give us what we want, and how many each of them will give us -/datum/component/plumbing/proc/process_request(amount = MACHINE_REAGENT_TRANSFER, reagent, dir) +/datum/component/plumbing/proc/process_request(amount = MACHINE_REAGENT_TRANSFER, reagent, dir, round_robin = TRUE) //find the duct to take from var/datum/ductnet/net if(!ducts.Find(num2text(dir))) @@ -115,7 +115,7 @@ var/target_volume = reagents.total_volume + amount for(var/datum/component/plumbing/give as anything in valid_suppliers) currentRequest = (target_volume - reagents.total_volume) / suppliersLeft - give.transfer_to(src, currentRequest, reagent, net) + give.transfer_to(src, currentRequest, reagent, net, round_robin) suppliersLeft-- return TRUE @@ -134,11 +134,11 @@ return FALSE ///this is where the reagent is actually transferred and is thus the finish point of our process() -/datum/component/plumbing/proc/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) +/datum/component/plumbing/proc/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net, round_robin = TRUE) if(!reagents || !target || !target.reagents) return FALSE - reagents.trans_to(target.recipient_reagents_holder, amount, target_id = reagent) + reagents.trans_to(target.recipient_reagents_holder, amount, target_id = reagent, methods = round_robin ? LINEAR : NONE) ///We create our luxurious piping overlays/underlays, to indicate where we do what. only called once if use_overlays = TRUE in Initialize() /datum/component/plumbing/proc/create_overlays(atom/movable/parent_movable, list/overlays) @@ -376,50 +376,3 @@ // Defer to later frame because pixel_* is actually updated after all callbacks addtimer(CALLBACK(parent_obj, TYPE_PROC_REF(/atom/, update_appearance)), 0.1 SECONDS) - -///has one pipe input that only takes, example is manual output pipe -/datum/component/plumbing/simple_demand - demand_connects = SOUTH - -///has one pipe output that only supplies. example is liquid pump and manual input pipe -/datum/component/plumbing/simple_supply - supply_connects = SOUTH - -///input and output, like a holding tank -/datum/component/plumbing/tank - demand_connects = WEST - supply_connects = EAST - -/datum/component/plumbing/manifold - demand_connects = NORTH - supply_connects = SOUTH - -/datum/component/plumbing/iv_drip - demand_connects = SOUTH - supply_connects = NORTH - -/datum/component/plumbing/manifold/change_ducting_layer(obj/caller, obj/changer, new_layer) - return - -#define READY 2 -///Baby component for the buffer plumbing machine -/datum/component/plumbing/buffer - demand_connects = WEST - supply_connects = EAST - -/datum/component/plumbing/buffer/Initialize(start=TRUE, _turn_connects=TRUE, _ducting_layer, datum/reagents/custom_receiver) - if(!istype(parent, /obj/machinery/plumbing/buffer)) - return COMPONENT_INCOMPATIBLE - - return ..() - -/datum/component/plumbing/buffer/can_give(amount, reagent, datum/ductnet/net) - var/obj/machinery/plumbing/buffer/buffer = parent - return (buffer.mode == READY) ? ..() : FALSE - -#undef READY - -///Lazily demand from any direction. Overlays won't look good, and the aquarium sprite occupies about the entire 32x32 area anyway. -/datum/component/plumbing/aquarium - demand_connects = SOUTH|NORTH|EAST|WEST - use_overlays = FALSE diff --git a/code/datums/components/plumbing/buffer.dm b/code/datums/components/plumbing/buffer.dm new file mode 100644 index 0000000000000..608d8df9fbc4b --- /dev/null +++ b/code/datums/components/plumbing/buffer.dm @@ -0,0 +1,17 @@ +#define READY 2 + +/datum/component/plumbing/buffer + demand_connects = WEST + supply_connects = EAST + +/datum/component/plumbing/buffer/Initialize(start = TRUE, _turn_connects = TRUE, _ducting_layer, datum/reagents/custom_receiver) + if(!istype(parent, /obj/machinery/plumbing/buffer)) + return COMPONENT_INCOMPATIBLE + + return ..() + +/datum/component/plumbing/buffer/can_give(amount, reagent, datum/ductnet/net) + var/obj/machinery/plumbing/buffer/buffer = parent + return (buffer.mode == READY) ? ..() : FALSE + +#undef READY diff --git a/code/datums/components/plumbing/filter.dm b/code/datums/components/plumbing/filter.dm index 30e36c057886e..76f3a7e13274e 100644 --- a/code/datums/components/plumbing/filter.dm +++ b/code/datums/components/plumbing/filter.dm @@ -22,7 +22,7 @@ if(!can_give_in_direction(direction, reagent)) return FALSE -/datum/component/plumbing/filter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) +/datum/component/plumbing/filter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net, round_robin = TRUE) if(!reagents || !target || !target.reagents) return FALSE var/direction @@ -31,7 +31,7 @@ direction = get_original_direction(text2num(A)) break if(reagent) - reagents.trans_to(target.parent, amount, target_id = reagent) + reagents.trans_to(target.parent, amount, target_id = reagent, methods = round_robin ? LINEAR : NONE) else for(var/A in reagents.reagent_list) var/datum/reagent/R = A @@ -40,10 +40,11 @@ var/new_amount if(R.volume < amount) new_amount = amount - R.volume - reagents.trans_to(target.parent, amount, target_id = R.type) + reagents.trans_to(target.parent, amount, target_id = R.type, methods = round_robin ? LINEAR : NONE) amount = new_amount if(amount <= 0) break + ///We check if the direction and reagent are valid to give. Needed for filters since different outputs have different behaviours /datum/component/plumbing/filter/proc/can_give_in_direction(dir, reagent) var/obj/machinery/plumbing/filter/F = parent diff --git a/code/datums/components/plumbing/simple_components.dm b/code/datums/components/plumbing/simple_components.dm new file mode 100644 index 0000000000000..d1f8a4c3ca637 --- /dev/null +++ b/code/datums/components/plumbing/simple_components.dm @@ -0,0 +1,26 @@ + +///has one pipe input that only takes, example is manual output pipe +/datum/component/plumbing/simple_demand + demand_connects = SOUTH + +///has one pipe output that only supplies. example is liquid pump and manual input pipe +/datum/component/plumbing/simple_supply + supply_connects = SOUTH + +///input and output, like a holding tank +/datum/component/plumbing/tank + demand_connects = WEST + supply_connects = EAST + +///Lazily demand from any direction. Overlays won't look good, and the aquarium sprite occupies about the entire 32x32 area anyway. +/datum/component/plumbing/aquarium + demand_connects = SOUTH|NORTH|EAST|WEST + use_overlays = FALSE + +///Connects different layer of ducts +/datum/component/plumbing/manifold + demand_connects = NORTH + supply_connects = SOUTH + +/datum/component/plumbing/manifold/change_ducting_layer(obj/caller, obj/changer, new_layer) + return diff --git a/code/datums/components/plumbing/splitter.dm b/code/datums/components/plumbing/splitter.dm index 5ade1dfebc3ba..f94c78c490438 100644 --- a/code/datums/components/plumbing/splitter.dm +++ b/code/datums/components/plumbing/splitter.dm @@ -29,7 +29,7 @@ return FALSE -/datum/component/plumbing/splitter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net) +/datum/component/plumbing/splitter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net, round_robin = TRUE) var/direction for(var/A in ducts) if(ducts[A] == net) diff --git a/code/datums/components/religious_tool.dm b/code/datums/components/religious_tool.dm index 3c421a04aa302..37b62d1aa0e3c 100644 --- a/code/datums/components/religious_tool.dm +++ b/code/datums/components/religious_tool.dm @@ -140,7 +140,10 @@ select_sect(usr, params["path"]) return TRUE //they picked a sect lets update so some weird spammy shit doesn't happen if("perform_rite") - perform_rite(usr, params["path"]) + if(!ispath(text2path(params["path"]), /datum/religion_rites)) + message_admins("[ADMIN_LOOKUPFLW(usr)] has tried to spawn an item when performing a rite.") + return + perform_rite(usr, text2path(params["path"])) /// Select the sect, called from [/datum/component/religious_tool/proc/AttemptActions] /datum/component/religious_tool/proc/select_sect(mob/living/user, path) @@ -154,9 +157,6 @@ /// Perform the rite, called from [/datum/component/religious_tool/proc/AttemptActions] /datum/component/religious_tool/proc/perform_rite(mob/living/user, path) - if(!ispath(text2path(path), /datum/religion_rites)) - message_admins("[ADMIN_LOOKUPFLW(usr)] has tried to spawn an item when performing a rite.") - return if(user.mind.holy_role < HOLY_ROLE_PRIEST) if(user.mind.holy_role == HOLY_ROLE_DEACON) to_chat(user, "You are merely a deacon of [GLOB.deity], and therefore cannot perform rites.") diff --git a/code/datums/components/riding/riding_mob.dm b/code/datums/components/riding/riding_mob.dm index 78158c55e8eb7..50798fce50157 100644 --- a/code/datums/components/riding/riding_mob.dm +++ b/code/datums/components/riding/riding_mob.dm @@ -119,43 +119,36 @@ ride_benefit = rough_rider.mob_mood.sanity_level switch(ride_benefit) if(SANITY_LEVEL_GREAT) - modified_move_cooldown *= 0.5 - modified_move_delay *= 0.5 - if(SANITY_LEVEL_NEUTRAL) modified_move_cooldown *= 0.8 modified_move_delay *= 0.8 + if(SANITY_LEVEL_NEUTRAL) + modified_move_cooldown *= 0.9 + modified_move_delay *= 0.9 if(SANITY_LEVEL_DISTURBED) modified_move_cooldown *= 1 modified_move_delay *= 1 if(SANITY_LEVEL_CRAZY) + modified_move_cooldown *= 1.1 + modified_move_delay *= 1.1 + if(SANITY_LEVEL_INSANE) modified_move_cooldown *= 1.2 modified_move_delay *= 1.2 - if(SANITY_LEVEL_INSANE) - modified_move_cooldown *= 1.5 - modified_move_delay *= 1.5 COOLDOWN_START(src, vehicle_move_cooldown = modified_move_cooldown, (last_move_diagonal ? 2 : 1) * modified_move_delay) return ..() /// Yeets the rider off, used for animals and cyborgs, redefined for humans who shove their piggyback rider off -/datum/component/riding/creature/proc/force_dismount(mob/living/rider, gentle = FALSE) +/datum/component/riding/creature/proc/force_dismount(mob/living/rider, throw_range = 8, throw_speed = 3, gentle = FALSE) var/atom/movable/movable_parent = parent movable_parent.unbuckle_mob(rider) - + rider.Knockdown(3 SECONDS) + if(throw_range == 0) + return if(!iscyborg(movable_parent) && !isanimal_or_basicmob(movable_parent)) return - var/turf/target = get_edge_target_turf(movable_parent, movable_parent.dir) - var/turf/targetm = get_step(get_turf(movable_parent), movable_parent.dir) - rider.Move(targetm) - rider.Knockdown(3 SECONDS) - if(gentle) - rider.visible_message(span_warning("[rider] is thrown clear of [movable_parent]!"), \ - span_warning("You're thrown clear of [movable_parent]!")) - rider.throw_at(target, 8, 3, movable_parent, gentle = TRUE) - else - rider.visible_message(span_warning("[rider] is thrown violently from [movable_parent]!"), \ - span_warning("You're thrown violently from [movable_parent]!")) - rider.throw_at(target, 14, 5, movable_parent, gentle = FALSE) + rider.visible_message(span_warning("[rider] is thrown clear of [movable_parent]!"), \ + span_warning("You're thrown clear of [movable_parent]!")) + rider.throw_at(target, throw_range, throw_speed, movable_parent, gentle = gentle) /// If we're a cyborg or animal and we spin, we yeet whoever's on us off us /datum/component/riding/creature/proc/check_emote(mob/living/user, datum/emote/emote) @@ -540,7 +533,33 @@ /datum/component/riding/creature/raptor require_minigame = TRUE - ride_check_flags = RIDER_NEEDS_ARM + ride_check_flags = RIDER_NEEDS_ARM | UNBUCKLE_DISABLED_RIDER + +/datum/component/riding/creature/raptor/Initialize(mob/living/riding_mob, force, ride_check_flags, potion_boost) + . = ..() + RegisterSignal(parent, COMSIG_PROJECTILE_PREHIT, PROC_REF(on_bullet_hit)) + RegisterSignal(parent, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(on_attacked)) + +/datum/component/riding/creature/raptor/proc/on_bullet_hit(atom/target, list/bullet_args, obj/projectile/hit_projectile) + SIGNAL_HANDLER + + if(hit_projectile.armor_flag == ENERGY) + freak_out() + +/datum/component/riding/creature/raptor/proc/on_attacked(mob/living/source, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, obj/item/attacking_item) + SIGNAL_HANDLER + + if(damagetype == STAMINA) + freak_out() + +/datum/component/riding/creature/raptor/proc/freak_out() + var/mob/living/living_parent = parent + if(lavaland_equipment_pressure_check(get_turf(living_parent)) || !length(living_parent.buckled_mobs)) + return + living_parent.balloon_alert_to_viewers("freaks out!") + living_parent.spin(spintime = 2 SECONDS, speed = 1) + for(var/mob/living/buckled_mob in living_parent.buckled_mobs) + force_dismount(buckled_mob, throw_range = 2, gentle = TRUE) /datum/component/riding/creature/raptor/handle_specials() . = ..() diff --git a/code/datums/components/riding/riding_vehicle.dm b/code/datums/components/riding/riding_vehicle.dm index 68e44c4acd3fa..561d0c87218d3 100644 --- a/code/datums/components/riding/riding_vehicle.dm +++ b/code/datums/components/riding/riding_vehicle.dm @@ -242,12 +242,12 @@ ///Makes sure that the hoverboard can move in zero-g in (open) space but only there's a ground turf on the z-level below. /datum/component/riding/vehicle/scooter/skateboard/hover/proc/hover_check(is_moving = FALSE) var/atom/movable/movable = parent - if(!isopenspaceturf(movable.loc)) + if(!is_space_or_openspace(movable.loc)) override_allow_spacemove = TRUE return var/turf/open/our_turf = movable.loc var/turf/turf_below = GET_TURF_BELOW(our_turf) - if(our_turf.zPassOut(DOWN) && (isnull(turf_below) || (isopenspaceturf(turf_below) && turf_below.zPassIn(DOWN) && turf_below.zPassOut(DOWN)))) + if(our_turf.zPassOut(DOWN) && (isnull(turf_below) || (is_space_or_openspace(turf_below) && turf_below.zPassIn(DOWN) && turf_below.zPassOut(DOWN)))) override_allow_spacemove = FALSE if(turf_below) our_turf.zFall(movable, falling_from_move = is_moving) diff --git a/code/datums/components/scope.dm b/code/datums/components/scope.dm index dfc9d1c66c4b8..087eb0c06d24c 100644 --- a/code/datums/components/scope.dm +++ b/code/datums/components/scope.dm @@ -1,3 +1,6 @@ +///Used to allow reaching the maximum offset range without exiting the boundaries of the game screen. +#define MOUSE_POINTER_OFFSET_MULT 1.1 + ///A component that allows players to use the item to zoom out. Mainly intended for firearms, but now works with other items too. /datum/component/scope /// How far we can extend, with modifier of 1, up to our vision edge, higher numbers multiply. @@ -249,6 +252,12 @@ icon_y = text2num(LAZYACCESS(modifiers, ICON_Y)) if(isnull(icon_y)) icon_y = view_list[2]*world.icon_size/2 - given_x = round(range_modifier * (icon_x - view_list[1]*world.icon_size/2)) - given_y = round(range_modifier * (icon_y - view_list[2]*world.icon_size/2)) + var/x_cap = range_modifier * view_list[1]*world.icon_size / 2 + var/y_cap = range_modifier * view_list[2]*world.icon_size / 2 + var/uncapped_x = round(range_modifier * (icon_x - view_list[1]*world.icon_size/2) * MOUSE_POINTER_OFFSET_MULT) + var/uncapped_y = round(range_modifier * (icon_y - view_list[2]*world.icon_size/2) * MOUSE_POINTER_OFFSET_MULT) + given_x = clamp(uncapped_x, -x_cap, x_cap) + given_y = clamp(uncapped_y, -y_cap, y_cap) given_turf = locate(owner.x+round(given_x/world.icon_size, 1),owner.y+round(given_y/world.icon_size, 1),owner.z) + +#undef MOUSE_POINTER_OFFSET_MULT diff --git a/code/datums/components/speechmod.dm b/code/datums/components/speechmod.dm new file mode 100644 index 0000000000000..71991c80d837c --- /dev/null +++ b/code/datums/components/speechmod.dm @@ -0,0 +1,125 @@ +/// Used to apply certain speech patterns +/// Can be used on organs, wearables, mutations and mobs +/datum/component/speechmod + /// Assoc list for strings/regexes and their replacements. Should be lowercase, as case will be automatically changed + var/list/replacements = list() + /// String added to the end of the message + var/end_string = "" + /// Chance for the end string to be applied + var/end_string_chance = 100 + /// Current target for modification + var/mob/targeted + /// Slot tags in which this item works when equipped + var/slots + /// If set to true, turns all text to uppercase + var/uppercase = FALSE + +/datum/component/speechmod/Initialize(replacements = list(), end_string = "", end_string_chance = 100, slots, uppercase = FALSE) + if (!ismob(parent) && !isitem(parent) && !istype(parent, /datum/mutation/human)) + return COMPONENT_INCOMPATIBLE + + src.replacements = replacements + src.end_string = end_string + src.end_string_chance = end_string_chance + src.slots = slots + src.uppercase = uppercase + + if (istype(parent, /datum/mutation/human)) + RegisterSignal(parent, COMSIG_MUTATION_GAINED, PROC_REF(on_mutation_gained)) + RegisterSignal(parent, COMSIG_MUTATION_LOST, PROC_REF(on_mutation_lost)) + return + + var/atom/owner = parent + + if (ismob(parent)) + targeted = parent + RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + return + + if (ismob(owner.loc)) + targeted = owner.loc + RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + + RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped)) + RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_unequipped)) + RegisterSignal(parent, COMSIG_ORGAN_IMPLANTED, PROC_REF(on_implanted)) + RegisterSignal(parent, COMSIG_ORGAN_REMOVED, PROC_REF(on_removed)) + +/datum/component/speechmod/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + var/message = speech_args[SPEECH_MESSAGE] + if(message[1] == "*") + return + + for (var/to_replace in replacements) + var/replacement = replacements[to_replace] + // Values can be lists to be picked randomly from + if (islist(replacement)) + replacement = pick(replacement) + + message = replacetextEx(message, to_replace, replacement) + message = trim(message) + if (prob(end_string_chance)) + message += islist(end_string) ? pick(end_string) : end_string + speech_args[SPEECH_MESSAGE] = trim(message) + + if (uppercase) + return COMPONENT_UPPERCASE_SPEECH + +/datum/component/speechmod/proc/on_equipped(datum/source, mob/living/user, slot) + SIGNAL_HANDLER + + if (!isnull(slots) && !(slot & slots)) + if (!isnull(targeted)) + UnregisterSignal(targeted, COMSIG_MOB_SAY) + targeted = null + return + + if (targeted == user) + return + + targeted = user + RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/component/speechmod/proc/on_unequipped(datum/source, mob/living/user) + SIGNAL_HANDLER + + if (isnull(targeted)) + return + UnregisterSignal(targeted, COMSIG_MOB_SAY) + targeted = null + +/datum/component/speechmod/proc/on_implanted(datum/source, mob/living/carbon/receiver) + SIGNAL_HANDLER + + if (targeted == receiver) + return + + targeted = receiver + RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/component/speechmod/proc/on_removed(datum/source, mob/living/carbon/former_owner) + SIGNAL_HANDLER + + if (isnull(targeted)) + return + UnregisterSignal(targeted, COMSIG_MOB_SAY) + targeted = null + +/datum/component/speechmod/proc/on_mutation_gained(datum/source, mob/living/carbon/human/owner) + SIGNAL_HANDLER + + if (targeted == owner) + return + + targeted = owner + RegisterSignal(targeted, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + +/datum/component/speechmod/proc/on_mutation_lost(datum/source, mob/living/carbon/human/owner) + SIGNAL_HANDLER + + if (isnull(targeted)) + return + UnregisterSignal(targeted, COMSIG_MOB_SAY) + targeted = null diff --git a/code/datums/components/surgery_initiator.dm b/code/datums/components/surgery_initiator.dm index de3f83739e546..848bfd021eee6 100644 --- a/code/datums/components/surgery_initiator.dm +++ b/code/datums/components/surgery_initiator.dm @@ -134,15 +134,7 @@ if(is_robotic) required_tool_type = TOOL_SCREWDRIVER - if(iscyborg(user)) - var/has_cautery = FALSE - for(var/obj/item/borg/cyborg_omnitool/toolarm in user.held_items) - if(toolarm.selected && istype(toolarm.selected, /obj/item/cautery)) - has_cautery = TRUE - if(!has_cautery) - patient.balloon_alert(user, "need a cautery in an inactive slot to stop the surgery!") - return - else if(!close_tool || close_tool.tool_behaviour != required_tool_type) + if(!close_tool || close_tool.tool_behaviour != required_tool_type) patient.balloon_alert(user, "need a [is_robotic ? "screwdriver": "cautery"] in your inactive hand to stop the surgery!") return @@ -226,7 +218,7 @@ ) /datum/component/surgery_initiator/ui_data(mob/user) - var/mob/living/surgery_target = surgery_target_ref.resolve() + var/mob/living/surgery_target = surgery_target_ref?.resolve() var/list/surgeries = list() if (!isnull(surgery_target)) @@ -253,10 +245,6 @@ return ..() /datum/component/surgery_initiator/ui_status(mob/user, datum/ui_state/state) - var/obj/item/item_parent = parent - if (user != item_parent.loc) - return UI_CLOSE - var/mob/living/surgery_target = surgery_target_ref?.resolve() if (isnull(surgery_target)) return UI_CLOSE @@ -271,7 +259,8 @@ return FALSE // The item was moved somewhere else - if (!(parent in user)) + var/atom/movable/tool = parent + if (tool.loc != user) return FALSE // While we were choosing, another surgery was started at the same location diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 28fc3be29c2fd..657d555b366ed 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -596,11 +596,9 @@ if(W.type in list(/obj/structure/window, /obj/structure/window/fulltile, /obj/structure/window/unanchored, /obj/structure/window/fulltile/unanchored)) // boring unreinforced windows for(var/i in 1 to speed) var/obj/item/shard/shard = new /obj/item/shard(get_turf(user)) - shard.embedding = list(embed_chance = 100, ignore_throwspeed_threshold = TRUE, impact_pain_mult=3, pain_chance=5) - shard.updateEmbedding() + shard.set_embed(/datum/embed_data/glass_candy) user.hitby(shard, skipcatch = TRUE, hitpush = FALSE) - shard.embedding = null - shard.updateEmbedding() + shard.set_embed(initial(shard.embed_type)) W.atom_destruction() user.adjustStaminaLoss(10 * speed) user.Paralyze(3 SECONDS) diff --git a/code/datums/dna.dm b/code/datums/dna.dm index d5677dad7ca61..e5d4657c17660 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -79,7 +79,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) var/stability = 100 ///Did we take something like mutagen? In that case we cant get our genes scanned to instantly cheese all the powers. var/scrambled = FALSE - + /// Weighted list of nonlethal meltdowns + var/static/list/nonfatal_meltdowns = list() + /// Weighted list of lethal meltdowns + var/static/list/fatal_meltdowns = list() /datum/dna/New(mob/living/new_holder) if(istype(new_holder)) @@ -466,7 +469,9 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) generate_dna_blocks() if(randomize_features) for(var/species_type in GLOB.species_prototypes) - features |= GLOB.species_prototypes[species_type].randomize_features() + var/list/new_features = GLOB.species_prototypes[species_type].randomize_features() + for(var/feature in new_features) + features[feature] = new_features[feature] features["mcolor"] = "#[random_color()]" @@ -871,81 +876,23 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) var/instability = -dna.stability dna.remove_all_mutations() dna.stability = 100 - if(prob(max(70-instability,0))) - switch(rand(0,11)) //not complete and utter death - if(0) - monkeyize() - if(1) - gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) - new/obj/vehicle/ridden/wheelchair(get_turf(src)) //don't buckle, because I can't imagine to plethora of things to go through that could otherwise break - to_chat(src, span_warning("My flesh turned into a wheelchair and I can't feel my legs.")) - if(2) - corgize() - if(3) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) - if(4) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) - physiology.damage_resistance -= 20000 //you thought - if(5) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) - reagents.add_reagent(/datum/reagent/aslimetoxin, 10) - if(6) - apply_status_effect(/datum/status_effect/go_away) - if(7) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) - ForceContractDisease(new /datum/disease/decloning) // slow acting, non-viral GBS - if(8) - var/list/elligible_organs = list() - for(var/obj/item/organ/internal/internal_organ in organs) //make sure we dont get an implant or cavity item - elligible_organs += internal_organ - vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 10) - if(elligible_organs.len) - var/obj/item/organ/O = pick(elligible_organs) - O.Remove(src) - visible_message(span_danger("[src] vomits up [p_their()] [O.name]!"), span_danger("You vomit up your [O.name]")) //no "vomit up your heart" - O.forceMove(drop_location()) - if(prob(20)) - O.animate_atom_living() - if(9 to 10) - ForceContractDisease(new/datum/disease/gastrolosis()) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) - if(11) - to_chat(src, span_notice("Your DNA mutates into the ultimate biological form!")) - crabize() - else - switch(rand(0,6)) - if(0) - investigate_log("has been gibbed by DNA instability.", INVESTIGATE_DEATHS) - gib(DROP_ALL_REMAINS) - if(1) - investigate_log("has been dusted by DNA instability.", INVESTIGATE_DEATHS) - dust() - if(2) - investigate_log("has been transformed into a statue by DNA instability.", INVESTIGATE_DEATHS) - death() - petrify(statue_timer = INFINITY, save_brain = FALSE) - ghostize(FALSE) - if(3) - if(prob(95)) - var/obj/item/bodypart/BP = get_bodypart(pick(BODY_ZONE_CHEST,BODY_ZONE_HEAD)) - if(BP) - BP.dismember() - else - investigate_log("has been gibbed by DNA instability.", INVESTIGATE_DEATHS) - gib(DROP_ALL_REMAINS) - else - set_species(/datum/species/dullahan) - if(4) - visible_message(span_warning("[src]'s skin melts off!"), span_boldwarning("Your skin melts off!")) - spawn_gibs() - set_species(/datum/species/skeleton) - if(prob(90)) - addtimer(CALLBACK(src, PROC_REF(death)), 3 SECONDS) - if(5) - to_chat(src, span_phobia("LOOK UP!")) - addtimer(CALLBACK(src, PROC_REF(something_horrible_mindmelt)), 3 SECONDS) - if(6) - slow_psykerize() + + var/nonfatal = prob(max(70-instability, 0)) + + if(!dna.nonfatal_meltdowns.len) + for(var/datum/instability_meltdown/meltdown_type as anything in typecacheof(/datum/instability_meltdown, ignore_root_path = TRUE)) + if(initial(meltdown_type.abstract_type) == meltdown_type) + continue + + if (initial(meltdown_type.fatal)) + dna.fatal_meltdowns[meltdown_type] = initial(meltdown_type.meltdown_weight) + continue + + dna.nonfatal_meltdowns[meltdown_type] = initial(meltdown_type.meltdown_weight) + + var/picked_type = pick_weight(nonfatal ? dna.nonfatal_meltdowns : dna.fatal_meltdowns) + var/datum/instability_meltdown/meltdown = new picked_type + meltdown.meltdown(src) /mob/living/carbon/human/proc/something_horrible_mindmelt() if(!is_blind()) diff --git a/code/datums/elements/caseless.dm b/code/datums/elements/caseless.dm index 587a32f2b304e..9b1c06012079c 100644 --- a/code/datums/elements/caseless.dm +++ b/code/datums/elements/caseless.dm @@ -24,7 +24,6 @@ if(reusable) if(!ispath(proj.shrapnel_type)) proj.shrapnel_type = shell.type - proj.updateEmbedding() proj.AddElement(/datum/element/projectile_drop, shell.type) /datum/element/caseless/proc/on_fired_casing(obj/item/ammo_casing/shell, atom/target, mob/living/user, fired_from, randomspread, spread, zone_override, params, distro, obj/projectile/proj) diff --git a/code/datums/elements/embed.dm b/code/datums/elements/embed.dm index 78f28d8b81c23..4a8bda37c3a75 100644 --- a/code/datums/elements/embed.dm +++ b/code/datums/elements/embed.dm @@ -10,64 +10,33 @@ */ /datum/element/embed - element_flags = ELEMENT_BESPOKE - argument_hash_start_idx = 2 - var/initialized = FALSE /// whether we can skip assigning all the vars (since these are bespoke elements, we don't have to reset the vars every time we attach to something, we already know what we are!) - - // all of this stuff is explained in _DEFINES/combat.dm - var/embed_chance - var/fall_chance - var/pain_chance - var/pain_mult - var/remove_pain_mult - var/impact_pain_mult - var/rip_time - var/ignore_throwspeed_threshold - var/jostle_chance - var/jostle_pain_mult - var/pain_stam_pct - var/payload_type - -/datum/element/embed/Attach(datum/target, embed_chance, fall_chance, pain_chance, pain_mult, remove_pain_mult, impact_pain_mult, rip_time, ignore_throwspeed_threshold, jostle_chance, jostle_pain_mult, pain_stam_pct, projectile_payload=/obj/item/shard) + +/datum/element/embed/Attach(datum/target) . = ..() if(!isitem(target) && !isprojectile(target)) return ELEMENT_INCOMPATIBLE - RegisterSignal(target, COMSIG_ELEMENT_ATTACH, PROC_REF(severancePackage)) - if(isitem(target)) - RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, PROC_REF(checkEmbed)) - RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(examined)) - RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, PROC_REF(tryForceEmbed)) - RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, PROC_REF(detachFromWeapon)) - else - payload_type = projectile_payload - RegisterSignal(target, COMSIG_PROJECTILE_SELF_ON_HIT, PROC_REF(checkEmbedProjectile)) - - if(!initialized) - src.embed_chance = embed_chance - src.fall_chance = fall_chance - src.pain_chance = pain_chance - src.pain_mult = pain_mult - src.remove_pain_mult = remove_pain_mult - src.rip_time = rip_time - src.impact_pain_mult = impact_pain_mult - src.ignore_throwspeed_threshold = ignore_throwspeed_threshold - src.jostle_chance = jostle_chance - src.jostle_pain_mult = jostle_pain_mult - src.pain_stam_pct = pain_stam_pct - initialized = TRUE + RegisterSignal(target, COMSIG_ELEMENT_ATTACH, PROC_REF(sever_element)) + if(isprojectile(target)) + RegisterSignal(target, COMSIG_PROJECTILE_SELF_ON_HIT, PROC_REF(check_embed_projectile)) + return + + RegisterSignal(target, COMSIG_MOVABLE_IMPACT_ZONE, PROC_REF(check_embed)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(examined)) + RegisterSignal(target, COMSIG_EMBED_TRY_FORCE, PROC_REF(try_force_embed)) + RegisterSignal(target, COMSIG_ITEM_DISABLE_EMBED, PROC_REF(detach_from_weapon)) /datum/element/embed/Detach(obj/target) . = ..() - if(isitem(target)) - UnregisterSignal(target, list(COMSIG_MOVABLE_IMPACT_ZONE, COMSIG_ELEMENT_ATTACH, COMSIG_MOVABLE_IMPACT, COMSIG_ATOM_EXAMINE, COMSIG_EMBED_TRY_FORCE, COMSIG_ITEM_DISABLE_EMBED)) - else + if(isprojectile(target)) UnregisterSignal(target, list(COMSIG_PROJECTILE_SELF_ON_HIT, COMSIG_ELEMENT_ATTACH)) + return + UnregisterSignal(target, list(COMSIG_MOVABLE_IMPACT_ZONE, COMSIG_ELEMENT_ATTACH, COMSIG_MOVABLE_IMPACT, COMSIG_ATOM_EXAMINE, COMSIG_EMBED_TRY_FORCE, COMSIG_ITEM_DISABLE_EMBED)) /// Checking to see if we're gonna embed into a human -/datum/element/embed/proc/checkEmbed(obj/item/weapon, mob/living/carbon/victim, hit_zone, blocked, datum/thrownthing/throwingdatum, forced=FALSE) +/datum/element/embed/proc/check_embed(obj/item/weapon, mob/living/carbon/victim, hit_zone, blocked, datum/thrownthing/throwingdatum, forced=FALSE) SIGNAL_HANDLER if(forced) @@ -82,7 +51,7 @@ var/flying_speed = throwingdatum?.speed || weapon.throw_speed - if(flying_speed < EMBED_THROWSPEED_THRESHOLD && !ignore_throwspeed_threshold) + if(flying_speed < EMBED_THROWSPEED_THRESHOLD && !weapon.get_embed().ignore_throwspeed_threshold) return FALSE if(!roll_embed_chance(weapon, victim, hit_zone, throwingdatum)) @@ -97,27 +66,17 @@ victim.AddComponent(/datum/component/embedded,\ weapon,\ throwingdatum,\ - part = limb,\ - embed_chance = embed_chance,\ - fall_chance = fall_chance,\ - pain_chance = pain_chance,\ - pain_mult = pain_mult,\ - remove_pain_mult = remove_pain_mult,\ - rip_time = rip_time,\ - ignore_throwspeed_threshold = ignore_throwspeed_threshold,\ - jostle_chance = jostle_chance,\ - jostle_pain_mult = jostle_pain_mult,\ - pain_stam_pct = pain_stam_pct) + part = limb) ///A different embed element has been attached, so we'll detach and let them handle things -/datum/element/embed/proc/severancePackage(obj/weapon, datum/element/E) +/datum/element/embed/proc/sever_element(obj/weapon, datum/element/E) SIGNAL_HANDLER if(istype(E, /datum/element/embed)) Detach(weapon) ///If we don't want to be embeddable anymore (deactivating an e-dagger for instance) -/datum/element/embed/proc/detachFromWeapon(obj/weapon) +/datum/element/embed/proc/detach_from_weapon(obj/weapon) SIGNAL_HANDLER Detach(weapon) @@ -126,27 +85,28 @@ /datum/element/embed/proc/examined(obj/item/I, mob/user, list/examine_list) SIGNAL_HANDLER - if(I.isEmbedHarmless()) + if(I.is_embed_harmless()) examine_list += "[I] feels sticky, and could probably get stuck to someone if thrown properly!" else examine_list += "[I] has a fine point, and could probably embed in someone if thrown properly!" /** - * checkEmbedProjectile() is what we get when a projectile with a defined shrapnel_type impacts a target. + * check_embed_projectile() is what we get when a projectile with a defined shrapnel_type impacts a target. * * If we hit a valid target, we create the shrapnel_type object and then forcefully try to embed it on its * behalf. DO NOT EVER add an embed element to the payload and let it do the rest. * That's awful, and it'll limit us to drop-deletable shrapnels in the worry of stuff like * arrows and harpoons being embeddable even when not let loose by their weapons. */ -/datum/element/embed/proc/checkEmbedProjectile(obj/projectile/source, atom/movable/firer, atom/hit, angle, hit_zone) +/datum/element/embed/proc/check_embed_projectile(obj/projectile/source, atom/movable/firer, atom/hit, angle, hit_zone, blocked) SIGNAL_HANDLER - if(!source.can_embed_into(hit)) + if(!source.can_embed_into(hit) || blocked) Detach(source) return // we don't care - + var/payload_type = source.shrapnel_type var/obj/item/payload = new payload_type(get_turf(hit)) + payload.set_embed(source.get_embed()) if(istype(payload, /obj/item/shrapnel/bullet)) payload.name = source.name SEND_SIGNAL(source, COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED, payload) @@ -155,12 +115,12 @@ if(!limb) limb = C.get_bodypart() - if(!tryForceEmbed(payload, limb)) + if(!try_force_embed(payload, limb)) payload.failedEmbed() Detach(source) /** - * tryForceEmbed() is called here when we fire COMSIG_EMBED_TRY_FORCE from [/obj/item/proc/tryEmbed]. Mostly, this means we're a piece of shrapnel from a projectile that just impacted something, and we're trying to embed in it. + * try_force_embed() is called here when we fire COMSIG_EMBED_TRY_FORCE from [/obj/item/proc/tryEmbed]. Mostly, this means we're a piece of shrapnel from a projectile that just impacted something, and we're trying to embed in it. * * The reason for this extra mucking about is avoiding having to do an extra hitby(), and annoying the target by impacting them once with the projectile, then again with the shrapnel, and possibly * AGAIN if we actually embed. This way, we save on at least one message. @@ -171,7 +131,7 @@ * * hit_zone- if our target is a carbon, try to hit them in this zone, if we don't have one, pick a random one. If our target is a bodypart, we already know where we're hitting. * * forced- if we want this to succeed 100% */ -/datum/element/embed/proc/tryForceEmbed(obj/item/embedding_item, atom/target, hit_zone, forced=FALSE) +/datum/element/embed/proc/try_force_embed(obj/item/embedding_item, atom/target, hit_zone, forced=FALSE) SIGNAL_HANDLER var/obj/item/bodypart/limb @@ -190,16 +150,16 @@ if(!forced && !roll_embed_chance(embedding_item, victim, hit_zone)) return - return checkEmbed(embedding_item, victim, hit_zone, forced=TRUE) // Don't repeat the embed roll, we already did it + return check_embed(embedding_item, victim, hit_zone, forced=TRUE) // Don't repeat the embed roll, we already did it /// Calculates the actual chance to embed based on armour penetration and throwing speed, then returns true if we pass that probability check /datum/element/embed/proc/roll_embed_chance(obj/item/embedding_item, mob/living/victim, hit_zone, datum/thrownthing/throwingdatum) - var/actual_chance = embed_chance + var/actual_chance = embedding_item.get_embed().embed_chance if(throwingdatum?.speed > embedding_item.throw_speed) actual_chance += (throwingdatum.speed - embedding_item.throw_speed) * EMBED_CHANCE_SPEED_BONUS - if(embedding_item.isEmbedHarmless()) // all the armor in the world won't save you from a kick me sign + if(embedding_item.is_embed_harmless()) // all the armor in the world won't save you from a kick me sign return prob(actual_chance) var/armor = max(victim.run_armor_check(hit_zone, BULLET, silent=TRUE), victim.run_armor_check(hit_zone, BOMB, silent=TRUE)) * 0.5 // we'll be nice and take the better of bullet and bomb armor, halved diff --git a/code/datums/elements/floorloving.dm b/code/datums/elements/floorloving.dm index 229dea11da874..c14d9d5801e68 100644 --- a/code/datums/elements/floorloving.dm +++ b/code/datums/elements/floorloving.dm @@ -14,7 +14,7 @@ /// Block movement to any non-floor location /datum/element/floor_loving/proc/attempting_move(atom/movable/parent, newloc) SIGNAL_HANDLER - if (!isopenturf(newloc) || isspaceturf(newloc) || isopenspaceturf(newloc)) + if (!isopenturf(newloc) || is_space_or_openspace(newloc)) return COMPONENT_MOVABLE_BLOCK_PRE_MOVE if (isliving(parent)) var/mob/living/living_parent = parent diff --git a/code/datums/elements/muffles_speech.dm b/code/datums/elements/muffles_speech.dm new file mode 100644 index 0000000000000..bbf41e3c4deef --- /dev/null +++ b/code/datums/elements/muffles_speech.dm @@ -0,0 +1,48 @@ +/datum/element/muffles_speech + +/datum/element/muffles_speech/Attach(datum/target) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ITEM_EQUIPPED, PROC_REF(equipped)) + RegisterSignal(target, COMSIG_ITEM_DROPPED, PROC_REF(dropped)) + +/datum/element/muffles_speech/Detach(datum/source) + . = ..() + UnregisterSignal(source, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED)) + +/datum/element/muffles_speech/proc/equipped(obj/item/source, mob/user, slot) + SIGNAL_HANDLER + if(source.slot_flags & slot) + RegisterSignal(user, COMSIG_MOB_SAY, PROC_REF(muzzle_talk)) + RegisterSignal(user, COMSIG_MOB_PRE_EMOTED, PROC_REF(emote_override)) + +/datum/element/muffles_speech/proc/dropped(obj/item/source, mob/user) + SIGNAL_HANDLER + UnregisterSignal(user, list(COMSIG_MOB_PRE_EMOTED, COMSIG_MOB_SAY)) + +/datum/element/muffles_speech/proc/emote_override(mob/living/source, key, params, type_override, intentional, datum/emote/emote) + SIGNAL_HANDLER + if(!emote.hands_use_check && (emote.emote_type & EMOTE_AUDIBLE)) + source.audible_message("makes a [pick("strong ", "weak ", "")]noise.", audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE) + return COMPONENT_CANT_EMOTE + return NONE + +/datum/element/muffles_speech/proc/muzzle_talk(datum/source, list/speech_args) + SIGNAL_HANDLER + + var/spoken_message = speech_args[SPEECH_MESSAGE] + if(spoken_message) + var/list/words = splittext(spoken_message, " ") + var/yell_suffix = copytext(spoken_message, findtext(spoken_message, "!")) + spoken_message = "" + + for(var/ind = 1 to length(words)) + var/new_word = "" + for(var/i = 1 to length(words[ind]) + rand(-1,1)) + new_word += "m" + new_word += "f" + words[ind] = yell_suffix ? uppertext(new_word) : new_word + spoken_message = "[jointext(words, " ")][yell_suffix]" + speech_args[SPEECH_MESSAGE] = spoken_message diff --git a/code/datums/elements/relay_attackers.dm b/code/datums/elements/relay_attackers.dm index 5f5bf7ed5893f..fd87cb3bc2c8e 100644 --- a/code/datums/elements/relay_attackers.dm +++ b/code/datums/elements/relay_attackers.dm @@ -85,7 +85,7 @@ SIGNAL_HANDLER 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) +/datum/element/relay_attackers/proc/on_attack_mech(atom/target, obj/vehicle/sealed/mecha/mecha_attacker, mob/living/pilot, mecha_attack_cooldown) SIGNAL_HANDLER relay_attacker(target, mecha_attacker, ATTACKER_DAMAGING_ATTACK) diff --git a/code/datums/components/crafting/slapcrafting.dm b/code/datums/elements/slapcrafting.dm similarity index 77% rename from code/datums/components/crafting/slapcrafting.dm rename to code/datums/elements/slapcrafting.dm index a15a8a80b17dd..42776bf31f773 100644 --- a/code/datums/components/crafting/slapcrafting.dm +++ b/code/datums/elements/slapcrafting.dm @@ -1,10 +1,11 @@ /// Slapcrafting component! -/datum/component/slapcrafting - dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS +/datum/element/slapcrafting + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 var/list/slapcraft_recipes = list() /** - * Slapcraft component + * Slapcraft element * * Slap it onto a item to be able to slapcraft with it * @@ -14,35 +15,28 @@ * It will check the area near the user for the rest of the ingredients and tools. * * **/ -/datum/component/slapcrafting/Initialize( - slapcraft_recipes = null, - ) +/datum/element/slapcrafting/Attach(datum/target, slapcraft_recipes = null) + ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE - if(!isitem(parent)) - return COMPONENT_INCOMPATIBLE + var/obj/item/target_item = target - var/obj/item/parent_item = parent + if((target_item.item_flags & ABSTRACT) || (target_item.item_flags & DROPDEL)) + return //Don't do anything, it just shouldn't be used in crafting. - if((parent_item.item_flags & ABSTRACT) || (parent_item.item_flags & DROPDEL)) - return COMPONENT_NOTRANSFER + RegisterSignal(target, COMSIG_ATOM_ATTACKBY, PROC_REF(attempt_slapcraft)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(get_examine_info)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(get_examine_more_info)) + RegisterSignal(target, COMSIG_TOPIC, PROC_REF(topic_handler)) - RegisterSignal(parent, COMSIG_ATOM_ATTACKBY, PROC_REF(attempt_slapcraft)) - RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(get_examine_info)) - RegisterSignal(parent, COMSIG_ATOM_EXAMINE_MORE, PROC_REF(get_examine_more_info)) - RegisterSignal(parent, COMSIG_TOPIC, PROC_REF(topic_handler)) + src.slapcraft_recipes = slapcraft_recipes - src.slapcraft_recipes += slapcraft_recipes +/datum/element/slapcrafting/Detach(datum/source, ...) + . = ..() + UnregisterSignal(source, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_EXAMINE_MORE)) -/datum/component/slapcrafting/InheritComponent(datum/component/slapcrafting/new_comp, original, slapcraft_recipes) - if(!original) - return - src.slapcraft_recipes += slapcraft_recipes - -/datum/component/slapcrafting/Destroy(force) - UnregisterSignal(parent, list(COMSIG_ATOM_ATTACKBY, COMSIG_ATOM_EXAMINE, COMSIG_ATOM_EXAMINE_MORE)) - return ..() - -/datum/component/slapcrafting/proc/attempt_slapcraft(obj/item/parent_item, obj/item/slapper, mob/user) +/datum/element/slapcrafting/proc/attempt_slapcraft(obj/item/parent_item, obj/item/slapper, mob/user) if(isnull(slapcraft_recipes)) CRASH("NULL SLAPCRAFT RECIPES?") @@ -71,9 +65,9 @@ return // We might use radials so we need to split the proc chain - INVOKE_ASYNC(src, PROC_REF(slapcraft_async), valid_recipes, user, craft_sheet) + INVOKE_ASYNC(src, PROC_REF(slapcraft_async), parent_item, valid_recipes, user, craft_sheet) -/datum/component/slapcrafting/proc/slapcraft_async(list/valid_recipes, mob/user, datum/component/personal_crafting/craft_sheet) +/datum/element/slapcrafting/proc/slapcraft_async(obj/parent_item, list/valid_recipes, mob/user, datum/component/personal_crafting/craft_sheet) var/list/recipe_choices = list() @@ -90,7 +84,7 @@ if(!recipe_choices) CRASH("No recipe choices despite validating in earlier proc") - string_chosen_recipe = show_radial_menu(user, parent, recipe_choices, require_near = TRUE) + string_chosen_recipe = show_radial_menu(user, parent_item, recipe_choices, require_near = TRUE) if(isnull(string_chosen_recipe)) return // they closed the thing @@ -118,7 +112,7 @@ to_chat(user, span_warning("crafting failed" + error_string)) /// Alerts any examiners to the recipe, if they wish to know more. -/datum/component/slapcrafting/proc/get_examine_info(atom/source, mob/user, list/examine_list) +/datum/element/slapcrafting/proc/get_examine_info(atom/source, mob/user, list/examine_list) SIGNAL_HANDLER var/list/string_results = list() @@ -132,17 +126,17 @@ already_used_names += initial(result.name) string_results += list("\a [initial(result.name)]") - examine_list += span_notice("You think [parent] could be used to make [english_list(string_results)]! Examine again to look at the details...") + examine_list += span_notice("You think [source] could be used to make [english_list(string_results)]! Examine again to look at the details...") /// Alerts any examiners to the details of the recipe. -/datum/component/slapcrafting/proc/get_examine_more_info(atom/source, mob/user, list/examine_list) +/datum/element/slapcrafting/proc/get_examine_more_info(atom/source, mob/user, list/examine_list) SIGNAL_HANDLER for(var/datum/crafting_recipe/recipe as anything in slapcraft_recipes) var/atom/result = initial(recipe.result) examine_list += "See Recipe For [initial(result.name)]" -/datum/component/slapcrafting/proc/topic_handler(atom/source, user, href_list) +/datum/element/slapcrafting/proc/topic_handler(atom/source, user, href_list) SIGNAL_HANDLER if(!href_list["check_recipe"]) @@ -176,7 +170,7 @@ var/amount = initial(cur_recipe.reqs[ingredient]) // If we're about to describe the ingredient that the component is based on, lower the described amount by 1 or remove it outright. - if(parent.type == valid_type) + if(source.type == valid_type) if(amount > 1) amount-- else diff --git a/code/datums/elements/turf_transparency.dm b/code/datums/elements/turf_transparency.dm index b050dd0866f0e..c9fb667cff922 100644 --- a/code/datums/elements/turf_transparency.dm +++ b/code/datums/elements/turf_transparency.dm @@ -219,10 +219,10 @@ GLOBAL_LIST_EMPTY(pillars_by_z) // it will make them look significantly nicer, and should let you tie into their logic more easily // Just please don't break behavior yeah? thanks, I love you <3 if(isclosedturf(our_turf)) //Show girders below closed turfs - var/mutable_appearance/girder_underlay = mutable_appearance('icons/obj/structures.dmi', "girder", layer = TURF_LAYER-0.01) + var/mutable_appearance/girder_underlay = mutable_appearance('icons/obj/structures.dmi', "girder", layer = BELOW_CLOSED_TURF_LAYER) girder_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR our_turf.underlays += girder_underlay - var/mutable_appearance/plating_underlay = mutable_appearance('icons/turf/floors.dmi', "plating", layer = TURF_LAYER-0.02) + var/mutable_appearance/plating_underlay = mutable_appearance('icons/turf/floors.dmi', "plating", layer = LOW_FLOOR_LAYER, offset_spokesman = our_turf, plane = FLOOR_PLANE) plating_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR our_turf.underlays += plating_underlay return TRUE @@ -240,10 +240,10 @@ GLOBAL_LIST_EMPTY(pillars_by_z) our_turf.underlays -= get_baseturf_underlay(our_turf) if(isclosedturf(our_turf)) //Show girders below closed turfs - var/mutable_appearance/girder_underlay = mutable_appearance('icons/obj/structures.dmi', "girder", layer = TURF_LAYER-0.01) + var/mutable_appearance/girder_underlay = mutable_appearance('icons/obj/structures.dmi', "girder", layer = BELOW_CLOSED_TURF_LAYER) girder_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR our_turf.underlays -= girder_underlay - var/mutable_appearance/plating_underlay = mutable_appearance('icons/turf/floors.dmi', "plating", layer = TURF_LAYER-0.02) + var/mutable_appearance/plating_underlay = mutable_appearance('icons/turf/floors.dmi', "plating", layer = LOW_FLOOR_LAYER, offset_spokesman = our_turf, plane = FLOOR_PLANE) plating_underlay.appearance_flags = RESET_ALPHA | RESET_COLOR our_turf.underlays -= plating_underlay @@ -271,7 +271,7 @@ GLOBAL_LIST_EMPTY(pillars_by_z) if(!ispath(path)) warning("Z-level [our_turf.z] has invalid baseturf '[SSmapping.level_trait(our_turf.z, ZTRAIT_BASETURF)]'") path = /turf/open/space - var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER-0.02, offset_spokesman = our_turf, plane = PLANE_SPACE) + var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = SPACE_LAYER + 0.1, offset_spokesman = our_turf, plane = PLANE_SPACE) underlay_appearance.appearance_flags = RESET_ALPHA | RESET_COLOR return underlay_appearance diff --git a/code/datums/elements/undertile.dm b/code/datums/elements/undertile.dm index ecc621a57e42f..ed901b196c1aa 100644 --- a/code/datums/elements/undertile.dm +++ b/code/datums/elements/undertile.dm @@ -44,6 +44,7 @@ if(underfloor_accessibility < UNDERFLOOR_INTERACTABLE) SET_PLANE_IMPLICIT(source, FLOOR_PLANE) // We do this so that turfs that allow you to see what's underneath them don't have to be on the game plane (which causes ambient occlusion weirdness) + source.layer = ABOVE_OPEN_TURF_LAYER ADD_TRAIT(source, TRAIT_UNDERFLOOR, REF(src)) if(tile_overlay) @@ -61,6 +62,7 @@ else SET_PLANE_IMPLICIT(source, initial(source.plane)) + source.layer = initial(source.layer) REMOVE_TRAIT(source, TRAIT_UNDERFLOOR, REF(src)) if(invisibility_trait) diff --git a/code/datums/elements/wearable_client_colour.dm b/code/datums/elements/wearable_client_colour.dm new file mode 100644 index 0000000000000..8757dd1098cd5 --- /dev/null +++ b/code/datums/elements/wearable_client_colour.dm @@ -0,0 +1,121 @@ +/// An element that adds a client colour to the wearer when equipped to the right slot, under the right conditions. +/datum/element/wearable_client_colour + element_flags = ELEMENT_BESPOKE + argument_hash_start_idx = 2 + ///The typepath of the client_colour added when worn in the appropriate slot(s) + var/datum/client_colour/colour_type + ///The slot(s) that enable the client colour + var/equip_slots = NONE + ///For items that want costumizable client colours + var/custom_colour + ///if forced is false, we check that the user has the TRAIT_SEE_WORN_COLOURS before adding the colour. + var/forced = FALSE + ///On examine, it'll tell which you have to press to toggle TRAIT_SEE_WORN_COLOURS. + var/key_info = "Figure it out yourself how" + +/datum/element/wearable_client_colour/Attach(obj/item/target, colour_type, equip_slots, custom_colour, forced = FALSE, comsig_toggle = COMSIG_CLICK_ALT) + . = ..() + if(!isitem(target)) + return ELEMENT_INCOMPATIBLE + + RegisterSignal(target, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equipped)) + RegisterSignal(target, COMSIG_ITEM_DROPPED, PROC_REF(on_dropped)) + + src.colour_type = colour_type + src.equip_slots = equip_slots + src.custom_colour = custom_colour + src.forced = forced + + if(!forced) + switch(comsig_toggle) + if(COMSIG_CLICK_ALT) + key_info = EXAMINE_HINT("Alt-Click") + if(COMSIG_CLICK_ALT_SECONDARY) + key_info = EXAMINE_HINT("Right-Alt-Click") + if(COMSIG_CLICK_CTRL) + key_info = EXAMINE_HINT("Ctrl-Click") + if(COMSIG_CLICK_CTRL_SHIFT) + key_info = EXAMINE_HINT("Ctrl-Shift-Click") + else + stack_trace("Unsupported comsig_toggle arg value ([comsig_toggle]) for [type], defaulting to [COMSIG_CLICK_ALT]") + key_info = EXAMINE_HINT("Alt-Click") + comsig_toggle = COMSIG_CLICK_ALT + RegisterSignal(target, comsig_toggle, PROC_REF(toggle_see_worn_colors)) + RegisterSignal(target, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine)) + + if(ismob(target.loc)) + var/mob/wearer = target.loc + if(wearer.get_slot_by_item(target) & equip_slots) + try_client_colour(wearer) + +/datum/element/wearable_client_colour/Detach(obj/item/source) + var/list/fairly_long_list = list( + COMSIG_ITEM_EQUIPPED, + COMSIG_ITEM_DROPPED, + COMSIG_CLICK_ALT, + COMSIG_CLICK_ALT_SECONDARY, + COMSIG_CLICK_CTRL, + COMSIG_CLICK_CTRL_SHIFT, + COMSIG_ATOM_EXAMINE, + ) + UnregisterSignal(source, fairly_long_list) + if(ismob(source.loc)) + var/mob/wearer = source.loc + if(wearer.get_slot_by_item(source) & equip_slots) + remove_client_colour(wearer) + return ..() + +/datum/element/wearable_client_colour/proc/on_equipped(obj/item/source, mob/equipper, slot) + SIGNAL_HANDLER + if(slot & equip_slots) + try_client_colour(equipper) + +/datum/element/wearable_client_colour/proc/on_dropped(obj/item/source, mob/dropper) + SIGNAL_HANDLER + remove_client_colour(dropper) + +/datum/element/wearable_client_colour/proc/try_client_colour(mob/equipper) + if(!forced) + RegisterSignal(equipper, SIGNAL_ADDTRAIT(TRAIT_SEE_WORN_COLOURS), PROC_REF(on_trait_added)) + RegisterSignal(equipper, SIGNAL_REMOVETRAIT(TRAIT_SEE_WORN_COLOURS), PROC_REF(on_trait_removed)) + if(!HAS_TRAIT(equipper, TRAIT_SEE_WORN_COLOURS)) + return + apply_client_colour(equipper) + +/datum/element/wearable_client_colour/proc/on_trait_added(mob/source, trait) + SIGNAL_HANDLER + apply_client_colour(source) + +/datum/element/wearable_client_colour/proc/apply_client_colour(mob/equipper) + var/datum/client_colour/colour_to_add = colour_type + if(custom_colour) + colour_to_add = new colour_to_add + colour_to_add.colour = custom_colour + equipper.add_client_colour(colour_to_add) + +/datum/element/wearable_client_colour/proc/on_trait_removed(mob/source, trait) + SIGNAL_HANDLER + source.remove_client_colour(colour_type) + +/datum/element/wearable_client_colour/proc/remove_client_colour(mob/dropper) + if(!forced) + UnregisterSignal(dropper, list(SIGNAL_ADDTRAIT(TRAIT_SEE_WORN_COLOURS), SIGNAL_REMOVETRAIT(TRAIT_SEE_WORN_COLOURS))) + if(!HAS_TRAIT(dropper, TRAIT_SEE_WORN_COLOURS)) + return + dropper.remove_client_colour(colour_type) + +/datum/element/wearable_client_colour/proc/toggle_see_worn_colors(obj/item/source, mob/clicker) + SIGNAL_HANDLER + if(source.loc != clicker || HAS_TRAIT(clicker, TRAIT_INCAPACITATED)) + return + if(HAS_TRAIT(clicker, TRAIT_SEE_WORN_COLOURS)) + REMOVE_TRAIT(clicker, TRAIT_SEE_WORN_COLOURS, CLOTHING_TRAIT) + clicker.balloon_alert(clicker, "glasses colors disabled") + else + ADD_TRAIT(clicker, TRAIT_SEE_WORN_COLOURS, CLOTHING_TRAIT) + clicker.balloon_alert(clicker, "glasses colors enabled") + return CLICK_ACTION_SUCCESS + +/datum/element/wearable_client_colour/proc/on_examine(obj/item/source, mob/user, list/examine_texts) + SIGNAL_HANDLER + examine_texts += span_info("While holding or wearing it, [key_info] to toggle on/off the screen color from glasses and such.") diff --git a/code/datums/embed_data.dm b/code/datums/embed_data.dm new file mode 100644 index 0000000000000..a82d305c8e6eb --- /dev/null +++ b/code/datums/embed_data.dm @@ -0,0 +1,55 @@ +/// Assosciative list of type -> embed data. +GLOBAL_LIST_INIT(embed_by_type, generate_embed_type_cache()) + +/proc/generate_embed_type_cache() + var/list/embed_cache = list() + for(var/datum/embed_data/embed_type as anything in subtypesof(/datum/embed_data)) + var/datum/embed_data/embed = new embed_type + embed_cache[embed_type] = embed + return embed_cache + +/proc/get_embed_by_type(embed_type) + var/datum/embed_data/embed = GLOB.embed_by_type[embed_type] + if(embed) + return embed + CRASH("Attempted to get an embed type that did not exist! '[embed_type]'") + +/datum/embed_data + /// Chance for an object to embed into somebody when thrown + var/embed_chance = 45 + /// Chance for embedded object to fall out (causing pain but removing the object) + var/fall_chance = 5 + /// Chance for embedded objects to cause pain (damage user) + var/pain_chance = 15 + /// Coefficient of multiplication for the damage the item does while embedded (this*item.w_class) + var/pain_mult = 2 + /// Coefficient of multiplication for the damage the item does when it first embeds (this*item.w_class) + var/impact_pain_mult = 4 + /// Coefficient of multiplication for the damage the item does when it falls out or is removed without a surgery (this*item.w_class) + var/remove_pain_mult = 6 + /// Time in ticks, total removal time = (this*item.w_class) + var/rip_time = 30 + /// If this should ignore throw speed threshold of 4 + var/ignore_throwspeed_threshold = FALSE + /// Chance for embedded objects to cause pain every time they move (jostle) + var/jostle_chance = 5 + /// Coefficient of multiplication for the damage the item does while + var/jostle_pain_mult = 1 + /// This percentage of all pain will be dealt as stam damage rather than brute (0-1) + var/pain_stam_pct = 0 + +/datum/embed_data/proc/generate_with_values(embed_chance, fall_chance, pain_chance, pain_mult, impact_pain_mult, remove_pain_mult, rip_time, ignore_throwspeed_threshold, jostle_chance, jostle_pain_mult, pain_stam_pct, force_new = FALSE) + var/datum/embed_data/data = isnull(GLOB.embed_by_type[type]) && !force_new ? src : new() + + data.embed_chance = !isnull(embed_chance) ? embed_chance : src.embed_chance + data.fall_chance = !isnull(fall_chance) ? fall_chance : src.fall_chance + data.pain_chance = !isnull(pain_chance) ? pain_chance : src.pain_chance + data.pain_mult = !isnull(pain_mult) ? pain_mult : src.pain_mult + data.impact_pain_mult = !isnull(impact_pain_mult) ? impact_pain_mult : src.impact_pain_mult + data.remove_pain_mult = !isnull(remove_pain_mult) ? remove_pain_mult : src.remove_pain_mult + data.rip_time = !isnull(rip_time) ? rip_time : src.rip_time + data.ignore_throwspeed_threshold = !isnull(ignore_throwspeed_threshold) ? ignore_throwspeed_threshold : src.ignore_throwspeed_threshold + data.jostle_chance = !isnull(jostle_chance) ? jostle_chance : src.jostle_chance + data.jostle_pain_mult = !isnull(jostle_pain_mult) ? jostle_pain_mult : src.jostle_pain_mult + data.pain_stam_pct = !isnull(pain_stam_pct) ? pain_stam_pct : src.pain_stam_pct + return data diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 36d405450af15..7006d6d6daa71 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -38,8 +38,6 @@ var/emote_type = EMOTE_VISIBLE /// Checks if the mob can use its hands before performing the emote. var/hands_use_check = FALSE - /// Will only work if the emote is EMOTE_AUDIBLE. - var/muzzle_ignore = FALSE /// Types that are allowed to use that emote. var/list/mob_type_allowed_typecache = /mob /// Types that are NOT allowed to use that emote. @@ -90,7 +88,7 @@ /datum/emote/proc/run_emote(mob/user, params, type_override, intentional = FALSE) if(!can_run_emote(user, TRUE, intentional)) return FALSE - if(SEND_SIGNAL(user, COMSIG_MOB_PRE_EMOTED, key, params, type_override, intentional) & COMPONENT_CANT_EMOTE) + if(SEND_SIGNAL(user, COMSIG_MOB_PRE_EMOTED, key, params, type_override, intentional, src) & COMPONENT_CANT_EMOTE) return TRUE // We don't return FALSE because the error output would be incorrect, provide your own if necessary. var/msg = select_message_type(user, message, intentional) if(params && message_param) @@ -259,8 +257,6 @@ return . var/mob/living/living_user = user - if(!muzzle_ignore && user.is_muzzled() && emote_type & EMOTE_AUDIBLE) - return "makes a [pick("strong ", "weak ", "")]noise." if(HAS_MIND_TRAIT(user, TRAIT_MIMING) && message_mime) . = message_mime if(isalienadult(user) && message_alien) @@ -338,9 +334,7 @@ * Returns a bool about whether or not the user should play a sound when performing the emote. */ /datum/emote/proc/should_play_sound(mob/user, intentional = FALSE) - if(emote_type & EMOTE_AUDIBLE && !muzzle_ignore) - if(user.is_muzzled()) - return FALSE + if(emote_type & EMOTE_AUDIBLE && !hands_use_check) if(HAS_TRAIT(user, TRAIT_MUTE)) return FALSE if(ishuman(user)) diff --git a/code/datums/greyscale/_greyscale_config.dm b/code/datums/greyscale/_greyscale_config.dm index 25d006a44ee8e..60c12c25b9ef1 100644 --- a/code/datums/greyscale/_greyscale_config.dm +++ b/code/datums/greyscale/_greyscale_config.dm @@ -278,8 +278,9 @@ for(var/datum/greyscale_layer/layer as anything in group) var/icon/layer_icon if(islist(layer)) + var/list/layer_list = layer layer_icon = GenerateLayerGroup(colors, layer, render_steps, new_icon || last_external_icon) - layer = layer[1] // When there are multiple layers in a group like this we use the first one's blend mode + layer = layer_list[1] // When there are multiple layers in a group like this we use the first one's blend mode else layer_icon = layer.Generate(colors, render_steps, new_icon || last_external_icon) diff --git a/code/datums/id_trim/ruins.dm b/code/datums/id_trim/ruins.dm index de58590ba8a9f..36284e06b72c4 100644 --- a/code/datums/id_trim/ruins.dm +++ b/code/datums/id_trim/ruins.dm @@ -27,7 +27,7 @@ /// Trim for the oldstation ruin/Charlie station to access APCs and other equipment /datum/id_trim/away/old/equipment - access = list(ACCESS_AWAY_GENERAL, ACCESS_ENGINEERING, ACCESS_ENGINE_EQUIP) + access = list(ACCESS_AWAY_GENERAL, ACCESS_AWAY_ENGINEERING, ACCESS_ENGINEERING, ACCESS_ENGINE_EQUIP) assignment = "Engine Equipment Access" /// Trim for the oldstation ruin/Charlie station to access robots, and downloading of paper publishing software for experiments diff --git a/code/datums/instability_meltdown.dm b/code/datums/instability_meltdown.dm new file mode 100644 index 0000000000000..d8e6fbd77ac9e --- /dev/null +++ b/code/datums/instability_meltdown.dm @@ -0,0 +1,163 @@ +/// A possible genetic meltdown that occurs when someone exceeds 100 genetic instability +/datum/instability_meltdown + /// How likely a meltdown is to be picked + var/meltdown_weight = 1 + /// If this meltdown is considered "fatal" or not + var/fatal = FALSE + /// Used to ensure that abstract subtypes do not get picked + var/abstract_type = /datum/instability_meltdown + +/// Code that runs when this meltdown is picked +/datum/instability_meltdown/proc/meltdown(mob/living/carbon/human/victim) + return + +// Nonfatal meltdowns + +/// Turns you into a monkey +/datum/instability_meltdown/monkey + +/datum/instability_meltdown/monkey/meltdown(mob/living/carbon/human/victim) + victim.monkeyize() + +/// Gives you brain trauma that makes your legs disfunctional and gifts you a wheelchair +/datum/instability_meltdown/paraplegic + +/datum/instability_meltdown/paraplegic/meltdown(mob/living/carbon/human/victim) + victim.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) + new /obj/vehicle/ridden/wheelchair(get_turf(victim)) + to_chat(victim, span_warning("My flesh turned into a wheelchair and I can't feel my legs.")) + +/// Turns you into a corgi +/datum/instability_meltdown/corgi + +/datum/instability_meltdown/corgi/meltdown(mob/living/carbon/human/victim) + victim.corgize() + +/// Does nothing +/datum/instability_meltdown/alright + +/datum/instability_meltdown/alright/meltdown(mob/living/carbon/human/victim) + to_chat(victim, span_notice("Oh, I actually feel quite alright!")) + +/// Gives you the same text as above but now when you're hit you take 200 times more damage +/datum/instability_meltdown/not_alright + +/datum/instability_meltdown/not_alright/meltdown(mob/living/carbon/human/victim) + to_chat(victim, span_notice("Oh, I actually feel quite alright!")) + victim.physiology.damage_resistance -= 20000 //you thought + victim.log_message("has received x200 damage multiplier from [type] genetic meltdown") + +/// Turns you into a slime +/datum/instability_meltdown/slime + +/datum/instability_meltdown/slime/meltdown(mob/living/carbon/human/victim) + to_chat(victim, span_notice("Oh, I actually feel quite alright!")) + victim.reagents.add_reagent(/datum/reagent/aslimetoxin, 10) + +/// Makes you phase through walls into a random direction +/datum/instability_meltdown/yeet + +/datum/instability_meltdown/yeet/meltdown(mob/living/carbon/human/victim) + victim.apply_status_effect(/datum/status_effect/go_away) + +/// Makes you take cell damage and gibs you after some time +/datum/instability_meltdown/decloning + +/datum/instability_meltdown/decloning/meltdown(mob/living/carbon/human/victim) + to_chat(src, span_notice("Oh, I actually feel quite alright!")) + victim.ForceContractDisease(new /datum/disease/decloning) // slow acting, non-viral GBS + +/// Makes you vomit up a random organ +/datum/instability_meltdown/organ_vomit + +/datum/instability_meltdown/organ_vomit/meltdown(mob/living/carbon/human/victim) + var/list/elligible_organs = list() + for(var/obj/item/organ/internal/internal_organ in victim.organs) //make sure we dont get an implant or cavity item + elligible_organs += internal_organ + victim.vomit(VOMIT_CATEGORY_DEFAULT, lost_nutrition = 10) + if(!elligible_organs.len) + return + var/obj/item/organ/picked_organ = pick(elligible_organs) + picked_organ.Remove(src) + victim.visible_message(span_danger("[victim] vomits up [p_their()] [picked_organ.name]!"), span_danger("You vomit up your [picked_organ.name]")) //no "vomit up your heart" + picked_organ.forceMove(victim.drop_location()) + if(prob(20)) + picked_organ.animate_atom_living() + +/// Turns you into a snail +/datum/instability_meltdown/snail + meltdown_weight = 2 + +/datum/instability_meltdown/snail/meltdown(mob/living/carbon/human/victim) + to_chat(victim, span_notice("Oh, I actually feel quite alright!")) + victim.ForceContractDisease(new/datum/disease/gastrolosis()) + +/// Turns you into the ultimate lifeform +/datum/instability_meltdown/crab + +/datum/instability_meltdown/crab/meltdown(mob/living/carbon/human/victim) + to_chat(victim, span_notice("Your DNA mutates into the ultimate biological form!")) + victim.crabize() + +// Fatal meltdowns + +/datum/instability_meltdown/fatal + fatal = TRUE + abstract_type = /datum/instability_meltdown/fatal + +/// Instantly gibs you +/datum/instability_meltdown/fatal/gib + +/datum/instability_meltdown/fatal/gib/meltdown(mob/living/carbon/human/victim) + victim.investigate_log("has been gibbed by DNA instability.", INVESTIGATE_DEATHS) + victim.gib(DROP_ALL_REMAINS) + +/// Dusts you +/datum/instability_meltdown/fatal/dust + +/datum/instability_meltdown/fatal/dust/meltdown(mob/living/carbon/human/victim) + victim.investigate_log("has been dusted by DNA instability.", INVESTIGATE_DEATHS) + victim.dust() + +/// Turns you into a statue +/datum/instability_meltdown/fatal/petrify + +/datum/instability_meltdown/fatal/petrify/meltdown(mob/living/carbon/human/victim) + victim.investigate_log("has been transformed into a statue by DNA instability.", INVESTIGATE_DEATHS) + victim.death() + victim.petrify(statue_timer = INFINITY, save_brain = FALSE) + victim.ghostize(FALSE) + +/// Either dismembers you, or if unable to, gibs you +/datum/instability_meltdown/fatal/dismember + +/datum/instability_meltdown/fatal/dismember/meltdown(mob/living/carbon/human/victim) + var/obj/item/bodypart/part = victim.get_bodypart(pick(BODY_ZONE_CHEST,BODY_ZONE_HEAD)) + if(part) + part.dismember() + return + victim.investigate_log("has been gibbed by DNA instability.", INVESTIGATE_DEATHS) + victim.gib(DROP_ALL_REMAINS) + +/// Turns you into a skeleton, with a high chance of killing you soon after +/datum/instability_meltdown/fatal/skeletonize + +/datum/instability_meltdown/fatal/skeletonize/meltdown(mob/living/carbon/human/victim) + victim.visible_message(span_warning("[victim]'s skin melts off!"), span_boldwarning("Your skin melts off!")) + victim.spawn_gibs() + victim.set_species(/datum/species/skeleton) + if(prob(90)) + addtimer(CALLBACK(victim, TYPE_PROC_REF(/mob/living, death)), 3 SECONDS) + +/// Makes you look up and melts out your eyes +/datum/instability_meltdown/fatal/ceiling + +/datum/instability_meltdown/fatal/ceiling/meltdown(mob/living/carbon/human/victim) + to_chat(victim, span_phobia("LOOK UP!")) + addtimer(CALLBACK(victim, TYPE_PROC_REF(/mob/living/carbon/human, something_horrible_mindmelt)), 3 SECONDS) + +/// Slowly turns you into a psyker +/datum/instability_meltdown/fatal/psyker + +/datum/instability_meltdown/fatal/psyker/meltdown(mob/living/carbon/human/victim) + victim.slow_psykerize() diff --git a/code/datums/looping_sounds/breathing.dm b/code/datums/looping_sounds/breathing.dm new file mode 100644 index 0000000000000..f9a81c6856926 --- /dev/null +++ b/code/datums/looping_sounds/breathing.dm @@ -0,0 +1,9 @@ +/datum/looping_sound/breathing + mid_sounds = 'sound/voice/breathing.ogg' + //Calculated this by using the average breathing time of an adult (12 to 20 per minute, which on average is 16 per minute) + mid_length = 3.75 SECONDS + mid_length_vary = 0.2 SECONDS + //spess station- + volume = 13 + pressure_affected = FALSE + direct = TRUE diff --git a/code/datums/mood.dm b/code/datums/mood.dm index 2b2a83fc6964d..8193f9c1c15c9 100644 --- a/code/datums/mood.dm +++ b/code/datums/mood.dm @@ -48,10 +48,15 @@ RegisterSignal(mob_to_make_moody, COMSIG_MOB_HUD_CREATED, PROC_REF(modify_hud)) RegisterSignal(mob_to_make_moody, COMSIG_ENTER_AREA, PROC_REF(check_area_mood)) + RegisterSignal(mob_to_make_moody, COMSIG_EXIT_AREA, PROC_REF(exit_area)) RegisterSignal(mob_to_make_moody, COMSIG_LIVING_REVIVE, PROC_REF(on_revive)) RegisterSignal(mob_to_make_moody, COMSIG_MOB_STATCHANGE, PROC_REF(handle_mob_death)) RegisterSignal(mob_to_make_moody, COMSIG_QDELETING, PROC_REF(clear_parent_ref)) + var/area/our_area = get_area(mob_to_make_moody) + if(our_area) + check_area_mood(mob_to_make_moody, our_area) + mob_to_make_moody.become_area_sensitive(MOOD_DATUM_TRAIT) if(mob_to_make_moody.hud_used) modify_hud() @@ -63,7 +68,10 @@ unmodify_hud() mob_parent.lose_area_sensitivity(MOOD_DATUM_TRAIT) - UnregisterSignal(mob_parent, list(COMSIG_MOB_HUD_CREATED, COMSIG_ENTER_AREA, COMSIG_LIVING_REVIVE, COMSIG_MOB_STATCHANGE, COMSIG_QDELETING)) + UnregisterSignal(mob_parent, list(COMSIG_MOB_HUD_CREATED, COMSIG_ENTER_AREA, COMSIG_EXIT_AREA, COMSIG_LIVING_REVIVE, COMSIG_MOB_STATCHANGE, COMSIG_QDELETING)) + var/area/our_area = get_area(mob_parent) + if(our_area) + UnregisterSignal(our_area, COMSIG_AREA_BEAUTY_UPDATED) mob_parent = null @@ -383,6 +391,8 @@ /datum/mood/proc/check_area_mood(datum/source, area/new_area) SIGNAL_HANDLER + RegisterSignal(new_area, COMSIG_AREA_BEAUTY_UPDATED, PROC_REF(update_beauty)) + update_beauty(new_area) if (new_area.mood_bonus && (!new_area.mood_trait || HAS_TRAIT(source, new_area.mood_trait))) add_mood_event("area", /datum/mood_event/area, new_area.mood_bonus, new_area.mood_message) @@ -391,10 +401,32 @@ /// Updates the mob's given beauty moodie, based on the area /datum/mood/proc/update_beauty(area/area_to_beautify) + SIGNAL_HANDLER if (area_to_beautify.outdoors) // if we're outside, we don't care clear_mood_event(MOOD_CATEGORY_AREA_BEAUTY) return + if(HAS_TRAIT(mob_parent, TRAIT_MORBID)) + if(HAS_TRAIT(mob_parent, TRAIT_SNOB)) + switch(area_to_beautify.beauty) + if(BEAUTY_LEVEL_DECENT to BEAUTY_LEVEL_GOOD) + add_mood_event(MOOD_CATEGORY_AREA_BEAUTY, /datum/mood_event/ehroom) + return + if(BEAUTY_LEVEL_GOOD to BEAUTY_LEVEL_GREAT) + add_mood_event(MOOD_CATEGORY_AREA_BEAUTY, /datum/mood_event/badroom) + return + if(BEAUTY_LEVEL_GREAT to INFINITY) + add_mood_event(MOOD_CATEGORY_AREA_BEAUTY, /datum/mood_event/horridroom) + return + switch(area_to_beautify.beauty) + if(-INFINITY to BEAUTY_LEVEL_HORRID) + add_mood_event(MOOD_CATEGORY_AREA_BEAUTY, /datum/mood_event/greatroom) + if(BEAUTY_LEVEL_HORRID to BEAUTY_LEVEL_BAD) + add_mood_event(MOOD_CATEGORY_AREA_BEAUTY, /datum/mood_event/goodroom) + if(BEAUTY_LEVEL_BAD to BEAUTY_LEVEL_DECENT) + clear_mood_event(MOOD_CATEGORY_AREA_BEAUTY) + return + if(HAS_TRAIT(mob_parent, TRAIT_SNOB)) switch(area_to_beautify.beauty) if(-INFINITY to BEAUTY_LEVEL_HORRID) @@ -413,6 +445,10 @@ if(BEAUTY_LEVEL_GREAT to INFINITY) add_mood_event(MOOD_CATEGORY_AREA_BEAUTY, /datum/mood_event/greatroom) +/datum/mood/proc/exit_area(datum/source, area/old_area) + SIGNAL_HANDLER + UnregisterSignal(old_area, COMSIG_AREA_BEAUTY_UPDATED) + /// Called when parent is ahealed. /datum/mood/proc/on_revive(datum/source, full_heal) SIGNAL_HANDLER diff --git a/code/datums/mood_events/beauty_events.dm b/code/datums/mood_events/beauty_events.dm index 31e199c47e181..ec89a9b41b933 100644 --- a/code/datums/mood_events/beauty_events.dm +++ b/code/datums/mood_events/beauty_events.dm @@ -6,6 +6,10 @@ description = "This room looks really bad." mood_change = -3 +/datum/mood_event/ehroom + description = "This room looks kinda bad." + mood_change = -1 + /datum/mood_event/decentroom description = "This room looks alright." mood_change = 1 diff --git a/code/datums/mood_events/morbid_events.dm b/code/datums/mood_events/morbid_events.dm index b21548c81228d..27c5424ec5cf1 100644 --- a/code/datums/mood_events/morbid_events.dm +++ b/code/datums/mood_events/morbid_events.dm @@ -37,6 +37,11 @@ Intended to push a creepy, mad scientist/doctor vibe, or someone who is downrigh mood_change = 3 timeout = 6 MINUTES +/datum/mood_event/morbid_aquarium_good + description = "Eh eh, all the fish are sleeping..." + mood_change = 3 + timeout = 90 SECONDS + // Negative Events - We helped someone stay alive. /datum/mood_event/morbid_tend_wounds @@ -49,3 +54,7 @@ Intended to push a creepy, mad scientist/doctor vibe, or someone who is downrigh mood_change = -6 timeout = 2 MINUTES +/datum/mood_event/morbid_aquarium_bad + description = "Watching fish in an aquarium is lousy." + mood_change = -3 + timeout = 90 SECONDS diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index c066b96cea419..db5acbca388b6 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -45,4 +45,7 @@ else if(!isnull(offset_spokesman) && !isatom(offset_spokesman)) stack_trace("Why did you pass in offset_spokesman as [offset_spokesman]? We need an atom to properly offset planes") + if(PERFORM_ALL_TESTS(focus_only/topdown_filtering)) + check_topdown_validity(appearance) + return appearance diff --git a/code/datums/mutations/_combined.dm b/code/datums/mutations/_combined.dm index 534d94550c41b..baa7c2c1215b5 100644 --- a/code/datums/mutations/_combined.dm +++ b/code/datums/mutations/_combined.dm @@ -50,5 +50,5 @@ result = /datum/mutation/human/martyrdom /datum/generecipe/heckacious - required = "/datum/mutation/human/wacky; /datum/mutation/human/trichromatic" + required = "/datum/mutation/human/wacky; /datum/mutation/human/stoner" result = /datum/mutation/human/heckacious diff --git a/code/datums/mutations/_mutations.dm b/code/datums/mutations/_mutations.dm index ba3c20a0cfe74..22988f5ebdd19 100644 --- a/code/datums/mutations/_mutations.dm +++ b/code/datums/mutations/_mutations.dm @@ -132,6 +132,7 @@ owner = acquirer dna = acquirer.dna dna.mutations += src + SEND_SIGNAL(src, COMSIG_MUTATION_GAINED, acquirer) if(text_gain_indication) to_chat(owner, text_gain_indication) if(visual_indicators.len) @@ -158,6 +159,7 @@ if(!istype(owner) || !(owner.dna.mutations.Remove(src))) return TRUE . = FALSE + SEND_SIGNAL(src, COMSIG_MUTATION_LOST, owner) if(text_lose_indication && owner.stat != DEAD) to_chat(owner, text_lose_indication) if(visual_indicators.len) diff --git a/code/datums/mutations/adaptation.dm b/code/datums/mutations/adaptation.dm index 7be2487e303dc..a731224d52357 100644 --- a/code/datums/mutations/adaptation.dm +++ b/code/datums/mutations/adaptation.dm @@ -13,7 +13,7 @@ /datum/mutation/human/adaptation/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut) ..() - conflicts = typesof(src) + conflicts = typesof(/datum/mutation/human/adaptation) if(!(type in visual_indicators)) visual_indicators[type] = list(mutable_appearance('icons/mob/effects/genetics.dmi', adapt_icon, -MUTATIONS_LAYER)) diff --git a/code/datums/mutations/hulk.dm b/code/datums/mutations/hulk.dm index 16e09c9f9af8b..7d5ea23f007b3 100644 --- a/code/datums/mutations/hulk.dm +++ b/code/datums/mutations/hulk.dm @@ -20,6 +20,9 @@ TRAIT_STUNIMMUNE, ) +/datum/mutation/human/hulk/New(class, timer, datum/mutation/human/copymut) + . = ..() + AddComponent(/datum/component/speechmod, replacements = list("." = "!"), end_string = "!!", uppercase = TRUE) /datum/mutation/human/hulk/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -29,7 +32,6 @@ owner.update_body_parts() owner.add_mood_event("hulk", /datum/mood_event/hulk) RegisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK, PROC_REF(on_attack_hand)) - RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) RegisterSignal(owner, COMSIG_MOB_CLICKON, PROC_REF(check_swing)) /datum/mutation/human/hulk/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, modifiers) @@ -91,21 +93,8 @@ owner.update_body_parts() owner.clear_mood_event("hulk") UnregisterSignal(owner, COMSIG_LIVING_EARLY_UNARMED_ATTACK) - UnregisterSignal(owner, COMSIG_MOB_SAY) UnregisterSignal(owner, COMSIG_MOB_CLICKON) -/datum/mutation/human/hulk/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - - var/message = speech_args[SPEECH_MESSAGE] - if(message) - message = "[replacetext(message, ".", "!")]!!" - speech_args[SPEECH_MESSAGE] = message - - // the reason we don't just uppertext(message) in this proc is so that our hulk speech - // can uppercase all other speech moidifiers after they are done (by returning COMPONENT_UPPERCASE_SPEECH) - return COMPONENT_UPPERCASE_SPEECH - /// How many steps it takes to throw the mob #define HULK_TAILTHROW_STEPS 28 diff --git a/code/datums/mutations/reach.dm b/code/datums/mutations/reach.dm index e63efbad78596..4be2a64608884 100644 --- a/code/datums/mutations/reach.dm +++ b/code/datums/mutations/reach.dm @@ -66,7 +66,7 @@ /// signal sent when prompting if an item can be equipped /datum/mutation/human/elastic_arms/proc/on_owner_equipping_item(mob/living/carbon/human/owner, obj/item/pick_item) SIGNAL_HANDLER - if(pick_item.w_class > WEIGHT_CLASS_BULKY) // cant decide if i should limit to huge or bulky. + if((pick_item.w_class > WEIGHT_CLASS_BULKY) && !(pick_item.item_flags & ABSTRACT|HAND_ITEM)) // cant decide if i should limit to huge or bulky. pick_item.balloon_alert(owner, "arms too floppy to wield!") return COMPONENT_LIVING_CANT_PUT_IN_HAND diff --git a/code/datums/mutations/speech.dm b/code/datums/mutations/speech.dm index 862039ef47dbe..557bc23e4e5d9 100644 --- a/code/datums/mutations/speech.dm +++ b/code/datums/mutations/speech.dm @@ -40,24 +40,13 @@ speech_args[SPEECH_SPANS] |= SPAN_SANS -// Lower rust floor probability -// Make it only happen on open turf -// Add early return to wall hitting -// Fix throw at on cult sac -// Reduce tochat prob on rust floor -// add trait rusty to windows -// aim assist on rc doesnt work -// also in general -// give master seek to rusted harvester - /datum/mutation/human/heckacious name = "heckacious larincks" desc = "duge what is WISH your words man..........." quality = MINOR_NEGATIVE - text_gain_indication = span_sans(span_red("aw SHIT man. your throat feels like FUCKASS.")) + text_gain_indication = span_sans("aw SHIT man. your throat feels like FUCKASS.") text_lose_indication = span_notice("The demonic entity possessing your larynx has finally released its grasp.") locked = TRUE - conflicts = list(/datum/mutation/human/trichromatic) // they both modify with the same spans. also would be way too annoying /datum/mutation/human/heckacious/on_acquiring(mob/living/carbon/human/owner) if(..()) @@ -111,11 +100,15 @@ // Random caps if(prob(10)) - editing_word = uppertext(editing_word) + editing_word = prob(85) ? uppertext(editing_word) : LOWER_TEXT(editing_word) // some times....... we add DOTS... if(prob(10)) for(var/dotnum in 1 to rand(2, 8)) editing_word += "." + // change for bold/italics/underline as well! + if(prob(10)) + var/extra_emphasis = pick("+", "_", "|") + editing_word = extra_emphasis + editing_word + extra_emphasis // If no replacement we do it manually if(!word_edited) @@ -133,9 +126,6 @@ patchword += replacetext(editing_word[letter], "", editing_word[letter] + editing_word[letter]) editing_word = patchword - // Some words are randomly recolored and resized so they get a few of these - editing_word = span_class_handler(editing_word) - LAZYADD(edited_message_words, editing_word) var/edited_message = jointext(edited_message_words, " ") @@ -144,74 +134,6 @@ speech_args[SPEECH_MESSAGE] = message -/datum/mutation/human/heckacious/proc/span_class_handler(message, looped = FALSE) - // Sadly combining span colors will not combine the colors of the message - if(prob(15)) - switch(rand(1,3)) - if(1) - message = span_red(message) - if(2) - message = span_blue(message) - if(3) - message = span_green(message) - if(prob(15)) - switch(rand(1,2)) - if(1) - message = span_big(message) - if(2) - message = span_small(message) - // do it AGAIN - if(prob(40)) - span_class_handler(message, looped = TRUE) - return message - -/datum/mutation/human/trichromatic - name = "Trichromatic Larynx" - desc = "A strange mutation originating from Clown Planet which alters the color of the patient's vocal chords." - quality = MINOR_NEGATIVE - text_gain_indication = span_red("You") + span_blue(" feel ") + span_green("Weird.") - text_lose_indication = span_notice("Your colors feel normal again.") - conflicts = list(/datum/mutation/human/heckacious) - -/datum/mutation/human/trichromatic/on_acquiring(mob/living/carbon/human/owner) - if(..()) - return - RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/datum/mutation/human/trichromatic/on_losing(mob/living/carbon/human/owner) - if(..()) - return - UnregisterSignal(owner, COMSIG_MOB_SAY) - -/datum/mutation/human/trichromatic/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - - var/message = speech_args[SPEECH_MESSAGE] - - var/list/message_words = splittext(message, " ") - var/list/static/span_combo_list = list("green", "red", "blue") - var/words_key = 1 - for(var/i in message_words) - message_words[words_key] = span_class_handler(message_words[words_key]) - words_key++ - - var/edited_message = jointext(message_words, " ") - - message = trim(edited_message) - - speech_args[SPEECH_MESSAGE] = message - -/datum/mutation/human/trichromatic/proc/span_class_handler(message) - // Sadly combining span colors will not combine the colors of the message - switch(rand(1,3)) - if(1) - message = span_red(message) - if(2) - message = span_blue(message) - if(3) - message = span_green(message) - return message - /datum/mutation/human/mute name = "Mute" desc = "Геном полностью подавляет отдел головного мозга, отвечающий за речевой аппарат." @@ -255,30 +177,11 @@ quality = MINOR_NEGATIVE text_gain_indication = span_notice("Ты ощущаешь себя шведом, что бы это ни значило.") text_lose_indication = span_notice("Ты перестаешь ощущать себя шведом.") + var/static/list/language_mutilation = list("w" = "v", "j" = "y", "bo" = "bjo", "a" = list("å","ä","æ","a"), "o" = list("ö","ø","o")) -/datum/mutation/human/swedish/on_acquiring(mob/living/carbon/human/owner) - if(..()) - return - RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/datum/mutation/human/swedish/on_losing(mob/living/carbon/human/owner) - if(..()) - return - UnregisterSignal(owner, COMSIG_MOB_SAY) - -/datum/mutation/human/swedish/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - - var/message = speech_args[SPEECH_MESSAGE] - if(message) - message = replacetext(message,"w","v") - message = replacetext(message,"j","y") - message = replacetext(message,"a",pick("å","ä","æ","a")) - message = replacetext(message,"bo","bjo") - message = replacetext(message,"o",pick("ö","ø","o")) - if(prob(30)) - message += " Bork[pick("",", bork",", bork, bork")]!" - speech_args[SPEECH_MESSAGE] = trim(message) +/datum/mutation/human/swedish/New(class, timer, datum/mutation/human/copymut) + . = ..() + AddComponent(/datum/component/speechmod, replacements = language_mutilation, end_string = list("",", bork",", bork, bork"), end_string_chance = 30) /datum/mutation/human/chav name = "Chav" @@ -288,35 +191,9 @@ text_gain_indication = span_notice("Ты ощущаешь себя мудаком, не так ли?") text_lose_indication = span_notice("Ты перестаешь ощущать себя грубым и нахальным.") -/datum/mutation/human/chav/on_acquiring(mob/living/carbon/human/owner) - if(..()) - return - RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/datum/mutation/human/chav/on_losing(mob/living/carbon/human/owner) - if(..()) - return - UnregisterSignal(owner, COMSIG_MOB_SAY) - -/datum/mutation/human/chav/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = " [message]" - var/list/chav_words = strings("chav_replacement.json", "chav") - - for(var/key in chav_words) - var/value = chav_words[key] - if(islist(value)) - value = pick(value) - - message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") - message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") - message = replacetextEx(message, " [key]", " [value]") - if(prob(30)) - message += ", mate" - speech_args[SPEECH_MESSAGE] = trim(message) +/datum/mutation/human/chav/New(class, timer, datum/mutation/human/copymut) + . = ..() + AddComponent(/datum/component/speechmod, replacements = strings("chav_replacement.json", "chav"), end_string = ", mate", end_string_chance = 30) /datum/mutation/human/elvis name = "Elvis" @@ -326,6 +203,14 @@ text_gain_indication = span_notice("Ты хорошо себя чувствуешь, куколка.") text_lose_indication = span_notice("Ты чувствуешь, что немного меньше разговоров не помешало бы.") +/datum/mutation/human/chav/New(class, timer, datum/mutation/human/copymut) + . = ..() + AddComponent(/datum/component/speechmod, replacements = strings("elvis_replacement.json", "elvis")) + +/datum/mutation/human/chav/New(class, timer, datum/mutation/human/copymut) + . = ..() + AddComponent(/datum/component/speechmod, replacements = strings("elvis_replacement.json", "elvis")) + /datum/mutation/human/elvis/on_life(seconds_per_tick, times_fired) switch(pick(1,2)) if(1) @@ -337,39 +222,10 @@ if(SPT_PROB(7.5, seconds_per_tick)) owner.visible_message("[owner] [pick("jiggles their hips", "rotates their hips", "gyrates their hips", "taps their foot", "dances to an imaginary song", "jiggles their legs", "snaps their fingers")]!") -/datum/mutation/human/elvis/on_acquiring(mob/living/carbon/human/owner) - if(..()) - return - RegisterSignal(owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - -/datum/mutation/human/elvis/on_losing(mob/living/carbon/human/owner) - if(..()) - return - UnregisterSignal(owner, COMSIG_MOB_SAY) - -/datum/mutation/human/elvis/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - - var/message = speech_args[SPEECH_MESSAGE] - if(message) - message = " [message] " - message = replacetext(message," i'm not "," I ain't ") - message = replacetext(message," girl ",pick(" honey "," baby "," baby doll ")) - message = replacetext(message," man ",pick(" son "," buddy "," brother"," pal "," friendo ")) - message = replacetext(message," out of "," outta ") - message = replacetext(message," thank you "," thank you, thank you very much ") - message = replacetext(message," thanks "," thank you, thank you very much ") - message = replacetext(message," what are you "," whatcha ") - message = replacetext(message," yes ",pick(" sure", "yea ")) - message = replacetext(message," muh valids "," my kicks ") - speech_args[SPEECH_MESSAGE] = trim(message) - - /datum/mutation/human/stoner name = "Stoner" desc = "Обычная мутация, которая сильно понижает интеллект." quality = NEGATIVE - locked = TRUE text_gain_indication = span_notice("Ты чувствуешь себя...максимально расслабленным, чувак!") text_lose_indication = span_notice("Ты чувствуешь, что твоё восприятие времени стало лучше.") diff --git a/code/datums/mutations/tongue_spike.dm b/code/datums/mutations/tongue_spike.dm index 4b639edf44013..8e3bf1383c08e 100644 --- a/code/datums/mutations/tongue_spike.dm +++ b/code/datums/mutations/tongue_spike.dm @@ -48,13 +48,7 @@ force = 2 throwforce = 25 throw_speed = 4 - embedding = list( - "impact_pain_mult" = 0, - "embedded_pain_multiplier" = 15, - "embed_chance" = 100, - "embedded_fall_chance" = 0, - "embedded_ignore_throwspeed_threshold" = TRUE, - ) + embed_type = /datum/embed_data/tongue_spike w_class = WEIGHT_CLASS_SMALL sharpness = SHARP_POINTY custom_materials = list(/datum/material/biomass = SMALL_MATERIAL_AMOUNT * 5) @@ -63,6 +57,13 @@ /// if we missed our target var/missed = TRUE +/datum/embed_data/tongue_spike + impact_pain_mult = 0 + pain_mult = 15 + embed_chance = 100 + fall_chance = 0 + ignore_throwspeed_threshold = TRUE + /obj/item/hardened_spike/Initialize(mapload, mob/living/carbon/source) . = ..() src.fired_by_ref = WEAKREF(source) @@ -110,17 +111,14 @@ desc = "Hardened biomass, shaped into... something." icon_state = "tonguespikechem" throwforce = 2 - embedding = list( - "impact_pain_mult" = 0, - "embedded_pain_multiplier" = 0, - "embed_chance" = 100, - "embedded_fall_chance" = 0, - "embedded_pain_chance" = 0, - "embedded_ignore_throwspeed_threshold" = TRUE, //never hurts once it's in you - ) + embed_type = /datum/embed_data/tongue_spike/chem /// Whether the tongue's already embedded in a target once before var/embedded_once_alread = FALSE +/datum/embed_data/tongue_spike/chem + pain_mult = 0 + pain_chance = 0 + /obj/item/hardened_spike/chem/embedded(mob/living/carbon/human/embedded_mob) . = ..() if(embedded_once_alread) diff --git a/code/datums/mutations/touch.dm b/code/datums/mutations/touch.dm index be34c9d9bb73a..06ccab06b989a 100644 --- a/code/datums/mutations/touch.dm +++ b/code/datums/mutations/touch.dm @@ -107,10 +107,10 @@ if(!istype(to_modify)) // null or invalid return - // More healing if powered up. - to_modify.heal_multiplier = GET_MUTATION_POWER(src) - // Less pain if synchronized. - to_modify.pain_multiplier = GET_MUTATION_SYNCHRONIZER(src) + // Transfers more damage if strengthened. (1.5 with power chromosome) + to_modify.power_coefficient = GET_MUTATION_POWER(src) + // Halves transferred damage if synchronized. (0.5 with synchronizer chromosome) + to_modify.synchronizer_coefficient = GET_MUTATION_SYNCHRONIZER(src) /datum/action/cooldown/spell/touch/lay_on_hands name = "Mending Touch" @@ -127,36 +127,55 @@ hand_path = /obj/item/melee/touch_attack/lay_on_hands draw_message = span_notice("You ready your hand to transfer injuries to yourself.") drop_message = span_notice("You lower your hand.") - /// Multiplies the amount healed, without increasing the received damage. + /// Multiplies the amount healed. var/heal_multiplier = 1 - /// Multiplies the incoming pain from healing. + /// Multiplies the incoming pain from healing. (Halved with synchronizer chromosome) var/pain_multiplier = 1 /// Icon used for beaming effect var/beam_icon = "blood" + /// The mutation's power coefficient. + var/power_coefficient = 1 + /// The mutation's synchronizer coefficient. + var/synchronizer_coefficient = 1 + +/datum/action/cooldown/spell/touch/lay_on_hands/create_hand(mob/living/carbon/cast_on) + . = ..() + if(!.) + return . + var/obj/item/bodypart/transfer_limb = cast_on.get_active_hand() + if(IS_ROBOTIC_LIMB(transfer_limb)) + to_chat(cast_on, span_notice("You fail to channel your mending powers through your inorganic hand.")) + return FALSE + + return TRUE /datum/action/cooldown/spell/touch/lay_on_hands/cast_on_hand_hit(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/mendicant) var/mob/living/hurtguy = victim + heal_multiplier = initial(heal_multiplier) * power_coefficient + pain_multiplier = initial(pain_multiplier) * synchronizer_coefficient + + // Message to show on a succesful heal if the healer has a special pacifism interaction with the mutation. + var/peaceful_message = null + // Heal more, hurt a bit more. // If you crunch the numbers it sounds crazy good, // but I think that's a fair reward for combining the efforts of Genetics, Medbay, and Mining to reach a hidden mechanic. if(HAS_TRAIT_FROM(mendicant, TRAIT_HIPPOCRATIC_OATH, HIPPOCRATIC_OATH_TRAIT)) heal_multiplier *= 2 pain_multiplier *= 0.5 - to_chat(mendicant, span_green("You can feel the magic of the Rod of Aesculapius aiding your efforts!")) + peaceful_message = span_boldnotice("You can feel the magic of the Rod of Aesculapius aiding your efforts!") beam_icon = "sendbeam" var/obj/item/rod_of_asclepius/rod = locate() in mendicant.contents if(rod) rod.add_filter("cool_glow", 2, list("type" = "outline", "color" = COLOR_VERY_PALE_LIME_GREEN, "size" = 1.25)) addtimer(CALLBACK(rod, TYPE_PROC_REF(/datum, remove_filter), "cool_glow"), 6 SECONDS) - - // If a normal pacifist, heal and hurt more! + // If a normal pacifist, transfer more. else if(HAS_TRAIT(mendicant, TRAIT_PACIFISM)) heal_multiplier *= 1.75 - pain_multiplier *= 1.75 - to_chat(mendicant, span_green("Your peaceful nature helps you guide all the pain to yourself.")) + peaceful_message = span_boldnotice("Your peaceful nature helps you guide all the pain to yourself.") var/success if(iscarbon(hurtguy)) @@ -164,17 +183,20 @@ else success = do_simple_heal(mendicant, hurtguy, heal_multiplier, pain_multiplier) + // No healies in the end, cancel + if(!success) + return FALSE + + if(peaceful_message) + to_chat(mendicant, peaceful_message) + // Both types can be ignited (technically at least), so we can just do this here. - if(hurtguy.has_status_effect(/datum/status_effect/fire_handler/fire_stacks)) + if(hurtguy.fire_stacks > 0) mendicant.set_fire_stacks(hurtguy.fire_stacks * pain_multiplier, remove_wet_stacks = TRUE) if(hurtguy.on_fire) mendicant.ignite_mob() hurtguy.extinguish_mob() - // No healies in the end, cancel - if(!success) - return FALSE - mendicant.Beam(hurtguy, icon_state = beam_icon, time = 0.5 SECONDS) beam_icon = initial(beam_icon) @@ -182,7 +204,7 @@ mendicant.update_damage_overlays() hurtguy.visible_message(span_notice("[mendicant] lays hands on [hurtguy]!")) - to_chat(target, span_boldnotice("[mendicant] lays hands on you, healing you!")) + to_chat(hurtguy, span_boldnotice("[mendicant] lays hands on you, healing you!")) new /obj/effect/temp_visual/heal(get_turf(hurtguy), COLOR_VERY_PALE_LIME_GREEN) return success @@ -201,7 +223,8 @@ if(IS_ORGANIC_LIMB(possible_limb)) mendicant_organic_limbs += possible_limb // None? Gtfo - if(isnull(mendicant_organic_limbs)) + if(!length(mendicant_organic_limbs)) + mendicant.balloon_alert(mendicant, "no organic limbs!") return . // Try to use our active hand, otherwise pick at random @@ -211,14 +234,15 @@ mendicant_transfer_limb.receive_damage(brute_to_heal * pain_multiplier, burn_to_heal * pain_multiplier, forced = TRUE, wound_bonus = CANT_WOUND) if(brute_to_heal) - hurtguy.adjustBruteLoss(brute_to_heal) + hurtguy.adjustBruteLoss(-brute_to_heal) . = TRUE if(burn_to_heal) - hurtguy.adjustFireLoss(burn_to_heal) + hurtguy.adjustFireLoss(-burn_to_heal) . = TRUE - return . + if(!.) + hurtguy.balloon_alert(mendicant, "unhurt!") /datum/action/cooldown/spell/touch/lay_on_hands/proc/do_complicated_heal(mob/living/carbon/mendicant, mob/living/carbon/hurtguy, heal_multiplier, pain_multiplier) @@ -232,8 +256,12 @@ mendicant_organic_limbs += possible_limb // If we have no organic available limbs just give up. - if(!length(mendicant_organic_limbs) || !length(hurt_limbs)) - return + if(!length(mendicant_organic_limbs)) + mendicant.balloon_alert(mendicant, "no organic limbs!") + return . + if(!length(hurt_limbs)) + hurtguy.balloon_alert(mendicant, "no damaged organic limbs!") + return . // Counter to make sure we don't take too much from separate limbs var/total_damage_healed = 0 @@ -244,28 +272,71 @@ if(!(mendicant_transfer_limb in mendicant_organic_limbs)) mendicant_transfer_limb = pick(mendicant_organic_limbs) - // Transfer at most 35 damage by default. + // Transfer at most 35 damage, by default. var/brute_damage = min(affected_limb.brute_dam, 35 * heal_multiplier) // no double dipping var/burn_damage = min(affected_limb.burn_dam, (35 * heal_multiplier) - brute_damage) if((brute_damage || burn_damage) && total_damage_healed < (35 * heal_multiplier)) - total_damage_healed = brute_damage + burn_damage + total_damage_healed += brute_damage + burn_damage . = TRUE + var/brute_taken = brute_damage * pain_multiplier + var/burn_taken = burn_damage * pain_multiplier // Heal! - affected_limb.heal_damage(brute_damage * heal_multiplier, burn_damage * heal_multiplier, required_bodytype = BODYTYPE_ORGANIC) + affected_limb.heal_damage(brute_damage, burn_damage, required_bodytype = BODYTYPE_ORGANIC) // Hurt! - mendicant_transfer_limb.receive_damage(brute_damage * pain_multiplier, burn_damage * pain_multiplier, forced = TRUE, wound_bonus = CANT_WOUND) + mendicant_transfer_limb.receive_damage(brute_taken, burn_taken, forced = TRUE, wound_bonus = CANT_WOUND) // Force light wounds onto you. for(var/datum/wound/iter_wound as anything in affected_limb.wounds) - if(iter_wound.severity > WOUND_SEVERITY_MODERATE) - continue + switch(iter_wound.severity) + if(WOUND_SEVERITY_SEVERE) // half and half + if(prob(50 * heal_multiplier)) + continue + if(WOUND_SEVERITY_CRITICAL) + if(heal_multiplier < 1.5) // need buffs to transfer crit wounds + continue . = TRUE iter_wound.remove_wound() iter_wound.apply_wound(mendicant_transfer_limb) + if(HAS_TRAIT(mendicant, TRAIT_NOBLOOD)) + return . - return . + // 10% base + var/max_blood_transfer = (BLOOD_VOLUME_NORMAL * 0.10) * heal_multiplier + // Too little blood + if(hurtguy.blood_volume < BLOOD_VOLUME_NORMAL) + var/max_blood_to_hurtguy = min(mendicant.blood_volume, BLOOD_VOLUME_NORMAL - hurtguy.blood_volume) + var/blood_to_hurtguy = min(max_blood_transfer, max_blood_to_hurtguy) + if(!blood_to_hurtguy) + return . + // We ignore incompatibility here. + mendicant.transfer_blood_to(hurtguy, blood_to_hurtguy, forced = TRUE, ignore_incompatibility = TRUE) + to_chat(mendicant, span_notice("Your veins (and brain) feel a bit lighter.")) + . = TRUE + // Because we do our own spin on it! + if(hurtguy.get_blood_compatibility(mendicant) == FALSE) + hurtguy.adjustToxLoss((blood_to_hurtguy * 0.1) * pain_multiplier) // 1 dmg per 10 blood + to_chat(hurtguy, span_notice("Your veins feel thicker, but they itch a bit.")) + else + to_chat(hurtguy, span_notice("Your veins feel thicker!")) + + // Too MUCH blood + if(hurtguy.blood_volume > BLOOD_VOLUME_MAXIMUM) + var/max_blood_to_mendicant = BLOOD_VOLUME_EXCESS - hurtguy.blood_volume + var/blood_to_mendicant = min(max_blood_transfer, max_blood_to_mendicant) + // mender always gonna have blood + + // We ignore incompatibility here. + hurtguy.transfer_blood_to(mendicant, hurtguy.blood_volume - BLOOD_VOLUME_EXCESS, forced = TRUE, ignore_incompatibility = TRUE) + to_chat(hurtguy, span_notice("Your veins don't feel quite so swollen anymore.")) + . = TRUE + // Because we do our own spin on it! + if(mendicant.get_blood_compatibility(hurtguy) == FALSE) + mendicant.adjustToxLoss((blood_to_mendicant * 0.1) * pain_multiplier) // 1 dmg per 10 blood + to_chat(mendicant, span_notice("Your veins swell and itch!")) + else + to_chat(mendicant, span_notice("Your veins swell!")) /obj/item/melee/touch_attack/lay_on_hands name = "mending touch" diff --git a/code/datums/proximity_monitor/field.dm b/code/datums/proximity_monitor/field.dm index 03e7c054d0908..e3f0ade5e7dba 100644 --- a/code/datums/proximity_monitor/field.dm +++ b/code/datums/proximity_monitor/field.dm @@ -168,6 +168,7 @@ /obj/item/multitool/field_debug name = "strange multitool" desc = "Seems to project a colored field!" + apc_scanner = FALSE var/operating = FALSE var/range_to_use = 5 var/datum/proximity_monitor/advanced/debug/current = null diff --git a/code/datums/quirks/negative_quirks/prosthetic_limb.dm b/code/datums/quirks/negative_quirks/prosthetic_limb.dm index 2d3aa36cdf3ba..502c41c6f16ea 100644 --- a/code/datums/quirks/negative_quirks/prosthetic_limb.dm +++ b/code/datums/quirks/negative_quirks/prosthetic_limb.dm @@ -16,9 +16,9 @@ customization_options = list(/datum/preference/choiced/prosthetic) /datum/quirk/prosthetic_limb/add_unique(client/client_source) - var/limb_type = GLOB.limb_choice[client_source?.prefs?.read_preference(/datum/preference/choiced/prosthetic)] + var/limb_type = GLOB.prosthetic_limb_choice[client_source?.prefs?.read_preference(/datum/preference/choiced/prosthetic)] if(isnull(limb_type)) //Client gone or they chose a random prosthetic - limb_type = GLOB.limb_choice[pick(GLOB.limb_choice)] + limb_type = GLOB.prosthetic_limb_choice[pick(GLOB.prosthetic_limb_choice)] var/mob/living/carbon/human/human_holder = quirk_holder var/obj/item/bodypart/surplus = new limb_type() diff --git a/code/datums/quirks/neutral_quirks/transhumanist.dm b/code/datums/quirks/neutral_quirks/transhumanist.dm index 1030b3bbc354e..21665ac303df7 100644 --- a/code/datums/quirks/neutral_quirks/transhumanist.dm +++ b/code/datums/quirks/neutral_quirks/transhumanist.dm @@ -110,6 +110,14 @@ if(isnull(part_type)) //Client gone or they chose a random part part_type = GLOB.part_choice_transhuman[pick(GLOB.part_choice_transhuman)] + if(quirk_holder.has_quirk(/datum/quirk/prosthetic_limb)) + var/obj/item/bodypart/shit_limb = GLOB.prosthetic_limb_choice[client_source?.prefs?.read_preference(/datum/preference/choiced/prosthetic)] + var/obj/item/bodypart/part_part = part_type + if(ispath(shit_limb, /obj/item/bodypart) && ispath(part_part, /obj/item/bodypart)) + // dumbass already has a part in the same spot so let's just let the shoddy trait do its thing instead + if(initial(shit_limb.body_zone) == initial(part_part.body_zone)) + return + var/mob/living/carbon/human/human_holder = quirk_holder var/obj/item/new_part = new part_type() if(isbodypart(new_part)) diff --git a/code/datums/ruins/icemoon.dm b/code/datums/ruins/icemoon.dm index 73153792ee647..14909ab0861f5 100644 --- a/code/datums/ruins/icemoon.dm +++ b/code/datums/ruins/icemoon.dm @@ -123,7 +123,7 @@ suffix = "icemoon_underground_hermit.dmm" /datum/map_template/ruin/icemoon/underground/lavaland - name = "Ice-Ruin Lavaland Site" + name = "Ice-Ruin Lavaland Incursion" id = "lavalandsite" description = "I guess we never really left you huh?" suffix = "icemoon_underground_lavaland.dmm" diff --git a/code/datums/shuttles/arrival.dm b/code/datums/shuttles/arrival.dm index 376de809afa23..645147ee5ba67 100644 --- a/code/datums/shuttles/arrival.dm +++ b/code/datums/shuttles/arrival.dm @@ -26,10 +26,6 @@ suffix = "pubby" name = "arrival shuttle (Pubby)" -/datum/map_template/shuttle/arrival/omega - suffix = "omega" - name = "arrival shuttle (Omega)" - /datum/map_template/shuttle/arrival/northstar suffix = "northstar" name = "arrival shuttle (North Star)" diff --git a/code/datums/shuttles/cargo.dm b/code/datums/shuttles/cargo.dm index a18b7a4ac9af7..8f5d83619f416 100644 --- a/code/datums/shuttles/cargo.dm +++ b/code/datums/shuttles/cargo.dm @@ -11,10 +11,6 @@ suffix = "birdboat" name = "supply shuttle (Birdboat)" -/datum/map_template/shuttle/cargo/donut - suffix = "donut" - name = "supply shuttle (Donut)" - /datum/map_template/shuttle/cargo/pubby suffix = "pubby" name = "supply shuttle (Pubby)" diff --git a/code/datums/shuttles/ferry.dm b/code/datums/shuttles/ferry.dm index e4f540992ff06..a0d3eac82d971 100644 --- a/code/datums/shuttles/ferry.dm +++ b/code/datums/shuttles/ferry.dm @@ -33,8 +33,3 @@ suffix = "kilo" name = "kilo transport ferry" description = "Standard issue CentCom Ferry for Kilo pattern stations. Includes additional equipment and rechargers." - -/datum/map_template/shuttle/ferry/northstar - suffix = "northstar" - name = "north star transport ferry" - description = "In the very depths of the frontier, you'll need a rugged shuttle capable of delivering crew, this is that." diff --git a/code/datums/shuttles/hunter.dm b/code/datums/shuttles/hunter.dm index d8b7f708324e2..ade978c937e07 100644 --- a/code/datums/shuttles/hunter.dm +++ b/code/datums/shuttles/hunter.dm @@ -17,3 +17,7 @@ /datum/map_template/shuttle/hunter/psyker suffix = "psyker" name = "Psyker Fortune-Telling Ship" + +/datum/map_template/shuttle/hunter/mi13_foodtruck + suffix = "mi13_foodtruck" + name = "Perfectly Ordinary Food Truck" diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm index e5cf49475e22e..5c7f99daf7e25 100644 --- a/code/datums/sprite_accessories.dm +++ b/code/datums/sprite_accessories.dm @@ -26,7 +26,7 @@ /// Determines if the accessory will be skipped or included in random hair generations. var/gender = NEUTER /// Something that can be worn by either gender, but looks different on each. - var/gender_specific + var/gender_specific = FALSE /// Determines if the accessory will be skipped by color preferences. var/use_static /** @@ -46,6 +46,9 @@ var/dimension_y = 32 /// Should this sprite block emissives? var/em_block = FALSE + /// Determines if this is considered "sane" for the purpose of [/proc/randomize_human_normie] + /// Basically this is to blacklist the extremely wacky stuff from being picked in random human generation. + var/natural_spawn = TRUE /datum/sprite_accessory/blank name = "None" @@ -74,11 +77,13 @@ /datum/sprite_accessory/hair/afro_large name = "Afro (Large)" icon_state = "hair_bigafro" + natural_spawn = FALSE /datum/sprite_accessory/hair/afro_huge name = "Afro (Huge)" icon_state = "hair_hugeafro" y_offset = 6 + natural_spawn = FALSE /datum/sprite_accessory/hair/allthefuzz name = "All The Fuzz" @@ -119,6 +124,7 @@ /datum/sprite_accessory/hair/bedheadfloorlength name = "Floorlength Bedhead" icon_state = "hair_floorlength_bedhead" + natural_spawn = FALSE /datum/sprite_accessory/hair/badlycut name = "Shorter Long Bedhead" @@ -359,6 +365,7 @@ /datum/sprite_accessory/hair/bigflattop name = "Flat Top (Big)" icon_state = "hair_bigflattop" + natural_spawn = FALSE /datum/sprite_accessory/hair/flow_hair name = "Flow Hair" @@ -419,6 +426,7 @@ /datum/sprite_accessory/hair/joestar name = "Joestar" icon_state = "hair_joestar" + natural_spawn = FALSE /datum/sprite_accessory/hair/keanu name = "Keanu Hair" @@ -475,22 +483,27 @@ /datum/sprite_accessory/hair/mohawk name = "Mohawk" icon_state = "hair_d" + natural_spawn = FALSE // sorry little one /datum/sprite_accessory/hair/nitori name = "Nitori" icon_state = "hair_nitori" + natural_spawn = FALSE /datum/sprite_accessory/hair/reversemohawk name = "Mohawk (Reverse)" icon_state = "hair_reversemohawk" + natural_spawn = FALSE /datum/sprite_accessory/hair/shavedmohawk name = "Mohawk (Shaved)" icon_state = "hair_shavedmohawk" + natural_spawn = FALSE /datum/sprite_accessory/hair/unshavenmohawk name = "Mohawk (Unshaven)" icon_state = "hair_unshaven_mohawk" + natural_spawn = FALSE /datum/sprite_accessory/hair/mulder name = "Mulder" @@ -499,6 +512,7 @@ /datum/sprite_accessory/hair/odango name = "Odango" icon_state = "hair_odango" + natural_spawn = FALSE /datum/sprite_accessory/hair/ombre name = "Ombre" @@ -531,14 +545,17 @@ /datum/sprite_accessory/hair/kagami name = "Pigtails" icon_state = "hair_kagami" + natural_spawn = FALSE /datum/sprite_accessory/hair/pigtail name = "Pigtails 2" icon_state = "hair_pigtails" + natural_spawn = FALSE /datum/sprite_accessory/hair/pigtail2 name = "Pigtails 3" icon_state = "hair_pigtails2" + natural_spawn = FALSE /datum/sprite_accessory/hair/pixie name = "Pixie Cut" @@ -917,6 +934,7 @@ /datum/sprite_accessory/facial_hair/brokenman name = "Beard (Broken Man)" icon_state = "facial_brokenman" + natural_spawn = FALSE /datum/sprite_accessory/facial_hair/chinstrap name = "Beard (Chinstrap)" @@ -961,6 +979,7 @@ /datum/sprite_accessory/facial_hair/martialartist name = "Beard (Martial Artist)" icon_state = "facial_martialartist" + natural_spawn = FALSE /datum/sprite_accessory/facial_hair/chinlessbeard name = "Beard (Chinless Beard)" diff --git a/code/datums/station_traits/positive_traits.dm b/code/datums/station_traits/positive_traits.dm index 99ed18f6fc734..1af74533775fa 100644 --- a/code/datums/station_traits/positive_traits.dm +++ b/code/datums/station_traits/positive_traits.dm @@ -63,6 +63,55 @@ /datum/station_trait/bountiful_bounties/on_round_start() SSeconomy.bounty_modifier *= 1.2 +///A positive station trait that scatters a bunch of lit glowsticks throughout maintenance +/datum/station_trait/glowsticks + name = "Glowsticks party" + trait_type = STATION_TRAIT_POSITIVE + weight = 2 + show_in_report = TRUE + report_message = "We've glowsticks upon glowsticks to spare, so we scattered some around maintenance (plus a couple floor lights)." + +/datum/station_trait/glowsticks/New() + ..() + RegisterSignal(SSticker, COMSIG_TICKER_ENTER_PREGAME, PROC_REF(on_pregame)) + +/datum/station_trait/glowsticks/proc/on_pregame(datum/source) + SIGNAL_HANDLER + INVOKE_ASYNC(src, PROC_REF(light_up_the_night)) + +/datum/station_trait/glowsticks/proc/light_up_the_night() + var/list/glowsticks = list( + /obj/item/flashlight/glowstick, + /obj/item/flashlight/glowstick/red, + /obj/item/flashlight/glowstick/blue, + /obj/item/flashlight/glowstick/cyan, + /obj/item/flashlight/glowstick/orange, + /obj/item/flashlight/glowstick/yellow, + /obj/item/flashlight/glowstick/pink, + ) + for(var/area/station/maintenance/maint in GLOB.areas) + var/list/turfs = get_area_turfs(maint) + for(var/i in 1 to round(length(turfs) * 0.115)) + CHECK_TICK + var/turf/open/chosen = pick_n_take(turfs) + if(!istype(chosen)) + continue + var/skip_this = FALSE + for(var/atom/movable/mov as anything in chosen) //stop glowing sticks from spawning on windows + if(mov.density && !(mov.pass_flags_self & LETPASSTHROW)) + skip_this = TRUE + break + if(skip_this) + continue + if(prob(3.4)) ///Rare, but this is something that can survive past the lifespawn of glowsticks. + new /obj/machinery/light/floor(chosen) + continue + var/stick_type = pick(glowsticks) + var/obj/item/flashlight/glowstick/stick = new stick_type(chosen) + ///we want a wider range, otherwise they'd all burn out in about 20 minutes. + stick.max_fuel = stick.fuel = rand(10 MINUTES, 45 MINUTES) + stick.turn_on() + /datum/station_trait/strong_supply_lines name = "Strong supply lines" trait_type = STATION_TRAIT_POSITIVE diff --git a/code/datums/status_effects/debuffs/staggered.dm b/code/datums/status_effects/debuffs/staggered.dm index 89cf4943c1980..9db72e1fd06ee 100644 --- a/code/datums/status_effects/debuffs/staggered.dm +++ b/code/datums/status_effects/debuffs/staggered.dm @@ -1,3 +1,7 @@ +/// Staggered, Next Shove Stuns, No Side Kick +/// Status effects related to shoving effects and collisions due to shoving + +/// Staggered can occur most often via shoving, but can also occur in other places too. /datum/status_effect/staggered id = "staggered" tick_interval = 0.5 SECONDS @@ -43,3 +47,88 @@ /mob/living/proc/do_stagger_animation() animate(src, pixel_x = 4, time = 0.2 SECONDS, loop = 6, flags = ANIMATION_RELATIVE|ANIMATION_PARALLEL) animate(pixel_x = -4, time = 0.2 SECONDS, flags = ANIMATION_RELATIVE) + +/// Status effect specifically for instances where someone is vulnerable to being stunned when shoved. +/datum/status_effect/next_shove_stuns + id = "next shove stuns" + duration = 3 SECONDS + status_type = STATUS_EFFECT_UNIQUE + tick_interval = 0.5 SECONDS + alert_type = null + remove_on_fullheal = TRUE + /// Our visual cue for the vulnerable state this status effect puts us in. + var/mutable_appearance/vulnverability_overlay + +/datum/status_effect/next_shove_stuns/on_apply() + //Let's just clear this if they're dead or we can't stun them on a shove + if(owner.stat == DEAD || HAS_TRAIT(owner, TRAIT_NO_SIDE_KICK) || HAS_TRAIT(owner, TRAIT_IMMOBILIZED)) + return FALSE + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(clear_stun_vulnverability_on_death)) + RegisterSignals(owner, list( + COMSIG_LIVING_STATUS_PARALYZE, + COMSIG_LIVING_STATUS_STUN, + COMSIG_LIVING_STATUS_IMMOBILIZE), PROC_REF(clear_stun_vulnverability) + ) + ADD_TRAIT(owner, TRAIT_STUN_ON_NEXT_SHOVE, STATUS_EFFECT_TRAIT) + vulnverability_overlay = mutable_appearance(icon = 'icons/effects/effects.dmi', icon_state = "dazed") + owner.add_overlay(vulnverability_overlay) + return TRUE + +/datum/status_effect/next_shove_stuns/on_remove() + UnregisterSignal(owner, list( + COMSIG_LIVING_STATUS_PARALYZE, + COMSIG_LIVING_STATUS_STUN, + COMSIG_LIVING_STATUS_IMMOBILIZE, + COMSIG_LIVING_DEATH, + )) + REMOVE_TRAIT(owner, TRAIT_STUN_ON_NEXT_SHOVE, STATUS_EFFECT_TRAIT) + if(vulnverability_overlay) + clear_stun_vulnverability_overlay() + +/// If our owner is either stunned, paralzyed or immobilized, we remove the status effect. +/// This is both an anti-chainstun measure and a sanity check. +/datum/status_effect/next_shove_stuns/proc/clear_stun_vulnverability(mob/living/source, amount = 0, ignore_canstun = FALSE) + SIGNAL_HANDLER + + if(amount > 0) + // Making absolutely sure we're removing this overlay + clear_stun_vulnverability_overlay() + qdel(src) + +/datum/status_effect/next_shove_stuns/proc/clear_stun_vulnverability_on_death(mob/living/source) + SIGNAL_HANDLER + + clear_stun_vulnverability_overlay() + qdel(src) + +/// Clears our overlay where needed. +/datum/status_effect/next_shove_stuns/proc/clear_stun_vulnverability_overlay() + owner.cut_overlay(vulnverability_overlay) + vulnverability_overlay = null + +/// Status effect to prevent stuns from a shove +/// Only applied by shoving someone to paralyze them +/datum/status_effect/no_side_kick + id = "no side kick" + duration = 3.5 SECONDS + status_type = STATUS_EFFECT_UNIQUE + tick_interval = 0.5 SECONDS + alert_type = null + remove_on_fullheal = TRUE + +/datum/status_effect/no_side_kick/on_apply() + // Once again, clear if dead + if(owner.stat == DEAD) + return FALSE + RegisterSignal(owner, COMSIG_LIVING_DEATH, PROC_REF(clear_on_death)) + ADD_TRAIT(owner, TRAIT_NO_SIDE_KICK, STATUS_EFFECT_TRAIT) + return TRUE + +/datum/status_effect/no_side_kick/on_remove() + UnregisterSignal(owner, list(COMSIG_LIVING_DEATH)) + REMOVE_TRAIT(owner, TRAIT_NO_SIDE_KICK, STATUS_EFFECT_TRAIT) + +/datum/status_effect/no_side_kick/proc/clear_on_death(mob/living/source) + SIGNAL_HANDLER + + qdel(src) diff --git a/code/datums/status_effects/debuffs/stamcrit.dm b/code/datums/status_effects/debuffs/stamcrit.dm index 05433244df09c..c0359c7ddf3b1 100644 --- a/code/datums/status_effects/debuffs/stamcrit.dm +++ b/code/datums/status_effects/debuffs/stamcrit.dm @@ -28,6 +28,8 @@ return FALSE if(owner.check_stun_immunity(CANKNOCKDOWN)) return FALSE + if(SEND_SIGNAL(owner, COMSIG_LIVING_ENTER_STAMCRIT) & STAMCRIT_CANCELLED) + return FALSE . = ..() if(!.) diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm index ca9cff19c73a8..16ffb326f8a86 100644 --- a/code/datums/weather/weather.dm +++ b/code/datums/weather/weather.dm @@ -56,7 +56,7 @@ /// The list of z-levels that this weather is actively affecting var/impacted_z_levels - /// Since it's above everything else, this is the layer used by default. TURF_LAYER is below mobs and walls if you need to use that. + /// Since it's above everything else, this is the layer used by default. var/overlay_layer = AREA_LAYER /// Plane for the overlay var/overlay_plane = AREA_PLANE diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 8049f08d8dcf4..584e862eb5d51 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -126,7 +126,7 @@ A.update_appearance() if(WIRE_IDSCAN) // Pulse to disable emergency access and flash the red lights. if(A.hasPower() && A.density) - A.do_animate("deny") + A.run_animation(DOOR_DENY_ANIMATION) if(A.emergency) A.emergency = FALSE A.update_appearance() diff --git a/code/datums/wires/mecha.dm b/code/datums/wires/mecha.dm index b6e20c8161f45..4e11eda65f7f6 100644 --- a/code/datums/wires/mecha.dm +++ b/code/datums/wires/mecha.dm @@ -3,7 +3,7 @@ proper_name = "Mecha Control" /datum/wires/mecha/New(atom/holder) - wires = list(WIRE_IDSCAN, WIRE_DISARM, WIRE_ZAP, WIRE_OVERCLOCK) + wires = list(WIRE_IDSCAN, WIRE_DISARM, WIRE_ZAP, WIRE_OVERCLOCK, WIRE_LAUNCH) var/obj/vehicle/sealed/mecha/mecha = holder if(mecha.mecha_flags & HAS_LIGHTS) wires += WIRE_LIGHT @@ -27,7 +27,7 @@ status += "The blue light is [mecha.equipment_disabled ? "on" : "off"]." return status -/datum/wires/mecha/on_pulse(wire) +/datum/wires/mecha/on_pulse(wire, user) var/obj/vehicle/sealed/mecha/mecha = holder switch(wire) if(WIRE_IDSCAN) @@ -42,6 +42,8 @@ mecha.set_light_on(!mecha.light_on) if(WIRE_OVERCLOCK) mecha.toggle_overclock() + if(WIRE_LAUNCH) + try_attack(user) /datum/wires/mecha/on_cut(wire, mend, source) var/obj/vehicle/sealed/mecha/mecha = holder @@ -58,11 +60,40 @@ mecha.internal_damage &= ~MECHA_INT_SHORT_CIRCUIT else mecha.internal_damage |= MECHA_INT_SHORT_CIRCUIT + if(isliving(source)) + mecha.shock(source, 50) if(WIRE_LIGHT) mecha.set_light_on(!mend) if(WIRE_OVERCLOCK) if(!mend) mecha.toggle_overclock(FALSE) + if(WIRE_LAUNCH) + if(!mend) + try_attack(source) + +/datum/wires/mecha/proc/try_attack(mob/living/target) + var/obj/vehicle/sealed/mecha/mecha = holder + if(mecha.occupant_amount()) //no powergamers sorry + return + var/list/obj/item/mecha_parts/mecha_equipment/armaments = list() + if(!isnull(mecha.equip_by_category[MECHA_R_ARM])) + armaments += mecha.equip_by_category[MECHA_R_ARM] + if(!isnull(mecha.equip_by_category[MECHA_L_ARM])) + armaments += mecha.equip_by_category[MECHA_L_ARM] + var/obj/item/mecha_parts/mecha_equipment/armament = length(armaments) ? pick(armaments) : null //null makes a melee attack + if(isnull(target)) + target = locate() in view(length(armaments) ? 5 : 1, mecha) + if(isnull(target)) // still no target + return + + var/disabled = mecha.equipment_disabled + if(!isnull(armament) && armament.range & MECHA_RANGED) + mecha.equipment_disabled = FALSE // honestly just avoid this wire + INVOKE_ASYNC(armament, TYPE_PROC_REF(/obj/item/mecha_parts/mecha_equipment, action), mecha, target) + mecha.equipment_disabled = disabled + return + if(mecha.Adjacent(target) && !TIMER_COOLDOWN_RUNNING(mecha, COOLDOWN_MECHA_MELEE_ATTACK) && target.mech_melee_attack(mecha)) + TIMER_COOLDOWN_START(mecha, COOLDOWN_MECHA_MELEE_ATTACK, mecha.melee_cooldown) /datum/wires/mecha/ui_act(action, params) . = ..() diff --git a/code/datums/wounds/cranial_fissure.dm b/code/datums/wounds/cranial_fissure.dm index 9bd9969f428cd..0b7c00dee7e32 100644 --- a/code/datums/wounds/cranial_fissure.dm +++ b/code/datums/wounds/cranial_fissure.dm @@ -12,10 +12,16 @@ viable_zones = list(BODY_ZONE_HEAD) /datum/wound_pregen_data/cranial_fissure/get_weight(obj/item/bodypart/limb, woundtype, damage, attack_direction, damage_source) - if (limb.owner?.stat < HARD_CRIT) - return 0 + if (isnull(limb.owner)) + return ..() - return ..() + if (HAS_TRAIT(limb.owner, TRAIT_CURSED) && (limb.get_mangled_state() & BODYPART_MANGLED_INTERIOR)) + return ..() + + if (limb.owner.stat >= HARD_CRIT) + return ..() + + return 0 /// A wound applied when receiving significant enough damage to the head. /// Will allow other players to take your eyes out of your head, and slipping diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 51d660af0459f..0c6847e7db348 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -540,39 +540,9 @@ GLOBAL_LIST_EMPTY(teleportlocs) for(var/atom/movable/recipient as anything in arrived.important_recursive_contents[RECURSIVE_CONTENTS_AREA_SENSITIVE]) SEND_SIGNAL(recipient, COMSIG_ENTER_AREA, src) - if(!isliving(arrived)) - return - - var/mob/living/L = arrived - if(!L.ckey) - return - - if(ambient_buzz != old_area.ambient_buzz) - L.refresh_looping_ambience() - -///Tries to play looping ambience to the mobs. -/mob/proc/refresh_looping_ambience() - if(!client) //if a tree falls in the woods... - return - var/area/my_area = get_area(src) - var/sound_to_use = my_area.ambient_buzz - - if(!sound_to_use || !(client.prefs.read_preference(/datum/preference/toggle/sound_ship_ambience))) - SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = CHANNEL_BUZZ)) - client.current_ambient_sound = null - return - - if(!can_hear()) - SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = CHANNEL_BUZZ)) - client.current_ambient_sound = null - return - - if(sound_to_use == client.current_ambient_sound) - return //don't reset current loops. - - client.current_ambient_sound = sound_to_use - SEND_SOUND(src, sound(sound_to_use, repeat = 1, wait = 0, volume = my_area.ambient_buzz_vol, channel = CHANNEL_BUZZ)) - + if(ismob(arrived)) + var/mob/mob = arrived + mob.update_ambience_area(src) /** * Called when an atom exits an area @@ -597,6 +567,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) beauty = 0 return FALSE //Too big beauty = totalbeauty / areasize + SEND_SIGNAL(src, COMSIG_AREA_BEAUTY_UPDATED) /** * Setup an area (with the given name) diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index e27d330ae250e..504efe0742ad1 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -73,6 +73,11 @@ name = "Russian Cargo Hauler" requires_power = TRUE +/area/shuttle/hunter/mi13_foodtruck + name = "Perfectly Ordinary Food Truck" + requires_power = TRUE + ambience_index = AMBIENCE_DANGER + ////////////////////////////White Ship//////////////////////////// /area/shuttle/abandoned diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index 9eaec1b48378e..4a398a635a73c 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -5,7 +5,7 @@ * as much as possible to the components/elements system */ /atom - layer = TURF_LAYER + layer = ABOVE_NORMAL_TURF_LAYER plane = GAME_PLANE appearance_flags = TILE_BOUND|LONG_GLIDE diff --git a/code/game/atom/atom_tool_acts.dm b/code/game/atom/atom_tool_acts.dm index d055f22759e3e..10bed5a407760 100644 --- a/code/game/atom/atom_tool_acts.dm +++ b/code/game/atom/atom_tool_acts.dm @@ -276,14 +276,6 @@ /atom/proc/multitool_act_secondary(mob/living/user, obj/item/tool) return -///Check if an item supports a data buffer (is a multitool) -/atom/proc/multitool_check_buffer(user, obj/item/multitool, silent = FALSE) - if(!istype(multitool, /obj/item/multitool)) - if(user && !silent) - to_chat(user, span_warning("[multitool] has no data buffer!")) - return FALSE - return TRUE - /// Called on an object when a tool with screwdriver capabilities is used to left click an object /atom/proc/screwdriver_act(mob/living/user, obj/item/tool) return diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index a8ae65ef24cd4..45257841c462d 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -831,10 +831,13 @@ return //Just delete us, no need to call anything else. on_deconstruction(disassembled) + + if(circuit) + spawn_frame(disassembled) + if(!LAZYLEN(component_parts)) dump_contents() //drop everything inside us return //we don't have any parts. - spawn_frame(disassembled) for(var/part in component_parts) if(istype(part, /datum/stock_part)) diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 117577e66eb83..08cd5bdc61a11 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/devices/tool.dmi' icon_state = "ai-slipper0" base_icon_state = "ai-slipper" - layer = PROJECTILE_HIT_THRESHHOLD_LAYER + layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE max_integrity = 200 armor_type = /datum/armor/machinery_ai_slipper diff --git a/code/game/machinery/botlaunchpad.dm b/code/game/machinery/botlaunchpad.dm index c8004af84ba86..fecca2a25489f 100644 --- a/code/game/machinery/botlaunchpad.dm +++ b/code/game/machinery/botlaunchpad.dm @@ -21,17 +21,14 @@ /obj/machinery/botpad/crowbar_act(mob/user, obj/item/tool) return default_deconstruction_crowbar(tool) -/obj/machinery/botpad/multitool_act(mob/living/user, obj/item/tool) +/obj/machinery/botpad/multitool_act(mob/living/user, obj/item/multitool/tool) if(!panel_open) - return - if(!multitool_check_buffer(user, tool)) - return + return NONE var/obj/item/multitool/multitool = tool multitool.set_buffer(src) balloon_alert(user, "saved to multitool buffer") return ITEM_INTERACT_SUCCESS - // Checks the turf for a bot and launches it if it's the only mob on the pad. /obj/machinery/botpad/proc/launch(mob/living/user) var/turf/reverse_turf = get_turf(user) diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 2b5cfa14c7c28..97bf368d3e25e 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -205,3 +205,6 @@ . = ..() if(active_apc) disconnect_apc() + +/obj/machinery/computer/apc_control/away + req_access = list(ACCESS_AWAY_ENGINEERING) diff --git a/code/game/machinery/computer/arcade/battle.dm b/code/game/machinery/computer/arcade/battle.dm index b97dac9e15dad..9733759b5caf4 100644 --- a/code/game/machinery/computer/arcade/battle.dm +++ b/code/game/machinery/computer/arcade/battle.dm @@ -505,7 +505,7 @@ return TRUE if(BATTLE_ARCADE_PLAYER_HEAVY_ATTACK) if(player_current_mp < SPELL_MP_COST) - say("You don't have enough MP to counterattack!") + say("You don't have enough MP to heavy attack!") player_turn = TRUE return TRUE player_current_mp -= SPELL_MP_COST diff --git a/code/game/machinery/computer/atmos_computers/inlets.dm b/code/game/machinery/computer/atmos_computers/inlets.dm index 32de77cc632de..474ccae2c14e1 100644 --- a/code/game/machinery/computer/atmos_computers/inlets.dm +++ b/code/game/machinery/computer/atmos_computers/inlets.dm @@ -4,6 +4,14 @@ /// The air sensor type this injector is linked to var/chamber_id +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/layer2 + piping_layer = 2 + icon_state = "inje_map-2" + +/obj/machinery/atmospherics/components/unary/outlet_injector/monitored/layer4 + piping_layer = 4 + icon_state = "inje_map-4" + /obj/machinery/atmospherics/components/unary/outlet_injector/monitored/Initialize(mapload) id_tag = CHAMBER_INPUT_FROM_ID(chamber_id) return ..() diff --git a/code/game/machinery/computer/launchpad_control.dm b/code/game/machinery/computer/launchpad_control.dm index 54ff5e0f31369..7c6d1307b76b1 100644 --- a/code/game/machinery/computer/launchpad_control.dm +++ b/code/game/machinery/computer/launchpad_control.dm @@ -58,20 +58,16 @@ to_chat(user, span_warning("You are too primitive to use this computer!")) return -/obj/machinery/computer/launchpad/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, W)) - return - var/obj/item/multitool/M = W - if(M.buffer && istype(M.buffer, /obj/machinery/launchpad)) - if(LAZYLEN(launchpads) < maximum_pads) - launchpads |= M.buffer - M.set_buffer(null) - to_chat(user, span_notice("You upload the data from the [W.name]'s buffer.")) - else - to_chat(user, span_warning("[src] cannot handle any more connections!")) - else - return ..() +/obj/machinery/computer/launchpad/multitool_act(mob/living/user, obj/item/multitool/tool) + . = NONE + if(!istype(tool.buffer, /obj/machinery/launchpad)) + return + + if(LAZYLEN(launchpads) < maximum_pads) + launchpads |= tool.buffer + tool.set_buffer(null) + to_chat(user, span_notice("You upload the data from the [tool] buffer.")) + return ITEM_INTERACT_SUCCESS /obj/machinery/computer/launchpad/proc/pad_exists(number) var/obj/machinery/launchpad/pad = launchpads[number] diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm index 7b80b6e95c8d6..46c0045fb3568 100644 --- a/code/game/machinery/computer/mechlaunchpad.dm +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -86,28 +86,32 @@ continue return found_mechpad -/obj/machinery/computer/mechpad/multitool_act(mob/living/user, obj/item/tool) - if(!multitool_check_buffer(user, tool)) +/obj/machinery/computer/mechpad/multitool_act(mob/living/user, obj/item/multitool/multitool) + . = NONE + if(!istype(multitool.buffer, /obj/machinery/mechpad)) return - var/obj/item/multitool/multitool = tool - if(istype(multitool.buffer, /obj/machinery/mechpad)) - var/obj/machinery/mechpad/buffered_pad = multitool.buffer - if(!(mechpads.len < maximum_pads)) - to_chat(user, span_warning("[src] cannot handle any more connections!")) - return TRUE - if(buffered_pad == connected_mechpad) - to_chat(user, span_warning("[src] cannot connect to its own mechpad!")) - else if(!connected_mechpad && buffered_pad == find_pad()) - if(buffered_pad in mechpads) - remove_pad(buffered_pad) - connect_launchpad(buffered_pad) - multitool.set_buffer(null) - to_chat(user, span_notice("You connect the console to the pad with data from the [multitool.name]'s buffer.")) - else - add_pad(buffered_pad) - multitool.set_buffer(null) - to_chat(user, span_notice("You upload the data from the [multitool.name]'s buffer.")) - return TRUE + + var/obj/machinery/mechpad/buffered_pad = multitool.buffer + if(!(mechpads.len < maximum_pads)) + to_chat(user, span_warning("[src] cannot handle any more connections!")) + return ITEM_INTERACT_SUCCESS + + if(buffered_pad == connected_mechpad) + to_chat(user, span_warning("[src] cannot connect to its own mechpad!")) + return ITEM_INTERACT_BLOCKING + + if(!connected_mechpad && buffered_pad == find_pad()) + if(buffered_pad in mechpads) + remove_pad(buffered_pad) + connect_launchpad(buffered_pad) + multitool.set_buffer(null) + to_chat(user, span_notice("You connect the console to the pad with data from the [multitool.name]'s buffer.")) + return ITEM_INTERACT_SUCCESS + + add_pad(buffered_pad) + multitool.set_buffer(null) + to_chat(user, span_notice("You upload the data from the [multitool.name]'s buffer.")) + return ITEM_INTERACT_SUCCESS /obj/machinery/computer/mechpad/proc/add_pad(obj/machinery/mechpad/pad) mechpads += pad diff --git a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm index 47d65a9492f04..2ca295a5679e6 100644 --- a/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm +++ b/code/game/machinery/dna_infuser/organ_sets/fly_organs.dm @@ -42,17 +42,11 @@ toxic_foodtypes = NONE // these fucks eat vomit, i am sure they can handle drinking bleach or whatever too modifies_speech = TRUE languages_native = list(/datum/language/buzzwords) + var/static/list/speech_replacements = list(new /regex("z+", "g") = "zzz", new /regex("Z+", "g") = "ZZZ", "s" = "z", "S" = "Z") -/obj/item/organ/internal/tongue/fly/modify_speech(datum/source, list/speech_args) - var/static/regex/fly_buzz = new("z+", "g") - var/static/regex/fly_buZZ = new("Z+", "g") - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = fly_buzz.Replace(message, "zzz") - message = fly_buZZ.Replace(message, "ZZZ") - message = replacetext(message, "s", "z") - message = replacetext(message, "S", "Z") - speech_args[SPEECH_MESSAGE] = message +/obj/item/organ/internal/tongue/fly/New(class, timer, datum/mutation/human/copymut) + . = ..() + AddComponent(/datum/component/speechmod, replacements = speech_replacements) /obj/item/organ/internal/tongue/fly/Initialize(mapload) . = ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 67f069c062c4c..33465809f4270 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -591,13 +591,13 @@ floorlight.pixel_y = 0 . += floorlight -/obj/machinery/door/airlock/do_animate(animation) +/obj/machinery/door/airlock/run_animation(animation) switch(animation) - if("opening") + if(DOOR_OPENING_ANIMATION) update_icon(ALL, AIRLOCK_OPENING) - if("closing") + if(DOOR_OPENING_ANIMATION) update_icon(ALL, AIRLOCK_CLOSING) - if("deny") + if(DOOR_DENY_ANIMATION) if(!machine_stat) update_icon(ALL, AIRLOCK_DENY) playsound(src,doorDeni,50,FALSE,3) @@ -607,6 +607,28 @@ if(airlock_state == AIRLOCK_DENY) update_icon(ALL, AIRLOCK_CLOSED) +/obj/machinery/door/airlock/animation_length(animation) + switch(animation) + if(DOOR_OPENING_ANIMATION) + return 0.6 SECONDS + if(DOOR_CLOSING_ANIMATION) + return 0.6 SECONDS + +/obj/machinery/door/airlock/animation_segment_delay(animation) + switch(animation) + if(AIRLOCK_OPENING_TRANSPARENT) + return 0.1 SECONDS + if(AIRLOCK_OPENING_PASSABLE) + return 0.5 SECONDS + if(AIRLOCK_OPENING_FINISHED) + return 0.6 SECONDS + if(AIRLOCK_CLOSING_UNPASSABLE) + return 0.2 SECONDS + if(AIRLOCK_CLOSING_OPAQUE) + return 0.5 SECONDS + if(AIRLOCK_CLOSING_FINISHED) + return 0.6 SECONDS + /obj/machinery/door/airlock/examine(mob/user) . = ..() if(closeOtherId) @@ -1234,18 +1256,21 @@ SEND_SIGNAL(src, COMSIG_AIRLOCK_OPEN, forced) operating = TRUE update_icon(ALL, AIRLOCK_OPENING, TRUE) - sleep(0.1 SECONDS) + var/transparent_delay = animation_segment_delay(AIRLOCK_OPENING_TRANSPARENT) + sleep(transparent_delay) set_opacity(0) if(multi_tile) filler.set_opacity(FALSE) update_freelook_sight() - sleep(0.4 SECONDS) + var/passable_delay = animation_segment_delay(AIRLOCK_OPENING_PASSABLE) - transparent_delay + sleep(passable_delay) set_density(FALSE) if(multi_tile) filler.set_density(FALSE) flags_1 &= ~PREVENT_CLICK_UNDER_1 air_update_turf(TRUE, FALSE) - sleep(0.1 SECONDS) + var/open_delay = animation_segment_delay(AIRLOCK_OPENING_FINISHED) - transparent_delay - passable_delay + sleep(open_delay) layer = OPEN_DOOR_LAYER update_icon(ALL, AIRLOCK_OPEN, TRUE) operating = FALSE @@ -1314,14 +1339,16 @@ filler.density = TRUE flags_1 |= PREVENT_CLICK_UNDER_1 air_update_turf(TRUE, TRUE) - sleep(0.1 SECONDS) + var/unpassable_delay = animation_segment_delay(AIRLOCK_CLOSING_UNPASSABLE) + sleep(unpassable_delay) if(!air_tight) set_density(TRUE) if(multi_tile) filler.density = TRUE flags_1 |= PREVENT_CLICK_UNDER_1 air_update_turf(TRUE, TRUE) - sleep(0.4 SECONDS) + var/opaque_delay = animation_segment_delay(AIRLOCK_CLOSING_OPAQUE) - unpassable_delay + sleep(opaque_delay) if(dangerous_close) crush() if(visible && !glass) @@ -1329,7 +1356,8 @@ if(multi_tile) filler.set_opacity(TRUE) update_freelook_sight() - sleep(0.1 SECONDS) + var/close_delay = animation_segment_delay(AIRLOCK_CLOSING_FINISHED) - unpassable_delay - opaque_delay + sleep(close_delay) update_icon(ALL, AIRLOCK_CLOSED, 1) operating = FALSE delayed_close_requested = FALSE diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index 34a161acac1b3..26dc09204a70c 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -173,21 +173,21 @@ * * seconds - Return the time in seconds if TRUE, else deciseconds. */ /obj/machinery/status_display/door_timer/proc/time_left(seconds = FALSE) - . = max(0, timer_duration + activation_time - world.time) + . = max(0, timer_duration + (activation_time ? activation_time - world.time : 0)) if(seconds) . /= (1 SECONDS) /** * Set the timer. Does NOT automatically start counting down, but does update the display. * - * returns TRUE if no change occurred + * returns FALSE if no change occurred * * Arguments: * value - time in deciseconds to set the timer for. */ /obj/machinery/status_display/door_timer/proc/set_timer(value) - var/new_time = clamp(value, 0, MAX_TIMER + world.time - activation_time) - . = new_time == timer_duration //return 1 on no change + var/new_time = clamp(value, 0, MAX_TIMER) + . = new_time != timer_duration //return 1 on change timer_duration = new_time update_content() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index b1fec07f422f4..9298859b64b04 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -3,7 +3,7 @@ name = "door" desc = "It opens and closes." icon = 'icons/obj/doors/doorint.dmi' - icon_state = "door1" + icon_state = "door_closed" base_icon_state = "door" opacity = TRUE density = TRUE @@ -24,6 +24,8 @@ idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.1 active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.2 + /// The animation we're currently playing, if any + var/animation var/visible = TRUE var/operating = FALSE var/glass = FALSE @@ -252,7 +254,7 @@ if(requiresID() && check_access(I)) open() else - do_animate("deny") + run_animation(DOOR_DENY_ANIMATION) return /obj/machinery/door/Move() @@ -282,7 +284,7 @@ else if(requiresID() && allowed(user)) open() else - do_animate("deny") + run_animation(DOOR_DENY_ANIMATION) /obj/machinery/door/attack_hand(mob/user, list/modifiers) . = ..() @@ -310,7 +312,7 @@ close() return TRUE if(density) - do_animate("deny") + run_animation(DOOR_DENY_ANIMATION) /obj/machinery/door/allowed(mob/M) if(emergency) @@ -405,24 +407,67 @@ INVOKE_ASYNC(src, PROC_REF(open)) /obj/machinery/door/update_icon_state() - icon_state = "[base_icon_state][density]" - return ..() - -/obj/machinery/door/proc/do_animate(animation) + . = ..() switch(animation) - if("opening") + if(DOOR_OPENING_ANIMATION) if(panel_open) - flick("o_doorc0", src) + icon_state = "o_door_opening" else - flick("doorc0", src) - if("closing") + icon_state = "door_opening" + if(DOOR_CLOSING_ANIMATION) if(panel_open) - flick("o_doorc1", src) + icon_state = "o_door_closing" else - flick("doorc1", src) - if("deny") + icon_state = "door_closing" + if(DOOR_DENY_ANIMATION) if(!machine_stat) - flick("door_deny", src) + icon_state = "door_deny" + else + icon_state = "[base_icon_state]_[density ? "closed" : "open"]" + +/obj/machinery/door/update_overlays() + . = ..() + if(panel_open) + . += mutable_appearance(icon, "panel_open") + +/// Returns the delay to use for the passed in animation +/// We'll do our cleanup once the delay runs out +/obj/machinery/door/proc/animation_length(animation) + switch(animation) + if(DOOR_OPENING_ANIMATION) + return 0.6 SECONDS + if(DOOR_CLOSING_ANIMATION) + return 0.6 SECONDS + if(DOOR_DENY_ANIMATION) + return 0.3 SECONDS + +/// Returns the time required to hit particular points in an animation +/// Used to manage delays for opening/closing and such +/obj/machinery/door/proc/animation_segment_delay(animation) + switch(animation) + if(DOOR_OPENING_PASSABLE) + return 0.5 SECONDS + if(DOOR_OPENING_FINISHED) + return 0.6 SECONDS + if(DOOR_CLOSING_UNPASSABLE) + return 0.2 SECONDS + if(DOOR_CLOSING_FINISHED) + return 0.6 SECONDS + +/// Override this to do misc tasks on animation start +/obj/machinery/door/proc/animation_effects(animation) + return + +/// Used to start a new animation +/// Accepts the animation to start as an arg +/obj/machinery/door/proc/run_animation(animation) + set_animation(animation) + addtimer(CALLBACK(src, PROC_REF(set_animation), null), animation_length(animation), TIMER_UNIQUE|TIMER_OVERRIDE) + +// React to our animation changing +/obj/machinery/door/proc/set_animation(animation) + src.animation = animation + update_appearance() /// Public proc that simply handles opening the door. Returns TRUE if the door was opened, FALSE otherwise. /// Use argument "forced" in conjunction with try_to_force_door_open if you want/need additional checks depending on how sorely you need the door opened. @@ -433,12 +478,14 @@ return FALSE operating = TRUE use_energy(active_power_usage) - do_animate("opening") + run_animation(DOOR_OPENING_ANIMATION) set_opacity(0) - SLEEP_NOT_DEL(0.5 SECONDS) + var/passable_delay = animation_segment_delay(DOOR_OPENING_PASSABLE) + SLEEP_NOT_DEL(passable_delay) set_density(FALSE) flags_1 &= ~PREVENT_CLICK_UNDER_1 - SLEEP_NOT_DEL(0.5 SECONDS) + var/open_delay = animation_segment_delay(DOOR_OPENING_FINISHED) - passable_delay + SLEEP_NOT_DEL(open_delay) layer = initial(layer) update_appearance() set_opacity(0) @@ -470,12 +517,14 @@ operating = TRUE - do_animate("closing") + run_animation(DOOR_CLOSING_ANIMATION) layer = closingLayer - SLEEP_NOT_DEL(0.5 SECONDS) + var/unpassable_delay = animation_segment_delay(DOOR_CLOSING_UNPASSABLE) + SLEEP_NOT_DEL(unpassable_delay) set_density(TRUE) flags_1 |= PREVENT_CLICK_UNDER_1 - SLEEP_NOT_DEL(0.5 SECONDS) + var/close_delay = animation_segment_delay(DOOR_CLOSING_FINISHED) - unpassable_delay + SLEEP_NOT_DEL(close_delay) update_appearance() if(visible && !glass) set_opacity(1) @@ -556,6 +605,26 @@ /obj/machinery/door/get_dumping_location() return null +/obj/machinery/door/morgue/animation_length(animation) + switch(animation) + if(DOOR_OPENING_ANIMATION) + return 1.5 SECONDS + if(DOOR_CLOSING_ANIMATION) + return 1.5 SECONDS + if(DOOR_DENY_ANIMATION) + return 0.1 SECONDS + +/obj/machinery/door/morgue/animation_segment_delay(animation) + switch(animation) + if(DOOR_OPENING_PASSABLE) + return 1.4 SECONDS + if(DOOR_OPENING_FINISHED) + return 1.5 SECONDS + if(DOOR_CLOSING_UNPASSABLE) + return 0.2 SECONDS + if(DOOR_CLOSING_FINISHED) + return 1.5 SECONDS + /obj/machinery/door/proc/lock() return diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 30deaef9183f3..1de24c94a02a2 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -609,16 +609,37 @@ if(active) addtimer(CALLBACK(src, PROC_REF(correct_state)), 2 SECONDS, TIMER_UNIQUE) -/obj/machinery/door/firedoor/do_animate(animation) - switch(animation) - if("opening") - flick("[base_icon_state]_opening", src) - if("closing") - flick("[base_icon_state]_closing", src) - /obj/machinery/door/firedoor/update_icon_state() . = ..() - icon_state = "[base_icon_state]_[density ? "closed" : "open"]" + switch(animation) + if(DOOR_OPENING_ANIMATION) + icon_state = "[base_icon_state]_opening" + if(DOOR_CLOSING_ANIMATION) + icon_state = "[base_icon_state]_closing" + if(DOOR_DENY_ANIMATION) + icon_state = "[base_icon_state]_deny" + else + icon_state = "[base_icon_state]_[density ? "closed" : "open"]" + +/obj/machinery/door/firedoor/animation_length(animation) + switch(animation) + if(DOOR_OPENING_ANIMATION) + return 1.2 SECONDS + if(DOOR_CLOSING_ANIMATION) + return 1.2 SECONDS + if(DOOR_DENY_ANIMATION) + return 0.3 SECONDS + +/obj/machinery/door/firedoor/animation_segment_delay(animation) + switch(animation) + if(DOOR_OPENING_PASSABLE) + return 1.0 SECONDS + if(DOOR_OPENING_FINISHED) + return 1.2 SECONDS + if(DOOR_CLOSING_UNPASSABLE) + return 0.2 SECONDS + if(DOOR_CLOSING_FINISHED) + return 1.2 SECONDS /obj/machinery/door/firedoor/update_overlays() . = ..() diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index df8f7fa936afd..bccc243381ba4 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -62,22 +62,44 @@ if(access_bypass || ask_for_pass(user)) open() else - do_animate("deny") + run_animation(DOOR_DENY_ANIMATION) /obj/machinery/door/password/update_icon_state() . = ..() - icon_state = density ? "closed" : "open" + //Deny animation would be nice to have. + switch(animation) + if(DOOR_OPENING_ANIMATION) + icon_state = "opening" + if(DOOR_CLOSING_ANIMATION) + icon_state = "closing" + else + icon_state = density ? "closed" : "open" + +/obj/machinery/door/password/animation_length(animation) + switch(animation) + if(DOOR_OPENING_ANIMATION) + return 1.1 SECONDS + if(DOOR_CLOSING_ANIMATION) + return 1.1 SECONDS + +/obj/machinery/door/password/animation_segment_delay(animation) + switch(animation) + if(DOOR_OPENING_PASSABLE) + return 0.5 SECONDS + if(DOOR_OPENING_FINISHED) + return 1.1 SECONDS + if(DOOR_CLOSING_UNPASSABLE) + return 0.2 SECONDS + if(DOOR_CLOSING_FINISHED) + return 1.1 SECONDS -/obj/machinery/door/password/do_animate(animation) +/obj/machinery/door/password/animation_effects(animation) switch(animation) - if("opening") - flick("opening", src) + if(DOOR_OPENING_ANIMATION) playsound(src, door_open, 50, TRUE) - if("closing") - flick("closing", src) + if(DOOR_CLOSING_ANIMATION) playsound(src, door_close, 50, TRUE) - if("deny") - //Deny animation would be nice to have. + if(DOOR_DENY_ANIMATION) playsound(src, door_deny, 30, TRUE) /obj/machinery/door/password/proc/ask_for_pass(mob/user) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 48e0cb195d7f3..ab18a63361c97 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -40,7 +40,7 @@ if(panel_open) if(deconstruction == BLASTDOOR_FINISHED) . += span_notice("The maintenance panel is opened and the electronics could be pried out.") - . += span_notice("\The [src] could be calibrated to a blast door controller ID with a multitool.") + . += span_notice("\The [src] could be calibrated to a blast door controller ID with a multitool or a blast door controller.") else if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS) . += span_notice("The electronics are missing and there are some wires sticking out.") else if(deconstruction == BLASTDOOR_NEEDS_WIRES) @@ -56,6 +56,9 @@ if(deconstruction == BLASTDOOR_NEEDS_ELECTRONICS && istype(held_item, /obj/item/electronics/airlock)) context[SCREENTIP_CONTEXT_LMB] = "Add electronics" return CONTEXTUAL_SCREENTIP_SET + if(deconstruction == BLASTDOOR_FINISHED && istype(held_item, /obj/item/assembly/control)) + context[SCREENTIP_CONTEXT_LMB] = "Calibrate ID" + return CONTEXTUAL_SCREENTIP_SET //we do not check for special effects like if they can actually perform the action because they will be told they can't do it when they try, //with feedback on what they have to do in order to do so. switch(held_item.tool_behaviour) @@ -99,6 +102,19 @@ balloon_alert(user, "electronics added") deconstruction = BLASTDOOR_FINISHED return ITEM_INTERACT_SUCCESS + + if(deconstruction == BLASTDOOR_FINISHED && istype(tool, /obj/item/assembly/control)) + if(density) + balloon_alert(user, "open the door first!") + return ITEM_INTERACT_BLOCKING + if(!panel_open) + balloon_alert(user, "open the panel first!") + return ITEM_INTERACT_BLOCKING + var/obj/item/assembly/control/controller_item = tool + id = controller_item.id + balloon_alert(user, "id changed") + return ITEM_INTERACT_SUCCESS + return NONE /obj/machinery/door/poddoor/screwdriver_act(mob/living/user, obj/item/tool) @@ -195,19 +211,43 @@ return FALSE return ..() -/obj/machinery/door/poddoor/do_animate(animation) +/obj/machinery/door/poddoor/update_icon_state() + . = ..() + switch(animation) + if(DOOR_OPENING_ANIMATION) + icon_state = "opening" + if(DOOR_CLOSING_ANIMATION) + icon_state = "closing" + if(DOOR_DENY_ANIMATION) + icon_state = "deny" + else + icon_state = density ? "closed" : "open" + +/obj/machinery/door/poddoor/animation_length(animation) switch(animation) - if("opening") - flick("opening", src) + if(DOOR_OPENING_ANIMATION) + return 1.1 SECONDS + if(DOOR_CLOSING_ANIMATION) + return 1.1 SECONDS + +/obj/machinery/door/poddoor/animation_segment_delay(animation) + switch(animation) + if(DOOR_OPENING_PASSABLE) + return 0.5 SECONDS + if(DOOR_OPENING_FINISHED) + return 1.1 SECONDS + if(DOOR_CLOSING_UNPASSABLE) + return 0.2 SECONDS + if(DOOR_CLOSING_FINISHED) + return 1.1 SECONDS + +/obj/machinery/door/poddoor/animation_effects(animation) + switch(animation) + if(DOOR_OPENING_ANIMATION) playsound(src, animation_sound, 50, TRUE) - if("closing") - flick("closing", src) + if(DOOR_CLOSING_ANIMATION) playsound(src, animation_sound, 50, TRUE) -/obj/machinery/door/poddoor/update_icon_state() - . = ..() - icon_state = density ? "closed" : "open" - /obj/machinery/door/poddoor/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers) if(density & !(resistance_flags & INDESTRUCTIBLE)) add_fingerprint(user) diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 0df6024ca827a..56e2f5a9743b2 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -11,6 +11,24 @@ recipe_type = /datum/crafting_recipe/shutters animation_sound = 'sound/machines/shutter.ogg' +/obj/machinery/door/poddoor/shutters/animation_length(animation) + switch(animation) + if(DOOR_OPENING_ANIMATION) + return 1.388 SECONDS + if(DOOR_CLOSING_ANIMATION) + return 1.388 SECONDS + +/obj/machinery/door/poddoor/shutters/animation_segment_delay(animation) + switch(animation) + if(DOOR_OPENING_PASSABLE) + return 0.76 SECONDS + if(DOOR_OPENING_FINISHED) + return 1.388 SECONDS + if(DOOR_CLOSING_UNPASSABLE) + return 0.152 SECONDS + if(DOOR_CLOSING_FINISHED) + return 1.388 SECONDS + /obj/machinery/door/poddoor/shutters/preopen icon_state = "open" density = FALSE diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 4c1d4ad2d5154..0c897c6809666 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -19,12 +19,16 @@ interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN set_dir_on_move = FALSE opens_with_door_remote = TRUE + /// Reference to the airlock electronics inside for determining window access. var/obj/item/electronics/airlock/electronics = null + /// If the door is considered reinforced. If TRUE, the door will resist twice as much heat (1600 deg C vs 800 deg C). var/reinf = 0 + /// On deconstruction, how many shards to drop. var/shards = 2 + /// On deconstruction, how many rods to drop. var/rods = 2 + /// On deconstruction, how much cable to drop. var/cable = 1 - var/list/debris = list() /datum/armor/door_window melee = 20 @@ -72,7 +76,15 @@ /obj/machinery/door/window/update_icon_state() . = ..() - icon_state = "[base_state][density ? null : "open"]" + switch(animation) + if(DOOR_OPENING_ANIMATION) + icon_state = "[base_state]opening" + if(DOOR_CLOSING_ANIMATION) + icon_state = "[base_state]closing" + if(DOOR_DENY_ANIMATION) + icon_state = "[base_state]deny" + else + icon_state = "[base_state][density ? null : "open"]" if(hasPower() && unres_sides) set_light(l_range = 2, l_power = 1) @@ -80,6 +92,24 @@ set_light(l_range = 0) +/obj/machinery/door/window/animation_length(animation) + switch(animation) + if(DOOR_OPENING_ANIMATION) + return 0.9 SECONDS + if(DOOR_CLOSING_ANIMATION) + return 0.9 SECONDS + +/obj/machinery/door/window/animation_segment_delay(animation) + switch(animation) + if(DOOR_OPENING_PASSABLE) + return 0.7 SECONDS + if(DOOR_OPENING_FINISHED) + return 0.9 SECONDS + if(DOOR_CLOSING_UNPASSABLE) + return 0.2 SECONDS + if(DOOR_CLOSING_FINISHED) + return 0.9 SECONDS + /obj/machinery/door/window/update_overlays() . = ..() @@ -111,9 +141,9 @@ return autoclose = TRUE if(check_access(null)) - sleep(5 SECONDS) + sleep(8 SECONDS) else //secure doors close faster - sleep(2 SECONDS) + sleep(5 SECONDS) if(!density && autoclose) //did someone change state while we slept? close() @@ -131,7 +161,7 @@ if(allowed(occupant)) open_and_close() return - do_animate("deny") + run_animation(DOOR_DENY_ANIMATION) return if(!SSticker) return @@ -155,7 +185,7 @@ open_and_close() else - do_animate("deny") + run_animation(DOOR_DENY_ANIMATION) return @@ -214,11 +244,13 @@ if(!operating) //in case of emag operating = TRUE - do_animate("opening") + run_animation(DOOR_OPENING_ANIMATION) playsound(src, 'sound/machines/windowdoor.ogg', 100, TRUE) - icon_state ="[base_state]open" - sleep(1 SECONDS) + var/passable_delay = animation_segment_delay(DOOR_OPENING_PASSABLE) + sleep(passable_delay) set_density(FALSE) + var/open_delay = animation_segment_delay(DOOR_OPENING_FINISHED) - passable_delay + sleep(open_delay) air_update_turf(TRUE, FALSE) update_freelook_sight() @@ -257,14 +289,15 @@ return FALSE operating = TRUE - do_animate("closing") + run_animation(DOOR_CLOSING_ANIMATION) playsound(src, 'sound/machines/windowdoor.ogg', 100, TRUE) - icon_state = base_state - + var/unpassable_delay = animation_segment_delay(DOOR_CLOSING_UNPASSABLE) + sleep(unpassable_delay) set_density(TRUE) air_update_turf(TRUE, TRUE) update_freelook_sight() - sleep(1 SECONDS) + var/close_delay = animation_segment_delay(DOOR_CLOSING_FINISHED) - unpassable_delay + sleep(close_delay) operating = FALSE return TRUE @@ -349,6 +382,10 @@ . = ..() if(obj_flags & EMAGGED) . += span_warning("Its access panel is smoking slightly.") + if(!density) + if(panel_open) + . += span_notice("The [span_boldnotice("airlock electronics")] could be [span_boldnotice("levered")] out.") + /obj/machinery/door/window/screwdriver_act(mob/living/user, obj/item/tool) . = ..() @@ -431,15 +468,6 @@ else to_chat(user, span_warning("The door's motors resist your efforts to force it!")) -/obj/machinery/door/window/do_animate(animation) - switch(animation) - if("opening") - flick("[base_state]opening", src) - if("closing") - flick("[base_state]closing", src) - if("deny") - flick("[base_state]deny", src) - /obj/machinery/door/window/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_DECONSTRUCT) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 172607451bda7..cbb7eede250b9 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -39,9 +39,9 @@ Possible to do for anyone motivated enough: icon = 'icons/obj/machines/floor.dmi' icon_state = "holopad0" base_icon_state = "holopad" - layer = LOW_OBJ_LAYER /// The plane is set such that it shows up without being covered by pipes/wires in a map editor, we change this on initialize. - plane = GAME_PLANE + layer = MAP_SWITCH(ABOVE_OPEN_TURF_LAYER, LOW_OBJ_LAYER) + plane = MAP_SWITCH(FLOOR_PLANE, GAME_PLANE) req_access = list(ACCESS_KEYCARD_AUTH) //Used to allow for forced connecting to other (not secure) holopads. Anyone can make a call, though. max_integrity = 300 armor_type = /datum/armor/machinery_holopad @@ -101,9 +101,6 @@ Possible to do for anyone motivated enough: /obj/machinery/holopad/Initialize(mapload) . = ..() - /// We set the plane on mapload such that we can see the holopad render over atmospherics pipe and cabling in a map editor (without initialization), but so it gets that "inset" look in the floor in-game. - SET_PLANE_IMPLICIT(src, FLOOR_PLANE) - update_appearance() var/static/list/hovering_mob_typechecks = list( /mob/living/silicon = list( diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 9ad6bcac58dc0..3fa7d25767f2f 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/machines/floor.dmi' icon_state = "igniter0" base_icon_state = "igniter" + layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE max_integrity = 300 armor_type = /datum/armor/machinery_igniter diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm index 444e44125c80a..8733ca548632e 100644 --- a/code/game/machinery/launch_pad.dm +++ b/code/game/machinery/launch_pad.dm @@ -66,6 +66,15 @@ if(in_range(user, src) || isobserver(user)) . += span_notice("The status display reads: Maximum range: [range] units.") +/obj/machinery/launchpad/multitool_act(mob/living/user, obj/item/multitool/multi) + . = NONE + if(!panel_open) + return + + multi.set_buffer(src) + balloon_alert(user, "saved to buffer") + return ITEM_INTERACT_SUCCESS + /obj/machinery/launchpad/attackby(obj/item/weapon, mob/user, params) if(!stationary) return ..() @@ -74,14 +83,6 @@ update_indicator() return - if(panel_open && weapon.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, weapon)) - return - var/obj/item/multitool/multi = weapon - multi.set_buffer(src) - balloon_alert(user, "saved to buffer") - return TRUE - if(default_deconstruction_crowbar(weapon)) return @@ -97,7 +98,7 @@ /// Updates diagnostic huds /obj/machinery/launchpad/proc/update_hud() var/image/holder = hud_list[DIAG_LAUNCHPAD_HUD] - var/mutable_appearance/target = mutable_appearance('icons/effects/effects.dmi', "launchpad_target", ABOVE_OPEN_TURF_LAYER, src, GAME_PLANE) + var/mutable_appearance/target = mutable_appearance('icons/effects/effects.dmi', "launchpad_target", ABOVE_NORMAL_TURF_LAYER, src, GAME_PLANE) holder.appearance = target update_indicator() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index f9075b4318fac..04883800f31ef 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -42,8 +42,8 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) if(isnull(held_item)) context[SCREENTIP_CONTEXT_LMB] = area.lightswitch ? "Flick off" : "Flick on" return CONTEXTUAL_SCREENTIP_SET - if(held_item.tool_behaviour != TOOL_SCREWDRIVER) - context[SCREENTIP_CONTEXT_RMB] = "Deconstruct" + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_LMB] = "Deconstruct" return CONTEXTUAL_SCREENTIP_SET return . @@ -69,17 +69,20 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light_switch, 26) /obj/machinery/light_switch/examine(mob/user) . = ..() . += "It is [(machine_stat & NOPOWER) ? "unpowered" : (area.lightswitch ? "on" : "off")]." + . += span_notice("It's screwed and secured to the wall.") /obj/machinery/light_switch/interact(mob/user) . = ..() set_lights(!area.lightswitch) -/obj/machinery/light_switch/attackby_secondary(obj/item/weapon, mob/user, params) - if(weapon.tool_behaviour == TOOL_SCREWDRIVER) - to_chat(user, "You pop \the [src] off the wall.") - deconstruct() - return COMPONENT_CANCEL_ATTACK_CHAIN - return ..() +/obj/machinery/light_switch/screwdriver_act(mob/living/user, obj/item/tool) + user.visible_message(span_notice("[user] starts unscrewing [src]..."), span_notice("You start unscrewing [src]...")) + if(!tool.use_tool(src, user, 40, volume = 50)) + return ITEM_INTERACT_BLOCKING + user.visible_message(span_notice("[user] unscrews [src]!"), span_notice("You detach [src] from the wall.")) + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + deconstruct(TRUE) + return ITEM_INTERACT_SUCCESS /obj/machinery/light_switch/proc/set_lights(status) if(area.lightswitch == status) diff --git a/code/game/machinery/mechlaunchpad.dm b/code/game/machinery/mechlaunchpad.dm index b8c282ae22cca..cbdc34d864800 100644 --- a/code/game/machinery/mechlaunchpad.dm +++ b/code/game/machinery/mechlaunchpad.dm @@ -30,15 +30,14 @@ if(default_deconstruction_crowbar(tool)) return TRUE -/obj/machinery/mechpad/multitool_act(mob/living/user, obj/item/tool) +/obj/machinery/mechpad/multitool_act(mob/living/user, obj/item/multitool/multitool) + . = NONE if(!panel_open) return - if(!multitool_check_buffer(user, tool)) - return - var/obj/item/multitool/multitool = tool + multitool.set_buffer(src) balloon_alert(user, "saved to multitool buffer") - return TRUE + return ITEM_INTERACT_SUCCESS /obj/machinery/mechpad/wirecutter_act(mob/living/user, obj/item/tool) if(!panel_open) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 9e926d9a84189..929383b178c62 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -120,8 +120,8 @@ Buildable meters return ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/ghettojetpack, /datum/crafting_recipe/pipegun, /datum/crafting_recipe/smoothbore_disabler, /datum/crafting_recipe/improvised_pneumatic_cannon) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index d41064ba2efcf..c9694730a3f8a 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -317,6 +317,15 @@ DEFINE_BITFIELD(turret_flags, list( remove_control() check_should_process() +/obj/machinery/porta_turret/multitool_act(mob/living/user, obj/item/multitool/tool) + . = NONE + if(locked) + return + + tool.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") + return ITEM_INTERACT_SUCCESS + /obj/machinery/porta_turret/attackby(obj/item/I, mob/user, params) if(machine_stat & BROKEN) if(I.tool_behaviour == TOOL_CROWBAR) @@ -364,12 +373,6 @@ DEFINE_BITFIELD(turret_flags, list( to_chat(user, span_notice("Controls are now [locked ? "locked" : "unlocked"].")) else to_chat(user, span_alert("Access denied.")) - else if(I.tool_behaviour == TOOL_MULTITOOL && !locked) - if(!multitool_check_buffer(user, I)) - return - var/obj/item/multitool/M = I - M.set_buffer(src) - balloon_alert(user, "saved to multitool buffer") else return ..() @@ -967,18 +970,19 @@ DEFINE_BITFIELD(turret_flags, list( . += {"[span_notice("Ctrl-click [src] to [ enabled ? "disable" : "enable"] turrets.")] [span_notice("Alt-click [src] to set turrets to [ lethal ? "stun" : "kill"].")]"} -/obj/machinery/turretid/attackby(obj/item/attacking_item, mob/user, params) +/obj/machinery/turretid/multitool_act(mob/living/user, obj/item/multitool/multi_tool) + . = NONE if(machine_stat & BROKEN) return - if(attacking_item.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, attacking_item)) - return - var/obj/item/multitool/M = attacking_item - if(M.buffer && istype(M.buffer, /obj/machinery/porta_turret)) - turrets |= WEAKREF(M.buffer) - to_chat(user, span_notice("You link \the [M.buffer] with \the [src].")) - return + if(multi_tool.buffer && istype(multi_tool.buffer, /obj/machinery/porta_turret)) + turrets |= WEAKREF(multi_tool.buffer) + to_chat(user, span_notice("You link \the [multi_tool.buffer] with \the [src].")) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/turretid/attackby(obj/item/attacking_item, mob/user, params) + if(machine_stat & BROKEN) + return if (issilicon(user)) return attack_hand(user) diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index e81c13af60892..ad3111b330bdc 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -36,6 +36,15 @@ /obj/machinery/porta_turret_cover/attack_ghost(mob/user) return ..() || parent_turret.attack_ghost(user) +/obj/machinery/porta_turret_cover/multitool_act(mob/living/user, obj/item/multitool/multi_tool) + . = NONE + if(parent_turret.locked) + return + + multi_tool.set_buffer(parent_turret) + balloon_alert(user, "saved to multitool buffer") + return ITEM_INTERACT_SUCCESS + /obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user, params) if(I.tool_behaviour == TOOL_WRENCH && !parent_turret.on) if(parent_turret.raised) @@ -61,13 +70,6 @@ to_chat(user, span_notice("Access denied.")) return - if(I.tool_behaviour == TOOL_MULTITOOL && !parent_turret.locked) - if(!multitool_check_buffer(user, I)) - return - var/obj/item/multitool/M = I - M.set_buffer(parent_turret) - balloon_alert(user, "saved to multitool buffer") - return return ..() /obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user) diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm index 1c014927e62d4..f5f5851b7586e 100644 --- a/code/game/machinery/quantum_pad.dm +++ b/code/game/machinery/quantum_pad.dm @@ -53,37 +53,30 @@ teleport_cooldown = initial(teleport_cooldown) teleport_cooldown -= (E * 100) -/obj/machinery/quantumpad/attackby(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, "qpad-idle-open", "qpad-idle", I)) - return - +/obj/machinery/quantumpad/multitool_act(mob/living/user, obj/item/multitool/multi_tool) if(panel_open) - if(I.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, I)) - return - var/obj/item/multitool/M = I - M.set_buffer(src) - balloon_alert(user, "saved to multitool buffer") - to_chat(user, span_notice("You save the data in [I]'s buffer. It can now be saved to pads with closed panels.")) - return TRUE - else if(I.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, I)) - return - var/obj/item/multitool/M = I - if(istype(M.buffer, /obj/machinery/quantumpad)) - if(M.buffer == src) - balloon_alert(user, "cannot link to self!") - return TRUE - else - linked_pad = M.buffer - balloon_alert(user, "data uploaded from buffer") - return TRUE - else - balloon_alert(user, "no quantum pad data found!") - return TRUE + multi_tool.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") + to_chat(user, span_notice("You save the data in [multi_tool] buffer. It can now be saved to pads with closed panels.")) + return ITEM_INTERACT_SUCCESS + + if(istype(multi_tool.buffer, /obj/machinery/quantumpad)) + if(multi_tool.buffer == src) + balloon_alert(user, "cannot link to self!") + return ITEM_INTERACT_BLOCKING + linked_pad = multi_tool.buffer + balloon_alert(user, "data uploaded from buffer") + return ITEM_INTERACT_SUCCESS + + balloon_alert(user, "no quantum pad data found!") + return NONE + +/obj/machinery/quantumpad/attackby(obj/item/weapon, mob/user, params) + if(default_deconstruction_screwdriver(user, "qpad-idle-open", "qpad-idle", weapon)) + return - else if(istype(I, /obj/item/quantum_keycard)) - var/obj/item/quantum_keycard/K = I + if(istype(weapon, /obj/item/quantum_keycard)) + var/obj/item/quantum_keycard/K = weapon if(K.qpad) to_chat(user, span_notice("You insert [K] into [src]'s card slot, activating it.")) interact(user, K.qpad) @@ -93,7 +86,7 @@ to_chat(user, span_notice("You complete the link between [K] and [src].")) K.set_pad(src) - if(default_deconstruction_crowbar(I)) + if(default_deconstruction_crowbar(weapon)) return return ..() diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index 4e7a80e166388..d961c68dc8ed6 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -286,6 +286,10 @@ icon = 'icons/obj/machines/shield_generator.dmi' icon_state = "shield_wall_gen" base_icon_state = "shield_wall_gen" + light_on = FALSE + light_range = 2.5 + light_power = 2 + light_color = LIGHT_COLOR_BLUE anchored = FALSE density = TRUE req_access = list(ACCESS_TELEPORTER) @@ -325,6 +329,10 @@ RegisterSignal(src, COMSIG_ATOM_SINGULARITY_TRY_MOVE, PROC_REF(block_singularity_if_active)) set_wires(new /datum/wires/shieldwallgen(src)) +/obj/machinery/power/shieldwallgen/update_appearance(updates) + . = ..() + set_light(l_on = !!active) + /obj/machinery/power/shieldwallgen/update_icon_state() icon_state = "[base_icon_state][active ? "_on" : ""]" return ..() @@ -530,7 +538,10 @@ icon_state = "shieldwall" density = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - light_range = 3 + light_range = 2.5 + light_power = 0.7 + light_color = LIGHT_COLOR_BLUE + var/primary_direction = NONE var/needs_power = FALSE var/obj/machinery/power/shieldwallgen/gen_primary var/obj/machinery/power/shieldwallgen/gen_secondary @@ -554,6 +565,10 @@ gen_secondary = null return ..() +/obj/machinery/shieldwall/update_overlays() + . = ..() + . += emissive_appearance(icon, icon_state, src, alpha = 200) + /obj/machinery/shieldwall/process() if(needs_power) if(!gen_primary || !gen_primary.active || !gen_secondary || !gen_secondary.active) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index a74d7456ed8ef..1c69dbecb7ea0 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -2,7 +2,7 @@ #define HEATER_MODE_HEAT "heat" #define HEATER_MODE_COOL "cool" #define HEATER_MODE_AUTO "auto" -#define BASE_HEATING_ENERGY (STANDARD_CELL_RATE * 0.1) +#define BASE_HEATING_ENERGY (STANDARD_CELL_RATE * 4) /obj/machinery/space_heater anchored = FALSE @@ -32,7 +32,7 @@ ///How much heat/cold we can deliver var/heating_energy = BASE_HEATING_ENERGY ///How efficiently we can deliver that heat/cold (higher indicates less cell consumption) - var/efficiency = 20 + var/efficiency = 200 ///The amount of degrees above and below the target temperature for us to change mode to heater or cooler var/temperature_tolerance = 1 ///What's the middle point of our settable temperature (30 °C) @@ -178,8 +178,8 @@ heating_energy = laser * BASE_HEATING_ENERGY - settable_temperature_range = cap * 30 - efficiency = (cap + 1) * 10 + settable_temperature_range = cap * initial(settable_temperature_range) + efficiency = (cap + 1) * initial(efficiency) * 0.5 target_temperature = clamp(target_temperature, max(settable_temperature_median - settable_temperature_range, TCMB), diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm index 77e1efbdfa13d..fb68631b76676 100644 --- a/code/game/machinery/telecomms/machine_interactions.dm +++ b/code/game/machinery/telecomms/machine_interactions.dm @@ -246,22 +246,19 @@ /// Returns a multitool from a user depending on their mobtype. /obj/machinery/telecomms/proc/get_multitool(mob/user) - var/obj/item/multitool/multitool = null - // Let's double check - if(!HAS_SILICON_ACCESS(user) && istype(user.get_active_held_item(), /obj/item/multitool)) - multitool = user.get_active_held_item() - else if(isAI(user)) + . = null + if(isAI(user)) var/mob/living/silicon/ai/U = user - multitool = U.aiMulti - else if(iscyborg(user) && in_range(user, src)) - var/mob/living/silicon/robot/borguser = user - for(var/obj/item/borg/cyborg_omnitool/toolarm in borguser.held_items) - if(istype(toolarm.selected, /obj/item/multitool)) - multitool = toolarm.selected - break - return multitool - -/obj/machinery/telecomms/proc/canAccess(mob/user) - if(HAS_SILICON_ACCESS(user) || in_range(user, src)) - return TRUE - return FALSE + return U.aiMulti + + var/obj/item/held_item = user.get_active_held_item() + if(QDELETED(held_item)) + return + held_item = held_item.get_proxy_attacker_for(src, user) //for borgs omni tool + if(held_item.tool_behaviour != TOOL_MULTITOOL) + return + + if(!HAS_SILICON_ACCESS(user)) + return held_item + if(iscyborg(user) && in_range(user, src)) + return held_item diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 2373334491772..c46f6b351543d 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -162,24 +162,25 @@ teleporter_console = null return ..() +/obj/machinery/teleport/station/multitool_act(mob/living/user, obj/item/multitool/tool) + . = NONE + + if(panel_open) + tool.set_buffer(src) + balloon_alert(user, "saved to multitool buffer") + return ITEM_INTERACT_SUCCESS + + if(!istype(tool.buffer, /obj/machinery/teleport/station) || tool.buffer == src) + return ITEM_INTERACT_BLOCKING + + if(linked_stations.len < efficiency) + linked_stations.Add(tool.buffer) + tool.set_buffer(null) + balloon_alert(user, "data uploaded from buffer") + return ITEM_INTERACT_SUCCESS + /obj/machinery/teleport/station/attackby(obj/item/W, mob/user, params) - if(W.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, W)) - return - var/obj/item/multitool/M = W - if(panel_open) - M.set_buffer(src) - balloon_alert(user, "saved to multitool buffer") - else - if(M.buffer && istype(M.buffer, /obj/machinery/teleport/station) && M.buffer != src) - if(linked_stations.len < efficiency) - linked_stations.Add(M.buffer) - M.set_buffer(null) - balloon_alert(user, "data uploaded from buffer") - else - to_chat(user, span_alert("This station can't hold more information, try to use better parts.")) - return - else if(default_deconstruction_screwdriver(user, "controller-o", "controller", W)) + if(default_deconstruction_screwdriver(user, "controller-o", "controller", W)) update_appearance() return diff --git a/code/game/objects/effects/blessing.dm b/code/game/objects/effects/blessing.dm index d07ced626dbc5..d1267c59c747c 100644 --- a/code/game/objects/effects/blessing.dm +++ b/code/game/objects/effects/blessing.dm @@ -12,7 +12,7 @@ for(var/obj/effect/blessing/B in loc) if(B != src) return INITIALIZE_HINT_QDEL - var/image/I = image(icon = 'icons/effects/effects.dmi', icon_state = "blessed", layer = ABOVE_OPEN_TURF_LAYER, loc = src) + var/image/I = image(icon = 'icons/effects/effects.dmi', icon_state = "blessed", layer = ABOVE_NORMAL_TURF_LAYER, loc = src) I.alpha = 64 I.appearance_flags = RESET_ALPHA add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/blessed_aware, "blessing", I) diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 21eff5028b57e..b6837df6f9546 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,5 +1,6 @@ /obj/effect/decal/cleanable gender = PLURAL + plane = GAME_PLANE layer = FLOOR_CLEAN_LAYER var/list/random_icon_states = null ///I'm sorry but cleanable/blood code is ass, and so is blood_DNA diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index 0f4c9dee3127f..062ba3837230b 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -296,7 +296,7 @@ /obj/effect/decal/cleanable/blood/footprints/update_icon() . = ..() - alpha = min(BLOODY_FOOTPRINT_BASE_ALPHA + (255 - BLOODY_FOOTPRINT_BASE_ALPHA) * bloodiness / (BLOOD_ITEM_MAX / 2), 255) + alpha = max(BLOODY_FOOTPRINT_BASE_ALPHA, min(255 * (bloodiness / 15), 255)) //Cache of bloody footprint images //Key: diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index fcc4afa14944d..f3fbf0b817caa 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -81,11 +81,11 @@ if(T.tiled_dirt) smoothing_flags = SMOOTH_BITMASK QUEUE_SMOOTH(src) - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) /obj/effect/decal/cleanable/dirt/Destroy() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) return ..() @@ -458,7 +458,6 @@ COMSIG_TURF_MOVABLE_THROW_LANDED = PROC_REF(ignition_trigger), ) AddElement(/datum/element/connect_loc, ignition_trigger_connections) - RegisterSignal(src, COMSIG_ATOM_TOUCHED_SPARKS, PROC_REF(ignition_trigger)) for(var/obj/effect/decal/cleanable/fuel_pool/pool in get_turf(src)) //Can't use locate because we also belong to that turf if(pool == src) continue @@ -468,6 +467,15 @@ if(burn_stacks) burn_amount = max(min(burn_stacks, 10), 1) + return INITIALIZE_HINT_LATELOAD + +// Just in case of fires, do this after mapload. +/obj/effect/decal/cleanable/fuel_pool/LateInitialize() +// We don't want to burn down the create_and_destroy test area +#ifndef UNIT_TESTS + RegisterSignal(src, COMSIG_ATOM_TOUCHED_SPARKS, PROC_REF(ignition_trigger)) +#endif + /obj/effect/decal/cleanable/fuel_pool/fire_act(exposed_temperature, exposed_volume) . = ..() ignite() diff --git a/code/game/objects/effects/decals/decal.dm b/code/game/objects/effects/decals/decal.dm index 941034ec511be..646713a21d74a 100644 --- a/code/game/objects/effects/decals/decal.dm +++ b/code/game/objects/effects/decals/decal.dm @@ -1,5 +1,6 @@ /obj/effect/decal name = "decal" + layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE anchored = TRUE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/game/objects/effects/spawners/random/maintenance.dm b/code/game/objects/effects/spawners/random/maintenance.dm index 38f8af6a90269..997c3bb1f0cdb 100644 --- a/code/game/objects/effects/spawners/random/maintenance.dm +++ b/code/game/objects/effects/spawners/random/maintenance.dm @@ -2,15 +2,13 @@ name = "maintenance loot spawner" desc = "Come on Lady Luck, spawn me a pair of sunglasses." icon_state = "loot" + remove_if_cant_spawn = FALSE //don't remove stuff from the global maint list, which other can use. // see code/_globalvars/lists/maintenance_loot.dm for loot table /// A subtype of maintenance loot spawner that does not spawn any decals, for when you want to place them on chasm turfs and such /// decals such as ashes will cause NeverShouldHaveComeHere() to fail on such turfs, which creates annoying rng based CI failures /obj/effect/spawner/random/maintenance/no_decals -/obj/effect/spawner/random/maintenance/no_decals/can_spawn(atom/loot) - return !ispath(loot, /obj/effect/decal) - /obj/effect/spawner/random/maintenance/examine(mob/user) . = ..() . += span_info("This spawner has an effective loot count of [get_effective_lootcount()].") @@ -19,6 +17,14 @@ loot = GLOB.maintenance_loot return ..() +/obj/effect/spawner/random/maintenance/skew_loot_weights(list/loot_list, exponent) + ///We only need to skew the weights once, since it's a global list used by all maint spawners. + var/static/already_done = FALSE + if(loot_list == GLOB.maintenance_loot && already_done) + return + already_done = TRUE + return ..() + /obj/effect/spawner/random/maintenance/proc/hide() SetInvisibility(INVISIBILITY_OBSERVER) alpha = 100 diff --git a/code/game/objects/effects/spawners/random/random.dm b/code/game/objects/effects/spawners/random/random.dm index 2c98ba72a4eef..fae8ff14cda07 100644 --- a/code/game/objects/effects/spawners/random/random.dm +++ b/code/game/objects/effects/spawners/random/random.dm @@ -29,6 +29,8 @@ var/spawn_scatter_radius = 0 /// Whether the items should have a random pixel_x/y offset (maxium offset distance is ±16 pixels for x/y) var/spawn_random_offset = FALSE + /// Whether items that cannot be spawned will be removed from the loot list. Keep it TRUE unless you've a good reason. + var/remove_if_cant_spawn = TRUE /obj/effect/spawner/random/Initialize(mapload) . = ..() @@ -52,13 +54,17 @@ if(loot_subtype_path) loot += subtypesof(loot_subtype_path) + if(CONFIG_GET(number/random_loot_weight_modifier) != 1) + skew_loot_weights(loot, CONFIG_GET(number/random_loot_weight_modifier)) + if(loot?.len) var/loot_spawned = 0 var/pixel_divider = FLOOR(16 / spawn_loot_split_pixel_offsets, 1) // 16 pixels offsets is max that should be allowed in any direction while((spawn_loot_count-loot_spawned) && loot.len) var/lootspawn = pick_weight_recursive(loot) if(!can_spawn(lootspawn)) - loot.Remove(lootspawn) + if(remove_if_cant_spawn) + loot.Remove(lootspawn) continue if(!spawn_loot_double) loot.Remove(lootspawn) @@ -85,6 +91,22 @@ spawned_loot.pixel_y = spawn_loot_split_pixel_offsets * (loot_spawned % pixel_divider) loot_spawned++ +///Levels out the weights of loot if lower than 1, or makes rarer spawns even more rare. +/obj/effect/spawner/random/proc/skew_loot_weights(list/loot_list, exponent) + ///This helps keeping the modified weights more or less correct, since pick_weight doesn't appreciate decimals. + var/precision = 1 + if(exponent < 1) + precision = round((1 - exponent) * 10) + 1 + for(var/loot_type in loot_list) + if(islist(loot_type)) + skew_loot_weights(loot_type, exponent) + var/loot_weight = loot_list[loot_type] + if(loot_weight <= 1) + if(exponent < 1) + loot_list[loot_type] *= precision + continue + loot_list[loot_type] = round(loot_weight ** exponent * precision, 1) + /** * Makes the actual item related to our spawner. * diff --git a/code/game/objects/effects/spawners/random/structure.dm b/code/game/objects/effects/spawners/random/structure.dm index b6af49275028b..359c147eb4fb5 100644 --- a/code/game/objects/effects/spawners/random/structure.dm +++ b/code/game/objects/effects/spawners/random/structure.dm @@ -2,6 +2,15 @@ name = "structure spawner" desc = "Now you see me, now you don't..." +///12% chance to spawn a ouija board, or a potted plant. Btw, Wawastation has a guaranteed board. +/obj/effect/spawner/random/structure/twelve_percent_spirit_board + name = "12% spirit board" + icon_state = "spirit_board" + loot = list( + /obj/structure/spirit_board = 3, + /obj/item/kirbyplants/random = 22, + ) + /obj/effect/spawner/random/structure/crate name = "crate spawner" icon_state = "crate_secure" diff --git a/code/game/objects/effects/temporary_visuals/cult.dm b/code/game/objects/effects/temporary_visuals/cult.dm index a53d4df9b925a..caeede1ec2096 100644 --- a/code/game/objects/effects/temporary_visuals/cult.dm +++ b/code/game/objects/effects/temporary_visuals/cult.dm @@ -49,6 +49,7 @@ /obj/effect/temp_visual/cult/turf/floor icon_state = "floorglow" duration = 5 + layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE /obj/effect/temp_visual/cult/portal diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index d132dd53da8c4..9cb926fd19756 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -709,3 +709,29 @@ flags = ANIMATION_RELATIVE, ) return ..() + +/obj/effect/temp_visual/mech_sparks + name = "mech sparks" + icon_state = "mech_sparks" + duration = 0.4 SECONDS + +/obj/effect/temp_visual/mech_sparks/Initialize(mapload, set_color) + . = ..() + pixel_x = rand(-16, 16) + pixel_y = rand(-8, 8) + +/obj/effect/temp_visual/mech_attack_aoe_charge + name = "mech attack aoe charge" + icon = 'icons/effects/96x96.dmi' + icon_state = "mech_attack_aoe_charge" + duration = 1 SECONDS + pixel_x = -32 + pixel_y = -32 + +/obj/effect/temp_visual/mech_attack_aoe_attack + name = "mech attack aoe attack" + icon = 'icons/effects/96x96.dmi' + icon_state = "mech_attack_aoe_attack" + duration = 0.5 SECONDS + pixel_x = -32 + pixel_y = -32 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 1cdeaa89bafcb..87e97b8703a1e 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -163,8 +163,10 @@ ///the icon to indicate this object is being dragged mouse_drag_pointer = MOUSE_ACTIVE_POINTER - ///Does it embed and if yes, what kind of embed - var/list/embedding + /// Does it embed and if yes, what kind of embed + var/embed_type + /// Stores embedding data + var/datum/embed_data/embed_data ///for flags such as [GLASSESCOVERSEYES] var/flags_cover = 0 @@ -263,8 +265,8 @@ add_weapon_description() SEND_GLOBAL_SIGNAL(COMSIG_GLOB_NEW_ITEM, src) - if(LAZYLEN(embedding)) - updateEmbedding() + if(get_embed()) + AddElement(/datum/element/embed) setup_reskinning() @@ -1246,9 +1248,11 @@ return owner.dropItemToGround(src) ///Does the current embedding var meet the criteria for being harmless? Namely, does it have a pain multiplier and jostle pain mult of 0? If so, return true. -/obj/item/proc/isEmbedHarmless() - if(embedding) - return !isnull(embedding["pain_mult"]) && !isnull(embedding["jostle_pain_mult"]) && embedding["pain_mult"] == 0 && embedding["jostle_pain_mult"] == 0 +/obj/item/proc/is_embed_harmless() + if (!get_embed()) + return FALSE + + return !isnull(embed_data.pain_mult) && !isnull(embed_data.jostle_pain_mult) && embed_data.pain_mult == 0 && embed_data.jostle_pain_mult == 0 ///In case we want to do something special (like self delete) upon failing to embed in something. /obj/item/proc/failedEmbed() @@ -1281,11 +1285,13 @@ /obj/item/proc/tryEmbed(atom/target, forced=FALSE) if(!isbodypart(target) && !iscarbon(target)) return NONE - if(!forced && !LAZYLEN(embedding)) + + if(!forced && !get_embed()) return NONE if(SEND_SIGNAL(src, COMSIG_EMBED_TRY_FORCE, target = target, forced = forced)) return COMPONENT_EMBED_SUCCESS + failedEmbed() ///For when you want to disable an item's embedding capabilities (like transforming weapons and such), this proc will detach any active embed elements from it. @@ -1293,29 +1299,6 @@ SEND_SIGNAL(src, COMSIG_ITEM_DISABLE_EMBED) return -///For when you want to add/update the embedding on an item. Uses the vars in [/obj/item/var/embedding], and defaults to config values for values that aren't set. Will automatically detach previous embed elements on this item. -/obj/item/proc/updateEmbedding() - SHOULD_CALL_PARENT(TRUE) - - SEND_SIGNAL(src, COMSIG_ITEM_EMBEDDING_UPDATE) - if(!LAZYLEN(embedding)) - disableEmbedding() - return - - AddElement(/datum/element/embed,\ - embed_chance = (!isnull(embedding["embed_chance"]) ? embedding["embed_chance"] : EMBED_CHANCE),\ - fall_chance = (!isnull(embedding["fall_chance"]) ? embedding["fall_chance"] : EMBEDDED_ITEM_FALLOUT),\ - pain_chance = (!isnull(embedding["pain_chance"]) ? embedding["pain_chance"] : EMBEDDED_PAIN_CHANCE),\ - pain_mult = (!isnull(embedding["pain_mult"]) ? embedding["pain_mult"] : EMBEDDED_PAIN_MULTIPLIER),\ - remove_pain_mult = (!isnull(embedding["remove_pain_mult"]) ? embedding["remove_pain_mult"] : EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER),\ - rip_time = (!isnull(embedding["rip_time"]) ? embedding["rip_time"] : EMBEDDED_UNSAFE_REMOVAL_TIME),\ - ignore_throwspeed_threshold = (!isnull(embedding["ignore_throwspeed_threshold"]) ? embedding["ignore_throwspeed_threshold"] : FALSE),\ - impact_pain_mult = (!isnull(embedding["impact_pain_mult"]) ? embedding["impact_pain_mult"] : EMBEDDED_IMPACT_PAIN_MULTIPLIER),\ - jostle_chance = (!isnull(embedding["jostle_chance"]) ? embedding["jostle_chance"] : EMBEDDED_JOSTLE_CHANCE),\ - jostle_pain_mult = (!isnull(embedding["jostle_pain_mult"]) ? embedding["jostle_pain_mult"] : EMBEDDED_JOSTLE_PAIN_MULTIPLIER),\ - pain_stam_pct = (!isnull(embedding["pain_stam_pct"]) ? embedding["pain_stam_pct"] : EMBEDDED_PAIN_STAM_PCT)) - return TRUE - /// How many different types of mats will be counted in a bite? #define MAX_MATS_PER_BITE 2 @@ -1732,3 +1715,29 @@ if(!isnull(loc)) SEND_SIGNAL(loc, COMSIG_ATOM_CONTENTS_WEIGHT_CLASS_CHANGED, src, old_w_class, new_w_class) return TRUE + +/// Fetches embedding data +/obj/item/proc/get_embed() + RETURN_TYPE(/datum/embed_data) + return embed_type ? (embed_data ||= get_embed_by_type(embed_type)) : embed_data + +/obj/item/proc/set_embed(datum/embed_data/embed) + if(embed_data == embed) + return + if(!GLOB.embed_by_type[embed_data?.type]) + qdel(embed_data) + embed_data = ispath(embed) ? get_embed_by_type(armor) : embed + SEND_SIGNAL(src, COMSIG_ITEM_EMBEDDING_UPDATE) + +/** + * Returns the atom(either itself or an internal module) that will interact/attack the target on behalf of us + * For example an object can have different `tool_behaviours` (e.g borg omni tool) but will return an internal reference of that tool to attack for us + * You can use it for general purpose polymorphism if you need a proxy atom to interact in a specific way + * with a target on behalf on this atom + * + * Currently used only in the object melee attack chain but can be used anywhere else or even moved up to the atom level if required + */ +/obj/item/proc/get_proxy_attacker_for(atom/target, mob/user) + RETURN_TYPE(/obj/item) + + return src diff --git a/code/game/objects/items/botpad_remote.dm b/code/game/objects/items/botpad_remote.dm index d2f2db3e1ac5e..6b219725aa087 100644 --- a/code/game/objects/items/botpad_remote.dm +++ b/code/game/objects/items/botpad_remote.dm @@ -28,22 +28,23 @@ user?.balloon_alert(user, "no connected pad!") return -/obj/item/botpad_remote/multitool_act(mob/living/user, obj/item/tool) - if(!multitool_check_buffer(user, tool)) +/obj/item/botpad_remote/multitool_act(mob/living/user, obj/item/multitool/multitool) + . = NONE + if(!istype(multitool.buffer, /obj/machinery/botpad)) return - var/obj/item/multitool/multitool = tool - if(istype(multitool.buffer, /obj/machinery/botpad)) - var/obj/machinery/botpad/buffered_remote = multitool.buffer - if(buffered_remote == connected_botpad) - to_chat(user, span_warning("Controller cannot connect to its own botpad!")) - else if(!connected_botpad && istype(buffered_remote, /obj/machinery/botpad)) - connected_botpad = buffered_remote - connected_botpad.connected_remote = src - connected_botpad.id = id - multitool.set_buffer(null) - to_chat(user, span_notice("You connect the controller to the pad with data from the [multitool.name]'s buffer.")) - else - to_chat(user, span_warning("Unable to upload!")) + + var/obj/machinery/botpad/buffered_remote = multitool.buffer + if(buffered_remote == connected_botpad) + to_chat(user, span_warning("Controller cannot connect to its own botpad!")) + return ITEM_INTERACT_BLOCKING + + if(!connected_botpad && istype(buffered_remote, /obj/machinery/botpad)) + connected_botpad = buffered_remote + connected_botpad.connected_remote = src + connected_botpad.id = id + multitool.set_buffer(null) + to_chat(user, span_notice("You connect the controller to the pad with data from the [multitool.name]'s buffer.")) + return ITEM_INTERACT_SUCCESS /obj/item/botpad_remote/proc/try_launch(mob/living/user) if(!connected_botpad) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 27647feb924f9..5d7e5cca76d73 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -321,6 +321,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM return lit = TRUE + playsound(src.loc, 'sound/items/cig_light.ogg', 100, 1) make_cig_smoke() if(!(flags_1 & INITIALIZED_1)) update_appearance(UPDATE_ICON) @@ -369,6 +370,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM STOP_PROCESSING(SSobj, src) reagents.flags |= NO_REACT lit = FALSE + playsound(src.loc, 'sound/items/cig_snuff.ogg', 100, 1) update_appearance(UPDATE_ICON) if(ismob(loc)) to_chat(loc, span_notice("Your [name] goes out.")) @@ -493,7 +495,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM /obj/item/cigarette/proc/make_cig_smoke() cig_smoke = new(src, /particles/smoke/cig) - cig_smoke.particles.scale *= 1.5 + cig_smoke.particles?.scale *= 1.5 return cig_smoke // Cigarette brands. @@ -916,11 +918,13 @@ CIGARETTE PACKETS ARE IN FANCY.DM span_notice("You hear a quiet click, as [user] shuts off [src] without even looking at what [user.p_theyre()] doing. Wow."), span_notice("You quietly shut off [src] without even looking at what you're doing. Wow.") ) + playsound(src.loc , 'sound/items/zippo_off.ogg', 100, 1) else user.visible_message( span_notice("[user] quietly shuts off [src]."), span_notice("You quietly shut off [src].") ) + playsound(src.loc , 'sound/items/lighter_off.ogg', 100, 1) return set_lit(TRUE) @@ -929,7 +933,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM span_notice("Without even breaking stride, [user] flips open and lights [src] in one smooth movement."), span_notice("Without even breaking stride, you flip open and light [src] in one smooth movement.") ) + playsound(src.loc , 'sound/items/zippo_on.ogg', 100, 1) return + else + playsound(src.loc, 'sound/items/lighter_on.ogg', 100, 1) var/hand_protected = FALSE var/mob/living/carbon/human/human_user = user diff --git a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm index a36fa9d2c37d1..f4168b7b37747 100644 --- a/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machines/machine_circuitboards.dm @@ -1008,6 +1008,11 @@ /datum/stock_part/micro_laser = 1, /obj/item/stack/sheet/glass = 1) +/obj/item/circuitboard/machine/vatgrower + name = "Growing Vat" + greyscale_colors = CIRCUIT_COLOR_SCIENCE + build_path = /obj/machinery/vatgrower + /obj/item/circuitboard/machine/monkey_recycler name = "Monkey Recycler" greyscale_colors = CIRCUIT_COLOR_SCIENCE @@ -1637,3 +1642,30 @@ /datum/stock_part/servo = 1, /obj/item/stack/sheet/plasteel = 5, ) + +/obj/item/circuitboard/machine/scrubber + name = "Portable Air Scrubber" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/portable_atmospherics/scrubber + needs_anchored = FALSE + req_components = list( + /obj/item/pipe/directional/scrubber = 1, + ) + +/obj/item/circuitboard/machine/pump + name = "Portable Air Pump" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/portable_atmospherics/pump + needs_anchored = FALSE + req_components = list( + /obj/item/pipe/directional/vent = 1, + ) + +/obj/item/circuitboard/machine/pipe_scrubber + name = "Portable Pipe Scrubber" + greyscale_colors = CIRCUIT_COLOR_ENGINEERING + build_path = /obj/machinery/portable_atmospherics/pipe_scrubber + needs_anchored = FALSE + req_components = list( + /obj/item/pipe/trinary/flippable/filter = 1, + ) diff --git a/code/game/objects/items/clown_items.dm b/code/game/objects/items/clown_items.dm index 3b10f044fc3c2..3d817d24ccf2b 100644 --- a/code/game/objects/items/clown_items.dm +++ b/code/game/objects/items/clown_items.dm @@ -207,6 +207,15 @@ worn_icon_state = "horn_air" sound_file = 'sound/items/airhorn2.ogg' +/datum/crafting_recipe/airhorn + name = "Air Horn" + result = /obj/item/bikehorn/airhorn + reqs = list( + /obj/item/bikehorn = 1, + /obj/item/toy/crayon/spraycan = 1, + ) + category = CAT_ENTERTAINMENT + //golden bikehorn /obj/item/bikehorn/golden name = "golden bike horn" diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index f50909eee12c9..9bc86d0c7f96b 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -763,8 +763,8 @@ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/improvised_coolant) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) register_context() diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm index 0a944b300d423..071561d57a095 100644 --- a/code/game/objects/items/debug_items.dm +++ b/code/game/objects/items/debug_items.dm @@ -143,6 +143,10 @@ if("Wire Brush") tool_behaviour = TOOL_RUSTSCRAPER +/obj/item/debug/omnitool/item_spawner + name = "spawntool" + color = COLOR_ADMIN_PINK + /obj/item/debug/omnitool/item_spawner/attack_self(mob/user) if(!user || !user.client) return diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 871892558b9dc..dc68175cafc63 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -28,7 +28,7 @@ /// If the cell can be removed via screwdriver var/cell_removable = TRUE var/obj/item/shockpaddles/paddles - var/obj/item/stock_parts/power_store/cell + var/obj/item/stock_parts/power_store/cell/cell /// If true, revive through space suits, allow for combat shocking var/combat = FALSE /// How long does it take to recharge @@ -155,24 +155,27 @@ update_power() return TRUE -/obj/item/defibrillator/attackby(obj/item/W, mob/user, params) - if(W == paddles) +/obj/item/defibrillator/item_interaction(mob/living/user, obj/item/item, list/modifiers) + if(item == paddles) toggle_paddles() - else if(istype(W, /obj/item/stock_parts/power_store/cell)) - var/obj/item/stock_parts/power_store/cell/C = W - if(cell) - to_chat(user, span_warning("[src] already has a cell!")) - else - if(C.maxcharge < paddles.revivecost) - to_chat(user, span_notice("[src] requires a higher capacity cell.")) - return - if(!user.transferItemToLoc(W, src)) - return - cell = W - to_chat(user, span_notice("You install a cell in [src].")) - update_power() - else - return ..() + return NONE + if(!istype(item, /obj/item/stock_parts/power_store/cell)) + return NONE + + var/obj/item/stock_parts/power_store/cell/new_cell = item + if(!isnull(cell)) + to_chat(user, span_warning("[src] already has a cell!")) + return ITEM_INTERACT_BLOCKING + + if(new_cell.maxcharge < paddles.revivecost) + to_chat(user, span_notice("[src] requires a higher capacity cell.")) + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(new_cell, src)) + return NONE + cell = new_cell + to_chat(user, span_notice("You install a cell in [src].")) + update_power() + return ITEM_INTERACT_SUCCESS /obj/item/defibrillator/emag_act(mob/user, obj/item/card/emag/emag_card) @@ -314,11 +317,6 @@ cell = new /obj/item/stock_parts/power_store/cell/infinite(src) update_power() -/obj/item/defibrillator/compact/combat/loaded/attackby(obj/item/W, mob/user, params) - if(W == paddles) - toggle_paddles() - return - /obj/item/defibrillator/compact/combat/loaded/nanotrasen name = "elite Nanotrasen defibrillator" desc = "A belt-equipped state-of-the-art defibrillator. Can revive through thick clothing, has an experimental self-recharging battery, and can be utilized as a weapon via applying the paddles while in a combat stance." diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 67ec498a1fbc6..e684c1b4959e5 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -46,8 +46,8 @@ var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/flashlight_eyes) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -928,6 +928,7 @@ light_range = 4 light_power = 2 alpha = 0 + layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE anchored = TRUE resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 1262abb141f47..f6fb14c2f19ba 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -12,7 +12,7 @@ /obj/item/multitool name = "multitool" - desc = "Used for pulsing wires to test which to cut. Not recommended by doctors." + desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. You can activate it in-hand to locate the nearest APC." icon = 'icons/obj/devices/tool.dmi' icon_state = "multitool" inhand_icon_state = "multitool" @@ -32,11 +32,31 @@ usesound = 'sound/weapons/empty.ogg' var/datum/buffer // simple machine buffer for device linkage var/mode = 0 + var/apc_scanner = TRUE + COOLDOWN_DECLARE(next_apc_scan) /obj/item/multitool/examine(mob/user) . = ..() . += span_notice("Its buffer [buffer ? "contains [buffer]." : "is empty."]") +/obj/item/multitool/attack_self(mob/user, list/modifiers) + . = ..() + + if(. || !apc_scanner) + return + + if(!COOLDOWN_FINISHED(src, next_apc_scan)) + return + + COOLDOWN_START(src, next_apc_scan, 1 SECONDS) + + var/area/local_area = get_area(src) + var/power_controller = local_area.apc + if(power_controller) + user.balloon_alert(user, "[get_dist(src, power_controller)]m [dir2text(get_dir(src, power_controller))]") + else + user.balloon_alert(user, "couldn't find apc!") + /obj/item/multitool/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] puts the [src] to [user.p_their()] chest. It looks like [user.p_theyre()] trying to pulse [user.p_their()] heart off!")) return OXYLOSS//theres a reason it wasn't recommended by doctors diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index ced454c3d3261..912e1d66b0929 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -116,9 +116,7 @@ // No subtypes if(type != /obj/item/radio) return - AddComponent(/datum/component/slapcrafting,\ - slapcraft_recipes = list(/datum/crafting_recipe/improv_explosive)\ - ) + AddElement(/datum/element/slapcrafting, string_list(list(/datum/crafting_recipe/improv_explosive))) RegisterSignal(src, COMSIG_HIT_BY_SABOTEUR, PROC_REF(on_saboteur)) diff --git a/code/game/objects/items/devices/scanners/gas_analyzer.dm b/code/game/objects/items/devices/scanners/gas_analyzer.dm index b1110e389a1db..f5fe29f9ed541 100644 --- a/code/game/objects/items/devices/scanners/gas_analyzer.dm +++ b/code/game/objects/items/devices/scanners/gas_analyzer.dm @@ -37,8 +37,8 @@ return var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/material_sniffer) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index ac309e275d77c..764e2fc6173bf 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -52,8 +52,8 @@ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/ghettojetpack) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -190,7 +190,7 @@ balloon_alert(user, "already full!") return TRUE // Make sure we're refilling with the proper chem. - if(!(target.reagents.has_reagent(chem))) + if(!(target.reagents.has_reagent(chem, check_subtypes = TRUE))) balloon_alert(user, "can't refill with this liquid!") return TRUE var/obj/structure/reagent_dispensers/W = target //will it work? diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index e2d587cd3594b..ad03fe9ab4f10 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -40,8 +40,8 @@ AddElement(/datum/element/update_icon_updates_onmob) var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/flamethrower) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/game/objects/items/food/sandwichtoast.dm b/code/game/objects/items/food/sandwichtoast.dm index e440a1039e6d1..47a7b563e0895 100644 --- a/code/game/objects/items/food/sandwichtoast.dm +++ b/code/game/objects/items/food/sandwichtoast.dm @@ -9,7 +9,7 @@ /datum/reagent/consumable/nutriment/vitamin = 1, ) tastes = list("meat" = 2, "cheese" = 1, "bread" = 2, "lettuce" = 1) - foodtypes = GRAIN | VEGETABLES + foodtypes = GRAIN | VEGETABLES | DAIRY | MEAT food_flags = FOOD_FINGER_FOOD w_class = WEIGHT_CLASS_SMALL crafting_complexity = FOOD_COMPLEXITY_3 diff --git a/code/game/objects/items/granters/crafting/fletching.dm b/code/game/objects/items/granters/crafting/fletching.dm new file mode 100644 index 0000000000000..e41c2f9acd121 --- /dev/null +++ b/code/game/objects/items/granters/crafting/fletching.dm @@ -0,0 +1,22 @@ + +/obj/item/book/granter/crafting_recipe/fletching + name = "Whittle Me This: Fletching for the Modern Spacer" + desc = "A how-to guide to crafting and maintaining wooden bows, fletching arrows, and... making violins?" + crafting_recipe_types = list( + /datum/crafting_recipe/arrow, + /datum/crafting_recipe/plastic_arrow, + /datum/crafting_recipe/shortbow, + /datum/crafting_recipe/holy_arrow, + /datum/crafting_recipe/arrow_quiver, + /datum/crafting_recipe/violin, + ) + icon_state = "book4" + uses = INFINITY + remarks = list( + "Okay, so the quality of the wood has some impact.", + "I feel like the violin chapter is in here as a joke, surely...", + "The author seems oddly proud about how many years they've been hunting in 'these parts'...", + "i really wish they'd stop with all the marriage euphemisms...", + "I need membership? Membership with what?", + "Okay, I think I get the point already...", + ) diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm index 336c9e5e2eea7..49f66b06896b8 100644 --- a/code/game/objects/items/grenades/plastic.dm +++ b/code/game/objects/items/grenades/plastic.dm @@ -145,9 +145,8 @@ var/obj/item/thrown_weapon = bomb_target thrown_weapon.throw_speed = max(1, (thrown_weapon.throw_speed - 3)) thrown_weapon.throw_range = max(1, (thrown_weapon.throw_range - 3)) - if(thrown_weapon.embedding) - thrown_weapon.embedding["embed_chance"] = 0 - thrown_weapon.updateEmbedding() + if(thrown_weapon.get_embed()) + thrown_weapon.set_embed(thrown_weapon.get_embed().generate_with_values(embed_chance = 0)) else if(isliving(bomb_target)) plastic_overlay.layer = FLOAT_LAYER diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index d3e8bdd0ad88d..c5a68260abade 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -214,8 +214,8 @@ var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/bola, /datum/crafting_recipe/gonbola) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -537,6 +537,8 @@ gender = NEUTER ///Amount of time to knock the target down for once it's hit in deciseconds. var/knockdown = 0 + ///Reference of the mob we will attempt to snare + var/datum/weakref/ensnare_mob_ref /obj/item/restraints/legcuffs/bola/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, gentle = FALSE, quickstart = TRUE) if(!..()) @@ -546,21 +548,32 @@ /obj/item/restraints/legcuffs/bola/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) if(..() || !iscarbon(hit_atom))//if it gets caught or the target can't be cuffed, return//abort - ensnare(hit_atom) + //The mob has been hit, save the reference for ensnaring + ensnare_mob_ref = WEAKREF(hit_atom) + +/obj/item/restraints/legcuffs/bola/after_throw(datum/callback/callback) + . = ..() + if (isnull(ensnare_mob_ref)) + return + var/atom/ensnare_mob = ensnare_mob_ref.resolve() + if (!isnull(ensnare_mob)) + ensnare(ensnare_mob) + ensnare_mob_ref = null /** * Attempts to legcuff someone with the bola * * Arguments: - * * C - the carbon that we will try to ensnare + * * snared_mob - the carbon that we will try to ensnare */ -/obj/item/restraints/legcuffs/bola/proc/ensnare(mob/living/carbon/C) - if(!C.legcuffed && C.num_legs >= 2) - visible_message(span_danger("\The [src] ensnares [C]!"), span_userdanger("\The [src] ensnares you!")) - C.equip_to_slot(src, ITEM_SLOT_LEGCUFFED) - SSblackbox.record_feedback("tally", "handcuffs", 1, type) - C.Knockdown(knockdown) - playsound(src, 'sound/effects/snap.ogg', 50, TRUE) +/obj/item/restraints/legcuffs/bola/proc/ensnare(mob/living/carbon/snared_mob) + if(snared_mob.legcuffed || snared_mob.num_legs < 2) + return + visible_message(span_danger("\The [src] ensnares [snared_mob]!"), span_userdanger("\The [src] ensnares you!")) + snared_mob.equip_to_slot(src, ITEM_SLOT_LEGCUFFED) + SSblackbox.record_feedback("tally", "handcuffs", 1, type) + snared_mob.Knockdown(knockdown) + playsound(src, 'sound/effects/snap.ogg', 50, TRUE) /** * A traitor variant of the bola. diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 622ee6592cb7a..1a16b08eb866b 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -21,7 +21,6 @@ attack_verb_simple = list("slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") sharpness = SHARP_EDGED armor_type = /datum/armor/item_knife - var/bayonet = FALSE //Can this be attached to a gun? wound_bonus = 5 bare_wound_bonus = 15 tool_behaviour = TOOL_KNIFE @@ -125,14 +124,19 @@ icon_state = "buckknife" worn_icon_state = "buckknife" desc = "A military combat utility survival knife." - embedding = list("pain_mult" = 4, "embed_chance" = 65, "fall_chance" = 10, "ignore_throwspeed_threshold" = TRUE) + embed_type = /datum/embed_data/combat_knife force = 20 throwforce = 20 attack_verb_continuous = list("slashes", "stabs", "slices", "tears", "lacerates", "rips", "cuts") attack_verb_simple = list("slash", "stab", "slice", "tear", "lacerate", "rip", "cut") - bayonet = TRUE slot_flags = ITEM_SLOT_MASK +/datum/embed_data/combat_knife + pain_mult = 4 + embed_chance = 65 + fall_chance = 10 + ignore_throwspeed_threshold = TRUE + /obj/item/knife/combat/Initialize(mapload) . = ..() AddComponent(/datum/component/knockoff, 90, list(BODY_ZONE_PRECISE_MOUTH), slot_flags) //90% to knock off when wearing a mask @@ -157,11 +161,10 @@ icon = 'icons/obj/weapons/stabby.dmi' icon_state = "survivalknife" worn_icon_state = "survivalknife" - embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) + embed_type = /datum/embed_data/combat_knife/weak desc = "A hunting grade survival knife." force = 15 throwforce = 15 - bayonet = TRUE /obj/item/knife/combat/bone name = "bone dagger" @@ -172,13 +175,16 @@ lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' desc = "A sharpened bone. The bare minimum in survival." - embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) + embed_type = /datum/embed_data/combat_knife/weak obj_flags = parent_type::obj_flags & ~CONDUCTS_ELECTRICITY slot_flags = NONE force = 15 throwforce = 15 custom_materials = null +/datum/embed_data/combat_knife/weak + embed_chance = 35 + /obj/item/knife/combat/cyborg name = "cyborg knife" icon = 'icons/obj/items_cyborg.dmi' diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm index eca126fc6aee0..253a40be69d54 100644 --- a/code/game/objects/items/melee/baton.dm +++ b/code/game/objects/items/melee/baton.dm @@ -339,6 +339,9 @@ ) RegisterSignal(src, COMSIG_TRANSFORMING_ON_TRANSFORM, PROC_REF(on_transform)) +/obj/item/melee/baton/telescopic/additional_effects_non_cyborg(mob/living/target, mob/living/user) + target.apply_status_effect(/datum/status_effect/next_shove_stuns) + /obj/item/melee/baton/telescopic/suicide_act(mob/living/user) var/mob/living/carbon/human/human_user = user var/obj/item/organ/internal/brain/our_brain = human_user.get_organ_by_type(/obj/item/organ/internal/brain) @@ -401,6 +404,7 @@ return span_danger("The baton is still charging!") /obj/item/melee/baton/telescopic/contractor_baton/additional_effects_non_cyborg(mob/living/target, mob/living/user) + . = ..() target.set_jitter_if_lower(40 SECONDS) target.set_stutter_if_lower(40 SECONDS) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 228f359729c31..dd70bd08c2161 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -113,13 +113,9 @@ SIGNAL_HANDLER if(active) - if(embedding) - updateEmbedding() heat = active_heat START_PROCESSING(SSobj, src) else - if(embedding) - disableEmbedding() heat = initial(heat) STOP_PROCESSING(SSobj, src) @@ -173,6 +169,10 @@ return (BRUTELOSS|FIRELOSS) /// Energy swords. +/datum/embed_data/esword + embed_chance = 75 + impact_pain_mult = 10 + /obj/item/melee/energy/sword name = "energy sword" desc = "May the force be within you." @@ -189,7 +189,7 @@ armour_penetration = 35 block_chance = 50 block_sound = 'sound/weapons/block_blade.ogg' - embedding = list("embed_chance" = 75, "impact_pain_mult" = 10) + embed_type = /datum/embed_data/esword /obj/item/melee/energy/sword/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, damage_type = BRUTE) if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)) diff --git a/code/game/objects/items/pillow.dm b/code/game/objects/items/pillow.dm index f1c96e2baa091..f699dd34b3bfa 100644 --- a/code/game/objects/items/pillow.dm +++ b/code/game/objects/items/pillow.dm @@ -37,8 +37,8 @@ /datum/crafting_recipe/pillow_suit, /datum/crafting_recipe/pillow_hood,\ ) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 1fabf13d31ac1..7e7076e842c64 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -86,6 +86,18 @@ puzzle_id = null //honestly these cant be closed anyway and im not fucking around with door code anymore INVOKE_ASYNC(src, PROC_REF(try_puzzle_open), null) +/obj/machinery/door/puzzle/animation_length(animation) + switch(animation) + if(DOOR_OPENING_ANIMATION) + return 1.0 SECONDS + +/obj/machinery/door/puzzle/animation_segment_delay(animation) + switch(animation) + if(DOOR_OPENING_PASSABLE) + return 0.8 SECONDS + if(DOOR_OPENING_FINISHED) + return 1.0 SECONDS + /obj/machinery/door/puzzle/Bumped(atom/movable/AM) return !density && ..() @@ -558,6 +570,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/password/pin, 32) desc = "A board filled with colored dots. What could this mean?" icon = 'icons/obj/fluff/puzzle_small.dmi' icon_state = "puzzle_dots" + layer = ABOVE_NORMAL_TURF_LAYER plane = GAME_PLANE //visible over walls resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | UNACIDABLE | LAVA_PROOF flags_1 = UNPAINTABLE_1 diff --git a/code/game/objects/items/rcd/RPLD.dm b/code/game/objects/items/rcd/RPLD.dm index 8fc2da9520599..56452e2e452b1 100644 --- a/code/game/objects/items/rcd/RPLD.dm +++ b/code/game/objects/items/rcd/RPLD.dm @@ -38,7 +38,6 @@ /obj/machinery/plumbing/synthesizer = 15, /obj/machinery/plumbing/reaction_chamber/chem = 15, /obj/machinery/plumbing/grinder_chemical = 30, - /obj/machinery/plumbing/growing_vat = 20, /obj/machinery/plumbing/fermenter = 30, /obj/machinery/plumbing/liquid_pump = 35, //extracting chemicals from ground is one way of creation /obj/machinery/plumbing/disposer = 10, @@ -303,44 +302,6 @@ current_layer = GLOB.plumbing_layers[current_loc] to_chat(source, span_notice("You set the layer to [current_layer].")) -/obj/item/construction/plumbing/research - name = "research plumbing constructor" - desc = "A type of plumbing constructor designed to rapidly deploy the machines needed to conduct cytological research." - icon_state = "plumberer_sci" - inhand_icon_state = "plumberer_sci" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - ///Design types for research plumbing constructor - var/list/static/research_design_types = list( - //Category 1 Synthesizers - "Synthesizers" = list( - /obj/machinery/plumbing/reaction_chamber = 15, - /obj/machinery/plumbing/grinder_chemical = 30, - /obj/machinery/plumbing/disposer = 10, - /obj/machinery/plumbing/growing_vat = 20, - ), - - //Category 2 Distributors - "Distributors" = list( - /obj/machinery/duct = 1, - /obj/machinery/plumbing/input = 5, - /obj/machinery/plumbing/filter = 5, - /obj/machinery/plumbing/splitter = 5, - /obj/machinery/plumbing/output = 5, - ), - - //Category 3 storage - "Storage" = list( - /obj/machinery/plumbing/tank = 20, - /obj/machinery/plumbing/acclimator = 10, - ), - ) - -/obj/item/construction/plumbing/research/Initialize(mapload) - plumbing_design_types = research_design_types - - . = ..() - /obj/item/construction/plumbing/service name = "service plumbing constructor" desc = "A type of plumbing constructor designed to rapidly deploy the machines needed to make a brewery." diff --git a/code/game/objects/items/robot/items/food.dm b/code/game/objects/items/robot/items/food.dm index 6e9b2143d12b6..865e5c792e56b 100644 --- a/code/game/objects/items/robot/items/food.dm +++ b/code/game/objects/items/robot/items/food.dm @@ -186,7 +186,7 @@ icon_state = "gumball" damage = 0 speed = 0.5 - embedding = null + embed_type = null /obj/projectile/bullet/gumball/Initialize(mapload) . = ..() @@ -219,29 +219,30 @@ icon_state = "lollipop_1" damage = 0 speed = 0.5 - embedding = null + embed_type = null var/head_color /obj/projectile/bullet/lollipop/harmful - embedding = list( - embed_chance = 35, - fall_chance = 2, - jostle_chance = 0, - ignore_throwspeed_threshold = TRUE, - pain_stam_pct = 0.5, - pain_mult = 3, - rip_time = 10, - ) + embed_type = /datum/embed_data/lollipop damage = 10 shrapnel_type = /obj/item/food/lollipop/cyborg embed_falloff_tile = 0 +/datum/embed_data/lollipop + embed_chance = 35 + fall_chance = 2 + jostle_chance = 0 + ignore_throwspeed_threshold = TRUE + pain_stam_pct = 0.5 + pain_mult = 3 + rip_time = 10 + /obj/projectile/bullet/lollipop/Initialize(mapload) . = ..() var/mutable_appearance/head = mutable_appearance('icons/obj/weapons/guns/projectiles.dmi', "lollipop_2") head.color = head_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) add_overlay(head) - if(!embedding) + if(!embed_type) AddElement(/datum/element/projectile_drop, /obj/item/food/lollipop/cyborg) RegisterSignals(src, list(COMSIG_PROJECTILE_ON_SPAWN_DROP, COMSIG_PROJECTILE_ON_SPAWN_EMBEDDED), PROC_REF(handle_drop)) diff --git a/code/game/objects/items/robot/items/tools.dm b/code/game/objects/items/robot/items/tools.dm index 8a4ccff8ced20..f16cd0844901d 100644 --- a/code/game/objects/items/robot/items/tools.dm +++ b/code/game/objects/items/robot/items/tools.dm @@ -1,7 +1,5 @@ #define PKBORG_DAMPEN_CYCLE_DELAY (2 SECONDS) #define POWER_RECHARGE_CYBORG_DRAIN_MULTIPLIER (0.0004 * STANDARD_CELL_RATE) -#define NO_TOOL "deactivated" -#define TOOL_DRAPES "surgical_drapes" /obj/item/cautery/prt //it's a subtype of cauteries so that it inherits the cautery sprites and behavior and stuff, because I'm too lazy to make sprites for this thing name = "plating repair tool" @@ -176,146 +174,138 @@ projectile.speed *= (1 / projectile_speed_coefficient) projectile.cut_overlay(projectile_effect) -////////////////////// -///CYBORG OMNITOOLS/// -////////////////////// - -/** - Onmi Toolboxs act as a cache of tools for a particular borg's omnitools. Not all borg - get a toolbox (as not all borgs use omnitools), and those that do can only have one - toolbox. The toolbox keeps track of a borg's omnitool arms, and handles speed upgrades. - - Omnitools are the actual tool arms for the cyborg to interact with. When attack_self - is called, they can select a tool from the toolbox. The tool is not moved, and instead - only referenced in place of the omnitool's own attacks. The omnitool also takes on - the tool's sprite, which completes the illusion. In this way, multiple tools are - shared between multiple omnitool arms. A multitool's buffer, for example, will not - depend on which omnitool arm was used to set it. -*/ -/obj/item/cyborg_omnitoolbox - name = "broken cyborg toolbox" - desc = "Some internal part of a broken cyborg." +//bare minimum omni-toolset for modularity +/obj/item/borg/cyborg_omnitool + name = "cyborg omni-toolset" + desc = "You shouldn't see this in-game normally." icon = 'icons/mob/silicon/robot_items.dmi' - icon_state = "lollipop" - toolspeed = 10 - ///List of Omnitool "arms" that the borg has. - var/list/omnitools = list() - ///List of paths for tools. These will be created during Initialize() - var/list/toolpaths = list() - ///Target Toolspeed to set after reciving an omnitool upgrade - var/upgraded_toolspeed = 10 - ///Whether we currently have the upgraded speed - var/currently_upgraded = FALSE - -/obj/item/cyborg_omnitoolbox/Initialize(mapload) - . = ..() - if(!toolpaths.len) - return - - var/obj/item/newitem - for(var/newpath in toolpaths) - newitem = new newpath(src) - newitem.toolspeed = toolspeed //In case thse have different base speeds as stand-alone tools on other borgs - ADD_TRAIT(newitem, TRAIT_NODROP, CYBORG_ITEM_TRAIT) + icon_state = "toolkit_medborg" -/obj/item/cyborg_omnitoolbox/proc/set_upgrade(upgrade = FALSE) - for(var/obj/item/tool in contents) - if(upgrade) - tool.toolspeed = upgraded_toolspeed - else - tool.toolspeed = toolspeed - currently_upgraded = upgrade + ///our tools (list of item typepaths) + var/list/obj/item/omni_toolkit = list() + ///Map of solid objects internally used by the omni tool + var/list/obj/item/atoms = list() + ///object we are referencing to for force, sharpness and sound + var/obj/item/reference + //is the toolset upgraded or not + var/upgraded = FALSE + +/obj/item/borg/cyborg_omnitool/Destroy(force) + for(var/obj/item/tool_path as anything in atoms) + var/obj/item/tool = atoms[tool_path] + if(!QDELETED(tool)) //if we are sharing tools from our other omnitool brothers we don't want to re delete them if they got deleted first + qdel(tool) + atoms.Cut() -/obj/item/cyborg_omnitoolbox/engineering - toolspeed = 0.5 - upgraded_toolspeed = 0.3 - toolpaths = list( - /obj/item/wrench/cyborg, - /obj/item/wirecutters/cyborg, - /obj/item/screwdriver/cyborg, - /obj/item/crowbar/cyborg, - /obj/item/multitool/cyborg, - ) - -/obj/item/cyborg_omnitoolbox/medical - toolspeed = 1 - upgraded_toolspeed = 0.7 - toolpaths = list( - /obj/item/scalpel/cyborg, - /obj/item/surgicaldrill/cyborg, - /obj/item/hemostat/cyborg, - /obj/item/retractor/cyborg, - /obj/item/cautery/cyborg, - /obj/item/circular_saw/cyborg, - /obj/item/bonesetter/cyborg, - ) + return ..() -/obj/item/borg/cyborg_omnitool - name = "broken cyborg tool arm" - desc = "Some internal part of a broken cyborg." - icon = 'icons/mob/silicon/robot_items.dmi' - icon_state = "lollipop" - ///Ref to the toolbox, since our own loc will be changing - var/obj/item/cyborg_omnitoolbox/toolbox - ///Ref to currently selected tool, if any - var/obj/item/selected +/obj/item/borg/cyborg_omnitool/get_all_tool_behaviours() + . = list() + for(var/obj/item/tool as anything in omni_toolkit) + . += initial(tool.tool_behaviour) + +///The omnitool interacts with real world objects based on the state it has assumed +/obj/item/borg/cyborg_omnitool/get_proxy_attacker_for(atom/target, mob/user) + if(!reference) + return src + + //first check if we have the tool + var/obj/item/tool = atoms[reference] + if(!QDELETED(tool)) + return tool + + //else try to borrow an in-built tool from our other omnitool brothers to save & share memory & such + var/mob/living/silicon/robot/borg = user + for(var/obj/item/borg/cyborg_omnitool/omni_tool in borg.model.basic_modules) + if(omni_tool == src) + continue + tool = omni_tool.atoms[reference] + if(!QDELETED(tool)) + atoms[reference] = tool + return tool -/obj/item/borg/cyborg_omnitool/Initialize(mapload) - . = ..() - if(!iscyborg(loc.loc)) - return - var/obj/item/robot_model/model = loc - var/obj/item/cyborg_omnitoolbox/chassis_toolbox = model.toolbox - if(!chassis_toolbox) - return - toolbox = chassis_toolbox - toolbox.omnitools += src + //if all else fails just make a new one from scratch + tool = new reference(user) + ADD_TRAIT(tool, TRAIT_NODROP, CYBORG_ITEM_TRAIT) + atoms[reference] = tool + return tool /obj/item/borg/cyborg_omnitool/attack_self(mob/user) + //build the radial menu options var/list/radial_menu_options = list() - for(var/obj/item/borgtool in toolbox.contents) - radial_menu_options[borgtool] = image(icon = borgtool.icon, icon_state = borgtool.icon_state) - var/obj/item/potential_new_tool = show_radial_menu(user, src, radial_menu_options, require_near = TRUE, tooltips = TRUE) - if(!potential_new_tool) - return ..() - if(potential_new_tool == selected) - return ..() - for(var/obj/item/borg/cyborg_omnitool/coworker in toolbox.omnitools) - if(coworker.selected == potential_new_tool) - coworker.deselect() //Can I borrow that please - break - selected = potential_new_tool - icon_state = selected.icon_state - playsound(src, 'sound/items/change_jaws.ogg', 50, TRUE) - return ..() + for(var/obj/item/tool as anything in omni_toolkit) + radial_menu_options[initial(tool.tool_behaviour)] = image(icon = initial(tool.icon), icon_state = initial(tool.icon_state)) -/obj/item/borg/cyborg_omnitool/proc/deselect() - if(!selected) + //assign the new tool behaviour + var/new_tool_behaviour = show_radial_menu(user, src, radial_menu_options, require_near = TRUE, tooltips = TRUE) + if(isnull(new_tool_behaviour) || new_tool_behaviour == tool_behaviour) return - selected = null + tool_behaviour = new_tool_behaviour + + //set the reference & update icons + for(var/obj/item/tool as anything in omni_toolkit) + if(initial(tool.tool_behaviour) == new_tool_behaviour) + reference = tool + update_appearance(UPDATE_ICON_STATE) + playsound(src, 'sound/items/change_jaws.ogg', 50, TRUE) + break + +/obj/item/borg/cyborg_omnitool/update_icon_state() icon_state = initial(icon_state) - playsound(src, 'sound/items/change_jaws.ogg', 50, TRUE) -/obj/item/borg/cyborg_omnitool/cyborg_unequip() - deselect() - return ..() + if (tool_behaviour) + icon_state += "_[sanitize_css_class_name(tool_behaviour)]" -/obj/item/borg/cyborg_omnitool/melee_attack_chain(mob/user, atom/target, params) - if(selected) - return selected.melee_attack_chain(user, target, params) return ..() +/** + * Is this omni tool upgraded or not + * Arguments + * + * * upgrade - TRUE/FALSE for upgraded + */ +/obj/item/borg/cyborg_omnitool/proc/set_upgraded(upgrade) + upgraded = upgraded + + playsound(src, 'sound/items/change_jaws.ogg', 50, TRUE) + +/obj/item/borg/cyborg_omnitool/medical + name = "surgical omni-toolset" + desc = "A set of surgical tools used by cyborgs to operate on various surgical operations." + + omni_toolkit = list( + /obj/item/surgical_drapes/cyborg, + /obj/item/scalpel/cyborg, + /obj/item/surgicaldrill/cyborg, + /obj/item/hemostat/cyborg, + /obj/item/retractor/cyborg, + /obj/item/cautery/cyborg, + /obj/item/circular_saw/cyborg, + /obj/item/bonesetter/cyborg, + ) + +//Toolset for engineering cyborgs, this is all of the tools except for the welding tool. since it's quite hard to implement (read:can't be arsed to) /obj/item/borg/cyborg_omnitool/engineering name = "engineering omni-toolset" desc = "A set of engineering tools used by cyborgs to conduct various engineering tasks." + icon = 'icons/obj/items_cyborg.dmi' icon_state = "toolkit_engiborg" -/obj/item/borg/cyborg_omnitool/medical - name = "surgical omni-toolset" - desc = "A set of surgical tools used by cyborgs to operate on various surgical operations." - icon_state = "toolkit_medborg" + omni_toolkit = list( + /obj/item/wrench/cyborg, + /obj/item/wirecutters/cyborg, + /obj/item/screwdriver/cyborg, + /obj/item/crowbar/cyborg, + /obj/item/multitool/cyborg, + ) + +/obj/item/borg/cyborg_omnitool/engineering/examine(mob/user) + . = ..() + + if(tool_behaviour == TOOL_MULTITOOL) + for(var/obj/item/multitool/tool in atoms) + . += "Its multitool buffer contains [tool.buffer]" + break #undef PKBORG_DAMPEN_CYCLE_DELAY #undef POWER_RECHARGE_CYBORG_DRAIN_MULTIPLIER -#undef NO_TOOL -#undef TOOL_DRAPES diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index b2994028c7006..6fa32ae31e29b 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -428,18 +428,21 @@ . = ..() if(!.) return . - if(cyborg.model.toolbox.currently_upgraded) - to_chat(user, span_warning("This unit is already equipped with an omnitool upgrade!")) - return FALSE - cyborg.model.toolbox.set_upgrade(TRUE) ADD_TRAIT(cyborg, TRAIT_FASTMED, REF(src)) + for(var/obj/item/borg/cyborg_omnitool/medical/omnitool_upgrade in cyborg.model.modules) + if(omnitool_upgrade.upgraded) + to_chat(user, span_warning("This unit is already equipped with an omnitool upgrade!")) + return FALSE + for(var/obj/item/borg/cyborg_omnitool/medical/omnitool in cyborg.model.modules) + omnitool.set_upgraded(TRUE) /obj/item/borg/upgrade/surgery_omnitool/deactivate(mob/living/silicon/robot/cyborg, mob/living/user = usr) . = ..() if(!.) return . - cyborg.model.toolbox.set_upgrade(FALSE) REMOVE_TRAIT(cyborg, TRAIT_FASTMED, REF(src)) + for(var/obj/item/borg/cyborg_omnitool/omnitool in cyborg.model.modules) + omnitool.set_upgraded(FALSE) /obj/item/borg/upgrade/engineering_omnitool name = "cyborg engineering omni-tool upgrade" @@ -454,16 +457,19 @@ . = ..() if(!.) return . - if(cyborg.model.toolbox.currently_upgraded) - to_chat(user, span_warning("This unit is already equipped with an omnitool upgrade!")) - return FALSE - cyborg.model.toolbox.set_upgrade(TRUE) + for(var/obj/item/borg/cyborg_omnitool/engineering/omnitool_upgrade in cyborg.model.modules) + if(omnitool_upgrade.upgraded) + to_chat(user, span_warning("This unit is already equipped with an omnitool upgrade!")) + return FALSE + for(var/obj/item/borg/cyborg_omnitool/engineering/omnitool in cyborg.model.modules) + omnitool.set_upgraded(TRUE) /obj/item/borg/upgrade/engineering_omnitool/deactivate(mob/living/silicon/robot/cyborg, mob/living/user = usr) . = ..() if(!.) return . - cyborg.model.toolbox.set_upgrade(FALSE) + for(var/obj/item/borg/cyborg_omnitool/omnitool in cyborg.model.modules) + omnitool.set_upgraded(FALSE) /obj/item/borg/upgrade/defib name = "medical cyborg defibrillator" diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 2cc41b5d9f266..1553f0e9c8f29 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -145,8 +145,8 @@ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/strobeshield) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index 9b024cfbb97a2..701a0a819d002 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -17,8 +17,7 @@ name = "bullet" icon = 'icons/obj/weapons/guns/ammo.dmi' icon_state = "s-casing" - embedding = null // embedding vars are taken from the projectile itself - + embed_type = null /obj/projectile/bullet/shrapnel name = "flying shrapnel shard" @@ -34,7 +33,12 @@ ignore_range_hit_prone_targets = TRUE sharpness = SHARP_EDGED wound_bonus = 30 - embedding = list(embed_chance=70, ignore_throwspeed_threshold=TRUE, fall_chance=1) + embed_type = /datum/embed_data/shrapnel + +/datum/embed_data/shrapnel + embed_chance = 70 + ignore_throwspeed_threshold = TRUE + fall_chance = 1 /obj/projectile/bullet/shrapnel/short_range range = 5 @@ -70,7 +74,17 @@ ricochet_incidence_leeway = 0 embed_falloff_tile = -2 shrapnel_type = /obj/item/shrapnel/stingball - embedding = list(embed_chance=55, fall_chance=2, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=3, jostle_pain_mult=3, rip_time=15) + embed_type = /datum/embed_data/stingball + +/datum/embed_data/stingball + embed_chance = 55 + fall_chance = 2 + jostle_chance = 7 + ignore_throwspeed_threshold = TRUE + pain_stam_pct = 0.7 + pain_mult = 3 + jostle_pain_mult = 3 + rip_time = 15 /obj/projectile/bullet/pellet/stingball/on_ricochet(atom/A) hit_prone_targets = TRUE // ducking will save you from the first wave, but not the rebounds @@ -92,10 +106,20 @@ ricochets_max = 2 ricochet_chance = 140 shrapnel_type = /obj/item/shrapnel/capmine - embedding = list(embed_chance=90, fall_chance=3, jostle_chance=7, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.7, pain_mult=5, jostle_pain_mult=6, rip_time=15) + embed_type = /datum/embed_data/capmine wound_falloff_tile = 0 embed_falloff_tile = 0 +/datum/embed_data/capmine + embed_chance = 90 + fall_chance = 3 + jostle_chance = 7 + ignore_throwspeed_threshold = TRUE + pain_stam_pct = 0.7 + pain_mult = 5 + jostle_pain_mult = 6 + rip_time = 15 + /obj/item/shrapnel/capmine name = "\improper AP shrapnel shard" custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 0.5) diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index 66e96bcab4b83..96fbde554b79e 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -12,7 +12,7 @@ throwforce = 20 throw_speed = 4 demolition_mod = 0.75 - embedding = list("impact_pain_mult" = 2, "remove_pain_mult" = 4, "jostle_chance" = 2.5) + embed_type = /datum/embed_data/spear armour_penetration = 10 custom_materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass= HALF_SHEET_MATERIAL_AMOUNT * 2) hitsound = 'sound/weapons/bladeslice.ogg' @@ -32,6 +32,11 @@ /// How much damage to do wielded var/force_wielded = 18 +/datum/embed_data/spear + impact_pain_mult = 2 + remove_pain_mult = 4 + jostle_chance = 2.5 + /datum/armor/item_spear fire = 50 acid = 30 @@ -61,8 +66,8 @@ /obj/item/spear/proc/add_headpike_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpike) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -231,8 +236,8 @@ /obj/item/spear/military/add_headpike_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikemilitary) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -255,8 +260,8 @@ /obj/item/spear/bonespear/add_headpike_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikebone) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -279,7 +284,7 @@ /obj/item/spear/bamboospear/add_headpike_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/headpikebamboo) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 82f19d09d9692..5a8e1361c28c3 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -33,13 +33,16 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ attack_verb_continuous = list("hits", "bludgeons", "whacks") attack_verb_simple = list("hit", "bludgeon", "whack") hitsound = 'sound/weapons/gun/general/grenade_launch.ogg' - embedding = list(embed_chance = 50) + embed_type = /datum/embed_data/rods novariants = TRUE matter_amount = 2 cost = HALF_SHEET_MATERIAL_AMOUNT source = /datum/robot_energy_storage/material/iron merge_type = /obj/item/stack/rods +/datum/embed_data/rods + embed_chance = 50 + /obj/item/stack/rods/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] begins to stuff \the [src] down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide!"))//it looks like theyre ur mum return BRUTELOSS @@ -58,8 +61,8 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/spear, /datum/crafting_recipe/stunprod, /datum/crafting_recipe/teleprod) // snatcher prod isn't here as a spoopy secret - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 59196639ffeba..a9d71fa127abb 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -293,7 +293,16 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( var/shiv_type = /obj/item/knife/shiv var/craft_time = 3.5 SECONDS var/obj/item/stack/sheet/weld_material = /obj/item/stack/sheet/glass - embedding = list("embed_chance" = 65) + embed_type = /datum/embed_data/shard + +/datum/embed_data/shard + embed_chance = 65 + +/datum/embed_data/glass_candy + embed_chance = 100 + ignore_throwspeed_threshold = TRUE + impact_pain_mult = 1 + pain_chance = 5 /datum/armor/item_shard melee = 100 diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 2d1636e9e165a..fbd69dbd20d4b 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -251,8 +251,8 @@ GLOBAL_LIST_INIT(leather_recipes, list ( \ /datum/crafting_recipe/goliathcloak, /datum/crafting_recipe/skilt, /datum/crafting_recipe/drakecloak,\ ) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -311,8 +311,8 @@ GLOBAL_LIST_INIT(sinew_recipes, list ( \ var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/drakecloak) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index cc9bc3bcb9659..0ec790fe74349 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -87,9 +87,9 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ new/datum/stack_recipe("wall girders (anchored)", /obj/structure/girder, 2, time = 4 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, placement_checks = STACK_CHECK_TRAM_FORBIDDEN, trait_booster = TRAIT_QUICK_BUILD, trait_modifier = 0.75, category = CAT_STRUCTURE), \ null, \ null, \ - new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("modular console", /obj/machinery/modular_computer, 10, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("computer frame", /obj/structure/frame/computer, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("modular console", /obj/machinery/modular_computer, 10, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("machine frame", /obj/structure/frame/machine, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ null, \ new /datum/stack_recipe_list("airlock assemblies", list( \ new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ @@ -113,24 +113,37 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ )), \ null, \ new/datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_DOORS), \ - new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 2.5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ null, \ new/datum/stack_recipe("grenade casing", /obj/item/grenade/chem_grenade, crafting_flags = NONE, category = CAT_CHEMISTRY), \ - new/datum/stack_recipe("light fixture frame", /obj/item/wallframe/light_fixture, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("small light fixture frame", /obj/item/wallframe/light_fixture/small, 1, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("light fixture frame", /obj/item/wallframe/light_fixture, 2, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("small light fixture frame", /obj/item/wallframe/light_fixture/small, 1, crafting_flags = NONE, category = CAT_STRUCTURE), \ null, \ - new/datum/stack_recipe("apc frame", /obj/item/wallframe/apc, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("air alarm frame", /obj/item/wallframe/airalarm, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2, crafting_flags = NONE, category = CAT_EQUIPMENT), \ - new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1, crafting_flags = NONE, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("apc frame", /obj/item/wallframe/apc, 2, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("air alarm frame", /obj/item/wallframe/airalarm, 2, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("fire alarm frame", /obj/item/wallframe/firealarm, 2, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("extinguisher cabinet frame", /obj/item/wallframe/extinguisher_cabinet, 2, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("button frame", /obj/item/wallframe/button, 1, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("light switch frame", /obj/item/wallframe/light_switch, 1, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("sparker frame", /obj/item/wallframe/sparker, 1, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("turret control frame", /obj/item/wallframe/turret_control, 6, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("camera assembly", /obj/item/wallframe/camera, 1, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("newscaster frame", /obj/item/wallframe/newscaster, 7, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("status display frame", /obj/item/wallframe/status_display, 7, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("intercom frame", /obj/item/wallframe/intercom, 2, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("requests console frame", /obj/item/wallframe/requests_console, 7, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("telescreen turbine frame", /obj/item/wallframe/telescreen/turbine, 7, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("telescreen engine frame", /obj/item/wallframe/telescreen/engine, 7, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("telescreen auxbase frame", /obj/item/wallframe/telescreen/auxbase, 7, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("tram controller frame", /obj/item/wallframe/tram/controller, 20, crafting_flags = NONE, category = CAT_STRUCTURE), \ + new/datum/stack_recipe("tram display frame", /obj/item/wallframe/indicator_display, 7, crafting_flags = NONE, category = CAT_STRUCTURE), \ null, \ new/datum/stack_recipe("iron door", /obj/structure/mineral_door/iron, 20, time = 5 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND | CRAFT_APPLIES_MATS, category = CAT_DOORS), \ new/datum/stack_recipe("filing cabinet", /obj/structure/filingcabinet, 2, time = 10 SECONDS, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_FURNITURE), \ new/datum/stack_recipe("desk bell", /obj/structure/desk_bell, 2, time = 3 SECONDS, crafting_flags = NONE, category = CAT_FURNITURE), \ - new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_EQUIPMENT), \ + new/datum/stack_recipe("floodlight frame", /obj/structure/floodlight_frame, 5, crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_ONE_PER_TURF | CRAFT_ON_SOLID_GROUND, category = CAT_STRUCTURE), \ new/datum/stack_recipe("voting box", /obj/structure/votebox, 15, time = 5 SECONDS, crafting_flags = NONE, category = CAT_ENTERTAINMENT), \ new/datum/stack_recipe("pestle", /obj/item/pestle, 1, time = 5 SECONDS, crafting_flags = NONE, category = CAT_CHEMISTRY), \ new/datum/stack_recipe("hygienebot assembly", /obj/item/bot_assembly/hygienebot, 2, time = 5 SECONDS, crafting_flags = NONE, category = CAT_ROBOT), \ @@ -536,8 +549,8 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/durathread_helmet, /datum/crafting_recipe/durathread_vest) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -670,8 +683,8 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/cardboard_id) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -811,8 +824,8 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ /datum/crafting_recipe/skullhelm, ) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) GLOBAL_LIST_INIT(plastic_recipes, list( diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index 57aa666c046ab..0e054ba8d1062 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -14,12 +14,17 @@ grind_results = list(/datum/reagent/cellulose = 5) splint_factor = 0.65 merge_type = /obj/item/stack/sticky_tape - var/list/conferred_embed = EMBED_HARMLESS + var/conferred_embed = /datum/embed_data/sticky_tape ///The tape type you get when ripping off a piece of tape. var/obj/tape_gag = /obj/item/clothing/mask/muzzle/tape greyscale_config = /datum/greyscale_config/tape greyscale_colors = "#B2B2B2#BD6A62" +/datum/embed_data/sticky_tape + pain_mult = 0 + jostle_pain_mult = 0 + ignore_throwspeed_threshold = 0 + /obj/item/stack/sticky_tape/attack_hand(mob/user, list/modifiers) if(user.get_inactive_held_item() == src) if(is_zero_amount(delete_if_zero = TRUE)) @@ -43,7 +48,7 @@ if(!isitem(target)) return NONE - if(target.embedding && target.embedding == conferred_embed) + if(target.get_embed()?.type == conferred_embed) to_chat(user, span_warning("[target] is already coated in [src]!")) return ITEM_INTERACT_BLOCKING @@ -60,12 +65,11 @@ user.put_in_hands(O) return ITEM_INTERACT_SUCCESS - if(target.embedding && target.embedding == conferred_embed) + if(target.get_embed() && target.get_embed().type == conferred_embed) to_chat(user, span_warning("[target] is already coated in [src]!")) return ITEM_INTERACT_BLOCKING - target.embedding = conferred_embed - target.updateEmbedding() + target.set_embed(conferred_embed) to_chat(user, span_notice("You finish wrapping [target] with [src].")) target.name = "[prefix] [target.name]" @@ -80,34 +84,44 @@ singular_name = "super sticky tape" desc = "Quite possibly the most mischevious substance in the galaxy. Use with extreme lack of caution." prefix = "super sticky" - conferred_embed = EMBED_HARMLESS_SUPERIOR + conferred_embed = /datum/embed_data/sticky_tape/super splint_factor = 0.4 merge_type = /obj/item/stack/sticky_tape/super greyscale_colors = "#4D4D4D#75433F" tape_gag = /obj/item/clothing/mask/muzzle/tape/super +/datum/embed_data/sticky_tape/super + embed_chance = 100 + fall_chance = 0.1 + /obj/item/stack/sticky_tape/pointy name = "pointy tape" singular_name = "pointy tape" desc = "Used for sticking to things for sticking said things inside people." icon_state = "tape_spikes" prefix = "pointy" - conferred_embed = EMBED_POINTY + conferred_embed = /datum/embed_data/pointy_tape merge_type = /obj/item/stack/sticky_tape/pointy greyscale_config = /datum/greyscale_config/tape/spikes greyscale_colors = "#E64539#808080#AD2F45" tape_gag = /obj/item/clothing/mask/muzzle/tape/pointy +/datum/embed_data/pointy_tape + ignore_throwspeed_threshold = TRUE + /obj/item/stack/sticky_tape/pointy/super name = "super pointy tape" singular_name = "super pointy tape" desc = "You didn't know tape could look so sinister. Welcome to Space Station 13." prefix = "super pointy" - conferred_embed = EMBED_POINTY_SUPERIOR + conferred_embed = /datum/embed_data/pointy_tape/super merge_type = /obj/item/stack/sticky_tape/pointy/super greyscale_colors = "#8C0A00#4F4F4F#300008" tape_gag = /obj/item/clothing/mask/muzzle/tape/pointy/super +/datum/embed_data/pointy_tape/super + embed_chance = 100 + /obj/item/stack/sticky_tape/surgical name = "surgical tape" singular_name = "surgical tape" diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 073a35ed1013c..89e6cae389dbd 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -1075,6 +1075,11 @@ inhand_icon_state = "tile-bcircuit" turf_type = /turf/open/floor/circuit merge_type = /obj/item/stack/tile/circuit + tile_reskin_types = list( + /obj/item/stack/tile/circuit, + /obj/item/stack/tile/circuit/green, + /obj/item/stack/tile/circuit/red, + ) /obj/item/stack/tile/circuit/green name = "green circuit tile" diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 10c95056afffb..d2d4297fdc6c5 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -32,10 +32,6 @@ * Backpack Types */ -/obj/item/storage/backpack/old/Initialize(mapload) - . = ..() - atom_storage.max_total_storage = 12 - /obj/item/bag_of_holding_inert name = "inert bag of holding" desc = "What is currently a just an unwieldly block of metal with a slot ready to accept a bluespace anomaly core." @@ -51,9 +47,8 @@ /obj/item/bag_of_holding_inert/Initialize(mapload) . = ..() - AddComponent(/datum/component/slapcrafting,\ - slapcraft_recipes = list(/datum/crafting_recipe/boh)\ - ) + var/static/list/recipes = list(/datum/crafting_recipe/boh) + AddElement(/datum/element/slapcrafting, recipes) /obj/item/storage/backpack/holding name = "bag of holding" diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 96b2d10440d4e..d3e41b21a986b 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -300,7 +300,7 @@ new /obj/item/clothing/suit/armor/vest/marine/pmc(src) //The armor kit is comparable to the infiltrator, 6 TC new /obj/item/clothing/head/helmet/marine/pmc(src) new /obj/item/clothing/mask/gas/sechailer(src) - new /obj/item/clothing/glasses/night(src) // 3~ TC + new /obj/item/clothing/glasses/night/colorless(src) // 3~ TC new /obj/item/clothing/gloves/krav_maga/combatglovesplus(src) //5TC new /obj/item/clothing/shoes/jackboots(src) new /obj/item/storage/belt/military/assault/fisher(src) //items in this belt easily costs 18 TC diff --git a/code/game/objects/items/tail_pin.dm b/code/game/objects/items/tail_pin.dm index de3148dd06dea..71bd50b1dda21 100644 --- a/code/game/objects/items/tail_pin.dm +++ b/code/game/objects/items/tail_pin.dm @@ -7,7 +7,6 @@ w_class = WEIGHT_CLASS_SMALL throwforce = 0 throw_speed = 1 - embedding = EMBED_HARMLESS custom_materials = list(/datum/material/iron= HALF_SHEET_MATERIAL_AMOUNT) hitsound = 'sound/weapons/bladeslice.ogg' attack_verb_continuous = list("pokes", "jabs", "pins the tail on") @@ -15,6 +14,12 @@ sharpness = SHARP_POINTY max_integrity = 200 layer = CORGI_ASS_PIN_LAYER + embed_type = /datum/embed_data/corgi_pin + +/datum/embed_data/corgi_pin + pain_chance = 0 + jostle_pain_mult = 0 + ignore_throwspeed_threshold = TRUE /obj/item/poster/tail_board name = "party game poster" diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 339894eb2d8f0..cd5a9a1841ead 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -8,10 +8,15 @@ w_class = WEIGHT_CLASS_BULKY distribute_pressure = ONE_ATMOSPHERE * O2STANDARD actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) + /// What gas our jetpack is filled with on initialize var/gas_type = /datum/gas/oxygen + /// If the jetpack is currently active var/on = FALSE - var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not + /// If the jetpack will stop when you stop moving var/stabilize = FALSE + /// If our jetpack is disabled, from getting EMPd + var/disabled = FALSE + /// Callback for the jetpack component var/thrust_callback /obj/item/tank/jetpack/Initialize(mapload) @@ -94,20 +99,18 @@ icon_state = "[initial(icon_state)][on ? "-on" : ""]" /obj/item/tank/jetpack/proc/turn_on(mob/user) + if(disabled) + return FALSE if(SEND_SIGNAL(src, COMSIG_JETPACK_ACTIVATED, user) & JETPACK_ACTIVATION_FAILED) return FALSE on = TRUE update_icon(UPDATE_ICON_STATE) - if(full_speed) - user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) return TRUE /obj/item/tank/jetpack/proc/turn_off(mob/user) SEND_SIGNAL(src, COMSIG_JETPACK_DEACTIVATED, user) on = FALSE update_icon(UPDATE_ICON_STATE) - if(user) - user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) /obj/item/tank/jetpack/proc/allow_thrust(num, use_fuel = TRUE) if(!ismob(loc)) @@ -139,6 +142,23 @@ suffocater.visible_message(span_suicide("[user] is suffocating [user.p_them()]self with [src]! It looks like [user.p_they()] didn't read what that jetpack says!")) return OXYLOSS +/obj/item/tank/jetpack/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_CONTENTS) + return + if(ismob(loc) && (item_flags & IN_INVENTORY)) + var/mob/wearer = loc + turn_off(wearer) + else + turn_off() + update_item_action_buttons() + disabled = TRUE + addtimer(CALLBACK(src, PROC_REF(remove_emp)), 4 SECONDS) + +///Removes the disabled flag after getting EMPd +/obj/item/tank/jetpack/proc/remove_emp() + disabled = FALSE + /obj/item/tank/jetpack/improvised name = "improvised jetpack" desc = "A jetpack made from two air tanks, a fire extinguisher and some atmospherics equipment. It doesn't look like it can hold much." @@ -148,7 +168,6 @@ worn_icon_state = "jetpack-improvised" volume = 20 //normal jetpacks have 70 volume gas_type = null //it starts empty - full_speed = FALSE //moves at modsuit jetpack speeds /obj/item/tank/jetpack/improvised/allow_thrust(num) if(!ismob(loc)) diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 70c0ea0822a41..40989915a68ce 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -77,6 +77,14 @@ . += span_notice("A warning is etched into [src]...") . += span_warning("There is no process in the body that uses N2O, so patients will exhale the N2O... exposing you to it. Make sure to work in a well-ventilated space to avoid sleepy mishaps.") +/obj/item/tank/internals/anesthetic/pure + desc = "A tank with pure N2O. There is a warning sticker crudely slapped onto the tank." + icon_state = "anesthetic_warning" + +/obj/item/tank/internals/anesthetic/pure/populate_gas() + air_contents.assert_gases(/datum/gas/nitrous_oxide) + air_contents.gases[/datum/gas/nitrous_oxide][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) + /* * Plasma */ diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index 45c20e9908bf4..8094a9a21c863 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -295,8 +295,8 @@ var/Adj = user.Adjacent(interacting_with) if(nozzle_mode == RESIN_LAUNCHER) - if(Adj) - return ITEM_INTERACT_BLOCKING //Safety check so you don't blast yourself trying to refill your tank + if(Adj && user.combat_mode) + return ITEM_INTERACT_SKIP_TO_ATTACK var/datum/reagents/R = reagents if(R.total_volume < 100) balloon_alert(user, "not enough water!") @@ -316,7 +316,9 @@ return ITEM_INTERACT_SUCCESS if(nozzle_mode == RESIN_FOAM) - if(!Adj || !isturf(interacting_with)) + if(!isturf(interacting_with)) + return NONE + if(!Adj) balloon_alert(user, "too far!") return ITEM_INTERACT_BLOCKING for(var/thing in interacting_with) diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm index 41edfaea37e88..e13251fe8e5ea 100644 --- a/code/game/objects/items/theft_tools.dm +++ b/code/game/objects/items/theft_tools.dm @@ -247,13 +247,6 @@ if(ismob(loc)) to_chat(loc, span_warning("[src] is permanently sealed, [sliver] is safely contained.")) -/obj/item/nuke_core_container/supermatter/attackby(obj/item/hemostat/supermatter/tongs, mob/user) - if(istype(tongs)) - //try to load shard into core - load(tongs, user) - else - return ..() - /obj/item/scalpel/supermatter name = "supermatter scalpel" desc = "A scalpel with a fragile tip of condensed hyper-noblium gas, searingly cold to the touch, that can safely shave a sliver off a supermatter crystal." @@ -295,11 +288,15 @@ /obj/item/hemostat/supermatter/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(!sliver) - return NONE + return ..() + if (istype(interacting_with, /obj/item/nuke_core_container/supermatter)) + var/obj/item/nuke_core_container/supermatter/container = interacting_with + container.load(src, user) + return ITEM_INTERACT_SUCCESS if(ismovable(interacting_with) && interacting_with != sliver) Consume(interacting_with, user) return ITEM_INTERACT_SUCCESS - return NONE + return ..() /obj/item/hemostat/supermatter/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) // no instakill supermatter javelins if(sliver) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 3eea2400aa24f..5384a11cf3bbe 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -387,7 +387,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 force = 2 throwforce = 10 //10 + 2 (WEIGHT_CLASS_SMALL) * 4 (EMBEDDED_IMPACT_PAIN_MULTIPLIER) = 18 damage on hit due to guaranteed embedding throw_speed = 4 - embedding = list("pain_mult" = 4, "embed_chance" = 100, "fall_chance" = 0) + embed_type = /datum/embed_data/throwing_star armour_penetration = 40 w_class = WEIGHT_CLASS_SMALL @@ -395,11 +395,22 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 5) resistance_flags = FIRE_PROOF +/datum/embed_data/throwing_star + pain_mult = 4 + embed_chance = 100 + fall_chance = 0 + /obj/item/throwing_star/stamina name = "shock throwing star" desc = "An aerodynamic disc designed to cause excruciating pain when stuck inside fleeing targets, hopefully without causing fatal harm." throwforce = 5 - embedding = list("pain_chance" = 5, "embed_chance" = 100, "fall_chance" = 0, "jostle_chance" = 10, "pain_stam_pct" = 0.8, "jostle_pain_mult" = 3) + embed_type = /datum/embed_data/throwing_star/stamina + +/datum/embed_data/throwing_star/stamina + pain_mult = 5 + jostle_chance = 10 + pain_stam_pct = 0.8 + jostle_pain_mult = 3 /obj/item/throwing_star/toy name = "toy throwing star" @@ -407,7 +418,11 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 sharpness = NONE force = 0 throwforce = 0 - embedding = list("pain_mult" = 0, "jostle_pain_mult" = 0, "embed_chance" = 100, "fall_chance" = 0) + embed_type = /datum/embed_data/throwing_star/toy + +/datum/embed_data/throwing_star/toy + pain_mult = 0 + jostle_pain_mult = 0 /obj/item/switchblade name = "switchblade" @@ -762,6 +777,40 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 inhand_icon_state = "hoverboard_nt" board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin +/obj/item/melee/skateboard/holyboard + name = "holy skateboard" + desc = "A board blessed by the gods with the power to grind for our sins. Has the initials 'J.C.' on the underside." + icon_state = "hoverboard_holy_held" + inhand_icon_state = "hoverboard_holy" + force = 18 + throwforce = 6 + w_class = WEIGHT_CLASS_NORMAL + attack_verb_continuous = list("bashes", "crashes", "grinds", "skates") + attack_verb_simple = list("bash", "crash", "grind", "skate") + board_item_type = /obj/vehicle/ridden/scooter/skateboard/hoverboard/holyboarded + +/obj/item/melee/skateboard/holyboard/Initialize(mapload) + . = ..() + AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) + AddComponent(/datum/component/effect_remover, \ + success_feedback = "You disrupt the magic of %THEEFFECT with %THEWEAPON.", \ + success_forcesay = "BEGONE FOUL MAGICKS!!", \ + 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) \ + ) + AddElement(/datum/element/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE) + +/obj/item/melee/skateboard/holyboard/proc/on_cult_rune_removed(obj/effect/target, mob/living/user) + SIGNAL_HANDLER + if(!istype(target, /obj/effect/rune)) + return + + var/obj/effect/rune/target_rune = target + if(target_rune.log_when_erased) + user.log_message("erased [target_rune.cultist_name] rune using [src]", LOG_GAME) + SSshuttle.shuttle_purchase_requirements_met[SHUTTLE_UNLOCK_NARNAR] = TRUE + /obj/item/melee/baseball_bat name = "baseball bat" desc = "There ain't a skull in the league that can withstand a swatter." @@ -1048,7 +1097,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce = 25 throw_speed = 4 attack_speed = CLICK_CD_HYPER_RAPID - embedding = list("embed_chance" = 100) + embed_type = /datum/embed_data/hfr_blade block_chance = 25 block_sound = 'sound/weapons/parry.ogg' sharpness = SHARP_EDGED @@ -1063,6 +1112,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /// The previous target we attacked var/datum/weakref/previous_target +/datum/embed_data/hfr_blade + embed_chance = 100 + /obj/item/highfrequencyblade/Initialize(mapload) . = ..() AddComponent(/datum/component/two_handed, \ diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index f43cc8dfa1cd4..ff6e6e171bb06 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -19,7 +19,7 @@ /obj/structure/Initialize(mapload) . = ..() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH(src) QUEUE_SMOOTH_NEIGHBORS(src) if(smoothing_flags & SMOOTH_CORNERS) @@ -28,7 +28,7 @@ /obj/structure/Destroy(force) GLOB.cameranet.updateVisibility(src) - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) return ..() diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 32ed0d14d873b..a843c3e3e4bff 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -12,6 +12,8 @@ LINEN BINS righthand_file = 'icons/mob/inhands/items/bedsheet_righthand.dmi' icon_state = "sheetwhite" inhand_icon_state = "sheetwhite" + drop_sound = 'sound/items/handling/cloth_drop.ogg' + pickup_sound = 'sound/items/handling/cloth_pickup.ogg' slot_flags = ITEM_SLOT_NECK layer = BELOW_MOB_LAYER throwforce = 0 @@ -57,20 +59,38 @@ LINEN BINS return NONE -/obj/item/bedsheet/attack_secondary(mob/living/target, mob/living/user, params) - if(!user.CanReach(target)) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(target.body_position != LYING_DOWN) - return ..() +/obj/item/bedsheet/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with)) + return NONE + var/mob/living/to_cover = interacting_with + if(to_cover.body_position != LYING_DOWN) + return ITEM_INTERACT_BLOCKING if(!user.dropItemToGround(src)) - return ..() + return ITEM_INTERACT_BLOCKING - forceMove(get_turf(target)) + forceMove(get_turf(to_cover)) balloon_alert(user, "covered") - coverup(target) + coverup(to_cover) add_fingerprint(user) - return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + return ITEM_INTERACT_SUCCESS + +/obj/item/bedsheet/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + // Handle wirecutters here so we still tear it up in combat mode + if(tool.tool_behaviour != TOOL_WIRECUTTER && !tool.get_sharpness()) + return NONE + + // We cannot get free cloth from holograms + if(flags_1 & HOLOGRAM_1) + return ITEM_INTERACT_BLOCKING + + var/obj/item/stack/shreds = new stack_type(get_turf(src), stack_amount) + if(!QDELETED(shreds)) // Stacks merged + transfer_fingerprints_to(shreds) + shreds.add_fingerprint(user) + to_chat(user, span_notice("You tear [src] up.")) + qdel(src) + return ITEM_INTERACT_SUCCESS /obj/item/bedsheet/attack_self(mob/living/user) if(!user.CanReach(src)) //No telekinetic grabbing. @@ -83,10 +103,15 @@ LINEN BINS coverup(user) add_fingerprint(user) +/obj/item/bedsheet/click_alt(mob/living/user) + setDir(REVERSE_DIR(dir)) + return CLICK_ACTION_SUCCESS + /obj/item/bedsheet/proc/coverup(mob/living/sleeper) layer = ABOVE_MOB_LAYER pixel_x = 0 pixel_y = 0 + pixel_z = sleeper.pixel_z // Account for possible mob elevation balloon_alert(sleeper, "covered") var/angle = sleeper.lying_prev dir = angle2dir(angle + 180) // 180 flips it to be the same direction as the mob @@ -107,6 +132,7 @@ LINEN BINS balloon_alert(sleeper, "smoothed sheets") layer = initial(layer) SET_PLANE_IMPLICIT(src, initial(plane)) + pixel_z = 0 signal_sleeper = null // We need to do this in case someone picks up a bedsheet while a mob is covered up @@ -120,24 +146,9 @@ LINEN BINS UnregisterSignal(sleeper, COMSIG_MOVABLE_MOVED) UnregisterSignal(sleeper, COMSIG_LIVING_SET_BODY_POSITION) UnregisterSignal(sleeper, COMSIG_QDELETING) + pixel_z = 0 signal_sleeper = null -/obj/item/bedsheet/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness()) - if (!(flags_1 & HOLOGRAM_1)) - var/obj/item/stack/shreds = new stack_type(get_turf(src), stack_amount) - if(!QDELETED(shreds)) //stacks merged - transfer_fingerprints_to(shreds) - shreds.add_fingerprint(user) - qdel(src) - to_chat(user, span_notice("You tear [src] up.")) - else - return ..() - -/obj/item/bedsheet/click_alt(mob/living/user) - dir = REVERSE_DIR(dir) - return CLICK_ACTION_SUCCESS - /obj/item/bedsheet/blue icon_state = "sheetblue" inhand_icon_state = "sheetblue" @@ -565,9 +576,12 @@ LINEN BINS desc = "It looks rather cosy." icon = 'icons/obj/structures.dmi' icon_state = "linenbin-full" + base_icon_state = "linenbin" anchored = TRUE + pass_flags = PASSTABLE resistance_flags = FLAMMABLE max_integrity = 70 + anchored_tabletop_offset = 6 /// The number of bedsheets in the bin var/amount = 10 /// A list of actual sheets within the bin @@ -581,6 +595,10 @@ LINEN BINS anchored = FALSE +/obj/structure/bedsheetbin/Initialize(mapload) + . = ..() + register_context() + /obj/structure/bedsheetbin/examine(mob/user) . = ..() if(amount < 1) @@ -590,15 +608,37 @@ LINEN BINS else . += "There are [amount] bed sheets in the bin." +/obj/structure/bedsheetbin/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + if(isnull(held_item)) + if(amount) + context[SCREENTIP_CONTEXT_LMB] = "Take bedsheet" + return CONTEXTUAL_SCREENTIP_SET + return + + if(istype(held_item, /obj/item/bedsheet)) + context[SCREENTIP_CONTEXT_LMB] = "Put in" + return CONTEXTUAL_SCREENTIP_SET + + if(held_item.tool_behaviour == TOOL_SCREWDRIVER) + context[SCREENTIP_CONTEXT_RMB] = "Disassemble" + . = CONTEXTUAL_SCREENTIP_SET + else if(held_item.tool_behaviour == TOOL_WRENCH) + context[SCREENTIP_CONTEXT_RMB] = "[anchored ? "Una" : "A"]nchor" + . = CONTEXTUAL_SCREENTIP_SET + + if(amount && held_item.w_class < WEIGHT_CLASS_BULKY) + context[SCREENTIP_CONTEXT_LMB] = "Hide item in" + . = CONTEXTUAL_SCREENTIP_SET + return . /obj/structure/bedsheetbin/update_icon_state() switch(amount) if(0) - icon_state = "linenbin-empty" + icon_state = "[base_icon_state]-empty" if(1 to 5) - icon_state = "linenbin-half" + icon_state = "[base_icon_state]-half" else - icon_state = "linenbin-full" + icon_state = "[base_icon_state]-full" return ..() /obj/structure/bedsheetbin/fire_act(exposed_temperature, exposed_volume) @@ -607,7 +647,7 @@ LINEN BINS update_appearance() ..() -/obj/structure/bedsheetbin/screwdriver_act(mob/living/user, obj/item/tool) +/obj/structure/bedsheetbin/screwdriver_act_secondary(mob/living/user, obj/item/tool) if(amount) to_chat(user, span_warning("The [src] must be empty first!")) return ITEM_INTERACT_SUCCESS @@ -617,27 +657,45 @@ LINEN BINS qdel(src) return ITEM_INTERACT_SUCCESS -/obj/structure/bedsheetbin/wrench_act(mob/living/user, obj/item/tool) +/obj/structure/bedsheetbin/wrench_act_secondary(mob/living/user, obj/item/tool) . = ..() default_unfasten_wrench(user, tool, time = 0.5 SECONDS) return ITEM_INTERACT_SUCCESS -/obj/structure/bedsheetbin/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/bedsheet)) - if(!user.transferItemToLoc(I, src)) - return - sheets.Add(I) - amount++ - to_chat(user, span_notice("You put [I] in [src].")) - update_appearance() +/obj/structure/bedsheetbin/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + if(istype(tool, /obj/item/bedsheet)) + return bedsheet_act(user, tool) - else if(amount && !hidden && I.w_class < WEIGHT_CLASS_BULKY) //make sure there's sheets to hide it among, make sure nothing else is hidden in there. - if(!user.transferItemToLoc(I, src)) - to_chat(user, span_warning("\The [I] is stuck to your hand, you cannot hide it among the sheets!")) - return - hidden = I - to_chat(user, span_notice("You hide [I] among the sheets.")) + // Everything else we try to hide + return hide_item_act(user, tool) +/obj/structure/bedsheetbin/proc/bedsheet_act(mob/living/user, obj/item/tool) + if(!user.transferItemToLoc(tool, src, silent = FALSE)) + return ITEM_INTERACT_BLOCKING + sheets.Add(tool) + amount++ + to_chat(user, span_notice("You put [tool] in [src].")) + update_appearance() + return ITEM_INTERACT_SUCCESS + +/obj/structure/bedsheetbin/proc/hide_item_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + return NONE + if(tool.w_class >= WEIGHT_CLASS_BULKY) + balloon_alert(user, "too big!") + return ITEM_INTERACT_BLOCKING + if(!amount) + balloon_alert(user, "nothing to hide under!") + return ITEM_INTERACT_BLOCKING + if(hidden) + balloon_alert(user, "already something there!") + return ITEM_INTERACT_BLOCKING + if(!user.transferItemToLoc(tool, src, silent = FALSE)) + to_chat(user, span_warning("\The [tool] is stuck to your hand, you cannot hide it among the sheets!")) + return ITEM_INTERACT_BLOCKING + hidden = tool + to_chat(user, span_notice("You hide [tool] among the sheets.")) + return ITEM_INTERACT_SUCCESS /obj/structure/bedsheetbin/attack_paw(mob/user, list/modifiers) return attack_hand(user, modifiers) @@ -696,3 +754,13 @@ LINEN BINS add_fingerprint(user) return COMPONENT_CANCEL_ATTACK_CHAIN + +/obj/structure/bedsheetbin/basket + name = "linen basket" + icon_state = "linenbasket-full" + base_icon_state = "linenbasket" + +/obj/structure/bedsheetbin/empty/basket + name = "linen basket" + icon_state = "linenbasket-empty" + base_icon_state = "linenbasket" diff --git a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm index 215fa6d86ed3d..7531b8bacfdcd 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/scientist.dm @@ -34,11 +34,9 @@ /obj/structure/closet/secure_closet/cytology/PopulateContents() . = ..() new /obj/item/pushbroom(src) - new /obj/item/plunger(src) new /obj/item/storage/bag/xeno(src) new /obj/item/storage/box/petridish(src) - new /obj/item/stack/ducts/fifty(src) for(var/i in 1 to 2) new /obj/item/biopsy_tool(src) new /obj/item/storage/box/swab(src) - new /obj/item/construction/plumbing/research(src) + new /obj/item/reagent_containers/condiment/protein(src) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index aab8e4b858286..64be6a4df8dac 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -20,7 +20,7 @@ /obj/structure/closet/syndicate/personal/PopulateContents() ..() new /obj/item/trench_tool(src) - new /obj/item/clothing/glasses/night(src) + new /obj/item/clothing/glasses/night/colorless(src) new /obj/item/ammo_box/magazine/m10mm(src) new /obj/item/storage/belt/military(src) new /obj/item/storage/belt/holster/nukie(src) diff --git a/code/game/objects/structures/fake_stairs.dm b/code/game/objects/structures/fake_stairs.dm index a5e03ed6b5986..1152a8c02dcca 100644 --- a/code/game/objects/structures/fake_stairs.dm +++ b/code/game/objects/structures/fake_stairs.dm @@ -6,6 +6,7 @@ anchored = TRUE move_resist = INFINITY + layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE //one with the floor MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fake_stairs, 0) diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index 82569c8f9e794..7acfa65f62577 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -87,7 +87,7 @@ icon = 'icons/obj/mining_zones/survival_pod.dmi' icon_state = "fan_tiny" plane = FLOOR_PLANE - layer = LOW_OBJ_LAYER + layer = ABOVE_OPEN_TURF_LAYER /** * A variety of statue in disrepair; parts are broken off and a gemstone is missing diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 37b894e277307..3bd3e00cc273b 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -42,7 +42,7 @@ return . = ..() - if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) + if((updates & UPDATE_SMOOTHING) && (smoothing_flags & USES_SMOOTHING)) QUEUE_SMOOTH(src) /obj/structure/grille/update_icon_state() diff --git a/code/game/objects/structures/lavaland/necropolis_tendril.dm b/code/game/objects/structures/lavaland/necropolis_tendril.dm index 2ede6833aa992..bf69b23238c61 100644 --- a/code/game/objects/structures/lavaland/necropolis_tendril.dm +++ b/code/game/objects/structures/lavaland/necropolis_tendril.dm @@ -134,6 +134,8 @@ GLOBAL_LIST_INIT(tendrils, list()) playsound(get_turf(src),'sound/effects/explosionfar.ogg', 200, TRUE) visible_message(span_boldannounce("The tendril falls inward, the ground around it widening into a yawning chasm!")) for(var/turf/T in RANGE_TURFS(2,src)) + if(HAS_TRAIT(T, TRAIT_NO_TERRAFORM)) + continue if(!T.density) T.TerraformTurf(/turf/open/chasm/lavaland, /turf/open/chasm/lavaland, flags = CHANGETURF_INHERIT_AIR) qdel(src) diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 27e05b6dc540d..cb9d203e3f2c7 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -85,6 +85,7 @@ RegisterSignal(src, COMSIG_SPAWNER_SPAWNED_DEFAULT, PROC_REF(anti_cheese)) RegisterSignal(src, COMSIG_SPAWNER_SPAWNED, PROC_REF(log_mob_spawned)) + AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_NO_TERRAFORM))) return ..() /obj/structure/ore_vent/Destroy() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index d794f24dd0894..d67f61e9442bb 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -300,7 +300,7 @@ /obj/structure/mineral_door/paperframe/Initialize(mapload) . = ..() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) /obj/structure/mineral_door/paperframe/examine(mob/user) @@ -333,6 +333,6 @@ return ..() /obj/structure/mineral_door/paperframe/Destroy() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) return ..() diff --git a/code/game/objects/structures/mystery_box.dm b/code/game/objects/structures/mystery_box.dm index 9dc8152f5b7bf..e165c2e295c93 100644 --- a/code/game/objects/structures/mystery_box.dm +++ b/code/game/objects/structures/mystery_box.dm @@ -22,9 +22,7 @@ GLOBAL_LIST_INIT(mystery_box_guns, list( /obj/item/gun/energy/lasercannon, /obj/item/gun/energy/recharge/ebow/large, /obj/item/gun/energy/e_gun, - /obj/item/gun/energy/e_gun/advtaser, /obj/item/gun/energy/e_gun/nuclear, - /obj/item/gun/energy/e_gun/turret, /obj/item/gun/energy/laser, /obj/item/gun/energy/laser/hellgun, /obj/item/gun/energy/laser/captain, @@ -34,17 +32,17 @@ GLOBAL_LIST_INIT(mystery_box_guns, list( /obj/item/gun/ballistic/revolver/mateba, /obj/item/gun/ballistic/automatic/pistol/deagle/camo, /obj/item/gun/ballistic/automatic/pistol/suppressed, - /obj/item/gun/energy/pulse/carbine, - /obj/item/gun/energy/pulse/pistol, + /obj/item/gun/energy/pulse/carbine/taserless, + /obj/item/gun/energy/pulse/pistol/taserless, /obj/item/gun/ballistic/shotgun/lethal, /obj/item/gun/ballistic/shotgun/automatic/combat, - /obj/item/gun/ballistic/shotgun/bulldog, + /obj/item/gun/ballistic/shotgun/bulldog/unrestricted, /obj/item/gun/ballistic/rifle/boltaction, /obj/item/gun/ballistic/automatic/ar, - /obj/item/gun/ballistic/automatic/proto, - /obj/item/gun/ballistic/automatic/c20r, - /obj/item/gun/ballistic/automatic/l6_saw, - /obj/item/gun/ballistic/automatic/m90, + /obj/item/gun/ballistic/automatic/proto/unrestricted, + /obj/item/gun/ballistic/automatic/c20r/unrestricted, + /obj/item/gun/ballistic/automatic/l6_saw/unrestricted, + /obj/item/gun/ballistic/automatic/m90/unrestricted, /obj/item/gun/ballistic/automatic/tommygun, /obj/item/gun/ballistic/automatic/wt550, /obj/item/gun/ballistic/rifle/sniper_rifle, @@ -72,15 +70,11 @@ GLOBAL_LIST_INIT(mystery_magic, list( /obj/item/gun/magic/wand/arcane_barrage/blood, /obj/item/gun/magic/wand/fireball, /obj/item/gun/magic/wand/resurrection, - /obj/item/gun/magic/wand/death, - /obj/item/gun/magic/wand/polymorph, /obj/item/gun/magic/wand/teleport, /obj/item/gun/magic/wand/door, /obj/item/gun/magic/wand/nothing, /obj/item/storage/belt/wands/full, /obj/item/gun/magic/staff/healing, - /obj/item/gun/magic/staff/change, - /obj/item/gun/magic/staff/animate, /obj/item/gun/magic/staff/chaos, /obj/item/gun/magic/staff/door, /obj/item/gun/magic/staff/honk, @@ -88,7 +82,6 @@ GLOBAL_LIST_INIT(mystery_magic, list( /obj/item/gun/magic/staff/flying, /obj/item/gun/magic/staff/babel, /obj/item/singularityhammer, - /obj/item/mod/control/pre_equipped/enchanted, /obj/item/runic_vendor_scepter, )) diff --git a/code/game/objects/structures/secure_safe.dm b/code/game/objects/structures/secure_safe.dm index 76c3ab4575f6c..9e1bf9b5adef9 100644 --- a/code/game/objects/structures/secure_safe.dm +++ b/code/game/objects/structures/secure_safe.dm @@ -74,15 +74,15 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/secure_safe, 32) There appears to be a small amount of surface corrosion. It doesn't look like it could withstand much of an explosion.\ Due to the expensive material, it was made incredibly small to cut corners, leaving only enough room to fit something as slim as an ID card." icon = 'icons/obj/structures.dmi' - icon_state = "safe" - base_icon_state = "safe" + icon_state = "spare_safe" + base_icon_state = "spare_safe" armor_type = /datum/armor/safe_caps_spare max_integrity = 300 damage_deflection = 30 // prevents stealing the captain's spare using null rods/lavaland monsters/AP projectiles density = TRUE - anchored_tabletop_offset = 4 + anchored_tabletop_offset = 6 custom_materials = list(/datum/material/gold = SMALL_MATERIAL_AMOUNT) - material_flags = MATERIAL_EFFECTS | MATERIAL_COLOR + material_flags = MATERIAL_EFFECTS /datum/armor/safe_caps_spare melee = 100 @@ -95,9 +95,6 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/secure_safe, 32) /obj/structure/secure_safe/caps_spare/Initialize(mapload) . = ..() - var/matrix/small_safe_transformation = new - small_safe_transformation.Scale(0.6) - transform = small_safe_transformation atom_storage.set_holdable(/obj/item/card/id) AddComponent(/datum/component/lockable_storage, \ lock_code = SSid_access.spare_id_safe_code, \ diff --git a/code/game/objects/structures/signs/signs_departments.dm b/code/game/objects/structures/signs/signs_departments.dm index e663ef2411e62..532cbcfc426ad 100644 --- a/code/game/objects/structures/signs/signs_departments.dm +++ b/code/game/objects/structures/signs/signs_departments.dm @@ -215,6 +215,14 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/lawyer, 32) MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/cargo, 32) +/obj/structure/sign/departments/exodrone + name = "\improper Exodrone sign" + sign_change_name = "Department - Cargo: exodrone" + desc = "A sign labelling an area where exodrones are used." + icon_state = "exodrone" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/departments/exodrone, 32) + ///////SECURITY /obj/structure/sign/departments/security diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 0a499440d4eb8..69c6aca505f36 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -92,7 +92,7 @@ /obj/structure/table/update_icon(updates=ALL) . = ..() - if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) + if((updates & UPDATE_SMOOTHING) && (smoothing_flags & USES_SMOOTHING)) QUEUE_SMOOTH(src) QUEUE_SMOOTH_NEIGHBORS(src) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 195fbbc643e0a..4c22cbf01b29d 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -1,13 +1,3 @@ -/* Windoor (window door) assembly -Nodrak - * Step 1: Create a windoor out of rglass - * Step 2: Add r-glass to the assembly to make a secure windoor (Optional) - * Step 3: Rotate or Flip the assembly to face and open the way you want - * Step 4: Wrench the assembly in place - * Step 5: Add cables to the assembly - * Step 6: Set access for the door. - * Step 7: Screwdriver the door to complete - */ - /obj/structure/windoor_assembly icon = 'icons/obj/doors/windoor.dmi' @@ -20,15 +10,30 @@ dir = NORTH obj_flags = CAN_BE_HIT | BLOCKS_CONSTRUCTION_DIR set_dir_on_move = FALSE + can_atmos_pass = ATMOS_PASS_PROC + /// Reference to the airlock electronics inside for determining window access. var/obj/item/electronics/airlock/electronics = null + /// Player generated name string from renaming. var/created_name = null //Vars to help with the icon's name - var/facing = "l" //Does the windoor open to the left or right? - var/secure = FALSE //Whether or not this creates a secure windoor - var/state = "01" //How far the door assembly has progressed - can_atmos_pass = ATMOS_PASS_PROC + ///Does the windoor open to the left or right? + var/facing = "l" + ///Whether or not this creates a secure windoor + var/secure = FALSE + /** + * Windoor (window door) assembly -Nodrak + * Step 1: Create a windoor out of rglass + * Step 2: Add r-glass to the assembly to make a secure windoor (Optional) + * Step 3: Rotate or Flip the assembly to face and open the way you want + * Step 4: Wrench the assembly in place + * Step 5: Add cables to the assembly + * Step 6: Set access for the door. + * Step 7: Crowbar the door to complete + */ + var/state = "01" + /obj/structure/windoor_assembly/Initialize(mapload, set_dir) . = ..() @@ -279,6 +284,21 @@ //Update to reflect changes(if applicable) update_appearance() +/obj/structure/windoor_assembly/examine(mob/user) + . = ..() + if(!anchored) + . += span_notice("\The [src] can be [span_boldnotice("wrenched")] down.") + . += span_notice("\The [src] could also be [span_boldnotice("cut apart")] with a [span_boldnotice("welder")].") + return + switch(state) + if("01") + . += span_notice("\The [src] needs [span_boldnotice("wiring")], or could be [span_boldnotice("un-wrenched")] from the floor.") + if("02") + if(!electronics) + . += span_notice("\The [src] needs [span_boldnotice("airlock electronics")] to continue installation, or [span_boldnotice("wirecutters")] to take apart.") + else + . += span_notice("\The [src] is ready to be [span_boldnotice("levered")] into place with a [span_boldnotice("crowbar")].") + /obj/structure/windoor_assembly/proc/finish_door() var/obj/machinery/door/window/windoor if(secure) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 0076019532118..6c41b2f8b157d 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -393,7 +393,7 @@ //This proc is used to update the icons of nearby windows. /obj/structure/window/proc/update_nearby_icons() update_appearance() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) //merges adjacent full-tile windows into one @@ -402,7 +402,7 @@ if(QDELETED(src) || !fulltile) return - if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) + if((updates & UPDATE_SMOOTHING) && (smoothing_flags & USES_SMOOTHING)) QUEUE_SMOOTH(src) var/ratio = atom_integrity / max_integrity @@ -901,7 +901,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw /obj/structure/window/paperframe/update_icon(updates=ALL) . = ..() - if((updates & UPDATE_SMOOTHING) && (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK))) + if((updates & UPDATE_SMOOTHING) && (smoothing_flags & USES_SMOOTHING)) QUEUE_SMOOTH(src) /obj/structure/window/paperframe/update_overlays() diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 4b0f7961d51ff..ed31138bb19f8 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -99,7 +99,7 @@ if(is_station_level(z)) GLOB.station_turfs += src if(smoothing_flags & SMOOTH_DIAGONAL_CORNERS && fixed_underlay) //Set underlays for the diagonal walls. - var/mutable_appearance/underlay_appearance = mutable_appearance(layer = TURF_LAYER, offset_spokesman = src, plane = FLOOR_PLANE) + var/mutable_appearance/underlay_appearance = mutable_appearance(layer = LOW_FLOOR_LAYER, offset_spokesman = src, plane = FLOOR_PLANE) if(fixed_underlay["space"]) generate_space_underlay(underlay_appearance, src) else diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 1d5b5671c2c0b..147e123c8af28 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -1,4 +1,5 @@ /turf/open + layer = LOW_FLOOR_LAYER plane = FLOOR_PLANE ///negative for faster, positive for slower var/slowdown = 0 @@ -11,7 +12,11 @@ /// Determines the type of damage overlay that will be used for the tile var/damaged_dmi = null var/broken = FALSE + /// Are broken overlays smoothed? if they are we have to change a little bit about how we render them + var/smooth_broken = FALSE var/burnt = FALSE + /// Are burnt overlays smoothed? if they are we have to change a little bit about how we render them + var/smooth_burnt = FALSE /// Returns a list of every turf state considered "broken". @@ -47,7 +52,7 @@ if(broken) var/mutable_appearance/broken_appearance = mutable_appearance(damaged_dmi, pick(broken_states())) - if(smoothing_flags && !(smoothing_flags & SMOOTH_BROKEN_TURF)) + if(smoothing_flags && !smooth_broken) var/matrix/translation = new translation.Translate(-LARGE_TURF_SMOOTHING_X_OFFSET, -LARGE_TURF_SMOOTHING_Y_OFFSET) broken_appearance.transform = translation @@ -62,7 +67,7 @@ else burnt_appearance = mutable_appearance(damaged_dmi, pick(broken_states())) - if(smoothing_flags && !(smoothing_flags & SMOOTH_BURNT_TURF)) + if(smoothing_flags && !smooth_burnt) var/matrix/translation = new translation.Translate(-LARGE_TURF_SMOOTHING_X_OFFSET, -LARGE_TURF_SMOOTHING_Y_OFFSET) burnt_appearance.transform = translation diff --git a/code/game/turfs/open/asteroid.dm b/code/game/turfs/open/asteroid.dm index aa295e1e8346e..8db5753a7196b 100644 --- a/code/game/turfs/open/asteroid.dm +++ b/code/game/turfs/open/asteroid.dm @@ -223,7 +223,7 @@ GLOBAL_LIST_EMPTY(dug_up_basalt) return TRUE return FALSE -/turf/open/misc/grass/burnt_states() +/turf/open/misc/asteroid/snow/burnt_states() return list("snow_dug") /turf/open/misc/asteroid/snow/icemoon diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 12d9deedbae84..84b9ac26e9b8d 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -142,7 +142,7 @@ /turf/open/floor/proc/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type && T.turf_dir == dir) return - var/obj/item/crowbar/CB = user.is_holding_item_of_type(/obj/item/crowbar) + var/obj/item/crowbar/CB = user.is_holding_tool_quality(TOOL_CROWBAR) if(!CB) return var/turf/open/floor/plating/P = pry_tile(CB, user, TRUE) diff --git a/code/game/turfs/open/floor/catwalk_plating.dm b/code/game/turfs/open/floor/catwalk_plating.dm index 57bd0b74107ee..765482cf78cfa 100644 --- a/code/game/turfs/open/floor/catwalk_plating.dm +++ b/code/game/turfs/open/floor/catwalk_plating.dm @@ -19,14 +19,10 @@ rust_resistance = RUST_RESISTANCE_BASIC var/covered = TRUE var/catwalk_type = "maint" - var/static/list/catwalk_underlays = list() /turf/open/floor/catwalk_floor/Initialize(mapload) . = ..() - if(!catwalk_underlays[catwalk_type]) - var/mutable_appearance/plating_underlay = mutable_appearance(icon, "[catwalk_type]_below", TURF_LAYER) - catwalk_underlays[catwalk_type] = plating_underlay - underlays += catwalk_underlays[catwalk_type] + underlays += mutable_appearance(icon, "[catwalk_type]_below", LOW_FLOOR_LAYER, src, FLOOR_PLANE) update_appearance() /turf/open/floor/catwalk_floor/examine(mob/user) @@ -43,7 +39,7 @@ covered = !covered if(!covered) underfloor_accessibility = UNDERFLOOR_INTERACTABLE - layer = TURF_LAYER + layer = LOW_FLOOR_LAYER icon_state = "[catwalk_type]_below" else underfloor_accessibility = UNDERFLOOR_VISIBLE diff --git a/code/game/turfs/open/floor/fancy_floor.dm b/code/game/turfs/open/floor/fancy_floor.dm index 935cb3b1f2c24..e672b7f7294fa 100644 --- a/code/game/turfs/open/floor/fancy_floor.dm +++ b/code/game/turfs/open/floor/fancy_floor.dm @@ -34,9 +34,9 @@ /turf/open/floor/wood/try_replace_tile(obj/item/stack/tile/T, mob/user, params) if(T.turf_type == type) return - var/obj/item/tool = user.is_holding_item_of_type(/obj/item/screwdriver) + var/obj/item/tool = user.is_holding_tool_quality(TOOL_SCREWDRIVER) if(!tool) - tool = user.is_holding_item_of_type(/obj/item/crowbar) + tool = user.is_holding_tool_quality(TOOL_CROWBAR) if(!tool) return var/turf/open/floor/plating/P = pry_tile(tool, user, TRUE) @@ -276,11 +276,11 @@ if(!. || !(updates & UPDATE_SMOOTHING)) return if(!broken && !burnt) - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH(src) else make_plating() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) /turf/open/floor/carpet/lone @@ -871,6 +871,7 @@ icon = 'icons/turf/space.dmi' icon_state = "space" floor_tile = /obj/item/stack/tile/fakespace + layer = SPACE_LAYER plane = PLANE_SPACE tiled_dirt = FALSE damaged_dmi = 'icons/turf/space.dmi' diff --git a/code/game/turfs/open/floor/hull.dm b/code/game/turfs/open/floor/hull.dm index 54ea29e051a45..6836c29b960ec 100644 --- a/code/game/turfs/open/floor/hull.dm +++ b/code/game/turfs/open/floor/hull.dm @@ -10,6 +10,16 @@ name = "shuttle ceiling plating" var/old_turf_type +/turf/open/floor/engine/hull/ceiling/Initialize(mapload) + . = ..() + if(!istype(loc, /area/space)) + return + if(istype(loc, /area/space/nearstation)) + return + new /obj/effect/mapping_error (src) //We're in a normal space tile, meaning we aren't lit correct. + ///datum/unit_test/mapping_nearstation_test.dm SHOULD fail this case automatically + //this is just here so the mapper responsible can easily see where the issues are directly on the map. + /turf/open/floor/engine/hull/ceiling/AfterChange(flags, oldType) . = ..() old_turf_type = oldType diff --git a/code/game/turfs/open/grass.dm b/code/game/turfs/open/grass.dm index d1779ad7499ac..4dd5946a7ed14 100644 --- a/code/game/turfs/open/grass.dm +++ b/code/game/turfs/open/grass.dm @@ -10,9 +10,11 @@ barefootstep = FOOTSTEP_GRASS clawfootstep = FOOTSTEP_GRASS heavyfootstep = FOOTSTEP_GENERIC_HEAVY - smoothing_flags = SMOOTH_BITMASK | SMOOTH_BROKEN_TURF | SMOOTH_BURNT_TURF + smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_TURF_OPEN + SMOOTH_GROUP_FLOOR_GRASS canSmoothWith = SMOOTH_GROUP_FLOOR_GRASS + SMOOTH_GROUP_CLOSED_TURFS + smooth_broken = TRUE + smooth_burnt = TRUE layer = HIGH_TURF_LAYER rust_resistance = RUST_RESISTANCE_ORGANIC damaged_dmi = 'icons/turf/floors/grass_damaged.dmi' @@ -24,13 +26,13 @@ var/base_burnt_icon_state = "grass_damaged" /turf/open/misc/grass/broken_states() - if (!smoothing_junction || !(smoothing_flags & SMOOTH_BROKEN_TURF)) + if (!smoothing_junction || !smooth_broken) return list("[base_broken_icon_state]-255") return list("[base_broken_icon_state]-[smoothing_junction]") /turf/open/misc/grass/burnt_states() - if (!smoothing_junction || !(smoothing_flags & SMOOTH_BURNT_TURF)) + if (!smoothing_junction || !smooth_burnt) return list("[base_burnt_icon_state]-255") return list("[base_burnt_icon_state]-[smoothing_junction]") diff --git a/code/game/turfs/open/openspace.dm b/code/game/turfs/open/openspace.dm index 677bc776ea5a7..1af42be3071cd 100644 --- a/code/game/turfs/open/openspace.dm +++ b/code/game/turfs/open/openspace.dm @@ -10,6 +10,7 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT pathing_pass_method = TURF_PATHING_PASS_PROC plane = TRANSPARENT_FLOOR_PLANE + layer = SPACE_LAYER rust_resistance = RUST_RESISTANCE_ABSOLUTE var/can_cover_up = TRUE var/can_build_on = TRUE @@ -199,6 +200,10 @@ /turf/open/openspace/icemoon/keep_below drill_below = FALSE +/turf/open/openspace/xenobio + name = "xenobio bz air" + initial_gas_mix = XENOBIO_BZ + /turf/open/openspace/icemoon/ruins protect_ruin = FALSE drill_below = FALSE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 565adb22dbc00..10165f869174f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -153,7 +153,7 @@ GLOBAL_LIST_EMPTY(station_turfs) SETUP_SMOOTHING() - if (smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if (smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH(src) for(var/atom/movable/content as anything in src) diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index 509787ffd3a56..4534ae9d93cff 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -11,7 +11,7 @@ user << browse(create_panel_helper(create_mob_html), "window=create_mob;size=425x475") /** - * Randomizes everything about a human, including DNA and name + * Fully randomizes everything about a human, including DNA and name. */ /proc/randomize_human(mob/living/carbon/human/human, randomize_mutations = FALSE) human.gender = human.dna.species.sexes ? pick(MALE, FEMALE, PLURAL, NEUTER) : PLURAL @@ -31,3 +31,32 @@ // Snowflake for Ethereals human.updatehealth() human.updateappearance(mutcolor_update = TRUE) + +/** + * Randomizes a human, but produces someone who looks exceedingly average (by most standards). + * + * (IE, no wacky hair styles / colors) + */ +/proc/randomize_human_normie(mob/living/carbon/human/human, randomize_mutations = FALSE) + // Sorry enbys but statistically you are not average enough + human.gender = human.dna.species.sexes ? pick(MALE, FEMALE) : PLURAL + human.physique = human.gender + human.real_name = human.generate_random_mob_name() + human.name = human.get_visible_name() + human.eye_color_left = random_eye_color() + human.eye_color_right = human.eye_color_left + human.skin_tone = pick(GLOB.skin_tones) + // No underwear generation handled here + var/picked_color = random_hair_color() + human.set_haircolor(picked_color, update = FALSE) + human.set_facial_haircolor(picked_color, update = FALSE) + var/datum/sprite_accessory/hairstyle = SSaccessories.hairstyles_list[random_hairstyle(human.gender)] + if(hairstyle && hairstyle.natural_spawn && !hairstyle.locked) + human.set_hairstyle(hairstyle.name, update = FALSE) + var/datum/sprite_accessory/facial_hair = SSaccessories.facial_hairstyles_list[random_facial_hairstyle(human.gender)] + if(facial_hair && facial_hair.natural_spawn && !facial_hair.locked) + human.set_facial_hairstyle(facial_hair.name, update = FALSE) + // Normal DNA init stuff, these can generally be wacky but we care less, they're aliens after all + human.dna.initialize_dna(newblood_type = random_blood_type(), create_mutation_blocks = randomize_mutations, randomize_features = TRUE) + human.updatehealth() + human.updateappearance(mutcolor_update = TRUE) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 2ba75020d48d1..13f5b3544b2a0 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1413,7 +1413,7 @@ if(response.body == "[]") dat += "
0 bans detected for [ckey]
" else - bans = json_decode(response["body"]) + bans = json_decode(response.body) //Ignore bans from non-whitelisted sources, if a whitelist exists var/list/valid_sources diff --git a/code/modules/admin/verbs/adminevents.dm b/code/modules/admin/verbs/adminevents.dm index 858e984a21263..fbd9f5c75d5df 100644 --- a/code/modules/admin/verbs/adminevents.dm +++ b/code/modules/admin/verbs/adminevents.dm @@ -8,6 +8,8 @@ ADMIN_VERB_AND_CONTEXT_MENU(cmd_admin_subtle_message, R_ADMIN, "Subtle Message", message_admins("[key_name_admin(user)] decided not to answer [ADMIN_LOOKUPFLW(target)]'s prayer") return + msg = user.reformat_narration(msg) + target.balloon_alert(target, "you hear a voice") to_chat(target, "You hear a voice in your head... [msg]", confidential = TRUE) @@ -53,6 +55,8 @@ ADMIN_VERB_AND_CONTEXT_MENU(cmd_admin_headset_message, R_ADMIN, "Headset Message message_admins("[key_name_admin(src)] decided not to answer [key_name_admin(target)]'s [sender] request.") return + input = reformat_narration(input) + log_directed_talk(mob, target, input, LOG_ADMIN, "reply") message_admins("[key_name_admin(src)] replied to [key_name_admin(target)]'s [sender] message with: \"[input]\"") target.balloon_alert(target, "you hear a voice") @@ -64,6 +68,7 @@ ADMIN_VERB(cmd_admin_world_narrate, R_ADMIN, "Global Narrate", "Send a direct na var/msg = input(user, "Message:", "Enter the text you wish to appear to everyone:") as text|null if (!msg) return + msg = user.reformat_narration(msg) to_chat(world, "[msg]", confidential = TRUE) log_admin("GlobalNarrate: [key_name(user)] : [msg]") message_admins(span_adminnotice("[key_name_admin(user)] Sent a global narrate")) @@ -76,6 +81,7 @@ ADMIN_VERB_AND_CONTEXT_MENU(cmd_admin_local_narrate, R_ADMIN, "Local Narrate", A var/msg = input(user, "Message:", "Enter the text you wish to appear to everyone within view:") as text|null if (!msg) return + msg = user.reformat_narration(msg) for(var/mob/M in view(range, locale)) to_chat(M, msg, confidential = TRUE) @@ -89,6 +95,8 @@ ADMIN_VERB_AND_CONTEXT_MENU(cmd_admin_direct_narrate, R_ADMIN, "Direct Narrate", if( !msg ) return + msg = user.reformat_narration(msg) + to_chat(target, msg, confidential = TRUE) log_admin("DirectNarrate: [key_name(user)] to ([key_name(target)]): [msg]") msg = span_adminnotice(" DirectNarrate: [key_name_admin(user)] to ([key_name_admin(target)]): [msg]
") @@ -278,3 +286,14 @@ ADMIN_VERB(command_report_footnote, R_ADMIN, "Command Report Footnote", "Adds a ADMIN_VERB(delay_command_report, R_FUN, "Delay Command Report", "Prevents the roundstart command report from being sent; or forces it to send it delayed.", ADMIN_CATEGORY_EVENTS) GLOB.communications_controller.block_command_report = !GLOB.communications_controller.block_command_report message_admins("[key_name_admin(user)] has [(GLOB.communications_controller.block_command_report ? "delayed" : "sent")] the roundstart command report.") + +///Reformats a narration message. First provides a prompt asking if the user wants to reformat their message, then allows them to pick from a list of spans to use. +/client/proc/reformat_narration(input) + if(tgui_alert(mob, "Set a custom text format?", "Make it snazzy!", list("Yes", "No")) == "Yes") + var/text_span = tgui_input_list(mob, "Select a span!", "Immersion! Yeah!", GLOB.spanname_to_formatting) + if(isnull(text_span)) //In case the user just quit the prompt. + return text_span + text_span = GLOB.spanname_to_formatting[text_span] + input = "" + input + "" + + return input diff --git a/code/modules/admin/verbs/anonymousnames.dm b/code/modules/admin/verbs/anonymousnames.dm index 86ccf7008ce91..ad38615d8bed6 100644 --- a/code/modules/admin/verbs/anonymousnames.dm +++ b/code/modules/admin/verbs/anonymousnames.dm @@ -94,7 +94,7 @@ GLOBAL_DATUM(current_anonymous_theme, /datum/anonymous_theme) return var/mob/living/carbon/human/human_mob = player var/original_name = player.real_name //id will not be changed if you do not do this - randomize_human(player) //do this first so the special name can be given + randomize_human_normie(player) //do this first so the special name can be given player.fully_replace_character_name(original_name, anonymous_name(player)) if(extras_enabled) player_extras(player) diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 436e484cb430e..3717affc51c34 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -208,7 +208,7 @@ ADMIN_VERB(create_mapping_job_icons, R_DEBUG, "Generate job landmarks icons", "G else for(var/obj/item/I in D) qdel(I) - randomize_human(D) + randomize_human_normie(D) D.dress_up_as_job( equipping = JB, visual_only = TRUE, diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm index a4035acd01421..d9a1b90b0af29 100644 --- a/code/modules/admin/view_variables/debug_variables.dm +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -3,11 +3,12 @@ /proc/debug_variable(name, value, level, datum/owner, sanitize = TRUE, display_flags = NONE) //if D is a list, name will be index, and value will be assoc value. if(owner) if(islist(owner)) + var/list/list_owner = owner var/index = name if (value) - name = owner[name] //name is really the index until this line + name = list_owner[name] //name is really the index until this line else - value = owner[name] + value = list_owner[name] . = "
  • ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_EDIT, "E", index)]) ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_CHANGE, "C", index)]) ([VV_HREF_TARGET_1V(owner, VV_HK_LIST_REMOVE, "-", index)]) " else . = "
  • ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_EDIT, "E", name)]) ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_CHANGE, "C", name)]) ([VV_HREF_TARGET_1V(owner, VV_HK_BASIC_MASSEDIT, "M", name)]) " diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index d1a2a52fa1b73..3a2ed4281ca77 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -525,6 +525,7 @@ GLOBAL_LIST_EMPTY(antagonists) "antag_team_hud_[REF(src)]", hud_image_on(target), antag_to_check || type, + get_team() && WEAKREF(get_team()), )) // Add HUDs that they couldn't see before diff --git a/code/modules/antagonists/_common/antag_hud.dm b/code/modules/antagonists/_common/antag_hud.dm index 228bfc354dff0..863d52ef5ffe4 100644 --- a/code/modules/antagonists/_common/antag_hud.dm +++ b/code/modules/antagonists/_common/antag_hud.dm @@ -4,9 +4,12 @@ GLOBAL_LIST_EMPTY_TYPED(has_antagonist_huds, /datum/atom_hud/alternate_appearanc /// An alternate appearance that will only show if you have the antag datum /datum/atom_hud/alternate_appearance/basic/has_antagonist var/antag_datum_type + /// Optionally, a weakref to antag team + var/datum/weakref/team_ref -/datum/atom_hud/alternate_appearance/basic/has_antagonist/New(key, image/I, antag_datum_type) +/datum/atom_hud/alternate_appearance/basic/has_antagonist/New(key, image/I, antag_datum_type, datum/weakref/team) src.antag_datum_type = antag_datum_type + team_ref = team GLOB.has_antagonist_huds += src return ..(key, I, NONE) @@ -15,6 +18,9 @@ GLOBAL_LIST_EMPTY_TYPED(has_antagonist_huds, /datum/atom_hud/alternate_appearanc return ..() /datum/atom_hud/alternate_appearance/basic/has_antagonist/mobShouldSee(mob/M) + var/datum/team/antag_team = team_ref?.resolve() + if(!isnull(antag_team)) + return !!(M.mind in antag_team.members) return !!M.mind?.has_antag_datum(antag_datum_type) /// An alternate appearance that will show all the antagonists this mob has diff --git a/code/modules/antagonists/abductor/abductee/abductee.dm b/code/modules/antagonists/abductor/abductee/abductee.dm index f1e657a558ea1..fa529a6504415 100644 --- a/code/modules/antagonists/abductor/abductee/abductee.dm +++ b/code/modules/antagonists/abductor/abductee/abductee.dm @@ -6,6 +6,7 @@ */ /datum/antagonist/abductee name = "\improper Abductee" + stinger_sound = 'sound/ambience/antag/abductee.ogg' roundend_category = "abductees" antagpanel_category = ANTAG_GROUP_ABDUCTORS antag_hud_name = "abductee" @@ -18,6 +19,7 @@ to_chat(owner, span_warning("Your mind snaps!")) to_chat(owner, "[span_warning("You can't remember how you got here...")]") owner.announce_objectives() + play_stinger() /datum/antagonist/abductee/proc/give_objective() var/objtype = (prob(75) ? /datum/objective/abductee/random : pick(subtypesof(/datum/objective/abductee/) - /datum/objective/abductee/random)) diff --git a/code/modules/antagonists/brainwashing/brainwashing.dm b/code/modules/antagonists/brainwashing/brainwashing.dm index 524bfb04362db..57707688f4daf 100644 --- a/code/modules/antagonists/brainwashing/brainwashing.dm +++ b/code/modules/antagonists/brainwashing/brainwashing.dm @@ -30,6 +30,7 @@ /datum/antagonist/brainwashed name = "\improper Brainwashed Victim" job_rank = ROLE_BRAINWASHED + stinger_sound = 'sound/ambience/antag/brainwashed.ogg' roundend_category = "brainwashed victims" show_in_antagpanel = TRUE antag_hud_name = "brainwashed" diff --git a/code/modules/antagonists/brother/brother.dm b/code/modules/antagonists/brother/brother.dm index b62b18a02aedf..13707df2c052f 100644 --- a/code/modules/antagonists/brother/brother.dm +++ b/code/modules/antagonists/brother/brother.dm @@ -75,9 +75,14 @@ flashed.balloon_alert(source, "unconscious!") return +#ifdef TESTING + if (isnull(flashed.mind)) + flashed.mind_initialize() +#else if (isnull(flashed.mind) || !GET_CLIENT(flashed)) flashed.balloon_alert(source, "[flashed.p_their()] mind is vacant!") return +#endif for(var/datum/objective/brother_objective as anything in source.mind.get_all_objectives()) // If the objective has a target, are we flashing them? @@ -183,6 +188,11 @@ message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner)] into a blood brother.") log_admin("[key_name(admin)] made [key_name(new_owner)] into a blood brother.") +/datum/antagonist/brother/apply_innate_effects(mob/living/mob_override) + . = ..() + var/mob/living/the_mob = owner.current || mob_override + add_team_hud(the_mob) + /datum/antagonist/brother/ui_static_data(mob/user) var/list/data = list() data["antag_name"] = name @@ -219,8 +229,13 @@ /// Adds a new brother to the team /datum/team/brother_team/proc/add_brother(mob/living/new_brother, source) +#ifndef TESTING if (isnull(new_brother) || isnull(new_brother.mind) || !GET_CLIENT(new_brother) || new_brother.mind.has_antag_datum(/datum/antagonist/brother)) return FALSE +#else + if (isnull(new_brother) || new_brother.mind.has_antag_datum(/datum/antagonist/brother)) + return FALSE +#endif set_brothers_left(brothers_left - 1) for (var/datum/mind/brother_mind as anything in members) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index de010b07cba33..9929266f4dbf4 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -341,7 +341,7 @@ damage = 0 damage_type = BRUTE range = 8 - hitsound = 'sound/weapons/thudswoosh.ogg' + hitsound = 'sound/weapons/shove.ogg' var/chain var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it ///Click params that were used to fire the tentacle shot diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm index 1c55e5416e247..130b6c9af5f1b 100644 --- a/code/modules/antagonists/clown_ops/clown_weapons.dm +++ b/code/modules/antagonists/clown_ops/clown_weapons.dm @@ -89,7 +89,7 @@ force = 0 throwforce = 0 hitsound = null - embedding = null + embed_type = null light_color = COLOR_YELLOW sword_color_icon = "bananium" active_heat = 0 diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 19d30ba09f419..6c4f1b2a8b527 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -332,6 +332,7 @@ Striking a noncultist, however, will tear their flesh."} else to_chat(user, span_warning("The bola seems to take on a life of its own!")) ensnare(user) + user.update_held_items() #undef CULT_BOLA_PICKUP_STUN @@ -633,6 +634,10 @@ Striking a noncultist, however, will tear their flesh."} icon_state = "blindfold" inhand_icon_state = "blindfold" flash_protect = FLASH_PROTECTION_WELDER + actions_types = null + color_cutoffs = list(40, 0, 0) //red + glass_colour_type = null + forced_glass_color = FALSE /obj/item/clothing/glasses/hud/health/night/cultblind/equipped(mob/living/user, slot) ..() diff --git a/code/modules/antagonists/fugitive/hunters/hunter.dm b/code/modules/antagonists/fugitive/hunters/hunter.dm index b75cba69e528a..ba26645364712 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter.dm @@ -42,6 +42,10 @@ to_chat(owner, span_danger("GOOD EVENING, WE ARE PSYKER HUNTE- NO, PSYKER SHIKARIS!")) to_chat(owner, span_danger("A brainling hit us up on the holopad with an offer we could NOT pass up. We kidnap some fools for them, and in exchange we get a LIFETIME SUPPLY OF GORE.")) to_chat(owner, span_danger("Our gore supply has been running thin as of late -- How could we say no? The binge MUST go on!")) + if(HUNTER_PACK_MI13) + to_chat(owner, span_danger("Agents, we have detected a wanted fugitive in Nanotrasen controlled space.")) + to_chat(owner, span_danger("Your mission is simple. Infiltrate the facility and extract the target, dead or alive.")) + to_chat(owner, span_danger("This is a stealth infiltration mission in hostile enemy territory. Be wary, and avoid being caught if possible.")) to_chat(owner, span_boldannounce("You are not an antagonist in that you may kill whomever you please, but you can do anything to ensure the capture of the fugitives, even if that means going through the station.")) owner.announce_objectives() diff --git a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm index 7df6818cdc44a..5491251d1aa53 100644 --- a/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm +++ b/code/modules/antagonists/fugitive/hunters/hunter_outfits.dm @@ -216,6 +216,56 @@ id_trim = /datum/id_trim/bounty_hunter/psykers/seer +/datum/outfit/mi13_hunter + name = "\improper MI13 Fugitive Retrieval Agent" + uniform = /obj/item/clothing/under/syndicate/sniper + back = /obj/item/storage/backpack/satchel/leather + ears = /obj/item/radio/headset/syndicate + glasses = /obj/item/clothing/glasses/sunglasses + gloves = /obj/item/clothing/gloves/combat + shoes = /obj/item/clothing/shoes/laceup + belt = /obj/item/restraints/handcuffs/cable/zipties + l_pocket = /obj/item/gun/ballistic/automatic/pistol + r_pocket = /obj/item/suppressor + id = /obj/item/card/id/advanced/chameleon/black + box = /obj/item/storage/box/survival/syndie + implants = list(/obj/item/implant/explosive) + +/datum/outfit/mi13_hunter/pre_equip(mob/living/carbon/human/agent, visualsOnly = FALSE) + backpack_contents = list() + backpack_contents += pick_weight(list(/obj/item/ammo_box/magazine/m9mm = 80, + /obj/item/ammo_box/magazine/m9mm/hp = 10, + /obj/item/ammo_box/magazine/m9mm/ap = 5, + /obj/item/ammo_box/magazine/m9mm/fire = 5, + )) + backpack_contents += pick_weight(list( + /obj/item/pen/edagger = 40, + /obj/item/knife/combat = 30, + /obj/item/assembly/flash = 30, + )) + backpack_contents += pick_weight(list( + /obj/item/grenade/c4 = 20, + /obj/item/implanter/freedom = 20, + /obj/item/clothing/mask/chameleon = 20, + /obj/item/language_manual/codespeak_manual/unlimited = 10, + /obj/item/storage/mail_counterfeit_device = 10, + /obj/item/traitor_machine_trapper = 10, + /obj/item/gun/ballistic/automatic/pistol/clandestine/fisher = 10, + )) + +/datum/outfit/mi13_hunter/post_equip(mob/living/carbon/human/agent, visualsOnly = FALSE) + if(visualsOnly) + return + var/obj/item/card/id/wearing = agent.wear_id + wearing.registered_name = agent.real_name + wearing.update_label() + +/datum/outfit/mi13_hunter/chef + name = "\improper MI13 Fugitive Retrieval Agent - Chef Disguise" + head = /obj/item/clothing/head/utility/chefhat + suit = /obj/item/clothing/suit/apron/chef + mask = /obj/item/clothing/mask/fakemoustache + //ids and ert code /obj/item/card/id/advanced/bountyhunter diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 488af0eef28dc..d2db4cb65d596 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -60,17 +60,17 @@ /// Wether we are allowed to ascend var/feast_of_owls = FALSE /// Static list of what each path converts to in the UI (colors are TGUI colors) - var/static/list/path_to_ui_color = list( - PATH_START = "grey", - PATH_SIDE = "green", - PATH_RUST = "brown", - PATH_FLESH = "red", - PATH_ASH = "white", - PATH_VOID = "blue", - PATH_BLADE = "label", // my favorite color is label - PATH_COSMIC = "purple", - PATH_LOCK = "yellow", - PATH_MOON = "blue", + var/static/list/path_to_ui_bgr = list( + PATH_START = "node_side", + PATH_SIDE = "node_side", + PATH_RUST = "node_rust", + PATH_FLESH = "node_flesh", + PATH_ASH = "node_ash", + PATH_VOID = "node_void", + PATH_BLADE = "node_blade", + PATH_COSMIC = "node_cosmos", + PATH_LOCK = "node_lock", + PATH_MOON = "node_moon", ) var/static/list/path_to_rune_color = list( @@ -98,6 +98,82 @@ LAZYNULL(sac_targets) return ..() +/datum/antagonist/heretic/proc/get_icon_of_knowledge(datum/heretic_knowledge/knowledge) + //basic icon parameters + var/icon_path = 'icons/mob/actions/actions_ecult.dmi' + var/icon_state = "eye" + var/icon_frame = knowledge.research_tree_icon_frame + var/icon_dir = knowledge.research_tree_icon_dir + //can't imagine why you would want this one, so it can't be overridden by the knowledge + var/icon_moving = 0 + + //item transmutation knowledge does not generate its own icon due to implementation difficulties, the icons have to be specified in the override vars + + //if the knowledge has a special icon, use that + if(!isnull(knowledge.research_tree_icon_path)) + icon_path = knowledge.research_tree_icon_path + icon_state = knowledge.research_tree_icon_state + + //if the knowledge is a spell, use the spell's button + else if(ispath(knowledge,/datum/heretic_knowledge/spell)) + var/datum/heretic_knowledge/spell/spell_knowledge = knowledge + var/datum/action/cooldown/spell/result_spell = spell_knowledge.spell_to_add + icon_path = result_spell.button_icon + icon_state = result_spell.button_icon_state + + //if the knowledge is a summon, use the mob sprite + else if(ispath(knowledge,/datum/heretic_knowledge/summon)) + var/datum/heretic_knowledge/summon/summon_knowledge = knowledge + var/mob/living/result_mob = summon_knowledge.mob_to_summon + icon_path = result_mob.icon + icon_state = result_mob.icon_state + + //if the knowledge is an eldritch mark, use the mark sprite + else if(ispath(knowledge,/datum/heretic_knowledge/mark)) + var/datum/heretic_knowledge/mark/mark_knowledge = knowledge + var/datum/status_effect/eldritch/mark_effect = mark_knowledge.mark_type + icon_path = mark_effect.effect_icon + icon_state = mark_effect.effect_icon_state + + //if the knowledge is an ascension, use the achievement sprite + else if(ispath(knowledge,/datum/heretic_knowledge/ultimate)) + var/datum/heretic_knowledge/ultimate/ascension_knowledge = knowledge + var/datum/award/achievement/misc/achievement = ascension_knowledge.ascension_achievement + if(!isnull(achievement)) + icon_path = achievement.icon + icon_state = achievement.icon_state + + var/list/result_parameters = list() + result_parameters["icon"] = icon_path + result_parameters["state"] = icon_state + result_parameters["frame"] = icon_frame + result_parameters["dir"] = icon_dir + result_parameters["moving"] = icon_moving + return result_parameters + +/datum/antagonist/heretic/proc/get_knowledge_data(datum/heretic_knowledge/knowledge, done) + + var/list/knowledge_data = list() + + knowledge_data["path"] = knowledge + knowledge_data["icon_params"] = get_icon_of_knowledge(knowledge) + knowledge_data["name"] = initial(knowledge.name) + knowledge_data["gainFlavor"] = initial(knowledge.gain_text) + knowledge_data["cost"] = initial(knowledge.cost) + knowledge_data["disabled"] = (!done) && (initial(knowledge.cost) > knowledge_points) + knowledge_data["bgr"] = (path_to_ui_bgr[initial(knowledge.route)] || "side") + knowledge_data["finished"] = done + knowledge_data["ascension"] = ispath(knowledge,/datum/heretic_knowledge/ultimate) + + //description of a knowledge might change, make sure we are not shown the initial() value in that case + if(done) + var/datum/heretic_knowledge/knowledge_instance = researched_knowledge[knowledge] + knowledge_data["desc"] = knowledge_instance.desc + else + knowledge_data["desc"] = initial(knowledge.desc) + + return knowledge_data + /datum/antagonist/heretic/ui_data(mob/user) var/list/data = list() @@ -105,26 +181,32 @@ data["total_sacrifices"] = total_sacrifices data["ascended"] = ascended + var/list/tiers = list() + // This should be cached in some way, but the fact that final knowledge // has to update its disabled state based on whether all objectives are complete, // makes this very difficult. I'll figure it out one day maybe + for(var/datum/heretic_knowledge/knowledge as anything in researched_knowledge) + var/list/knowledge_data = get_knowledge_data(knowledge,TRUE) + + while(initial(knowledge.depth) > tiers.len) + tiers += list(list("nodes"=list())) + + tiers[initial(knowledge.depth)]["nodes"] += list(knowledge_data) + for(var/datum/heretic_knowledge/knowledge as anything in get_researchable_knowledge()) - var/list/knowledge_data = list() - knowledge_data["path"] = knowledge - knowledge_data["name"] = initial(knowledge.name) - knowledge_data["desc"] = initial(knowledge.desc) - knowledge_data["gainFlavor"] = initial(knowledge.gain_text) - knowledge_data["cost"] = initial(knowledge.cost) - knowledge_data["disabled"] = initial(knowledge.cost) > knowledge_points + var/list/knowledge_data = get_knowledge_data(knowledge,FALSE) // Final knowledge can't be learned until all objectives are complete. if(ispath(knowledge, /datum/heretic_knowledge/ultimate)) - knowledge_data["disabled"] = !can_ascend() + knowledge_data["disabled"] ||= !can_ascend() - knowledge_data["hereticPath"] = initial(knowledge.route) - knowledge_data["color"] = path_to_ui_color[initial(knowledge.route)] || "grey" + while(initial(knowledge.depth) > tiers.len) + tiers += list(list("nodes"=list())) - data["learnableKnowledge"] += list(knowledge_data) + tiers[initial(knowledge.depth)]["nodes"] += list(knowledge_data) + + data["knowledge_tiers"] = tiers return data @@ -134,18 +216,6 @@ data["objectives"] = get_objectives() data["can_change_objective"] = can_assign_self_objectives - for(var/path in researched_knowledge) - var/list/knowledge_data = list() - var/datum/heretic_knowledge/found_knowledge = researched_knowledge[path] - knowledge_data["name"] = found_knowledge.name - knowledge_data["desc"] = found_knowledge.desc - knowledge_data["gainFlavor"] = found_knowledge.gain_text - knowledge_data["cost"] = found_knowledge.cost - knowledge_data["hereticPath"] = found_knowledge.route - knowledge_data["color"] = path_to_ui_color[found_knowledge.route] || "grey" - - data["learnedKnowledge"] += list(knowledge_data) - return data /datum/antagonist/heretic/ui_act(action, params) diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 4c83958d7f7ab..83c883b71616f 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -38,6 +38,14 @@ var/priority = 0 /// What path is this on. If set to "null", assumed to be unreachable (or abstract). var/route + /// In case we want to override the default UI icon getter and plug in our own icon instead. + /// if research_tree_icon_path is not null, research_tree_icon_state must also be specified or things may break + var/research_tree_icon_path + var/research_tree_icon_state + var/research_tree_icon_frame = 1 + var/research_tree_icon_dir = SOUTH + /// Level of knowledge tree where this knowledge should be in the UI + var/depth = 1 ///Determines what kind of monster ghosts will ignore from here on out. Defaults to POLL_IGNORE_HERETIC_MONSTER, but we define other types of monsters for more granularity. var/poll_ignore_define = POLL_IGNORE_HERETIC_MONSTER @@ -263,6 +271,7 @@ limit = 2 cost = 1 priority = MAX_KNOWLEDGE_PRIORITY - 5 + depth = 2 /datum/heretic_knowledge/limited_amount/starting/New() . = ..() @@ -287,6 +296,7 @@ abstract_parent_type = /datum/heretic_knowledge/mark mutually_exclusive = TRUE cost = 2 + depth = 5 /// The status effect typepath we apply on people on mansus grasp. var/datum/status_effect/eldritch/mark_type @@ -352,6 +362,7 @@ abstract_parent_type = /datum/heretic_knowledge/blade_upgrade mutually_exclusive = TRUE cost = 2 + depth = 9 /datum/heretic_knowledge/blade_upgrade/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) @@ -592,6 +603,9 @@ mutually_exclusive = TRUE cost = 1 priority = MAX_KNOWLEDGE_PRIORITY - 10 // A pretty important midgame ritual. + depth = 6 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "book_open" /// Whether we've done the ritual. Only doable once. var/was_completed = FALSE @@ -685,6 +699,9 @@ cost = 2 priority = MAX_KNOWLEDGE_PRIORITY + 1 // Yes, the final ritual should be ABOVE the max priority. required_atoms = list(/mob/living/carbon/human = 3) + depth = 11 + //use this to store the achievement typepath + var/datum/award/achievement/misc/ascension_achievement /datum/heretic_knowledge/ultimate/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -745,6 +762,8 @@ source = user, header = "Еретик вознесся!", ) + if(!isnull(ascension_achievement)) + user.client?.give_award(ascension_achievement, user) heretic_datum.increase_rust_strength() return TRUE diff --git a/code/modules/antagonists/heretic/items/eldritch_flask.dm b/code/modules/antagonists/heretic/items/eldritch_flask.dm index 9fdf8a571158c..fcafba914938b 100644 --- a/code/modules/antagonists/heretic/items/eldritch_flask.dm +++ b/code/modules/antagonists/heretic/items/eldritch_flask.dm @@ -4,5 +4,5 @@ name = "flask of eldritch essence" desc = "Токсичный для недалеких умов, но освежающий для тех, кто имеет знания о потустороннем." icon = 'icons/obj/antags/eldritch.dmi' - icon_state = "eldrich_flask" + icon_state = "eldritch_flask" list_reagents = list(/datum/reagent/eldritch = 50) diff --git a/code/modules/antagonists/heretic/items/keyring.dm b/code/modules/antagonists/heretic/items/keyring.dm index e495ffd184b4d..eebdc9507d791 100644 --- a/code/modules/antagonists/heretic/items/keyring.dm +++ b/code/modules/antagonists/heretic/items/keyring.dm @@ -185,7 +185,7 @@ if(reference_resolved) make_portal(user, reference_resolved, target) - to_chat(user, span_notice("Используя [src], вы соединяете [link] с [target].")) + to_chat(user, span_notice("Используя [src], вы соединяете [reference_resolved] с [target].")) link = null balloon_alert(user, "соединено 2/2") else diff --git a/code/modules/antagonists/heretic/knowledge/ash_lore.dm b/code/modules/antagonists/heretic/knowledge/ash_lore.dm index b5e532bca9092..6d2f231d31ddf 100644 --- a/code/modules/antagonists/heretic/knowledge/ash_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/ash_lore.dm @@ -1,5 +1,7 @@ /** * # The path of Ash. + * Spell names are in this language: OLD NORDIC + * Both are related: Nordic Mythology-Yggdrassil-Ash Tree Genus-Ash * * Goes as follows: * @@ -39,6 +41,8 @@ ) result_atoms = list(/obj/item/melee/sickly_blade/ash) route = PATH_ASH + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "ash_blade" /datum/heretic_knowledge/ashen_grasp name = "Grasp of Ash" @@ -48,6 +52,9 @@ next_knowledge = list(/datum/heretic_knowledge/spell/ash_passage) cost = 1 route = PATH_ASH + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_ash" /datum/heretic_knowledge/ashen_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -80,6 +87,7 @@ spell_to_add = /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash cost = 1 route = PATH_ASH + depth = 4 /datum/heretic_knowledge/mark/ash_mark name = "Mark of Ash" @@ -119,6 +127,8 @@ spell_to_add = /datum/action/cooldown/spell/charged/beam/fire_blast cost = 1 route = PATH_ASH + depth = 7 + research_tree_icon_frame = 7 /datum/heretic_knowledge/mad_mask @@ -142,6 +152,9 @@ result_atoms = list(/obj/item/clothing/mask/madness_mask) cost = 1 route = PATH_ASH + research_tree_icon_path = 'icons/obj/clothing/masks.dmi' + research_tree_icon_state = "mad_mask" + depth = 8 /datum/heretic_knowledge/blade_upgrade/ash name = "Fiery Blade" @@ -150,6 +163,8 @@ Его город, люди, за которыми он поклялся наблюдать... и он наблюдал, пока все они сгорали дотла." next_knowledge = list(/datum/heretic_knowledge/spell/flame_birth) route = PATH_ASH + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_ash" /datum/heretic_knowledge/blade_upgrade/ash/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) if(source == target) @@ -173,6 +188,8 @@ spell_to_add = /datum/action/cooldown/spell/aoe/fiery_rebirth cost = 1 route = PATH_ASH + depth = 10 + research_tree_icon_frame = 5 /datum/heretic_knowledge/ultimate/ash_final name = "Ashlord's Rite" @@ -187,6 +204,7 @@ ибо он принес человечеству обряд! Его взгляд продолжается, и теперь я един с пламенем, \ УЗРИТЕ МОЕ ВОЗНЕСЕНИЕ, ПЕПЕЛЬНЫЙ ФОНАРЬ ВОСПЛАМЕНИТСЯ ВНОВЬ!" route = PATH_ASH + ascension_achievement = /datum/award/achievement/misc/ash_ascension /// A static list of all traits we apply on ascension. var/static/list/traits_to_apply = list( TRAIT_BOMBIMMUNE, @@ -215,7 +233,7 @@ text = "[generate_heretic_text()] Бойтесь пламени, ибо Пепельный лорд, [user.real_name], вознесся! Пламя поглотит всех! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_ash.ogg', - color_override = "pink", + color_override = "white", ) var/datum/action/cooldown/spell/fire_sworn/circle_spell = new(user.mind) @@ -233,6 +251,5 @@ var/datum/action/cooldown/spell/aoe/fiery_rebirth/fiery_rebirth = locate() in user.actions fiery_rebirth?.cooldown_time *= 0.16 - user.client?.give_award(/datum/award/achievement/misc/ash_ascension, user) if(length(traits_to_apply)) user.add_traits(traits_to_apply, MAGIC_TRAIT) diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm index 704bc702a4505..d263980169b2c 100644 --- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm @@ -1,5 +1,7 @@ /** * # The path of Blades. Stab stab. + * Spell names are in this language: ARAMAIC + * Both are related: Aramaic-Damascus-Blade * * Goes as follows: * @@ -43,6 +45,8 @@ result_atoms = list(/obj/item/melee/sickly_blade/dark) limit = 5 // It's the blade path, it's a given route = PATH_BLADE + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "dark_blade" /datum/heretic_knowledge/blade_grasp name = "Grasp of the Blade" @@ -52,6 +56,9 @@ next_knowledge = list(/datum/heretic_knowledge/blade_dance) cost = 1 route = PATH_BLADE + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_blade" /datum/heretic_knowledge/blade_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -111,6 +118,9 @@ ) cost = 1 route = PATH_BLADE + depth = 4 + research_tree_icon_path = 'icons/mob/actions/actions_ecult.dmi' + research_tree_icon_state = "shatter" /// Whether the counter-attack is ready or not. /// Used instead of cooldowns, so we can give feedback when it's ready again var/riposte_ready = TRUE @@ -231,6 +241,7 @@ spell_to_add = /datum/action/cooldown/spell/realignment cost = 1 route = PATH_BLADE + depth = 7 /// The amount of blood flow reduced per level of severity of gained bleeding wounds for Stance of the Torn Champion. #define BLOOD_FLOW_PER_SEVEIRTY -1 @@ -251,6 +262,10 @@ ) cost = 1 route = PATH_BLADE + depth = 8 + research_tree_icon_path = 'icons/effects/blood.dmi' + research_tree_icon_state = "suitblood" + research_tree_icon_dir = SOUTH /// Whether we're currently in duelist stance, gaining certain buffs (low health) var/in_duelist_stance = FALSE @@ -310,6 +325,8 @@ шквал клинков, но ни один из них не попал в цель, ибо чемпион был неукротим." next_knowledge = list(/datum/heretic_knowledge/spell/furious_steel) route = PATH_BLADE + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_blade" /// How much force do we apply to the offhand? var/offand_force_decrement = 0 /// How much force was the last weapon we offhanded with? If it's different, we need to re-calculate the decrement @@ -380,6 +397,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/projectile/furious_steel cost = 1 route = PATH_BLADE + depth = 10 /datum/heretic_knowledge/ultimate/blade_final name = "Maelstrom of Silver" @@ -393,6 +411,7 @@ gain_text = "Разорванный чемпион освобожден! Я стану воссоединенным клинком, и с моими более великими амбициями, \ НЕ НЕТ РАВНЫХ! БУРЯ ИЗ СТАЛИ И СЕРЕБРА НАДВИГАЕТСЯ НА НАС! УЗРИТЕ МОЕ ВОЗНЕСЕНИЕ!" route = PATH_BLADE + ascension_achievement = /datum/award/achievement/misc/blade_ascension /datum/heretic_knowledge/ultimate/blade_final/is_valid_sacrifice(mob/living/carbon/human/sacrifice) . = ..() @@ -409,7 +428,6 @@ sound = 'sound/ambience/antag/heretic/ascend_blade.ogg', color_override = "pink", ) - user.client?.give_award(/datum/award/achievement/misc/blade_ascension, user) ADD_TRAIT(user, TRAIT_NEVER_WOUNDED, name) RegisterSignal(user, COMSIG_HERETIC_BLADE_ATTACK, PROC_REF(on_eldritch_blade)) user.apply_status_effect(/datum/status_effect/protective_blades/recharging, null, 8, 30, 0.25 SECONDS, 1 MINUTES) diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index 60112bb9878a9..670fb8fac6fd8 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -1,5 +1,7 @@ /** * # The path of Cosmos. + * Spell names are in this language: SUMERIAN + * Both are related: Sumerian-Original-Primordial-Cosmic * * Goes as follows: * @@ -38,6 +40,8 @@ ) result_atoms = list(/obj/item/melee/sickly_blade/cosmic) route = PATH_COSMIC + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "cosmic_blade" /datum/heretic_knowledge/cosmic_grasp name = "Grasp of Cosmos" @@ -48,6 +52,9 @@ next_knowledge = list(/datum/heretic_knowledge/spell/cosmic_runes) cost = 1 route = PATH_COSMIC + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_cosmos" /datum/heretic_knowledge/cosmic_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -78,6 +85,7 @@ spell_to_add = /datum/action/cooldown/spell/cosmic_rune cost = 1 route = PATH_COSMIC + depth = 4 /datum/heretic_knowledge/mark/cosmic_mark name = "Mark of Cosmos" @@ -107,6 +115,7 @@ spell_to_add = /datum/action/cooldown/spell/touch/star_touch cost = 1 route = PATH_COSMIC + depth = 7 /datum/heretic_knowledge/spell/star_blast name = "Star Blast" @@ -123,6 +132,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/projectile/star_blast cost = 1 route = PATH_COSMIC + depth = 8 /datum/heretic_knowledge/blade_upgrade/cosmic name = "Cosmic Blade" @@ -135,6 +145,8 @@ Клинки теперь сверкали раздробленной силой. Я упал на землю и зарыдал у ног Зверя." next_knowledge = list(/datum/heretic_knowledge/spell/cosmic_expansion) route = PATH_COSMIC + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_cosmos" /// Storage for the second target. var/datum/weakref/second_target /// Storage for the third target. @@ -233,6 +245,7 @@ spell_to_add = /datum/action/cooldown/spell/conjure/cosmic_expansion cost = 1 route = PATH_COSMIC + depth = 10 /datum/heretic_knowledge/ultimate/cosmic_final name = "Creators's Gift" @@ -250,6 +263,7 @@ Я закрыл глаза, прижавшись головой к их телу. Я был в безопасности. \ УЗРИТЕ МОЕ ВОЗНЕСЕНИЕ!" route = PATH_COSMIC + ascension_achievement = /datum/award/achievement/misc/cosmic_ascension /// A static list of command we can use with our mob. var/static/list/star_gazer_commands = list( /datum/pet_command/idle, @@ -271,7 +285,7 @@ text = "[generate_heretic_text()] Звездочет прибыл на станцию, [user.real_name] вознесся! Эта станция - владения Космоса! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_cosmic.ogg', - color_override = "pink", + color_override = "purple", ) var/mob/living/basic/heretic_summon/star_gazer/star_gazer_mob = new /mob/living/basic/heretic_summon/star_gazer(loc) star_gazer_mob.maxHealth = INFINITY @@ -296,5 +310,3 @@ var/datum/action/cooldown/spell/conjure/cosmic_expansion/cosmic_expansion_spell = locate() in user.actions cosmic_expansion_spell?.ascended = TRUE - - user.client?.give_award(/datum/award/achievement/misc/cosmic_ascension, user) diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index 5f986db82fa95..5547bb974758c 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -5,6 +5,8 @@ /** * # The path of Flesh. + * Spell names are in this language: LATIN + * Both are related: Latin-Rome-Hedonism-Flesh * * Goes as follows: * @@ -44,6 +46,8 @@ result_atoms = list(/obj/item/melee/sickly_blade/flesh) limit = 3 // Bumped up so they can arm up their ghouls too. route = PATH_FLESH + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "flesh_blade" /datum/heretic_knowledge/limited_amount/starting/base_flesh/on_research(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -64,6 +68,9 @@ limit = 1 cost = 1 route = PATH_FLESH + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_flesh" /datum/heretic_knowledge/limited_amount/flesh_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -137,6 +144,10 @@ limit = 2 cost = 1 route = PATH_FLESH + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "ghoul_voiceless" + + depth = 4 /datum/heretic_knowledge/limited_amount/flesh_ghoul/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) . = ..() @@ -227,6 +238,7 @@ spell_to_add = /datum/action/cooldown/spell/touch/flesh_surgery cost = 1 route = PATH_FLESH + depth = 7 /datum/heretic_knowledge/summon/raw_prophet name = "Raw Ritual" @@ -250,6 +262,7 @@ cost = 1 route = PATH_FLESH poll_ignore_define = POLL_IGNORE_RAW_PROPHET + depth = 8 /datum/heretic_knowledge/blade_upgrade/flesh name = "Bleeding Steel" @@ -258,6 +271,8 @@ Наконец-то я начал понимать. А потом с небес хлынул кровавый дождь." next_knowledge = list(/datum/heretic_knowledge/summon/stalker) route = PATH_FLESH + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_flesh" ///What type of wound do we apply on hit var/wound_type = /datum/wound/slash/flesh/severe @@ -292,6 +307,7 @@ cost = 1 route = PATH_FLESH poll_ignore_define = POLL_IGNORE_STALKER + depth = 10 /datum/heretic_knowledge/ultimate/flesh_final name = "Priest's Final Hymn" @@ -308,6 +324,7 @@ Реальность согнется перед ВЛАДЫКОЙ НОЧИ или будет разрушена! УЗРИТЕ МОЕ ВОЗНЕСЕНИЕ!" required_atoms = list(/mob/living/carbon/human = 4) route = PATH_FLESH + ascension_achievement = /datum/award/achievement/misc/flesh_ascension /datum/heretic_knowledge/ultimate/flesh_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) . = ..() @@ -315,13 +332,12 @@ text = "[generate_heretic_text()] Вечно закручивающийся вихрь. Реальность развернулась. С ВЫТЯНУТЫМИ РУКАМИ, ВЛАСТЕЛИН НОЧИ, [user.real_name] вознесся! Бойтесь вечно изгибающейся руки! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_flesh.ogg', - color_override = "pink", + color_override = "red", ) var/datum/action/cooldown/spell/shapeshift/shed_human_form/worm_spell = new(user.mind) worm_spell.Grant(user) - user.client?.give_award(/datum/award/achievement/misc/flesh_ascension, user) var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) var/datum/heretic_knowledge/limited_amount/flesh_grasp/grasp_ghoul = heretic_datum.get_knowledge(/datum/heretic_knowledge/limited_amount/flesh_grasp) diff --git a/code/modules/antagonists/heretic/knowledge/general_side.dm b/code/modules/antagonists/heretic/knowledge/general_side.dm index d5e76c5bd608f..f6c9abb855447 100644 --- a/code/modules/antagonists/heretic/knowledge/general_side.dm +++ b/code/modules/antagonists/heretic/knowledge/general_side.dm @@ -12,6 +12,9 @@ ) cost = 1 route = PATH_SIDE + depth = 8 + research_tree_icon_path = 'icons/mob/actions/actions_animal.dmi' + research_tree_icon_state = "gaze" /datum/heretic_knowledge/reroll_targets/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm index bf38cefaae0c4..5c41a793355da 100644 --- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm @@ -1,5 +1,7 @@ /** * # The path of Lock. + * Spell names are in this language: EGYPTIAN + * Both are related: Egyptian-Mysteries-Secrets-Lock * * Goes as follows: * @@ -39,6 +41,8 @@ result_atoms = list(/obj/item/melee/sickly_blade/lock) limit = 2 route = PATH_LOCK + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "key_blade" /datum/heretic_knowledge/lock_grasp name = "Grasp of Lock" @@ -49,6 +53,9 @@ next_knowledge = list(/datum/heretic_knowledge/key_ring) cost = 1 route = PATH_LOCK + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_lock" /datum/heretic_knowledge/lock_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, PROC_REF(on_secondary_mansus_grasp)) @@ -111,6 +118,9 @@ ) cost = 1 route = PATH_LOCK + research_tree_icon_path = 'icons/obj/card.dmi' + research_tree_icon_state = "card_gold" + depth = 4 /datum/heretic_knowledge/mark/lock_mark name = "Mark of Lock" @@ -140,6 +150,9 @@ next_knowledge = list(/datum/heretic_knowledge/spell/burglar_finesse) cost = 1 route = PATH_LOCK + research_tree_icon_path = 'icons/obj/service/library.dmi' + research_tree_icon_state = "heretichandbook" + depth = 7 /datum/heretic_knowledge/spell/burglar_finesse name = "Burglar's Finesse" @@ -156,6 +169,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/burglar_finesse cost = 1 route = PATH_LOCK + depth = 8 /datum/heretic_knowledge/blade_upgrade/flesh/lock //basically a chance-based weeping avulsion version of the former name = "Opening Blade" @@ -164,6 +178,8 @@ next_knowledge = list(/datum/heretic_knowledge/spell/caretaker_refuge) route = PATH_LOCK wound_type = /datum/wound/slash/flesh/critical + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_lock" var/chance = 35 /datum/heretic_knowledge/blade_upgrade/flesh/lock/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) @@ -183,6 +199,7 @@ route = PATH_LOCK spell_to_add = /datum/action/cooldown/spell/caretaker cost = 1 + depth = 10 /datum/heretic_knowledge/ultimate/lock_final name = "Unlock the Labyrinth" @@ -199,6 +216,7 @@ Лабиринт теперь не будет Заперт, свобода будет нашей! УЗРИТЕ НАС!" required_atoms = list(/mob/living/carbon/human = 3) route = PATH_LOCK + ascension_achievement = /datum/award/achievement/misc/lock_ascension /datum/heretic_knowledge/ultimate/lock_final/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) . = ..() @@ -225,15 +243,13 @@ text = "Пространственная аномалия Дельта-класса обнар[generate_heretic_text()] Реальность разрушена, разорвана. Врата открыты, двери открыты, [user.real_name] вознесся! Бойтесь нашествия! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_knock.ogg', - color_override = "pink", + color_override = "yellow", ) - user.client?.give_award(/datum/award/achievement/misc/lock_ascension, user) // buffs var/datum/action/cooldown/spell/shapeshift/eldritch/ascension/transform_spell = new(user.mind) transform_spell.Grant(user) - user.client?.give_award(/datum/award/achievement/misc/lock_ascension, user) var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) var/datum/heretic_knowledge/blade_upgrade/flesh/lock/blade_upgrade = heretic_datum.get_knowledge(/datum/heretic_knowledge/blade_upgrade/flesh/lock) blade_upgrade.chance += 30 diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm index 8dd32c201dc45..511ac0f0cafbd 100644 --- a/code/modules/antagonists/heretic/knowledge/moon_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -1,5 +1,7 @@ /** * # The path of Moon. + * Spell names are in this language: ANCIENT HEBREW + * Both are related: Ancient Hebrew-Moon Mysticism-Moon * * Goes as follows: * @@ -39,6 +41,8 @@ ) result_atoms = list(/obj/item/melee/sickly_blade/moon) route = PATH_MOON + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "moon_blade" /datum/heretic_knowledge/base_moon/on_gain(mob/user, datum/antagonist/heretic/our_heretic) add_traits(user ,TRAIT_EMPATH, REF(src)) @@ -51,6 +55,9 @@ next_knowledge = list(/datum/heretic_knowledge/spell/moon_smile) cost = 1 route = PATH_MOON + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_moon" /datum/heretic_knowledge/moon_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -82,6 +89,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/moon_smile cost = 1 route = PATH_MOON + depth = 4 /datum/heretic_knowledge/mark/moon_mark name = "Mark of Moon" @@ -107,6 +115,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/projectile/moon_parade cost = 1 route = PATH_MOON + depth = 7 /datum/heretic_knowledge/moon_amulet @@ -130,6 +139,10 @@ result_atoms = list(/obj/item/clothing/neck/heretic_focus/moon_amulet) cost = 1 route = PATH_MOON + depth = 8 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "moon_amulette" + research_tree_icon_frame = 9 /datum/heretic_knowledge/blade_upgrade/moon name = "Moonlight Blade" @@ -137,6 +150,8 @@ gain_text = "Его остроумие было острым, как клинок, оно прорезало ложь, чтобы принести нам радость." next_knowledge = list(/datum/heretic_knowledge/spell/moon_ringleader) route = PATH_MOON + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_moon" /datum/heretic_knowledge/blade_upgrade/moon/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) if(source == target) @@ -164,6 +179,8 @@ spell_to_add = /datum/action/cooldown/spell/aoe/moon_ringleader cost = 1 route = PATH_MOON + depth = 10 + research_tree_icon_frame = 5 /datum/heretic_knowledge/ultimate/moon_final name = "The Last Act" @@ -176,6 +193,7 @@ туда, откуда Шпрехшталмейстер начал парад, и я продолжу его до самой кончины солнца \ УЗРИТЕ МОЕ ВОЗНЕСЕНИЕ, ЛУНА УЛЫБНЕТСЯ РАЗ И НАВСЕГДА!" route = PATH_MOON + ascension_achievement = /datum/award/achievement/misc/moon_ascension /datum/heretic_knowledge/ultimate/moon_final/is_valid_sacrifice(mob/living/sacrifice) @@ -193,10 +211,9 @@ Правда наконец поглотит ложь! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_moon.ogg', - color_override = "pink", + color_override = "blue", ) - user.client?.give_award(/datum/award/achievement/misc/moon_ascension, user) ADD_TRAIT(user, TRAIT_MADNESS_IMMUNE, REF(src)) user.mind.add_antag_datum(/datum/antagonist/lunatic/master) RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(on_life)) diff --git a/code/modules/antagonists/heretic/knowledge/rust_lore.dm b/code/modules/antagonists/heretic/knowledge/rust_lore.dm index a40a9c8717a6d..0fe648d8ecbb4 100644 --- a/code/modules/antagonists/heretic/knowledge/rust_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/rust_lore.dm @@ -1,5 +1,6 @@ /** * # The path of Rust. + * Spell names are in this language: OLD SLAVIC * * Goes as follows: * @@ -42,6 +43,8 @@ ) result_atoms = list(/obj/item/melee/sickly_blade/rust) route = PATH_RUST + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "rust_blade" /datum/heretic_knowledge/rust_fist name = "Grasp of Rust" @@ -52,6 +55,9 @@ next_knowledge = list(/datum/heretic_knowledge/rust_regen) cost = 1 route = PATH_RUST + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_rust" /datum/heretic_knowledge/rust_fist/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -93,6 +99,9 @@ ) cost = 1 route = PATH_RUST + research_tree_icon_path = 'icons/effects/eldritch.dmi' + research_tree_icon_state = "cloud_swirl" + depth = 4 /datum/heretic_knowledge/rust_regen/on_gain(mob/user, datum/antagonist/heretic/our_heretic) user.AddElement(/datum/element/leeching_walk) @@ -128,6 +137,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/rust_construction cost = 1 route = PATH_RUST + depth = 7 /datum/heretic_knowledge/spell/area_conversion name = "Aggressive Spread" @@ -145,6 +155,8 @@ spell_to_add = /datum/action/cooldown/spell/aoe/rust_conversion cost = 1 route = PATH_RUST + depth = 8 + research_tree_icon_frame = 5 /datum/heretic_knowledge/spell/area_conversion/on_gain(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -157,6 +169,8 @@ Тяжелая ржавчина утяжеляет клинок. Вы пристально вглядываетесь в него. Ржавые холмы зовут тебя." next_knowledge = list(/datum/heretic_knowledge/spell/entropic_plume) route = PATH_RUST + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_rust" /datum/heretic_knowledge/blade_upgrade/rust/on_gain(mob/user, datum/antagonist/heretic/our_heretic) . = ..() @@ -181,6 +195,7 @@ spell_to_add = /datum/action/cooldown/spell/cone/staggered/entropic_plume cost = 1 route = PATH_RUST + depth = 10 /datum/heretic_knowledge/spell/entropic_plume/on_gain(mob/user) . = ..() @@ -197,6 +212,7 @@ gain_text = "Чемпион ржавчины. Разлагатель стали. Бойся темноты, ибо пришел ПОВЕЛИТЕЛЬ РЖАВЧИНЫ! \ Работа Кузнеца продолжается! Ржавые холмы, УСЛЫШЬТЕ МОЕ ИМЯ! УЗРИТЕ МОЕ ВОЗНЕСЕНИЕ!" route = PATH_RUST + ascension_achievement = /datum/award/achievement/misc/rust_ascension /// If TRUE, then immunities are currently active. var/immunities_active = FALSE /// A typepath to an area that we must finish the ritual in. @@ -242,7 +258,7 @@ text = "[generate_heretic_text()] Бойтесь разложения, ведь Повелитель ржавчины, [user.real_name] вознесся! Никто не избежит коррозии! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_rust.ogg', - color_override = "pink", + color_override = "brown", ) trigger(loc) RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) diff --git a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm index 9fd24f0c1e584..25656f377a68b 100644 --- a/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm +++ b/code/modules/antagonists/heretic/knowledge/sacrifice_knowledge/sacrifice_knowledge.dm @@ -16,6 +16,9 @@ cost = 0 priority = MAX_KNOWLEDGE_PRIORITY // Should be at the top route = PATH_START + research_tree_icon_path = 'icons/effects/eldritch.dmi' + research_tree_icon_state = "eye_close" + research_tree_icon_frame = 1 /// How many targets do we generate? var/num_targets_to_generate = 5 /// Whether we've generated a heretic sacrifice z-level yet, from any heretic. diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm index 52f96a1337409..c3fc2783bb89f 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm @@ -16,6 +16,9 @@ result_atoms = list(/obj/item/clothing/neck/eldritch_amulet) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "eye_medalion" + depth = 4 /datum/heretic_knowledge/curse/paralysis name = "Curse of Paralysis" @@ -37,6 +40,9 @@ curse_color = "#f19a9a" cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "curse_paralysis" + depth = 8 /datum/heretic_knowledge/curse/paralysis/curse(mob/living/carbon/human/chosen_mob, boosted = FALSE) if(chosen_mob.usable_legs <= 0) // What're you gonna do, curse someone who already can't walk? @@ -75,6 +81,7 @@ cost = 1 route = PATH_SIDE poll_ignore_define = POLL_IGNORE_ASH_SPIRIT + depth = 10 /datum/heretic_knowledge/summon/ashy/cleanup_atoms(list/selected_atoms) var/obj/item/bodypart/head/ritual_head = locate() in selected_atoms diff --git a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm index 2a94e648c54bb..aa250ce435e3d 100644 --- a/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm +++ b/code/modules/antagonists/heretic/knowledge/side_blade_rust.dm @@ -16,6 +16,10 @@ result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' + research_tree_icon_state = "eldritch_armor" + research_tree_icon_frame = 12 + depth = 4 /datum/heretic_knowledge/crucible name = "Mawed Crucible" @@ -34,6 +38,9 @@ result_atoms = list(/obj/structure/destructible/eldritch_crucible) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "crucible" + depth = 8 /datum/heretic_knowledge/rifle name = "Lionhunter's Rifle" @@ -59,9 +66,12 @@ result_atoms = list(/obj/item/gun/ballistic/rifle/lionhunter) cost = 1 route = PATH_SIDE + depth = 8 + research_tree_icon_path = 'icons/obj/weapons/guns/ballistic.dmi' + research_tree_icon_state = "goldrevolver" /datum/heretic_knowledge/rifle_ammo - name = "Lionhunter Rifle Ammunition (free)" + name = "Lionhunter Rifle Ammunition" desc = "Позволяет трансмутировать 3 баллистические гильзы (использованные или неиспользованные) любого калибра, \ включая дробь, со шкурой любого животного, чтобы создать дополнительную обойму боеприпасов для винтовки Lionhunter." gain_text = "К оружию прилагались три грубых железных шара, предназначенных для использования в качестве боеприпасов. \ @@ -74,6 +84,9 @@ result_atoms = list(/obj/item/ammo_box/strilka310/lionhunter) cost = 0 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/weapons/guns/ammo.dmi' + research_tree_icon_state = "310_strip" + depth = 8 /// A list of calibers that the ritual will deny. Only ballistic calibers are allowed. var/static/list/caliber_blacklist = list( CALIBER_LASER, @@ -107,3 +120,4 @@ spell_to_add = /datum/action/cooldown/mob_cooldown/charge/rust cost = 1 route = PATH_SIDE + depth = 10 diff --git a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm index 37758eb2b2239..5a8b0f852b4c4 100644 --- a/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm +++ b/code/modules/antagonists/heretic/knowledge/side_cosmos_ash.dm @@ -19,6 +19,8 @@ cost = 1 route = PATH_SIDE poll_ignore_define = POLL_IGNORE_FIRE_SHARK + depth = 4 + research_tree_icon_dir = EAST /datum/heretic_knowledge/spell/space_phase name = "Space Phase" @@ -32,6 +34,8 @@ spell_to_add = /datum/action/cooldown/spell/jaunt/space_crawl cost = 1 route = PATH_SIDE + depth = 8 + research_tree_icon_frame = 6 /datum/heretic_knowledge/eldritch_coin name = "Eldritch Coin" @@ -51,3 +55,6 @@ result_atoms = list(/obj/item/coin/eldritch) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/economy.dmi' + research_tree_icon_state = "coin_heretic" + depth = 10 diff --git a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm index c85ea8da6acba..839158c7f253c 100644 --- a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm +++ b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm @@ -19,6 +19,9 @@ result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/void) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/clothing/suits/armor.dmi' + research_tree_icon_state = "void_cloak" + depth = 4 /datum/heretic_knowledge/spell/blood_siphon name = "Blood Siphon" @@ -32,6 +35,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/blood_siphon cost = 1 route = PATH_SIDE + depth = 8 /datum/heretic_knowledge/spell/cleave name = "Blood Cleave" @@ -46,3 +50,4 @@ spell_to_add = /datum/action/cooldown/spell/pointed/cleave cost = 1 route = PATH_SIDE + depth = 10 diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm index 50f9867847d85..f20901387c19a 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_flesh.dm @@ -12,6 +12,7 @@ spell_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation cost = 1 route = PATH_SIDE + depth = 8 /datum/heretic_knowledge/spell/apetra_vulnera name = "Apetra Vulnera" @@ -26,3 +27,4 @@ spell_to_add = /datum/action/cooldown/spell/pointed/apetra_vulnera cost = 1 route = PATH_SIDE + depth = 10 diff --git a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm index 1b22cb7d4450a..cc421c717114e 100644 --- a/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm +++ b/code/modules/antagonists/heretic/knowledge/side_lock_moon.dm @@ -13,6 +13,7 @@ spell_to_add = /datum/action/cooldown/spell/pointed/mind_gate cost = 1 route = PATH_SIDE + depth = 4 /datum/heretic_knowledge/unfathomable_curio name = "Unfathomable Curio" @@ -33,6 +34,9 @@ result_atoms = list(/obj/item/storage/belt/unfathomable_curio) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/clothing/belts.dmi' + research_tree_icon_state = "unfathomable_curio" + depth = 8 /datum/heretic_knowledge/painting name = "Unsealed Arts" @@ -54,6 +58,9 @@ result_atoms = list(/obj/item/canvas) cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/obj/signs.dmi' + research_tree_icon_state = "eldritch_painting_weeping" + depth = 8 /datum/heretic_knowledge/painting/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) if(locate(/obj/item/organ/internal/eyes) in atoms) diff --git a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm index 869a69926c8a2..331ff58696e12 100644 --- a/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm +++ b/code/modules/antagonists/heretic/knowledge/side_rust_cosmos.dm @@ -17,6 +17,9 @@ result_atoms = list(/obj/item/reagent_containers/cup/beaker/eldritch) cost = 1 route = PATH_SIDE + depth = 4 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "eldritch_flask" /datum/heretic_knowledge/entropy_pulse name = "Pulse of Entropy" @@ -28,6 +31,10 @@ ) cost = 0 route = PATH_SIDE + research_tree_icon_path = 'icons/mob/actions/actions_ecult.dmi' + research_tree_icon_state = "corrode" + research_tree_icon_frame = 10 + depth = 4 var/rusting_range = 8 /datum/heretic_knowledge/entropy_pulse/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) @@ -60,6 +67,9 @@ curse_color = "#c1ffc9" cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "curse_corrosion" + depth = 8 /datum/heretic_knowledge/curse/corrosion/curse(mob/living/carbon/human/chosen_mob, boosted = FALSE) to_chat(chosen_mob, span_danger("Вы чувствуете себя очень плохо...")) @@ -92,6 +102,7 @@ cost = 1 route = PATH_SIDE poll_ignore_define = POLL_IGNORE_RUST_SPIRIT + depth = 8 /datum/heretic_knowledge/summon/rusty/cleanup_atoms(list/selected_atoms) var/obj/item/bodypart/head/ritual_head = locate() in selected_atoms diff --git a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm index f119c5d11b10c..dcd30cffc0a2e 100644 --- a/code/modules/antagonists/heretic/knowledge/side_void_blade.dm +++ b/code/modules/antagonists/heretic/knowledge/side_void_blade.dm @@ -23,6 +23,9 @@ limit = 1 cost = 1 route = PATH_SIDE + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "ghoul_shattered" + depth = 4 /datum/heretic_knowledge/limited_amount/risen_corpse/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) . = ..() @@ -139,6 +142,9 @@ result_atoms = list(/obj/item/melee/rune_carver) cost = 1 route = PATH_SIDE + depth = 8 + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "rune_carver" /datum/heretic_knowledge/summon/maid_in_mirror name = "Maid in the Mirror" @@ -162,3 +168,4 @@ route = PATH_SIDE mob_to_summon = /mob/living/basic/heretic_summon/maid_in_the_mirror poll_ignore_define = POLL_IGNORE_MAID_IN_MIRROR + depth = 10 diff --git a/code/modules/antagonists/heretic/knowledge/starting_lore.dm b/code/modules/antagonists/heretic/knowledge/starting_lore.dm index 351db763eac20..af7bc1c98ae56 100644 --- a/code/modules/antagonists/heretic/knowledge/starting_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/starting_lore.dm @@ -1,4 +1,5 @@ // Heretic starting knowledge. +// Default heretic language is Ancient Greek, because, uh, they're like ancient and shit. /// Global list of all heretic knowledge that have route = PATH_START. List of PATHS. GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) @@ -48,6 +49,9 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) cost = 0 priority = MAX_KNOWLEDGE_PRIORITY - 1 // Knowing how to remake your heart is important route = PATH_START + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "living_heart" + research_tree_icon_frame = 1 /// The typepath of the organ type required for our heart. var/required_organ_type = /obj/item/organ/internal/heart @@ -204,6 +208,8 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) cost = 0 priority = MAX_KNOWLEDGE_PRIORITY - 2 // Not as important as making a heart or sacrificing, but important enough. route = PATH_START + research_tree_icon_path = 'icons/obj/clothing/neck.dmi' + research_tree_icon_state = "eldritch_necklace" /datum/heretic_knowledge/spell/cloak_of_shadows name = "Cloak of Shadow" @@ -238,6 +244,8 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) route = PATH_START priority = MAX_KNOWLEDGE_PRIORITY - 3 // Least priority out of the starting knowledges, as it's an optional boon. var/static/list/non_mob_bindings = typecacheof(list(/obj/item/stack/sheet/leather, /obj/item/stack/sheet/animalhide)) + research_tree_icon_path = 'icons/obj/antags/eldritch.dmi' + research_tree_icon_state = "book" /datum/heretic_knowledge/codex_cicatrix/parse_required_item(atom/item_path, number_of_things) if(item_path == /obj/item/pen) @@ -300,21 +308,30 @@ GLOBAL_LIST_INIT(heretic_start_knowledge, initialize_starting_knowledge()) gain_text = "Under the soft glow of unreason there is a beast that stalks the night. I shall bring it forth and let it enter my presence. It will feast upon my amibitions and leave knowledge in its wake." route = PATH_START required_atoms = list() + research_tree_icon_path = 'icons/mob/actions/actions_animal.dmi' + research_tree_icon_state = "god_transmit" /datum/heretic_knowledge/feast_of_owls/can_be_invoked(datum/antagonist/heretic/invoker) return !invoker.feast_of_owls /datum/heretic_knowledge/feast_of_owls/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + //amount of research points granted + var/reward = 5 var/alert = tgui_alert(user,"Do you really want to forsake your ascension? This action cannot be reverted.", "Feast of Owls", list("Yes I'm sure", "No"), 30 SECONDS) if( alert != "Yes I'm sure") return FALSE - user.set_temp_blindness(5 SECONDS) - user.AdjustParalyzed(5 SECONDS) + user.set_temp_blindness(reward SECONDS) + user.AdjustParalyzed(reward SECONDS) + user.playsound_local(get_turf(user), 'sound/ambience/antag/heretic/heretic_gain_intense.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user) - for(var/i in 0 to 4) + for(var/i in 1 to reward) user.emote("scream") playsound(loc, 'sound/items/eatfood.ogg', 100, TRUE) heretic_datum.knowledge_points++ + to_chat(user, span_danger("You feel something invisible tearing away at your very essence!")) + user.do_jitter_animation() sleep(1 SECONDS) - to_chat(user,span_danger("You feel different...")) heretic_datum.feast_of_owls = TRUE + to_chat(user, span_danger(span_big("Your ambition is ravaged, but something powerful remains in its wake..."))) + var/drain_message = pick(strings(HERETIC_INFLUENCE_FILE, "drain_message")) + to_chat(user, span_hypnophrase(span_big("[drain_message]"))) diff --git a/code/modules/antagonists/heretic/knowledge/void_lore.dm b/code/modules/antagonists/heretic/knowledge/void_lore.dm index 56134db680163..0d8dbbec36f3d 100644 --- a/code/modules/antagonists/heretic/knowledge/void_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/void_lore.dm @@ -1,5 +1,7 @@ /** * # The path of VOID. + * Spell names are in this language: PALI + * Both are related: Pali-Buddhism-Nothingness-Void * * Goes as follows: * @@ -37,6 +39,8 @@ required_atoms = list(/obj/item/knife = 1) result_atoms = list(/obj/item/melee/sickly_blade/void) route = PATH_VOID + research_tree_icon_path = 'icons/obj/weapons/khopesh.dmi' + research_tree_icon_state = "void_blade" /datum/heretic_knowledge/limited_amount/starting/base_void/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) if(!isopenturf(loc)) @@ -58,6 +62,9 @@ next_knowledge = list(/datum/heretic_knowledge/cold_snap) cost = 1 route = PATH_VOID + depth = 3 + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "grasp_void" /datum/heretic_knowledge/void_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) @@ -88,6 +95,9 @@ ) cost = 1 route = PATH_VOID + research_tree_icon_path = 'icons/effects/effects.dmi' + research_tree_icon_state = "the_freezer" + depth = 4 /datum/heretic_knowledge/cold_snap/on_gain(mob/user, datum/antagonist/heretic/our_heretic) user.add_traits(list(TRAIT_NOBREATH, TRAIT_RESISTCOLD), type) @@ -119,6 +129,7 @@ spell_to_add = /datum/action/cooldown/spell/cone/staggered/cone_of_cold/void cost = 1 route = PATH_VOID + depth = 7 /datum/heretic_knowledge/spell/void_phase name = "Void Phase" @@ -135,6 +146,8 @@ spell_to_add = /datum/action/cooldown/spell/pointed/void_phase cost = 1 route = PATH_VOID + depth = 8 + research_tree_icon_frame = 7 /datum/heretic_knowledge/blade_upgrade/void name = "Seeking Blade" @@ -142,6 +155,8 @@ gain_text = "Мимолетные воспоминания, мимолетные ноги. Я отмечаю свой путь застывшей кровью на снегу. Покрытый и забытый." next_knowledge = list(/datum/heretic_knowledge/spell/void_pull) route = PATH_VOID + research_tree_icon_path = 'icons/ui_icons/antags/heretic/knowledge.dmi' + research_tree_icon_state = "blade_upgrade_void" /datum/heretic_knowledge/blade_upgrade/void/do_ranged_effects(mob/living/user, mob/living/target, obj/item/melee/sickly_blade/blade) if(!target.has_status_effect(/datum/status_effect/eldritch)) @@ -168,6 +183,8 @@ spell_to_add = /datum/action/cooldown/spell/aoe/void_pull cost = 1 route = PATH_VOID + depth = 10 + research_tree_icon_frame = 6 /datum/heretic_knowledge/ultimate/void_final name = "Waltz at the End of Time" @@ -180,6 +197,7 @@ Аристократ стоит передо мной, призывая. Мы будем играть вальс под шепот умирающей реальности, \ пока мир разрушается на наших глазах. Пустота вернет все в ничто, УЗРИТЕ МОЕ ВОЗНЕСЕНИЕ!" route = PATH_VOID + ascension_achievement = /datum/award/achievement/misc/void_ascension ///soundloop for the void theme var/datum/looping_sound/void_loop/sound_loop ///Reference to the ongoing voidstrom that surrounds the heretic @@ -203,9 +221,8 @@ text = "[generate_heretic_text()] Дворянин пустоты [user.real_name] прибыл, танцуя Вальс, уничтожающий миры! [generate_heretic_text()]", title = "[generate_heretic_text()]", sound = 'sound/ambience/antag/heretic/ascend_void.ogg', - color_override = "pink", + color_override = "blue", ) - user.client?.give_award(/datum/award/achievement/misc/void_ascension, user) ADD_TRAIT(user, TRAIT_RESISTLOWPRESSURE, MAGIC_TRAIT) // Let's get this show on the road! diff --git a/code/modules/antagonists/heretic/magic/aggressive_spread.dm b/code/modules/antagonists/heretic/magic/aggressive_spread.dm index bd77b7804dba5..c7eb726b459d4 100644 --- a/code/modules/antagonists/heretic/magic/aggressive_spread.dm +++ b/code/modules/antagonists/heretic/magic/aggressive_spread.dm @@ -10,8 +10,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "A'GRSV SPR'D" - invocation_type = INVOCATION_WHISPER + invocation = "Agresiv'noe rasprostra-neniye!" + invocation_type = INVOCATION_SHOUT spell_requirements = NONE aoe_radius = 2 diff --git a/code/modules/antagonists/heretic/magic/apetravulnera.dm b/code/modules/antagonists/heretic/magic/apetravulnera.dm index b64d906c53332..8a8f2f931d85d 100644 --- a/code/modules/antagonists/heretic/magic/apetravulnera.dm +++ b/code/modules/antagonists/heretic/magic/apetravulnera.dm @@ -10,8 +10,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS - invocation = "AP'TRA VULN'RA!" - invocation_type = INVOCATION_WHISPER + invocation = "Shea' shen-eh!" + invocation_type = INVOCATION_SHOUT spell_requirements = NONE cast_range = 4 diff --git a/code/modules/antagonists/heretic/magic/ash_ascension.dm b/code/modules/antagonists/heretic/magic/ash_ascension.dm index 0a71f025ebbd6..bc7b67a0ce121 100644 --- a/code/modules/antagonists/heretic/magic/ash_ascension.dm +++ b/code/modules/antagonists/heretic/magic/ash_ascension.dm @@ -10,7 +10,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 70 SECONDS - invocation = "FL'MS" + invocation = "EID'R-ELDR!!!" invocation_type = INVOCATION_WHISPER spell_requirements = NONE @@ -72,8 +72,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "C'SC'DE" - invocation_type = INVOCATION_WHISPER + invocation = "ILLA-LASARA'FOSS!!!" + invocation_type = INVOCATION_SHOUT spell_requirements = NONE /// The radius the flames will go around the caster. @@ -112,7 +112,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 300 - invocation = "F'RE" + invocation = "Eld'sky!" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/ash_jaunt.dm b/code/modules/antagonists/heretic/magic/ash_jaunt.dm index b831665a84bae..7e6e03d392e66 100644 --- a/code/modules/antagonists/heretic/magic/ash_jaunt.dm +++ b/code/modules/antagonists/heretic/magic/ash_jaunt.dm @@ -10,7 +10,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 15 SECONDS - invocation = "ASH'N P'SSG'" + invocation = "Askgraar' goetur!" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/blood_cleave.dm b/code/modules/antagonists/heretic/magic/blood_cleave.dm index 41c415843b791..672dd23a98f71 100644 --- a/code/modules/antagonists/heretic/magic/blood_cleave.dm +++ b/code/modules/antagonists/heretic/magic/blood_cleave.dm @@ -10,7 +10,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS - invocation = "CL'VE!" + invocation = "Fer're!" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/blood_siphon.dm b/code/modules/antagonists/heretic/magic/blood_siphon.dm index 7b269730ec05f..ef0f485815a06 100644 --- a/code/modules/antagonists/heretic/magic/blood_siphon.dm +++ b/code/modules/antagonists/heretic/magic/blood_siphon.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 15 SECONDS - invocation = "FL'MS O'ET'RN'ITY." + invocation = "Sanguis suctio!" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/burglar_finesse.dm b/code/modules/antagonists/heretic/magic/burglar_finesse.dm index 74c753dc3b9a7..93bd5e354623e 100644 --- a/code/modules/antagonists/heretic/magic/burglar_finesse.dm +++ b/code/modules/antagonists/heretic/magic/burglar_finesse.dm @@ -9,7 +9,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 40 SECONDS - invocation = "Y'O'K!" + invocation = "Khenem" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm index f025e40ce6743..cb3a8db081c03 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_expansion.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_expansion.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS - invocation = "C'SM'S 'XP'ND" + invocation = "An'gar baltil!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/cosmic_runes.dm b/code/modules/antagonists/heretic/magic/cosmic_runes.dm index bf1d64c2ed13d..513d7d43af346 100644 --- a/code/modules/antagonists/heretic/magic/cosmic_runes.dm +++ b/code/modules/antagonists/heretic/magic/cosmic_runes.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 15 SECONDS - invocation = "ST'R R'N'" + invocation = "Is'zara-runen" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/eldritch_blind.dm b/code/modules/antagonists/heretic/magic/eldritch_blind.dm index 8df20503821b0..413ff4fe67810 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_blind.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_blind.dm @@ -5,7 +5,7 @@ overlay_icon_state = "bg_heretic_border" school = SCHOOL_FORBIDDEN - invocation = "E'E'S" + invocation = "Caecus" spell_requirements = NONE cast_range = 10 diff --git a/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm b/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm index b2f7a9886e49f..931642f96b1a9 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_emplosion.dm @@ -8,7 +8,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "E'P" + invocation = "Pulsus Energiae" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm b/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm index f17e10458122d..a3fbd64728869 100644 --- a/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm +++ b/code/modules/antagonists/heretic/magic/eldritch_shapeshift.dm @@ -7,7 +7,7 @@ overlay_icon_state = "bg_heretic_border" school = SCHOOL_FORBIDDEN - invocation = "SH'PE" + invocation = "Forma" invocation_type = INVOCATION_WHISPER spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/fire_blast.dm b/code/modules/antagonists/heretic/magic/fire_blast.dm index 3c57b8f6de5b8..98fe5bbdb3ea6 100644 --- a/code/modules/antagonists/heretic/magic/fire_blast.dm +++ b/code/modules/antagonists/heretic/magic/fire_blast.dm @@ -12,7 +12,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 45 SECONDS - invocation = "V'LC'N!" + invocation = "Eld'fjall!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE channel_time = 5 SECONDS diff --git a/code/modules/antagonists/heretic/magic/flesh_ascension.dm b/code/modules/antagonists/heretic/magic/flesh_ascension.dm index e287738fa2839..08e2f144066e9 100644 --- a/code/modules/antagonists/heretic/magic/flesh_ascension.dm +++ b/code/modules/antagonists/heretic/magic/flesh_ascension.dm @@ -9,7 +9,7 @@ school = SCHOOL_FORBIDDEN - invocation = "РЕАЛЬНОСТЬ РАЗРУШЬСЯ!" + invocation = "REALITAS EXSERPAT!!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/flesh_surgery.dm b/code/modules/antagonists/heretic/magic/flesh_surgery.dm index 26ad0a7886585..9b4c0f5279dd0 100644 --- a/code/modules/antagonists/heretic/magic/flesh_surgery.dm +++ b/code/modules/antagonists/heretic/magic/flesh_surgery.dm @@ -11,8 +11,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - invocation = "CL'M M'N!" // "CLAIM MINE", but also almost "KALI MA" - invocation_type = INVOCATION_SHOUT + invocation = "Carnis chirurgia" + invocation_type = INVOCATION_WHISPER spell_requirements = NONE hand_path = /obj/item/melee/touch_attack/flesh_surgery diff --git a/code/modules/antagonists/heretic/magic/furious_steel.dm b/code/modules/antagonists/heretic/magic/furious_steel.dm index 31af20d9126e9..64b15d65f9570 100644 --- a/code/modules/antagonists/heretic/magic/furious_steel.dm +++ b/code/modules/antagonists/heretic/magic/furious_steel.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 60 SECONDS - invocation = "F'LSH'NG S'LV'R!" + invocation = "Ham'sana-qasep!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/manse_link.dm b/code/modules/antagonists/heretic/magic/manse_link.dm index d9fe06f3fb4d0..fddb253dbbb42 100644 --- a/code/modules/antagonists/heretic/magic/manse_link.dm +++ b/code/modules/antagonists/heretic/magic/manse_link.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - invocation = "PI'RC' TH' M'ND." + invocation = "Diaperaste' to-myalo!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE antimagic_flags = MAGIC_RESISTANCE|MAGIC_RESISTANCE_MIND diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index 0105eee1de668..c464506cb3314 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -10,7 +10,7 @@ school = SCHOOL_EVOCATION cooldown_time = 10 SECONDS - invocation = "R'CH T'H TR'TH!" + invocation = "Ad verum per aspera!" invocation_type = INVOCATION_SHOUT // Mimes can cast it. Chaplains can cast it. Anyone can cast it, so long as they have a hand. spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION @@ -66,6 +66,7 @@ carbon_hit.adjust_timed_status_effect(4 SECONDS, /datum/status_effect/speech/slurring/heretic) carbon_hit.AdjustKnockdown(5 SECONDS) carbon_hit.adjustStaminaLoss(80) + carbon_hit.apply_status_effect(/datum/status_effect/next_shove_stuns) return TRUE diff --git a/code/modules/antagonists/heretic/magic/mind_gate.dm b/code/modules/antagonists/heretic/magic/mind_gate.dm index 2db7c989ff5d5..205e54d779bbe 100644 --- a/code/modules/antagonists/heretic/magic/mind_gate.dm +++ b/code/modules/antagonists/heretic/magic/mind_gate.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - invocation = "Op' 'oY 'Mi'd" + invocation = "Sha'ar ha-da'at" invocation_type = INVOCATION_WHISPER spell_requirements = NONE cast_range = 6 diff --git a/code/modules/antagonists/heretic/magic/moon_parade.dm b/code/modules/antagonists/heretic/magic/moon_parade.dm index b645f65bd4880..e0247bf9f47f0 100644 --- a/code/modules/antagonists/heretic/magic/moon_parade.dm +++ b/code/modules/antagonists/heretic/magic/moon_parade.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "L'N'R P'RAD" + invocation = "Tsiyun' levani!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/moon_ringleader.dm b/code/modules/antagonists/heretic/magic/moon_ringleader.dm index 7697a8774f132..77c75ff0c9e80 100644 --- a/code/modules/antagonists/heretic/magic/moon_ringleader.dm +++ b/code/modules/antagonists/heretic/magic/moon_ringleader.dm @@ -12,7 +12,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 1 MINUTES - invocation = "R''S 'E" + invocation = "Manahel-qomem!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm index e980612c367f9..4db700e7e478b 100644 --- a/code/modules/antagonists/heretic/magic/moon_smile.dm +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -12,7 +12,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - invocation = "Mo'N S'M'LE" + invocation = "Hiyuk-levana!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE cast_range = 6 diff --git a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm index a4df7d1da68a0..bac0fde3606d3 100644 --- a/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm +++ b/code/modules/antagonists/heretic/magic/nightwatcher_rebirth.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 1 MINUTES - invocation = "GL'RY T' TH' N'GHT'W'TCH'ER" + invocation = "Dyrth-a Vaktry'ggjandi" invocation_type = INVOCATION_WHISPER spell_requirements = SPELL_REQUIRES_HUMAN diff --git a/code/modules/antagonists/heretic/magic/realignment.dm b/code/modules/antagonists/heretic/magic/realignment.dm index 5c02d8ac312ce..5afabd2c8b7c3 100644 --- a/code/modules/antagonists/heretic/magic/realignment.dm +++ b/code/modules/antagonists/heretic/magic/realignment.dm @@ -14,8 +14,8 @@ cooldown_reduction_per_rank = -6 SECONDS // we're not a wizard spell but we use the levelling mechanic spell_max_level = 10 // we can get up to / over a minute duration cd time - invocation = "R'S'T." - invocation_type = INVOCATION_SHOUT + invocation = "Rasut" + invocation_type = INVOCATION_WHISPER spell_requirements = NONE /datum/action/cooldown/spell/realignment/is_valid_target(atom/cast_on) diff --git a/code/modules/antagonists/heretic/magic/rust_wave.dm b/code/modules/antagonists/heretic/magic/rust_wave.dm index 2a316e98d9730..714244f645f8d 100644 --- a/code/modules/antagonists/heretic/magic/rust_wave.dm +++ b/code/modules/antagonists/heretic/magic/rust_wave.dm @@ -13,8 +13,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "'NTR'P'C PL'M'" - invocation_type = INVOCATION_WHISPER + invocation = "Entro'pichniy-plim!" + invocation_type = INVOCATION_SHOUT spell_requirements = NONE cone_levels = 5 @@ -78,8 +78,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 35 SECONDS - invocation = "SPR'D TH' WO'D" - invocation_type = INVOCATION_WHISPER + invocation = "Diffunde' verbum!" + invocation_type = INVOCATION_SHOUT spell_requirements = NONE projectile_type = /obj/projectile/magic/aoe/rust_wave diff --git a/code/modules/antagonists/heretic/magic/star_blast.dm b/code/modules/antagonists/heretic/magic/star_blast.dm index 607ce3f52d84e..b98cdfc842cd7 100644 --- a/code/modules/antagonists/heretic/magic/star_blast.dm +++ b/code/modules/antagonists/heretic/magic/star_blast.dm @@ -10,7 +10,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 20 SECONDS - invocation = "R'T'T' ST'R!" + invocation = "Pi-rig is'zara!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/star_touch.dm b/code/modules/antagonists/heretic/magic/star_touch.dm index 1558c8a622975..58d52cbaf48c6 100644 --- a/code/modules/antagonists/heretic/magic/star_touch.dm +++ b/code/modules/antagonists/heretic/magic/star_touch.dm @@ -13,7 +13,7 @@ sound = 'sound/items/welder.ogg' school = SCHOOL_FORBIDDEN cooldown_time = 15 SECONDS - invocation = "ST'R 'N'RG'!" + invocation = "An'gar sig!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE antimagic_flags = MAGIC_RESISTANCE diff --git a/code/modules/antagonists/heretic/magic/void_cold_cone.dm b/code/modules/antagonists/heretic/magic/void_cold_cone.dm index d29f29d3d35f4..0daf3577f1aee 100644 --- a/code/modules/antagonists/heretic/magic/void_cold_cone.dm +++ b/code/modules/antagonists/heretic/magic/void_cold_cone.dm @@ -11,7 +11,7 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "FR'ZE!" + invocation = "Sunya'kop!" invocation_type = INVOCATION_SHOUT spell_requirements = NONE diff --git a/code/modules/antagonists/heretic/magic/void_phase.dm b/code/modules/antagonists/heretic/magic/void_phase.dm index 7588c82ceb925..39059d5d712b1 100644 --- a/code/modules/antagonists/heretic/magic/void_phase.dm +++ b/code/modules/antagonists/heretic/magic/void_phase.dm @@ -12,8 +12,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 30 SECONDS - invocation = "RE'L'TY PH'S'E." - invocation_type = INVOCATION_WHISPER + invocation = "Sunya'sthiti!" + invocation_type = INVOCATION_SHOUT spell_requirements = NONE cast_range = 9 diff --git a/code/modules/antagonists/heretic/magic/void_pull.dm b/code/modules/antagonists/heretic/magic/void_pull.dm index 233e78e1560f5..3d4409e8d49ee 100644 --- a/code/modules/antagonists/heretic/magic/void_pull.dm +++ b/code/modules/antagonists/heretic/magic/void_pull.dm @@ -11,8 +11,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 40 SECONDS - invocation = "BR'NG F'RTH TH'M T' M'." - invocation_type = INVOCATION_WHISPER + invocation = "Sunya'apamkti!" + invocation_type = INVOCATION_SHOUT spell_requirements = NONE aoe_radius = 7 diff --git a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm index bfe0fc1d203e4..87caca7496fd2 100644 --- a/code/modules/antagonists/heretic/magic/wave_of_desperation.dm +++ b/code/modules/antagonists/heretic/magic/wave_of_desperation.dm @@ -11,8 +11,8 @@ school = SCHOOL_FORBIDDEN cooldown_time = 5 MINUTES - invocation = "F'K 'FF." - invocation_type = INVOCATION_WHISPER + invocation = "Kher' Sekh-em waaef'k!" + invocation_type = INVOCATION_SHOUT spell_requirements = NONE aoe_radius = 3 diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm index 2d21e3858acc1..a0525c7489226 100644 --- a/code/modules/antagonists/heretic/structures/carving_knife.dm +++ b/code/modules/antagonists/heretic/structures/carving_knife.dm @@ -15,15 +15,7 @@ attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "rend") actions_types = list(/datum/action/item_action/rune_shatter) - embedding = list( - ignore_throwspeed_threshold = TRUE, - embed_chance = 75, - jostle_chance = 2, - jostle_pain_mult = 5, - pain_stam_pct = 0.4, - pain_mult = 3, - rip_time = 15, - ) + embed_type = /datum/embed_data/rune_carver /// Whether we're currently drawing a rune var/drawing = FALSE @@ -34,6 +26,15 @@ /// Turfs that you cannot draw carvings on var/static/list/blacklisted_turfs = typecacheof(list(/turf/open/space, /turf/open/openspace, /turf/open/lava)) +/datum/embed_data/rune_carver + ignore_throwspeed_threshold = TRUE + embed_chance = 75 + jostle_chance = 2 + jostle_pain_mult = 5 + pain_stam_pct = 0.4 + pain_mult = 3 + rip_time = 15 + /obj/item/melee/rune_carver/examine(mob/user) . = ..() if(!IS_HERETIC_OR_MONSTER(user) && !isobserver(user)) diff --git a/code/modules/antagonists/hypnotized/hypnotized.dm b/code/modules/antagonists/hypnotized/hypnotized.dm index 4f1f49aa3be7c..fc1e5d7d5ad24 100644 --- a/code/modules/antagonists/hypnotized/hypnotized.dm +++ b/code/modules/antagonists/hypnotized/hypnotized.dm @@ -1,6 +1,7 @@ /// Antag datum associated with the hypnosis brain trauma, used for displaying objectives and antag hud /datum/antagonist/hypnotized name = "\improper Hypnotized Victim" + stinger_sound = 'sound/ambience/antag/hypnotized.ogg' job_rank = ROLE_HYPNOTIZED roundend_category = "hypnotized victims" antag_hud_name = "brainwashed" @@ -10,7 +11,6 @@ show_name_in_check_antagonists = TRUE count_against_dynamic_roll_chance = FALSE - silent = TRUE //not actually silent, because greet will be called by the trauma anyway. /// Brain trauma associated with this antag datum var/datum/brain_trauma/hypnosis/trauma diff --git a/code/modules/antagonists/ninja/outfit.dm b/code/modules/antagonists/ninja/outfit.dm index f91f660a3e8b9..924943dce777b 100644 --- a/code/modules/antagonists/ninja/outfit.dm +++ b/code/modules/antagonists/ninja/outfit.dm @@ -1,7 +1,7 @@ /datum/outfit/ninja name = "Space Ninja" uniform = /obj/item/clothing/under/syndicate/ninja - glasses = /obj/item/clothing/glasses/night + glasses = /obj/item/clothing/glasses/night/colorless mask = /obj/item/clothing/mask/gas/ninja ears = /obj/item/radio/headset shoes = /obj/item/clothing/shoes/jackboots diff --git a/code/modules/antagonists/nukeop/datums/operative_lone.dm b/code/modules/antagonists/nukeop/datums/operative_lone.dm index d0bc718a781b0..3993c2d49a7f6 100644 --- a/code/modules/antagonists/nukeop/datums/operative_lone.dm +++ b/code/modules/antagonists/nukeop/datums/operative_lone.dm @@ -2,7 +2,7 @@ name = "Lone Operative" always_new_team = TRUE send_to_spawnpoint = FALSE //Handled by event - nukeop_outfit = /datum/outfit/syndicate/full + nukeop_outfit = /datum/outfit/syndicate/full/loneop preview_outfit = /datum/outfit/nuclear_operative preview_outfit_behind = null nuke_icon_state = null diff --git a/code/modules/antagonists/nukeop/outfits.dm b/code/modules/antagonists/nukeop/outfits.dm index 5cd89e6c842a9..8c2820d11be68 100644 --- a/code/modules/antagonists/nukeop/outfits.dm +++ b/code/modules/antagonists/nukeop/outfits.dm @@ -67,7 +67,7 @@ /datum/outfit/syndicate/full name = "Syndicate Operative - Full Kit" - glasses = /obj/item/clothing/glasses/night + glasses = /obj/item/clothing/glasses/night/colorless mask = /obj/item/clothing/mask/gas/syndicate back = /obj/item/mod/control/pre_equipped/nuclear r_pocket = /obj/item/tank/internals/emergency_oxygen/engi @@ -80,6 +80,10 @@ /obj/item/ammo_box/magazine/m12g = 3, ) +/datum/outfit/syndicate/full/loneop + name = "Syndicate Operative - Full Kit (Loneop)" + uplink_type = /obj/item/uplink/loneop + /datum/outfit/syndicate/full/plasmaman name = "Syndicate Operative - Full Kit (Plasmaman)" back = /obj/item/mod/control/pre_equipped/nuclear/plasmaman @@ -91,6 +95,10 @@ backpack_contents += /obj/item/clothing/head/helmet/space/plasmaman/syndie return ..() +/datum/outfit/syndicate/full/plasmaman/loneop + name = "Syndicate Operative - Full Kit (Loneop Plasmaman)" + uplink_type = /obj/item/uplink/loneop + /datum/outfit/syndicate/reinforcement name = "Syndicate Operative - Reinforcement" tc = 0 diff --git a/code/modules/antagonists/pirate/pirate_outfits.dm b/code/modules/antagonists/pirate/pirate_outfits.dm index aef7f1d9d4b92..72318fe4987ca 100644 --- a/code/modules/antagonists/pirate/pirate_outfits.dm +++ b/code/modules/antagonists/pirate/pirate_outfits.dm @@ -62,10 +62,12 @@ id_trim = /datum/id_trim/pirate/silverscale uniform = /obj/item/clothing/under/syndicate/sniper suit = /obj/item/clothing/suit/armor/vest/alt + back = /obj/item/storage/backpack/satchel glasses = /obj/item/clothing/glasses/monocle gloves = /obj/item/clothing/gloves/color/black head = /obj/item/clothing/head/collectable/tophat shoes = /obj/item/clothing/shoes/laceup + implants = list(/obj/item/implant/explosive) /datum/outfit/pirate/silverscale/captain name = "Silver Scale Captain" diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm index f050528bd3bc7..0bb3bcfe8ead7 100644 --- a/code/modules/art/paintings.dm +++ b/code/modules/art/paintings.dm @@ -265,7 +265,7 @@ return var/sniped_amount = painting_metadata.credit_value var/offer_amount = tgui_input_number(user, "How much do you want to offer?", "Patronage Amount", (painting_metadata.credit_value + 1), account.account_balance, painting_metadata.credit_value) - if(!offer_amount || QDELETED(user) || QDELETED(src) || !usr.can_perform_action(src, FORBID_TELEKINESIS_REACH)) + if(!offer_amount || QDELETED(user) || QDELETED(src) || !istype(loc, /obj/structure/sign/painting) || !user.can_perform_action(loc, FORBID_TELEKINESIS_REACH)) return if(sniped_amount != painting_metadata.credit_value) return diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index cfb87ce7cb3fe..db2732be83fad 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -676,20 +676,20 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) return FALSE /// Pumps gas from src to output_air. Amount depends on target_pressure -/datum/gas_mixture/proc/pump_gas_to(datum/gas_mixture/output_air, target_pressure, specific_gas = null) - var/temperature_delta = abs(temperature - output_air.temperature) +/datum/gas_mixture/proc/pump_gas_to(datum/gas_mixture/output_air, target_pressure, specific_gas = null, datum/gas_mixture/output_pipenet_air = null) + var/datum/gas_mixture/input_air = specific_gas ? remove_specific_ratio(specific_gas, 1) : src + var/temperature_delta = abs(input_air.temperature - output_air.temperature) var/datum/gas_mixture/removed - var/transfer_moles + + var/transfer_moles_output = input_air.gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) + var/transfer_moles_pipenet = output_pipenet_air?.volume ? input_air.gas_pressure_calculate(output_pipenet_air, target_pressure, temperature_delta <= 5) : 0 + var/transfer_moles = max(transfer_moles_output, transfer_moles_pipenet) if(specific_gas) - // This is necessary because the specific heat capacity of a gas might be different from our gasmix. - var/datum/gas_mixture/temporary = remove_specific_ratio(specific_gas, 1) - transfer_moles = temporary.gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) - removed = temporary.remove_specific(specific_gas, transfer_moles) - merge(temporary) + removed = input_air.remove_specific(specific_gas, transfer_moles) + merge(input_air) // Merge the remaining gas back to the input node else - transfer_moles = gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) - removed = remove(transfer_moles) + removed = input_air.remove(transfer_moles) if(!removed) return FALSE @@ -698,18 +698,20 @@ GLOBAL_LIST_INIT(gaslist_cache, init_gaslist_cache()) return removed /// Releases gas from src to output air. This means that it can not transfer air to gas mixture with higher pressure. -/datum/gas_mixture/proc/release_gas_to(datum/gas_mixture/output_air, target_pressure, rate=1) +/datum/gas_mixture/proc/release_gas_to(datum/gas_mixture/output_air, target_pressure, rate=1, datum/gas_mixture/output_pipenet_air = null) var/output_starting_pressure = output_air.return_pressure() var/input_starting_pressure = return_pressure() //Need at least 10 KPa difference to overcome friction in the mechanism - if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) + if(output_starting_pressure >= min(target_pressure, input_starting_pressure-10)) return FALSE //Can not have a pressure delta that would cause output_pressure > input_pressure target_pressure = output_starting_pressure + min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) var/temperature_delta = abs(temperature - output_air.temperature) - var/transfer_moles = gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) + var/transfer_moles_output = gas_pressure_calculate(output_air, target_pressure, temperature_delta <= 5) + var/transfer_moles_pipenet = output_pipenet_air?.volume ? gas_pressure_calculate(output_pipenet_air, target_pressure, temperature_delta <= 5) : 0 + var/transfer_moles = max(transfer_moles_output, transfer_moles_pipenet) //Actually transfer the gas var/datum/gas_mixture/removed = remove(transfer_moles * rate) diff --git a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm index 97278dc6a623b..282c523445bbc 100644 --- a/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm +++ b/code/modules/atmospherics/machinery/air_alarm/_air_alarm.dm @@ -145,6 +145,8 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) /obj/machinery/airalarm/proc/check_enviroment() var/turf/our_turf = connected_sensor ? get_turf(connected_sensor) : get_turf(src) var/datum/gas_mixture/environment = our_turf.return_air() + if(isnull(environment)) + return check_danger(our_turf, environment, environment.temperature) /obj/machinery/airalarm/proc/get_enviroment() @@ -554,6 +556,9 @@ GLOBAL_LIST_EMPTY_TYPED(air_alarms, /obj/machinery/airalarm) if((machine_stat & (NOPOWER|BROKEN)) || shorted) return + if(!environment) + return + var/old_danger = danger_level danger_level = AIR_ALARM_ALERT_NONE diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index fa8b833234586..29ea43905b8b7 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -666,7 +666,7 @@ SET_PLANE_EXPLICIT(cap_overlay, initial(plane), our_turf) cap_overlay.color = pipe_color - cap_overlay.layer = layer + cap_overlay.layer = initial(layer) cap_overlay.icon_state = "[bitfield]_[piping_layer]" cap_overlay.forceMove(our_turf) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm index 572e910d3fe08..1d7657dd35276 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/passive_gate.dm @@ -59,9 +59,11 @@ Passive gate is similar to the regular pump except: if(!on) return - var/datum/gas_mixture/air1 = airs[1] - var/datum/gas_mixture/air2 = airs[2] - if(air1.release_gas_to(air2, target_pressure)) + var/datum/gas_mixture/input_air = airs[1] + var/datum/gas_mixture/output_air = airs[2] + var/datum/gas_mixture/output_pipenet_air = parents[2].air + + if(input_air.release_gas_to(output_air, target_pressure, output_pipenet_air = output_pipenet_air)) update_parents() /obj/machinery/atmospherics/components/binary/passive_gate/relaymove(mob/living/user, direction) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm index 399feff12146f..ff9cc36d7cd61 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pressure_valve.dm @@ -54,11 +54,12 @@ if(!on || !is_operational) return - var/datum/gas_mixture/air1 = airs[1] - var/datum/gas_mixture/air2 = airs[2] + var/datum/gas_mixture/input_air = airs[1] + var/datum/gas_mixture/output_air = airs[2] + var/datum/gas_mixture/output_pipenet_air = parents[2].air - if(air1.return_pressure() > target_pressure) - if(air1.release_gas_to(air2, air1.return_pressure())) + if(input_air.return_pressure() > target_pressure) + if(input_air.release_gas_to(output_air, input_air.return_pressure(), output_pipenet_air = output_pipenet_air)) update_parents() is_gas_flowing = TRUE else diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index 63ba340f27ff4..1e68bf9ad691a 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -61,10 +61,11 @@ if(!on || !is_operational) return - var/datum/gas_mixture/air1 = airs[1] - var/datum/gas_mixture/air2 = airs[2] + var/datum/gas_mixture/input_air = airs[1] + var/datum/gas_mixture/output_air = airs[2] + var/datum/gas_mixture/output_pipenet_air = parents[2].air - if(air1.pump_gas_to(air2, target_pressure)) + if(input_air.pump_gas_to(output_air, target_pressure, output_pipenet_air = output_pipenet_air)) update_parents() /obj/machinery/atmospherics/components/binary/pump/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm index b5a3740245a31..879f6b7fab8d3 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/temperature_gate.dm @@ -68,19 +68,20 @@ if(!on || !is_operational) return - var/datum/gas_mixture/air1 = airs[1] - var/datum/gas_mixture/air2 = airs[2] + var/datum/gas_mixture/input_air = airs[1] + var/datum/gas_mixture/output_air = airs[2] + var/datum/gas_mixture/output_pipenet_air = parents[2].air if(!inverted) - if(air1.temperature < target_temperature) - if(air1.release_gas_to(air2, air1.return_pressure())) + if(input_air.temperature < target_temperature) + if(input_air.release_gas_to(output_air, input_air.return_pressure(), output_pipenet_air = output_pipenet_air)) update_parents() is_gas_flowing = TRUE else is_gas_flowing = FALSE else - if(air1.temperature > target_temperature) - if(air1.release_gas_to(air2, air1.return_pressure())) + if(input_air.temperature > target_temperature) + if(input_air.release_gas_to(output_air, input_air.return_pressure(), output_pipenet_air = output_pipenet_air)) update_parents() is_gas_flowing = TRUE else diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index b4e5d88d62c71..cd4e00b3f33a6 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -62,6 +62,7 @@ color = null SET_PLANE_IMPLICIT(src, showpipe ? GAME_PLANE : FLOOR_PLANE) + // Layer is handled in update_layer() if(!showpipe) return ..() @@ -327,7 +328,7 @@ connect_nodes() /obj/machinery/atmospherics/components/update_layer() - layer = initial(layer) + (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE + (GLOB.pipe_colors_ordered[pipe_color] * 0.001) + layer = (showpipe ? initial(layer) : ABOVE_OPEN_TURF_LAYER) + (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE + (GLOB.pipe_colors_ordered[pipe_color] * 0.001) /** * Handles air relocation to the pipenet/environment diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm index 6e0490e25efb3..95b548998a194 100644 --- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm +++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer_items.dm @@ -16,7 +16,7 @@ if(atmos_device.nob_crystal_inserted) to_chat(user, span_warning("[atmos_device] already has a hypernoblium crystal inserted in it!")) return ITEM_INTERACT_BLOCKING - atmos_device.nob_crystal_inserted = TRUE + atmos_device.insert_nob_crystal() to_chat(user, span_notice("You insert the [src] into [atmos_device].")) if(istype(worn_item)) diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm index a9fcaf93ec680..ee1e61428d196 100644 --- a/code/modules/atmospherics/machinery/components/tank.dm +++ b/code/modules/atmospherics/machinery/components/tank.dm @@ -363,6 +363,18 @@ /obj/machinery/atmospherics/components/tank/air name = "pressure tank (Air)" +/obj/machinery/atmospherics/components/tank/air/layer1 + piping_layer = 1 + +/obj/machinery/atmospherics/components/tank/air/layer2 + piping_layer = 2 + +/obj/machinery/atmospherics/components/tank/air/layer4 + piping_layer = 4 + +/obj/machinery/atmospherics/components/tank/air/layer5 + piping_layer = 5 + /obj/machinery/atmospherics/components/tank/air/Initialize(mapload) . = ..() fill_to_pressure(/datum/gas/oxygen, safety_margin = (O2STANDARD * 0.5)) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index 12a3c7971601b..8f90986baaa46 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -250,6 +250,18 @@ icon_state = "mixer_on-0_f" flipped = TRUE +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/layer1 + piping_layer = 1 + +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/layer2 + piping_layer = 2 + +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/layer4 + piping_layer = 4 + +/obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/layer5 + piping_layer = 5 + /obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped/inverse node1_concentration = O2STANDARD node2_concentration = N2STANDARD diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 2fe1a8e430fa1..619bf100a170f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -333,6 +333,18 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer1 + piping_layer = 1 + +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer2 + piping_layer = 2 + +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer4 + piping_layer = 4 + +/obj/machinery/atmospherics/components/unary/thermomachine/freezer/layer5 + piping_layer = 5 + /obj/machinery/atmospherics/components/unary/thermomachine/freezer/on on = TRUE icon_state = "thermo_base_1" @@ -352,6 +364,18 @@ /obj/machinery/atmospherics/components/unary/thermomachine/heater +/obj/machinery/atmospherics/components/unary/thermomachine/heater/layer1 + piping_layer = 1 + +/obj/machinery/atmospherics/components/unary/thermomachine/heater/layer2 + piping_layer = 2 + +/obj/machinery/atmospherics/components/unary/thermomachine/heater/layer4 + piping_layer = 4 + +/obj/machinery/atmospherics/components/unary/thermomachine/heater/layer5 + piping_layer = 5 + /obj/machinery/atmospherics/components/unary/thermomachine/heater/on on = TRUE icon_state = "thermo_base_1" diff --git a/code/modules/atmospherics/machinery/pipes/bridge_pipe.dm b/code/modules/atmospherics/machinery/pipes/bridge_pipe.dm index 472cb3ed2034a..4c1cd63016c92 100644 --- a/code/modules/atmospherics/machinery/pipes/bridge_pipe.dm +++ b/code/modules/atmospherics/machinery/pipes/bridge_pipe.dm @@ -5,6 +5,7 @@ name = "bridge pipe" desc = "A one meter section of regular pipe used to connect pipenets over pipes." + layer = HIGH_PIPE_LAYER dir = SOUTH initialize_directions = NORTH | SOUTH pipe_flags = PIPING_CARDINAL_AUTONORMALIZE | PIPING_BRIDGE @@ -28,4 +29,5 @@ PIPING_LAYER_DOUBLE_SHIFT(center, piping_layer) . += center - layer = HIGH_PIPE_LAYER //to stay above all sorts of pipes +/obj/machinery/atmospherics/pipe/bridge_pipe/update_layer() + layer = (HAS_TRAIT(src, TRAIT_UNDERFLOOR) ? ABOVE_OPEN_TURF_LAYER + 1 : initial(layer)) diff --git a/code/modules/atmospherics/machinery/pipes/layermanifold.dm b/code/modules/atmospherics/machinery/pipes/layermanifold.dm index 730e193671dbe..df919cbeccb1c 100644 --- a/code/modules/atmospherics/machinery/pipes/layermanifold.dm +++ b/code/modules/atmospherics/machinery/pipes/layermanifold.dm @@ -41,7 +41,7 @@ nodes = list() /obj/machinery/atmospherics/pipe/layer_manifold/update_layer() - layer = initial(layer) + (PIPING_LAYER_MAX * PIPING_LAYER_LCHANGE) //This is above everything else. + layer = (HAS_TRAIT(src, TRAIT_UNDERFLOOR) ? ABOVE_OPEN_TURF_LAYER : initial(layer)) + (PIPING_LAYER_MAX * PIPING_LAYER_LCHANGE) //This is above everything else. /obj/machinery/atmospherics/pipe/layer_manifold/update_overlays() . = ..() @@ -68,7 +68,8 @@ . += get_attached_image(get_dir(src, machine_check), machine_check.piping_layer, machine_check.pipe_color) /obj/machinery/atmospherics/pipe/layer_manifold/proc/get_attached_image(p_dir, p_layer, p_color) - var/mutable_appearance/muta = mutable_appearance('icons/obj/pipes_n_cables/layer_manifold_underlays.dmi', "intact_[p_dir]_[p_layer]", layer = layer - 0.01, appearance_flags = RESET_COLOR) + var/working_layer = FLOAT_LAYER - HAS_TRAIT(src, TRAIT_UNDERFLOOR) ? 1 : 0.01 + var/mutable_appearance/muta = mutable_appearance('icons/obj/pipes_n_cables/layer_manifold_underlays.dmi', "intact_[p_dir]_[p_layer]", layer = working_layer, appearance_flags = RESET_COLOR) muta.color = p_color return muta diff --git a/code/modules/atmospherics/machinery/pipes/mapping.dm b/code/modules/atmospherics/machinery/pipes/mapping.dm index 3ba647ace8ab4..3615147e4d1bf 100644 --- a/code/modules/atmospherics/machinery/pipes/mapping.dm +++ b/code/modules/atmospherics/machinery/pipes/mapping.dm @@ -1,6 +1,22 @@ //Colored pipes, use these for mapping +#define HELPER_PIPING_LAYER(Fulltype) \ + ##Fulltype/layer1 { \ + piping_layer = 1; \ + } \ + ##Fulltype/layer2 { \ + piping_layer = 2; \ + } \ + ##Fulltype/layer4 { \ + piping_layer = 4; \ + } \ + ##Fulltype/layer5 { \ + piping_layer = 5; \ + } + #define HELPER_PARTIAL(Fulltype, Iconbase, Color) \ + HELPER_PIPING_LAYER(Fulltype/visible) \ + HELPER_PIPING_LAYER(Fulltype/hidden) \ ##Fulltype { \ pipe_color = Color; \ color = Color; \ @@ -10,38 +26,30 @@ layer = GAS_PIPE_VISIBLE_LAYER; \ } \ ##Fulltype/visible/layer2 { \ - piping_layer = 2; \ icon_state = Iconbase + "-2"; \ } \ ##Fulltype/visible/layer4 { \ - piping_layer = 4; \ icon_state = Iconbase + "-4"; \ } \ ##Fulltype/visible/layer1 { \ - piping_layer = 1; \ icon_state = Iconbase + "-1"; \ } \ ##Fulltype/visible/layer5 { \ - piping_layer = 5; \ icon_state = Iconbase + "-5"; \ } \ ##Fulltype/hidden { \ hide = TRUE; \ } \ ##Fulltype/hidden/layer2 { \ - piping_layer = 2; \ icon_state = Iconbase + "-2"; \ } \ ##Fulltype/hidden/layer4 { \ - piping_layer = 4; \ icon_state = Iconbase + "-4"; \ } \ ##Fulltype/hidden/layer1 { \ - piping_layer = 1; \ icon_state = Iconbase + "-1"; \ } \ ##Fulltype/hidden/layer5 { \ - piping_layer = 5; \ icon_state = Iconbase + "-5"; \ } @@ -89,3 +97,4 @@ HELPER_NAMED(supply, "air supply pipe", COLOR_BLUE) #undef HELPER #undef HELPER_PARTIAL_NAMED #undef HELPER_PARTIAL +#undef HELPER_PIPING_LAYER diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 40258db903ff0..230edc9a897f0 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -139,4 +139,4 @@ current_node.update_icon() /obj/machinery/atmospherics/pipe/update_layer() - layer = initial(layer) + (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE + (GLOB.pipe_colors_ordered[pipe_color] * 0.0001) + layer = (HAS_TRAIT(src, TRAIT_UNDERFLOOR) ? ABOVE_OPEN_TURF_LAYER : initial(layer)) + (piping_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_LCHANGE + (GLOB.pipe_colors_ordered[pipe_color] * 0.0001) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index c3dae6241620d..af13be0bbbf9b 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -101,6 +101,8 @@ /obj/machinery/portable_atmospherics/canister/examine(user) . = ..() + if(atom_integrity < max_integrity) + . += span_notice("Integrity compromised, repair hull with a welding tool.") . += span_notice("A sticker on its side says MAX SAFE PRESSURE: [siunit_pressure(initial(pressure_limit), 0)]; MAX SAFE TEMPERATURE: [siunit(temp_limit, "K", 0)].") . += span_notice("The hull is welded together and can be cut apart.") if(internal_cell) @@ -109,8 +111,6 @@ . += span_notice("Warning, no cell installed, use a screwdriver to open the hatch and insert one.") if(panel_open) . += span_notice("Hatch open, close it with a screwdriver.") - if(integrity_failure) - . += span_notice("Integrity compromised, repair hull with a welding tool.") // Please keep the canister types sorted // Basic canister per gas below here diff --git a/code/modules/atmospherics/machinery/portable/pipe_scrubber.dm b/code/modules/atmospherics/machinery/portable/pipe_scrubber.dm new file mode 100644 index 0000000000000..cde38f216ad70 --- /dev/null +++ b/code/modules/atmospherics/machinery/portable/pipe_scrubber.dm @@ -0,0 +1,167 @@ +/obj/machinery/portable_atmospherics/pipe_scrubber + name = "pipe scrubber" + desc = "A machine for cleaning out pipes of lingering gases. It is a huge tank with a pump attached to it." + icon_state = "pipe_scrubber" + density = TRUE + max_integrity = 250 + volume = 200 + ///The internal air tank obj of the mech + var/obj/machinery/portable_atmospherics/canister/internal_tank + ///Is the machine on? + var/on = FALSE + ///What direction is the machine pumping to (into scrubber or out to the port)? + var/direction = PUMP_IN + ///the rate the machine will scrub air + var/volume_rate = 1000 + ///List of gases that can be scrubbed + var/list/scrubbing = list( + /datum/gas/plasma, + /datum/gas/carbon_dioxide, + /datum/gas/nitrous_oxide, + /datum/gas/bz, + /datum/gas/nitrium, + /datum/gas/tritium, + /datum/gas/hypernoblium, + /datum/gas/water_vapor, + /datum/gas/freon, + /datum/gas/hydrogen, + /datum/gas/healium, + /datum/gas/proto_nitrate, + /datum/gas/zauker, + /datum/gas/halon, + ) + +/obj/machinery/portable_atmospherics/pipe_scrubber/Initialize(mapload) + . = ..() + internal_tank = new(src) + RegisterSignal(internal_tank, COMSIG_ATOM_BREAK, PROC_REF(deconstruct)) + RegisterSignal(internal_tank, COMSIG_QDELETING, PROC_REF(deconstruct)) + +/obj/machinery/portable_atmospherics/pipe_scrubber/atom_deconstruct(disassembled) + . = ..() + var/turf/my_turf = get_turf(src) + my_turf.assume_air(air_contents) + my_turf.assume_air(internal_tank.air_contents) + SSair.stop_processing_machine(internal_tank) + qdel(internal_tank) + +/obj/machinery/portable_atmospherics/pipe_scrubber/return_analyzable_air() + return list( + air_contents, + internal_tank.air_contents + ) + +/obj/machinery/portable_atmospherics/pipe_scrubber/welder_act(mob/living/user, obj/item/tool) + internal_tank.welder_act(user, tool) + return ..() + +/obj/machinery/portable_atmospherics/pipe_scrubber/click_alt(mob/living/user) + return CLICK_ACTION_BLOCKING + +/obj/machinery/portable_atmospherics/pipe_scrubber/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank) + return FALSE + +/obj/machinery/portable_atmospherics/pipe_scrubber/update_icon_state() + icon_state = on ? "[initial(icon_state)]_active" : initial(icon_state) + return ..() + +/obj/machinery/portable_atmospherics/pipe_scrubber/process_atmos() + if(take_atmos_damage()) + excited = TRUE + return ..() + if(!on) + return ..() + excited = TRUE + if(direction == PUMP_IN) + scrub(air_contents) + else + internal_tank.air_contents.pump_gas_to(air_contents, PUMP_MAX_PRESSURE) + return ..() + +/// Scrub gasses from own air_contents into internal_tank.air_contents +/obj/machinery/portable_atmospherics/pipe_scrubber/proc/scrub() + if(internal_tank.air_contents.return_pressure() >= PUMP_MAX_PRESSURE) + return + + var/transfer_moles = min(1, volume_rate / air_contents.volume) * air_contents.total_moles() + + var/datum/gas_mixture/filtering = air_contents.remove(transfer_moles) // Remove part of the mixture to filter. + var/datum/gas_mixture/filtered = new + if(!filtering) + return + + filtered.temperature = filtering.temperature + for(var/gas in filtering.gases & scrubbing) + filtered.add_gas(gas) + filtered.gases[gas][MOLES] = filtering.gases[gas][MOLES] // Shuffle the "bad" gasses to the filtered mixture. + filtering.gases[gas][MOLES] = 0 + filtering.garbage_collect() // Now that the gasses are set to 0, clean up the mixture. + + internal_tank.air_contents.merge(filtered) // Store filtered out gasses. + air_contents.merge(filtering) // Returned the cleaned gas. + +/obj/machinery/portable_atmospherics/pipe_scrubber/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "PipeScrubber", name) + ui.open() + +/obj/machinery/portable_atmospherics/pipe_scrubber/ui_data() + var/data = list() + data["on"] = on + data["direction"] = direction + data["connected"] = connected_port ? 1 : 0 + data["pressureTank"] = round(internal_tank.air_contents.return_pressure() ? internal_tank.air_contents.return_pressure() : 0) + data["pressurePump"] = round(air_contents.return_pressure() ? air_contents.return_pressure() : 0) + data["hasHypernobCrystal"] = nob_crystal_inserted + data["reactionSuppressionEnabled"] = suppress_reactions + + data["filterTypes"] = list() + for(var/gas_path in GLOB.meta_gas_info) + var/list/gas = GLOB.meta_gas_info[gas_path] + data["filterTypes"] += list(list("gasId" = gas[META_GAS_ID], "gasName" = gas[META_GAS_NAME], "enabled" = (gas_path in scrubbing))) + + return data + +/obj/machinery/portable_atmospherics/pipe_scrubber/ui_static_data() + var/list/data = list() + data["pressureLimitPump"] = pressure_limit + data["pressureLimitTank"] = internal_tank.pressure_limit + return data + +/obj/machinery/portable_atmospherics/pipe_scrubber/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("power") + on = !on + if(on) + SSair.start_processing_machine(src) + SSair.start_processing_machine(internal_tank) + . = TRUE + if("direction") + direction = !direction + . = TRUE + if("toggle_filter") + scrubbing ^= gas_id2path(params["val"]) + . = TRUE + if("reaction_suppression") + if(!internal_tank.nob_crystal_inserted) + message_admins("[ADMIN_LOOKUPFLW(usr)] tried to toggle reaction suppression on a pipe scrubber without a noblium crystal inside, possible href exploit attempt.") + return + internal_tank.suppress_reactions = !internal_tank.suppress_reactions + SSair.start_processing_machine(internal_tank) + message_admins("[ADMIN_LOOKUPFLW(usr)] turned [internal_tank.suppress_reactions ? "on" : "off"] the [internal_tank] reaction suppression.") + usr.investigate_log("turned [internal_tank.suppress_reactions ? "on" : "off"] the [internal_tank] reaction suppression.") + . = TRUE + update_appearance() + +/obj/machinery/portable_atmospherics/pipe_scrubber/insert_nob_crystal() + . = ..() + internal_tank.nob_crystal_inserted = TRUE + +/obj/machinery/portable_atmospherics/pipe_scrubber/proc/toggle_reaction_suppression() + var/new_value = !suppress_reactions + suppress_reactions = new_value + internal_tank.suppress_reactions = new_value diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 17f3a6fb439f7..9729c0871451a 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -212,8 +212,16 @@ * * new_tank: the tank we are trying to put in the machine */ /obj/machinery/portable_atmospherics/proc/replace_tank(mob/living/user, close_valve, obj/item/tank/new_tank) + if(machine_stat & BROKEN) + return FALSE if(!user) return FALSE + if(!user.transferItemToLoc(new_tank, src)) + return FALSE + + investigate_log("had its internal [holding] swapped with [new_tank] by [key_name(user)].", INVESTIGATE_ATMOS) + to_chat(user, span_notice("[holding ? "In one smooth motion you pop [holding] out of [src]'s connector and replace it with [new_tank]" : "You insert [new_tank] into [src]"].")) + if(holding && new_tank)//for when we are actually switching tanks user.put_in_hands(holding) UnregisterSignal(holding, COMSIG_QDELETING) @@ -238,17 +246,9 @@ return TRUE /obj/machinery/portable_atmospherics/attackby(obj/item/item, mob/user, params) - if(!istype(item, /obj/item/tank)) - return ..() - if(machine_stat & BROKEN) - return FALSE - var/obj/item/tank/insert_tank = item - if(!user.transferItemToLoc(insert_tank, src)) - return FALSE - to_chat(user, span_notice("[holding ? "In one smooth motion you pop [holding] out of [src]'s connector and replace it with [insert_tank]" : "You insert [insert_tank] into [src]"].")) - investigate_log("had its internal [holding] swapped with [insert_tank] by [key_name(user)].", INVESTIGATE_ATMOS) - replace_tank(user, FALSE, insert_tank) - update_appearance() + if(istype(item, /obj/item/tank)) + return replace_tank(user, FALSE, item) + return ..() /obj/machinery/portable_atmospherics/wrench_act(mob/living/user, obj/item/wrench) if(machine_stat & BROKEN) @@ -295,4 +295,8 @@ UnregisterSignal(holding, COMSIG_QDELETING) holding = null +/// Insert Hypernob crystal into the machine +/obj/machinery/portable_atmospherics/proc/insert_nob_crystal() + nob_crystal_inserted = TRUE + #undef PORTABLE_ATMOS_IGNORE_ATMOS_LIMIT diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 09c6c64709b9a..b292180683f88 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -1,16 +1,17 @@ /obj/machinery/portable_atmospherics/scrubber name = "portable air scrubber" + desc = "A portable variant of the station scrubbers, capable of filtering gas from the air around it or inserted tank. May also be wrenched into a port." icon_state = "scrubber" density = TRUE max_integrity = 250 - volume = 1000 + volume = 2000 ///Is the machine on? var/on = FALSE ///the rate the machine will scrub air - var/volume_rate = 1000 + var/volume_rate = 650 ///Multiplier with ONE_ATMOSPHERE, if the enviroment pressure is higher than that, the scrubber won't work - var/overpressure_m = 80 + var/overpressure_m = 100 ///Should the machine use overlay in update_overlays() when open/close? var/use_overlays = TRUE ///List of gases that can be scrubbed @@ -59,8 +60,15 @@ excited = TRUE - var/atom/target = holding || get_turf(src) - scrub(target.return_air()) + if(!isnull(holding)) + scrub(holding.return_air()) + return ..() + + var/turf/epicentre = get_turf(src) + if(isopenturf(epicentre)) + scrub(epicentre.return_air()) + for(var/turf/open/openturf as anything in epicentre.get_atmos_adjacent_turfs(alldir = TRUE)) + scrub(openturf.return_air()) return ..() /** @@ -68,28 +76,39 @@ * Arguments: * * mixture: the gas mixture to be scrubbed */ -/obj/machinery/portable_atmospherics/scrubber/proc/scrub(datum/gas_mixture/mixture) +/obj/machinery/portable_atmospherics/scrubber/proc/scrub(datum/gas_mixture/environment) if(air_contents.return_pressure() >= overpressure_m * ONE_ATMOSPHERE) return - var/transfer_moles = min(1, volume_rate / mixture.volume) * mixture.total_moles() + var/list/env_gases = environment.gases - var/datum/gas_mixture/filtering = mixture.remove(transfer_moles) // Remove part of the mixture to filter. - var/datum/gas_mixture/filtered = new - if(!filtering) - return + //contains all of the gas we're sucking out of the tile, gets put into our parent pipenet + var/datum/gas_mixture/filtered_out = new + var/list/filtered_gases = filtered_out.gases + filtered_out.temperature = environment.temperature - filtered.temperature = filtering.temperature - for(var/gas in filtering.gases & scrubbing) - filtered.add_gas(gas) - filtered.gases[gas][MOLES] = filtering.gases[gas][MOLES] // Shuffle the "bad" gasses to the filtered mixture. - filtering.gases[gas][MOLES] = 0 - filtering.garbage_collect() // Now that the gasses are set to 0, clean up the mixture. + //maximum percentage of the turfs gas we can filter + var/removal_ratio = min(1, volume_rate / environment.volume) - air_contents.merge(filtered) // Store filtered out gasses. - mixture.merge(filtering) // Returned the cleaned gas. - if(!holding) - air_update_turf(FALSE, FALSE) + var/total_moles_to_remove = 0 + for(var/gas in scrubbing & env_gases) + total_moles_to_remove += env_gases[gas][MOLES] + + if(total_moles_to_remove == 0)//sometimes this gets non gc'd values + environment.garbage_collect() + return FALSE + + for(var/gas in scrubbing & env_gases) + filtered_out.add_gas(gas) + var/transferred_moles = max(QUANTIZE(env_gases[gas][MOLES] * removal_ratio * (env_gases[gas][MOLES] / total_moles_to_remove)), min(MOLAR_ACCURACY*1000, env_gases[gas][MOLES])) + + filtered_gases[gas][MOLES] = transferred_moles + env_gases[gas][MOLES] -= transferred_moles + + environment.garbage_collect() + + //Remix the resulting gases + air_contents.merge(filtered_out) /obj/machinery/portable_atmospherics/scrubber/emp_act(severity) . = ..() diff --git a/code/modules/awaymissions/away_props.dm b/code/modules/awaymissions/away_props.dm index 22d9f532efcbd..6f6a25b47c8cd 100644 --- a/code/modules/awaymissions/away_props.dm +++ b/code/modules/awaymissions/away_props.dm @@ -56,6 +56,7 @@ name = "pit grate" icon = 'icons/obj/smooth_structures/lattice.dmi' icon_state = "lattice-255" + layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE anchored = TRUE obj_flags = CAN_BE_HIT | BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP @@ -95,6 +96,7 @@ talpha = 255 obj_flags |= BLOCK_Z_OUT_DOWN | BLOCK_Z_IN_UP SET_PLANE_IMPLICIT(src, ABOVE_LIGHTING_PLANE) //What matters it's one above openspace, so our animation is not dependant on what's there. Up to revision with 513 + layer = ABOVE_NORMAL_TURF_LAYER animate(src,alpha = talpha,time = 10) addtimer(CALLBACK(src, PROC_REF(reset_plane)), 1 SECONDS) if(hidden) @@ -106,6 +108,7 @@ /obj/structure/pitgrate/proc/reset_plane() SET_PLANE_IMPLICIT(src, FLOOR_PLANE) + layer = ABOVE_OPEN_TURF_LAYER /obj/structure/pitgrate/Destroy() if(hidden) diff --git a/code/modules/bitrunning/components/avatar_connection.dm b/code/modules/bitrunning/components/avatar_connection.dm index a92e8ef3d2e6e..51263c339319e 100644 --- a/code/modules/bitrunning/components/avatar_connection.dm +++ b/code/modules/bitrunning/components/avatar_connection.dm @@ -60,7 +60,7 @@ var/datum/action/avatar_domain_info/action = new(help_datum) action.Grant(avatar) - var/client/our_client = old_body.client + var/client/our_client = avatar.client var/alias = our_client?.prefs?.read_preference(/datum/preference/name/hacker_alias) || pick(GLOB.hacker_aliases) if(alias && avatar.real_name != alias) diff --git a/code/modules/bitrunning/components/bitrunning_points.dm b/code/modules/bitrunning/components/bitrunning_points.dm index 328a70679e653..ea8f63f76d8df 100644 --- a/code/modules/bitrunning/components/bitrunning_points.dm +++ b/code/modules/bitrunning/components/bitrunning_points.dm @@ -5,6 +5,7 @@ /// A special condition limits this from spawning a crate var/points_received = 0 + /datum/component/bitrunning_points/Initialize(datum/lazy_template/virtual_domain/domain) . = ..() if(!isturf(parent)) @@ -12,6 +13,7 @@ RegisterSignal(domain, COMSIG_BITRUNNER_GOAL_POINT, PROC_REF(on_add_points)) + /// Listens for points to be added which will eventually spawn a crate. /datum/component/bitrunning_points/proc/on_add_points(datum/source, points_to_add) SIGNAL_HANDLER @@ -23,12 +25,14 @@ reveal() + /// Spawns the crate with some effects /datum/component/bitrunning_points/proc/reveal() playsound(src, 'sound/magic/blink.ogg', 50, TRUE) var/turf/tile = parent - new /obj/structure/closet/crate/secure/bitrunning/encrypted(tile) + var/obj/structure/closet/crate/secure/bitrunning/encrypted/crate = new() + crate.forceMove(tile) // Triggers any on-move effects on that turf var/datum/effect_system/spark_spread/quantum/sparks = new(tile) sparks.set_up(number = 5, location = tile) diff --git a/code/modules/bitrunning/netpod/_netpod.dm b/code/modules/bitrunning/netpod/_netpod.dm new file mode 100644 index 0000000000000..56e8b0a1a57d1 --- /dev/null +++ b/code/modules/bitrunning/netpod/_netpod.dm @@ -0,0 +1,137 @@ +#define BASE_DISCONNECT_DAMAGE 40 + + +/obj/machinery/netpod + name = "netpod" + + base_icon_state = "netpod" + circuit = /obj/item/circuitboard/machine/netpod + desc = "Связущее звено с сетевым миром. Здесь есть множество кабелей для подключения себя к виртуальному домену." + icon = 'icons/obj/machines/bitrunning.dmi' + icon_state = "netpod" + max_integrity = 300 + obj_flags = BLOCKS_CONSTRUCTION + state_open = TRUE + interaction_flags_mouse_drop = NEED_HANDS | NEED_DEXTERITY + + /// Whether we have an ongoing connection + var/connected = FALSE + /// A player selected outfit by clicking the netpod + var/datum/outfit/netsuit = /datum/outfit/job/bitrunner + /// Holds this to see if it needs to generate a new one + var/datum/weakref/avatar_ref + /// The linked quantum server + var/datum/weakref/server_ref + /// The amount of brain damage done from force disconnects + var/disconnect_damage + /// Static list of outfits to select from + var/list/cached_outfits = list() + + +/obj/machinery/netpod/post_machine_initialize() + . = ..() + + disconnect_damage = BASE_DISCONNECT_DAMAGE + find_server() + + RegisterSignal(src, COMSIG_ATOM_TAKE_DAMAGE, PROC_REF(on_damage_taken)) + RegisterSignal(src, COMSIG_MACHINERY_POWER_LOST, PROC_REF(on_power_loss)) + RegisterSignals(src, list(COMSIG_QDELETING, COMSIG_MACHINERY_BROKEN),PROC_REF(on_broken)) + + register_context() + update_appearance() + + +/obj/machinery/netpod/Destroy() + . = ..() + + QDEL_LIST(cached_outfits) + + +/obj/machinery/netpod/examine(mob/user) + . = ..() + + if(isnull(server_ref?.resolve())) + . += span_infoplain("Оно ни к чему не подключено.") + . += span_infoplain("Нетподы должны быть построены на расстоянии 4-х тайлов от сервера.") + return + + if(!isobserver(user)) + . += span_infoplain("Перетащите себя на под, чтобы начать подключение.") + . += span_infoplain("Под имеет ограниченные возможности реанимации. Нахождение в поде может вылечить некоторые ранения.") + . += span_infoplain("Имеется система безопасности, оповещающая пользователя, если начнется вмешательство с подом.") + + if(isnull(occupant)) + . += span_infoplain("Сейчас внутри пусто.") + return + + . += span_infoplain("Сейчас внутри находится - [occupant].") + + if(isobserver(user)) + . += span_notice("Как наблюдатель, вы можете щелкнуть по этому нетподу, чтобы перейти к его аватару.") + return + + . += span_notice("Оно может быть насильно открыто монтировкой, но системы безопасности оповестят пользователя.") + + +/obj/machinery/netpod/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + + if(isnull(held_item)) + context[SCREENTIP_CONTEXT_LMB] = "Выбрать одежду" + return CONTEXTUAL_SCREENTIP_SET + + if(istype(held_item, /obj/item/crowbar) && occupant) + context[SCREENTIP_CONTEXT_LMB] = "Насильно открыть" + return CONTEXTUAL_SCREENTIP_SET + + +/obj/machinery/netpod/update_icon_state() + if(!is_operational) + icon_state = base_icon_state + return ..() + + if(state_open) + icon_state = base_icon_state + "_open_active" + return ..() + + if(panel_open) + icon_state = base_icon_state + "_panel" + return ..() + + icon_state = base_icon_state + "_closed" + if(occupant) + icon_state += "_active" + + return ..() + + +/obj/machinery/netpod/mouse_drop_receive(mob/target, mob/user, params) + var/mob/living/carbon/player = user + + if(!iscarbon(player) || !is_operational || !state_open || player.buckled) + return + + close_machine(target) + + +/obj/machinery/netpod/attack_hand(mob/living/user, list/modifiers) + . = ..() + if(!state_open && user == occupant) + container_resist_act(user) + + +/obj/machinery/netpod/attack_ghost(mob/dead/observer/our_observer) + var/our_target = avatar_ref?.resolve() + if(isnull(our_target) || !our_observer.orbit(our_target)) + return ..() + + +/// When the server is upgraded, drops brain damage a little +/obj/machinery/netpod/proc/on_server_upgraded(obj/machinery/quantum_server/source) + SIGNAL_HANDLER + + disconnect_damage = BASE_DISCONNECT_DAMAGE * (1 - source.servo_bonus) + + +#undef BASE_DISCONNECT_DAMAGE diff --git a/code/modules/bitrunning/netpod/container.dm b/code/modules/bitrunning/netpod/container.dm new file mode 100644 index 0000000000000..6165544544511 --- /dev/null +++ b/code/modules/bitrunning/netpod/container.dm @@ -0,0 +1,74 @@ +/obj/machinery/netpod/Exited(atom/movable/gone, direction) + . = ..() + if(!state_open && gone == occupant) + container_resist_act(gone) + + +/obj/machinery/netpod/relaymove(mob/living/user, direction) + if(!state_open) + container_resist_act(user) + + +/obj/machinery/netpod/container_resist_act(mob/living/user) + user.visible_message(span_notice("[occupant] emerges from [src]!"), + span_notice("You climb out of [src]!"), + span_notice("With a hiss, you hear a machine opening.")) + open_machine() + + +/obj/machinery/netpod/open_machine(drop = TRUE, density_to_set = FALSE) + playsound(src, 'sound/machines/tramopen.ogg', 60, TRUE, frequency = 65000) + flick("[base_icon_state]_opening", src) + SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_OPENED) + update_use_power(IDLE_POWER_USE) + + return ..() + + +/obj/machinery/netpod/close_machine(mob/user, density_to_set = TRUE) + if(!state_open || panel_open || !is_operational || !iscarbon(user)) + return + + playsound(src, 'sound/machines/tramclose.ogg', 60, TRUE, frequency = 65000) + flick("[base_icon_state]_closing", src) + ..() + + enter_matrix() + + +/obj/machinery/netpod/default_pry_open(obj/item/crowbar, mob/living/pryer) + if(isnull(occupant) || !iscarbon(occupant)) + if(!state_open) + if(panel_open) + return FALSE + open_machine() + else + shut_pod() + + return TRUE + + pryer.visible_message( + span_danger("[pryer] starts prying open [src]!"), + span_notice("You start to pry open [src]."), + span_notice("You hear loud prying on metal.") + ) + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) + + SEND_SIGNAL(src, COMSIG_BITRUNNER_CROWBAR_ALERT, pryer) + + if(do_after(pryer, 15 SECONDS, src)) + if(!state_open) + sever_connection() + open_machine() + + return TRUE + + +/// Closes the machine without shoving in an occupant +/obj/machinery/netpod/proc/shut_pod() + state_open = FALSE + playsound(src, 'sound/machines/tramclose.ogg', 60, TRUE, frequency = 65000) + flick("[base_icon_state]_closing", src) + set_density(TRUE) + + update_appearance() diff --git a/code/modules/bitrunning/netpod/outfitting.dm b/code/modules/bitrunning/netpod/outfitting.dm new file mode 100644 index 0000000000000..07f251541980f --- /dev/null +++ b/code/modules/bitrunning/netpod/outfitting.dm @@ -0,0 +1,30 @@ +/// Creates a list of outfit entries for the UI. +/obj/machinery/netpod/proc/make_outfit_collection(identifier, list/outfit_list) + var/list/collection = list( + "name" = identifier, + "outfits" = list() + ) + + for(var/datum/outfit/outfit as anything in outfit_list) + var/outfit_name = initial(outfit.name) + if(findtext(outfit_name, "(") != 0 || findtext(outfit_name, "-") != 0) // No special variants please + continue + + collection["outfits"] += list(list("path" = outfit, "name" = outfit_name)) + + return list(collection) + + +/// Resolves a path to an outfit. +/obj/machinery/netpod/proc/resolve_outfit(text) + var/path = text2path(text) + if(!ispath(path, /datum/outfit)) + return + + for(var/wardrobe in cached_outfits) + for(var/outfit in wardrobe["outfits"]) + if(path == outfit["path"]) + return path + + message_admins("[usr]:[usr.ckey] attempted to select an unavailable outfit from a netpod") + return diff --git a/code/modules/bitrunning/netpod/signals.dm b/code/modules/bitrunning/netpod/signals.dm new file mode 100644 index 0000000000000..8f8416aeb7b1b --- /dev/null +++ b/code/modules/bitrunning/netpod/signals.dm @@ -0,0 +1,64 @@ +/// Machine has been broken - handles signals and reverting sprites +/obj/machinery/netpod/proc/on_broken(datum/source) + SIGNAL_HANDLER + + sever_connection() + + +/// Checks the integrity, alerts occupants +/obj/machinery/netpod/proc/on_damage_taken(datum/source, damage_amount) + SIGNAL_HANDLER + + if(isnull(occupant) || !connected) + return + + var/total = max_integrity - damage_amount + var/integrity = (atom_integrity / total) * 100 + if(integrity > 50) + return + + SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_INTEGRITY) + + +/// Puts points on the current occupant's card account +/obj/machinery/netpod/proc/on_domain_complete(datum/source, atom/movable/crate, reward_points) + SIGNAL_HANDLER + + if(isnull(occupant) || !connected) + return + + var/mob/living/player = occupant + + var/datum/bank_account/account = player.get_bank_account() + if(isnull(account)) + return + + account.bitrunning_points += reward_points * 100 + + +/// 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/avatar = avatar_ref?.resolve() + if(isnull(avatar)) + return + + QDEL_NULL(avatar) + + +/// Boots out anyone in the machine && opens it +/obj/machinery/netpod/proc/on_power_loss(datum/source) + SIGNAL_HANDLER + + if(state_open) + return + + if(isnull(occupant) || !connected) + connected = FALSE + open_machine() + return + + sever_connection() + + diff --git a/code/modules/bitrunning/netpod/tools.dm b/code/modules/bitrunning/netpod/tools.dm new file mode 100644 index 0000000000000..0d31bdab86651 --- /dev/null +++ b/code/modules/bitrunning/netpod/tools.dm @@ -0,0 +1,22 @@ +/obj/machinery/netpod/crowbar_act(mob/living/user, obj/item/tool) + if(user.combat_mode) + attack_hand(user) + return ITEM_INTERACT_SUCCESS + + if(default_pry_open(tool, user) || default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS + + +/obj/machinery/netpod/screwdriver_act(mob/living/user, obj/item/tool) + if(occupant) + balloon_alert(user, "in use!") + return ITEM_INTERACT_SUCCESS + + if(state_open) + balloon_alert(user, "close first.") + return ITEM_INTERACT_SUCCESS + + if(default_deconstruction_screwdriver(user, "[base_icon_state]_panel", "[base_icon_state]_closed", tool)) + update_appearance() // sometimes icon doesnt properly update during flick() + ui_close(user) + return ITEM_INTERACT_SUCCESS diff --git a/code/modules/bitrunning/netpod/ui.dm b/code/modules/bitrunning/netpod/ui.dm new file mode 100644 index 0000000000000..93719fe64ebef --- /dev/null +++ b/code/modules/bitrunning/netpod/ui.dm @@ -0,0 +1,41 @@ +/obj/machinery/netpod/ui_interact(mob/user, datum/tgui/ui) + if(!is_operational || occupant) + return + + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "NetpodOutfits") + ui.set_autoupdate(FALSE) + ui.open() + + +/obj/machinery/netpod/ui_data() + var/list/data = list() + + data["netsuit"] = netsuit + return data + + +/obj/machinery/netpod/ui_static_data() + var/list/data = list() + + if(!length(cached_outfits)) + cached_outfits += make_outfit_collection("Jobs", subtypesof(/datum/outfit/job)) + + data["collections"] = cached_outfits + + return data + + +/obj/machinery/netpod/ui_act(action, params) + . = ..() + if(.) + return TRUE + switch(action) + if("select_outfit") + var/datum/outfit/new_suit = resolve_outfit(params["outfit"]) + if(new_suit) + netsuit = new_suit + return TRUE + + return FALSE diff --git a/code/modules/bitrunning/netpod/utils.dm b/code/modules/bitrunning/netpod/utils.dm new file mode 100644 index 0000000000000..73040b86b4c6b --- /dev/null +++ b/code/modules/bitrunning/netpod/utils.dm @@ -0,0 +1,144 @@ +/// Puts the occupant in netpod stasis, basically short-circuiting environmental conditions +/obj/machinery/netpod/proc/add_healing(mob/living/target) + if(target != occupant) + return + + target.AddComponent(/datum/component/netpod_healing, pod = src) + target.playsound_local(src, 'sound/effects/submerge.ogg', 20, vary = TRUE) + target.extinguish_mob() + update_use_power(ACTIVE_POWER_USE) + + +/// Disconnects the occupant after a certain time so they aren't just hibernating in netpod stasis. A balance change +/obj/machinery/netpod/proc/auto_disconnect() + if(isnull(occupant) || state_open || connected) + return + + var/mob/player = occupant + player.playsound_local(src, 'sound/effects/splash.ogg', 60, TRUE) + to_chat(player, span_notice("The machine disconnects itself and begins to drain.")) + open_machine() + + +/// Handles occupant post-disconnection effects like damage, sounds, etc +/obj/machinery/netpod/proc/disconnect_occupant(cause_damage = FALSE) + connected = FALSE + + var/mob/living/mob_occupant = occupant + if(isnull(occupant) || mob_occupant.stat == DEAD) + open_machine() + return + + mob_occupant.playsound_local(src, 'sound/magic/blink.ogg', 25, TRUE) + mob_occupant.set_static_vision(2 SECONDS) + mob_occupant.set_temp_blindness(1 SECONDS) + mob_occupant.Paralyze(2 SECONDS) + + if(!is_operational) + open_machine() + return + + var/heal_time = 1 + if(mob_occupant.health < mob_occupant.maxHealth) + heal_time = (mob_occupant.stat + 2) * 5 + addtimer(CALLBACK(src, PROC_REF(auto_disconnect)), heal_time SECONDS, TIMER_UNIQUE|TIMER_STOPPABLE|TIMER_DELETE_ME) + + if(!cause_damage) + return + + mob_occupant.flash_act(override_blindness_check = TRUE, visual = TRUE) + mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, disconnect_damage) + INVOKE_ASYNC(mob_occupant, TYPE_PROC_REF(/mob/living, emote), "scream") + to_chat(mob_occupant, span_danger("You've been forcefully disconnected from your avatar! Your thoughts feel scrambled!")) + + +/** + * ### Enter Matrix + * Finds any current avatars from this chair - or generates a new one + * + * New avatars cost 1 attempt, and this will eject if there's none left + * + * Connects the mind to the avatar if everything is ok + */ +/obj/machinery/netpod/proc/enter_matrix() + var/mob/living/carbon/human/neo = occupant + if(!ishuman(neo) || neo.stat == DEAD || isnull(neo.mind)) + balloon_alert(neo, "неверный пользователь.") + return + + var/obj/machinery/quantum_server/server = find_server() + if(isnull(server)) + balloon_alert(neo, "нет подключения к серверу!") + return + + var/datum/lazy_template/virtual_domain/generated_domain = server.generated_domain + if(isnull(generated_domain) || !server.is_ready) + balloon_alert(neo, "ничего не загружено!!") + return + + var/mob/living/carbon/current_avatar = avatar_ref?.resolve() + if(isnull(current_avatar) || current_avatar.stat != CONSCIOUS) // We need a viable avatar + current_avatar = server.start_new_connection(neo, netsuit) + if(isnull(current_avatar)) + balloon_alert(neo, "кончилась пропускная способность!") + return + + neo.set_static_vision(2 SECONDS) + add_healing(occupant) + + if(!validate_entry(neo, current_avatar)) + open_machine() + return + + current_avatar.AddComponent( \ + /datum/component/avatar_connection, \ + old_mind = neo.mind, \ + old_body = neo, \ + server = server, \ + pod = src, \ + help_text = generated_domain.help_text, \ + ) + + connected = TRUE + + +/// Finds a server and sets the server_ref +/obj/machinery/netpod/proc/find_server() + var/obj/machinery/quantum_server/server = server_ref?.resolve() + if(server) + return server + + server = locate(/obj/machinery/quantum_server) in oview(4, src) + if(isnull(server)) + return + + server_ref = WEAKREF(server) + RegisterSignal(server, COMSIG_MACHINERY_REFRESH_PARTS, 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 + + +/// Severs the connection with the current avatar +/obj/machinery/netpod/proc/sever_connection() + if(isnull(occupant) || !connected) + return + + SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_SEVER) + + +/// Checks for cases to eject/fail connecting an avatar +/obj/machinery/netpod/proc/validate_entry(mob/living/neo, mob/living/avatar) + if(!do_after(neo, 2 SECONDS, src)) + return FALSE + + // Very invalid + if(QDELETED(neo) || QDELETED(avatar) || QDELETED(src) || !is_operational) + return FALSE + + // Invalid + if(occupant != neo || isnull(neo.mind) || neo.stat > SOFT_CRIT || avatar.stat == DEAD) + return FALSE + + return TRUE diff --git a/code/modules/bitrunning/objects/landmarks.dm b/code/modules/bitrunning/objects/landmarks.dm index 3b38493edfffa..ea55b96979edd 100644 --- a/code/modules/bitrunning/objects/landmarks.dm +++ b/code/modules/bitrunning/objects/landmarks.dm @@ -12,6 +12,11 @@ name = "Bitrunning hololadder spawn" icon_state = "hololadder" +/// A permanent exit for the domain +/obj/effect/landmark/bitrunning/permanent_exit + name = "Bitrunning permanent exit" + icon_state = "perm_exit" + /// Where the crates need to be taken /obj/effect/landmark/bitrunning/cache_goal_turf name = "Bitrunning goal turf" diff --git a/code/modules/bitrunning/objects/netpod.dm b/code/modules/bitrunning/objects/netpod.dm deleted file mode 100644 index 27b43748d465f..0000000000000 --- a/code/modules/bitrunning/objects/netpod.dm +++ /dev/null @@ -1,491 +0,0 @@ -#define BASE_DISCONNECT_DAMAGE 40 - -/obj/machinery/netpod - name = "netpod" - - base_icon_state = "netpod" - circuit = /obj/item/circuitboard/machine/netpod - desc = "Связущее звено с сетевым миром. Здесь есть множество кабелей для подключения себя к виртуальному домену." - icon = 'icons/obj/machines/bitrunning.dmi' - icon_state = "netpod" - max_integrity = 300 - obj_flags = BLOCKS_CONSTRUCTION - state_open = TRUE - interaction_flags_mouse_drop = NEED_HANDS | NEED_DEXTERITY - - /// Whether we have an ongoing connection - var/connected = FALSE - /// A player selected outfit by clicking the netpod - var/datum/outfit/netsuit = /datum/outfit/job/bitrunner - /// Holds this to see if it needs to generate a new one - var/datum/weakref/avatar_ref - /// The linked quantum server - var/datum/weakref/server_ref - /// The amount of brain damage done from force disconnects - var/disconnect_damage - /// Static list of outfits to select from - var/list/cached_outfits = list() - -/obj/machinery/netpod/post_machine_initialize() - . = ..() - - disconnect_damage = BASE_DISCONNECT_DAMAGE - find_server() - - RegisterSignal(src, COMSIG_ATOM_TAKE_DAMAGE, PROC_REF(on_damage_taken)) - RegisterSignal(src, COMSIG_MACHINERY_POWER_LOST, PROC_REF(on_power_loss)) - RegisterSignals(src, list(COMSIG_QDELETING, COMSIG_MACHINERY_BROKEN),PROC_REF(on_broken)) - - register_context() - update_appearance() - -/obj/machinery/netpod/Destroy() - . = ..() - - QDEL_LIST(cached_outfits) - -/obj/machinery/netpod/examine(mob/user) - . = ..() - - if(isnull(server_ref?.resolve())) - . += span_infoplain("Оно ни к чему не подключено.") - . += span_infoplain("Нетподы должны быть построены на расстоянии 4-х тайлов от сервера.") - return - - if(!isobserver(user)) - . += span_infoplain("Перетащите себя на под, чтобы начать подключение.") - . += span_infoplain("Под имеет ограниченные возможности реанимации. Нахождение в поде может вылечить некоторые ранения.") - . += span_infoplain("Имеется система безопасности, оповещающая пользователя, если начнется вмешательство с подом.") - - if(isnull(occupant)) - . += span_infoplain("Сейчас внутри пусто.") - return - - . += span_infoplain("Сейчас внутри находится - [occupant].") - - if(isobserver(user)) - . += span_notice("Как наблюдатель, вы можете щелкнуть по этому нетподу, чтобы перейти к его аватару.") - return - - . += span_notice("Сейчас внутри находится - [occupant].") - . += span_notice("Оно может быть насильно открыто монтировкой, но системы безопасности оповестят пользователя.") - - - -/obj/machinery/netpod/add_context(atom/source, list/context, obj/item/held_item, mob/user) - . = ..() - - if(isnull(held_item)) - context[SCREENTIP_CONTEXT_LMB] = "Выбрать одежду" - return CONTEXTUAL_SCREENTIP_SET - - if(istype(held_item, /obj/item/crowbar) && occupant) - context[SCREENTIP_CONTEXT_LMB] = "Насильно открыть" - return CONTEXTUAL_SCREENTIP_SET - - -/obj/machinery/netpod/update_icon_state() - if(!is_operational) - icon_state = base_icon_state - return ..() - - if(state_open) - icon_state = base_icon_state + "_open_active" - return ..() - - if(panel_open) - icon_state = base_icon_state + "_panel" - return ..() - - icon_state = base_icon_state + "_closed" - if(occupant) - icon_state += "_active" - - return ..() - -/obj/machinery/netpod/mouse_drop_receive(mob/target, mob/user, params) - var/mob/living/carbon/player = user - - if(!iscarbon(player) || !is_operational || !state_open || player.buckled) - return - - close_machine(target) - -/obj/machinery/netpod/crowbar_act(mob/living/user, obj/item/tool) - if(user.combat_mode) - attack_hand(user) - return ITEM_INTERACT_SUCCESS - - if(default_pry_open(tool, user) || default_deconstruction_crowbar(tool)) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/netpod/screwdriver_act(mob/living/user, obj/item/tool) - if(occupant) - balloon_alert(user, "in use!") - return ITEM_INTERACT_SUCCESS - - if(state_open) - balloon_alert(user, "close first.") - return ITEM_INTERACT_SUCCESS - - if(default_deconstruction_screwdriver(user, "[base_icon_state]_panel", "[base_icon_state]_closed", tool)) - update_appearance() // sometimes icon doesnt properly update during flick() - ui_close(user) - return ITEM_INTERACT_SUCCESS - -/obj/machinery/netpod/attack_hand(mob/living/user, list/modifiers) - . = ..() - if(!state_open && user == occupant) - container_resist_act(user) - -/obj/machinery/netpod/Exited(atom/movable/gone, direction) - . = ..() - if(!state_open && gone == occupant) - container_resist_act(gone) - -/obj/machinery/netpod/relaymove(mob/living/user, direction) - if(!state_open) - container_resist_act(user) - -/obj/machinery/netpod/container_resist_act(mob/living/user) - user.visible_message(span_notice("[occupant] emerges from [src]!"), - span_notice("You climb out of [src]!"), - span_notice("With a hiss, you hear a machine opening.")) - open_machine() - -/obj/machinery/netpod/open_machine(drop = TRUE, density_to_set = FALSE) - playsound(src, 'sound/machines/tramopen.ogg', 60, TRUE, frequency = 65000) - flick("[base_icon_state]_opening", src) - SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_OPENED) - update_use_power(IDLE_POWER_USE) - - return ..() - -/obj/machinery/netpod/close_machine(mob/user, density_to_set = TRUE) - if(!state_open || panel_open || !is_operational || !iscarbon(user)) - return - - playsound(src, 'sound/machines/tramclose.ogg', 60, TRUE, frequency = 65000) - flick("[base_icon_state]_closing", src) - ..() - - enter_matrix() - -/obj/machinery/netpod/default_pry_open(obj/item/crowbar, mob/living/pryer) - if(isnull(occupant) || !iscarbon(occupant)) - if(!state_open) - if(panel_open) - return FALSE - open_machine() - else - shut_pod() - - return TRUE - - pryer.visible_message( - span_danger("[pryer] starts prying open [src]!"), - span_notice("You start to pry open [src]."), - span_notice("You hear loud prying on metal.") - ) - playsound(src, 'sound/machines/airlock_alien_prying.ogg', 100, TRUE) - - SEND_SIGNAL(src, COMSIG_BITRUNNER_CROWBAR_ALERT, pryer) - - if(do_after(pryer, 15 SECONDS, src)) - if(!state_open) - sever_connection() - open_machine() - - return TRUE - -/obj/machinery/netpod/ui_interact(mob/user, datum/tgui/ui) - if(!is_operational || occupant) - return - - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "NetpodOutfits") - ui.set_autoupdate(FALSE) - ui.open() - -/obj/machinery/netpod/ui_data() - var/list/data = list() - - data["netsuit"] = netsuit - return data - -/obj/machinery/netpod/ui_static_data() - var/list/data = list() - - if(!length(cached_outfits)) - cached_outfits += make_outfit_collection("Jobs", subtypesof(/datum/outfit/job)) - - data["collections"] = cached_outfits - - return data - -/obj/machinery/netpod/ui_act(action, params) - . = ..() - if(.) - return TRUE - switch(action) - if("select_outfit") - var/datum/outfit/new_suit = resolve_outfit(params["outfit"]) - if(new_suit) - netsuit = new_suit - return TRUE - - return FALSE - -/obj/machinery/netpod/attack_ghost(mob/dead/observer/our_observer) - var/our_target = avatar_ref?.resolve() - if(isnull(our_target) || !our_observer.orbit(our_target)) - return ..() - -/// Puts the occupant in netpod stasis, basically short-circuiting environmental conditions -/obj/machinery/netpod/proc/add_healing(mob/living/target) - if(target != occupant) - return - - target.AddComponent(/datum/component/netpod_healing, pod = src) - target.playsound_local(src, 'sound/effects/submerge.ogg', 20, vary = TRUE) - target.extinguish_mob() - update_use_power(ACTIVE_POWER_USE) - -/// Disconnects the occupant after a certain time so they aren't just hibernating in netpod stasis. A balance change -/obj/machinery/netpod/proc/auto_disconnect() - if(isnull(occupant) || state_open || connected) - return - - var/mob/player = occupant - player.playsound_local(src, 'sound/effects/splash.ogg', 60, TRUE) - to_chat(player, span_notice("The machine disconnects itself and begins to drain.")) - open_machine() - -/// Handles occupant post-disconnection effects like damage, sounds, etc -/obj/machinery/netpod/proc/disconnect_occupant(cause_damage = FALSE) - connected = FALSE - - var/mob/living/mob_occupant = occupant - if(isnull(occupant) || mob_occupant.stat == DEAD) - open_machine() - return - - mob_occupant.playsound_local(src, 'sound/magic/blink.ogg', 25, TRUE) - mob_occupant.set_static_vision(2 SECONDS) - mob_occupant.set_temp_blindness(1 SECONDS) - mob_occupant.Paralyze(2 SECONDS) - - if(!is_operational) - open_machine() - return - - var/heal_time = 1 - if(mob_occupant.health < mob_occupant.maxHealth) - heal_time = (mob_occupant.stat + 2) * 5 - addtimer(CALLBACK(src, PROC_REF(auto_disconnect)), heal_time SECONDS, TIMER_UNIQUE|TIMER_STOPPABLE|TIMER_DELETE_ME) - - if(!cause_damage) - return - - mob_occupant.flash_act(override_blindness_check = TRUE, visual = TRUE) - mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, disconnect_damage) - INVOKE_ASYNC(mob_occupant, TYPE_PROC_REF(/mob/living, emote), "scream") - to_chat(mob_occupant, span_danger("You've been forcefully disconnected from your avatar! Your thoughts feel scrambled!")) - -/** - * ### Enter Matrix - * Finds any current avatars from this chair - or generates a new one - * - * New avatars cost 1 attempt, and this will eject if there's none left - * - * Connects the mind to the avatar if everything is ok - */ -/obj/machinery/netpod/proc/enter_matrix() - var/mob/living/carbon/human/neo = occupant - if(!ishuman(neo) || neo.stat == DEAD || isnull(neo.mind)) - balloon_alert(neo, "неверный пользователь.") - return - - var/obj/machinery/quantum_server/server = find_server() - if(isnull(server)) - balloon_alert(neo, "нет подключения к серверу!") - return - - var/datum/lazy_template/virtual_domain/generated_domain = server.generated_domain - if(isnull(generated_domain) || !server.is_ready) - balloon_alert(neo, "ничего не загружено!") - return - - var/mob/living/carbon/current_avatar = avatar_ref?.resolve() - if(isnull(current_avatar) || current_avatar.stat != CONSCIOUS) // We need a viable avatar - var/obj/structure/hololadder/wayout = server.generate_hololadder() - if(isnull(wayout)) - balloon_alert(neo, "кончилась пропускная способность!") - return - current_avatar = server.generate_avatar(wayout, netsuit) - avatar_ref = WEAKREF(current_avatar) - server.stock_gear(current_avatar, neo, generated_domain) - - neo.set_static_vision(3 SECONDS) - add_healing(occupant) - - if(!validate_entry(neo, current_avatar)) - open_machine() - return - - current_avatar.AddComponent( \ - /datum/component/avatar_connection, \ - old_mind = neo.mind, \ - old_body = neo, \ - server = server, \ - pod = src, \ - help_text = generated_domain.help_text, \ - ) - - connected = TRUE - -/// Finds a server and sets the server_ref -/obj/machinery/netpod/proc/find_server() - var/obj/machinery/quantum_server/server = server_ref?.resolve() - if(server) - return server - - server = locate(/obj/machinery/quantum_server) in oview(4, src) - if(isnull(server)) - return - - server_ref = WEAKREF(server) - RegisterSignal(server, COMSIG_MACHINERY_REFRESH_PARTS, 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 - -/// Creates a list of outfit entries for the UI. -/obj/machinery/netpod/proc/make_outfit_collection(identifier, list/outfit_list) - var/list/collection = list( - "name" = identifier, - "outfits" = list() - ) - - for(var/datum/outfit/outfit as anything in outfit_list) - var/outfit_name = initial(outfit.name) - if(findtext(outfit_name, "(") != 0 || findtext(outfit_name, "-") != 0) // No special variants please - continue - - collection["outfits"] += list(list("path" = outfit, "name" = outfit_name)) - - return list(collection) - -/// Machine has been broken - handles signals and reverting sprites -/obj/machinery/netpod/proc/on_broken(datum/source) - SIGNAL_HANDLER - - sever_connection() - -/// Checks the integrity, alerts occupants -/obj/machinery/netpod/proc/on_damage_taken(datum/source, damage_amount) - SIGNAL_HANDLER - - if(isnull(occupant) || !connected) - return - - var/total = max_integrity - damage_amount - var/integrity = (atom_integrity / total) * 100 - if(integrity > 50) - return - - SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_INTEGRITY) - -/// Puts points on the current occupant's card account -/obj/machinery/netpod/proc/on_domain_complete(datum/source, atom/movable/crate, reward_points) - SIGNAL_HANDLER - - if(isnull(occupant) || !connected) - return - - var/mob/living/player = occupant - - var/datum/bank_account/account = player.get_bank_account() - if(isnull(account)) - return - - account.bitrunning_points += reward_points * 100 - -/// 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/avatar = avatar_ref?.resolve() - if(isnull(avatar)) - return - - QDEL_NULL(avatar) - -/// Boots out anyone in the machine && opens it -/obj/machinery/netpod/proc/on_power_loss(datum/source) - SIGNAL_HANDLER - - if(state_open) - return - - if(isnull(occupant) || !connected) - connected = FALSE - open_machine() - return - - sever_connection() - -/// When the server is upgraded, drops brain damage a little -/obj/machinery/netpod/proc/on_server_upgraded(obj/machinery/quantum_server/source) - SIGNAL_HANDLER - - disconnect_damage = BASE_DISCONNECT_DAMAGE * (1 - source.servo_bonus) - -/// Resolves a path to an outfit. -/obj/machinery/netpod/proc/resolve_outfit(text) - var/path = text2path(text) - if(!ispath(path, /datum/outfit)) - return - - for(var/wardrobe in cached_outfits) - for(var/outfit in wardrobe["outfits"]) - if(path == outfit["path"]) - return path - - message_admins("[usr]:[usr.ckey] attempted to select an unavailable outfit from a netpod") - return - -/// Severs the connection with the current avatar -/obj/machinery/netpod/proc/sever_connection() - if(isnull(occupant) || !connected) - return - - SEND_SIGNAL(src, COMSIG_BITRUNNER_NETPOD_SEVER) - -/// Closes the machine without shoving in an occupant -/obj/machinery/netpod/proc/shut_pod() - state_open = FALSE - playsound(src, 'sound/machines/tramclose.ogg', 60, TRUE, frequency = 65000) - flick("[base_icon_state]_closing", src) - set_density(TRUE) - - update_appearance() - -/// Checks for cases to eject/fail connecting an avatar -/obj/machinery/netpod/proc/validate_entry(mob/living/neo, mob/living/avatar) - if(!do_after(neo, 2 SECONDS, src)) - return FALSE - - // Very invalid - if(QDELETED(neo) || QDELETED(avatar) || QDELETED(src) || !is_operational) - return FALSE - - // Invalid - if(occupant != neo || isnull(neo.mind) || neo.stat > SOFT_CRIT || avatar.stat == DEAD) - return FALSE - - return TRUE - -#undef BASE_DISCONNECT_DAMAGE diff --git a/code/modules/bitrunning/outfits.dm b/code/modules/bitrunning/outfits.dm index 41a65b228ff44..c0bb01ebc06e5 100644 --- a/code/modules/bitrunning/outfits.dm +++ b/code/modules/bitrunning/outfits.dm @@ -10,12 +10,62 @@ 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() + /datum/outfit/bitductor name = "Bitrunning Abductor" uniform = /obj/item/clothing/under/abductor gloves = /obj/item/clothing/gloves/fingerless shoes = /obj/item/clothing/shoes/jackboots + + +/datum/outfit/beachbum_combat + name = "Beachbum: Island Combat" + id = /obj/item/card/id/advanced + l_pocket = null + r_pocket = null + shoes = /obj/item/clothing/shoes/sandal + uniform = /obj/item/clothing/under/pants/jeans + /// Available ranged weapons + var/list/ranged_weaps = list( + /obj/item/gun/ballistic/automatic/pistol, + /obj/item/gun/ballistic/rifle/boltaction, + /obj/item/gun/ballistic/automatic/mini_uzi, + /obj/item/gun/ballistic/automatic/pistol/deagle, + /obj/item/gun/ballistic/rocketlauncher/unrestricted, + /obj/item/gun/ballistic/automatic/ar, + + ) + /// Corresponding ammo + var/list/corresponding_ammo = list( + /obj/item/ammo_box/magazine/m9mm, + /obj/item/ammo_box/strilka310, + /obj/item/ammo_box/magazine/uzim9mm, + /obj/item/ammo_box/magazine/m50, + /obj/item/food/pizzaslice/dank, // more silly, less destructive + /obj/item/ammo_box/magazine/m223, + ) + + +/datum/outfit/beachbum_combat/post_equip(mob/living/carbon/human/bum, visualsOnly) + . = ..() + + var/choice = rand(1, length(ranged_weaps)) + var/weapon = ranged_weaps[choice] + bum.put_in_active_hand(new weapon) + + var/ammo = corresponding_ammo[choice] + var/obj/item/ammo1 = new ammo + var/obj/item/ammo2 = new ammo + + if(!bum.equip_to_slot_if_possible(new ammo, ITEM_SLOT_LPOCKET)) + ammo1.forceMove(get_turf(bum)) + if(!bum.equip_to_slot_if_possible(new ammo, ITEM_SLOT_RPOCKET)) + ammo2.forceMove(get_turf(bum)) + + if(prob(50)) + bum.equip_to_slot_if_possible(new /obj/item/clothing/glasses/sunglasses, ITEM_SLOT_EYES) diff --git a/code/modules/bitrunning/server/_parent.dm b/code/modules/bitrunning/server/_parent.dm index 776bae1db4434..f848a6bb966b6 100644 --- a/code/modules/bitrunning/server/_parent.dm +++ b/code/modules/bitrunning/server/_parent.dm @@ -77,12 +77,18 @@ . += span_infoplain("Может требовать много ресурсов при работе. Обеспечьте достаточное энергоснабжение.") + var/upgraded = FALSE if(capacitor_coefficient < 1) . += span_infoplain("- Вместимость охладителя уменьшает время задержки на [(1 - capacitor_coefficient) * 100]%.") + upgraded = TRUE if(servo_bonus > 0.2) . += span_infoplain("- Потенциал манипуляторов увеличивает награду на [servo_bonus]x.") . += span_infoplain("- Повреждения, получаемые при небезопасном выходе, уменьшены на [servo_bonus * 100]%.") + upgraded = TRUE + + if(!upgraded) + . += span_notice("Его производительность неоптимальна. Улучшенные компоненты дадут информацию о домене, сократят время действия и увеличат награду.") if(!is_ready) . += span_notice("Сервер охлаждается, пожалуйста, ожидайте.") diff --git a/code/modules/bitrunning/server/loot.dm b/code/modules/bitrunning/server/loot.dm index c607b784b8cc5..a340f69962510 100644 --- a/code/modules/bitrunning/server/loot.dm +++ b/code/modules/bitrunning/server/loot.dm @@ -4,6 +4,7 @@ #define GRADE_A "A" #define GRADE_S "S" + /// Handles calculating rewards based on number of players, parts, threats, etc /obj/machinery/quantum_server/proc/calculate_rewards() var/rewards_base = 0.8 @@ -20,6 +21,7 @@ return rewards_base + /// Handles spawning the (new) crate and deleting the former /obj/machinery/quantum_server/proc/generate_loot(obj/cache, obj/machinery/byteforge/chosen_forge) SSblackbox.record_feedback("tally", "bitrunning_domain_primary_completed", 1, generated_domain.key) @@ -55,6 +57,8 @@ chosen_forge.start_to_spawn(reward_cache) return TRUE + +/// Builds secondary loot if the achievements were met /obj/machinery/quantum_server/proc/generate_secondary_loot(obj/curiosity, obj/machinery/byteforge/chosen_forge) SSblackbox.record_feedback("tally", "bitrunning_domain_secondary_completed", 1, generated_domain.key) spark_at_location(curiosity) // abracadabra! @@ -65,6 +69,7 @@ chosen_forge.start_to_spawn(reward_curiosity) return TRUE + /// Returns the markdown text containing domain completion information /obj/machinery/quantum_server/proc/get_completion_certificate(time_difference, grade) var/base_points = generated_domain.reward_points @@ -126,6 +131,7 @@ return generated_domain.difficulty >= BITRUNNER_DIFFICULTY_MEDIUM && (grade in passing_grades) + /// Grades the player's run based on several factors /obj/machinery/quantum_server/proc/grade_completion(completion_time) var/score = length(spawned_threat_refs) * 5 diff --git a/code/modules/bitrunning/server/map_handling.dm b/code/modules/bitrunning/server/map_handling.dm index 06f04a37b119c..c2756b4f5df29 100644 --- a/code/modules/bitrunning/server/map_handling.dm +++ b/code/modules/bitrunning/server/map_handling.dm @@ -24,6 +24,7 @@ reset() + /// Links all the loading processes together - does validation for booting a map /obj/machinery/quantum_server/proc/cold_boot_map(map_key) if(!is_ready) @@ -69,8 +70,15 @@ if(broadcasting) start_broadcasting_network(BITRUNNER_CAMERA_NET) + if(generated_domain.announce_to_ghosts) + notify_ghosts("Bitrunners have loaded a domain that offers ghost interactions. Check the spawners menu for more information.", + src, + "Matrix Glitch", + ) + return TRUE + /// Initializes a new domain if the given key is valid and the user has enough points /obj/machinery/quantum_server/proc/load_domain(map_key) for(var/datum/lazy_template/virtual_domain/available in SSbitrunning.all_domains) @@ -82,6 +90,7 @@ return FALSE + /// Loads in necessary map items like hololadder spawns, caches, etc /obj/machinery/quantum_server/proc/load_map_items() var/turf/goal_turfs = list() @@ -116,6 +125,15 @@ var/turf/signaler_turf = get_turf(thing) signaler_turf.AddComponent(/datum/component/bitrunning_points, generated_domain) qdel(thing) + continue + + if(istype(thing, /obj/effect/landmark/bitrunning/permanent_exit)) + var/turf/tile = get_turf(thing) + exit_turfs += tile + qdel(thing) + + new /obj/structure/hololadder(tile) + if(!length(exit_turfs)) CRASH("Failed to find exit turfs on generated domain.") @@ -134,6 +152,7 @@ return TRUE + /// Stops the current virtual domain and disconnects all users /obj/machinery/quantum_server/proc/reset(fast = FALSE) is_ready = FALSE @@ -155,6 +174,7 @@ stop_broadcasting_network(BITRUNNER_CAMERA_NET) + /// Tries to clean up everything in the domain /obj/machinery/quantum_server/proc/scrub_vdom() sever_connections() /// just in case someone's connected diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm index 232847e29bd86..327c9785c5b61 100644 --- a/code/modules/bitrunning/server/obj_generation.dm +++ b/code/modules/bitrunning/server/obj_generation.dm @@ -15,6 +15,7 @@ new /obj/structure/closet/crate/secure/bitrunning/encrypted(chosen_turf) return TRUE + /// Attempts to spawn a lootbox /obj/machinery/quantum_server/proc/attempt_spawn_curiosity(list/possible_turfs) if(!length(possible_turfs)) // Out of turfs to place a curiosity @@ -35,9 +36,10 @@ new /obj/item/storage/lockbox/bitrunning/encrypted(chosen_turf) return chosen_turf + /// Generates a new avatar for the bitrunner. -/obj/machinery/quantum_server/proc/generate_avatar(obj/structure/hololadder/wayout, datum/outfit/netsuit) - var/mob/living/carbon/human/avatar = new(wayout.loc) +/obj/machinery/quantum_server/proc/generate_avatar(turf/destination, datum/outfit/netsuit) + var/mob/living/carbon/human/avatar = new(destination) var/outfit_path = generated_domain.forced_outfit || netsuit var/datum/outfit/to_wear = new outfit_path() @@ -61,8 +63,9 @@ if(istype(hat)) hat.set_armor(/datum/armor/none) - for(var/obj/thing in avatar.held_items) - qdel(thing) + if(!generated_domain.forced_outfit) + for(var/obj/thing in avatar.held_items) + qdel(thing) var/obj/item/storage/backpack/bag = avatar.back if(istype(bag)) @@ -88,32 +91,9 @@ network = BITRUNNER_CAMERA_NET, \ emp_proof = TRUE, \ ) - return avatar - -/// Generates a new hololadder for the bitrunner. Effectively a respawn attempt. -/obj/machinery/quantum_server/proc/generate_hololadder() - if(!length(exit_turfs)) - return - - if(retries_spent >= length(exit_turfs)) - return - var/turf/destination - for(var/turf/dest_turf in exit_turfs) - if(!locate(/obj/structure/hololadder) in dest_turf) - destination = dest_turf - break - - if(isnull(destination)) - return - - var/obj/structure/hololadder/wayout = new(destination, src) - if(isnull(wayout)) - return - - retries_spent += 1 + return avatar - return wayout /// Loads in any mob segments of the map /obj/machinery/quantum_server/proc/load_mob_segments() @@ -142,6 +122,7 @@ return TRUE + /// Scans over neo's contents for bitrunning tech disks. Loads the items or abilities onto the avatar. /obj/machinery/quantum_server/proc/stock_gear(mob/living/carbon/human/avatar, mob/living/carbon/human/neo, datum/lazy_template/virtual_domain/generated_domain) var/domain_forbids_items = generated_domain.forbids_disk_items diff --git a/code/modules/bitrunning/server/signal_handlers.dm b/code/modules/bitrunning/server/signal_handlers.dm index 0e5e949e8bb51..f5d2840143e16 100644 --- a/code/modules/bitrunning/server/signal_handlers.dm +++ b/code/modules/bitrunning/server/signal_handlers.dm @@ -4,12 +4,14 @@ sever_connections() + /// Whenever a corpse spawner makes a new corpse, add it to the list of potential mutations /obj/machinery/quantum_server/proc/on_corpse_spawned(datum/source, mob/living/corpse) SIGNAL_HANDLER mutation_candidate_refs.Add(WEAKREF(corpse)) + /// Being qdeleted - make sure the circuit and connected mobs go with it /obj/machinery/quantum_server/proc/on_delete(datum/source) SIGNAL_HANDLER @@ -26,6 +28,7 @@ if(circuit) qdel(circuit) + /// Whenever something enters the send tiles, check if it's a loot crate. If so, alert players. /obj/machinery/quantum_server/proc/on_goal_turf_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) SIGNAL_HANDLER @@ -51,6 +54,7 @@ generate_secondary_loot(arrived, chosen_forge, generated_domain) return + /// Handles examining the server. Shows cooldown time and efficiency. /obj/machinery/quantum_server/proc/on_goal_turf_examined(datum/source, mob/examiner, list/examine_text) SIGNAL_HANDLER @@ -58,6 +62,7 @@ examine_text += span_info("Beneath your gaze, the floor pulses subtly with streams of encoded data.") examine_text += span_info("It seems to be part of the location designated for retrieving encrypted payloads.") + /// Scans over the inbound created_atoms from lazy templates /obj/machinery/quantum_server/proc/on_template_loaded(datum/lazy_template/source, list/created_atoms) SIGNAL_HANDLER @@ -98,6 +103,7 @@ /// Just in case there's any special handling for the domain generated_domain.setup_domain(created_atoms) + /// Handles when cybercops are summoned into the area or ghosts click a ghost role spawner /obj/machinery/quantum_server/proc/on_threat_created(datum/source, mob/living/threat) SIGNAL_HANDLER diff --git a/code/modules/bitrunning/server/threats.dm b/code/modules/bitrunning/server/threats.dm index 25a891c03b24b..28d91aa4b3714 100644 --- a/code/modules/bitrunning/server/threats.dm +++ b/code/modules/bitrunning/server/threats.dm @@ -4,6 +4,7 @@ SEND_SIGNAL(src, COMSIG_BITRUNNER_THREAT_CREATED) threat.AddComponent(/datum/component/virtual_entity, src) + /// Choses which antagonist role is spawned based on threat /obj/machinery/quantum_server/proc/get_antagonist_role() var/list/available = list() @@ -19,6 +20,7 @@ return chosen + /// Selects a target to mutate. Gives two attempts, then crashes if it fails. /obj/machinery/quantum_server/proc/get_mutation_target() var/datum/weakref/target_ref = pick(mutation_candidate_refs) @@ -35,6 +37,7 @@ resolved = target_ref.resolve() return resolved + /// Finds any mobs with minds in the zones and gives them the bad news /obj/machinery/quantum_server/proc/notify_spawned_threats() for(var/datum/weakref/baddie_ref as anything in spawned_threat_refs) @@ -52,10 +55,12 @@ to_chat(baddie, span_userdanger("You have been flagged for deletion! Thank you for your service.")) + /// Removes a specific threat - used when station spawning /obj/machinery/quantum_server/proc/remove_threat(mob/living/threat) spawned_threat_refs.Remove(WEAKREF(threat)) + /// Selects the role and waits for a ghost orbiter /obj/machinery/quantum_server/proc/setup_glitch(datum/antagonist/bitrunning_glitch/forced_role) if(!validate_mutation_candidates()) @@ -83,6 +88,7 @@ spawn_glitch(chosen_role, mutation_target, chosen_one) return mutation_target + /// Orbit poll has concluded - spawn the antag /obj/machinery/quantum_server/proc/spawn_glitch(datum/antagonist/bitrunning_glitch/chosen_role, mob/living/mutation_target, mob/dead/observer/ghost) if(QDELETED(mutation_target)) @@ -121,6 +127,7 @@ add_threats(new_mob) + /// Oh boy - transports the antag station side /obj/machinery/quantum_server/proc/station_spawn(mob/living/antag, obj/machinery/byteforge/chosen_forge) antag.balloon_alert(antag, "scanning...") @@ -165,6 +172,7 @@ do_teleport(antag, get_turf(chosen_forge), forced = TRUE, asoundin = 'sound/magic/ethereal_enter.ogg', asoundout = 'sound/magic/ethereal_exit.ogg', channel = TELEPORT_CHANNEL_QUANTUM) + /// Removes any invalid candidates from the list /obj/machinery/quantum_server/proc/validate_mutation_candidates() for(var/datum/weakref/creature_ref as anything in mutation_candidate_refs) diff --git a/code/modules/bitrunning/server/util.dm b/code/modules/bitrunning/server/util.dm index 6b5352bde6cb1..ab267a34cd330 100644 --- a/code/modules/bitrunning/server/util.dm +++ b/code/modules/bitrunning/server/util.dm @@ -1,11 +1,13 @@ #define MAX_DISTANCE 4 // How far crates can spawn from the server + /// Resets the cooldown state and updates icons /obj/machinery/quantum_server/proc/cool_off() is_ready = TRUE update_appearance() radio.talk_into(src, "Thermal systems within operational parameters. Proceeding to domain configuration.", RADIO_CHANNEL_SUPPLY) + /// If there are hosted minds, attempts to get a list of their current virtual bodies w/ vitals /obj/machinery/quantum_server/proc/get_avatar_data() var/list/hosted_avatars = list() @@ -31,6 +33,49 @@ return hosted_avatars + +/// I grab the atom here so I can signal it / manipulate spawners etc +/obj/machinery/quantum_server/proc/get_avatar_destination() as /atom + // Branch A: Custom spawns + if(length(generated_domain.custom_spawns)) + var/atom/valid_spawner + + while(isnull(valid_spawner)) + var/atom/chosen = pick(generated_domain.custom_spawns) + if(QDELETED(chosen)) + generated_domain.custom_spawns -= chosen + continue + + valid_spawner = chosen + break + + return valid_spawner + + // Branch B: Hololadders + if(!length(exit_turfs)) + return + + if(retries_spent >= length(exit_turfs)) + return + + var/turf/exit_tile + for(var/turf/dest_turf in exit_turfs) + if(!locate(/obj/structure/hololadder) in dest_turf) + exit_tile = dest_turf + break + + if(isnull(exit_tile)) + return + + var/obj/structure/hololadder/wayout = new(exit_tile, src) + if(isnull(wayout)) + return + + retries_spent += 1 + + return wayout + + /// Locates any turfs with forges on them, returns a random one /obj/machinery/quantum_server/proc/get_random_nearby_forge() var/list/nearby_forges = list() @@ -40,6 +85,7 @@ return pick(nearby_forges) + /// Gets a random available domain given the current points. /obj/machinery/quantum_server/proc/get_random_domain_id() if(points < 1) @@ -85,6 +131,7 @@ SEND_SIGNAL(src, COMSIG_BITRUNNER_QSRV_SEVER) + /// Do some magic teleport sparks /obj/machinery/quantum_server/proc/spark_at_location(obj/cache) playsound(cache, 'sound/magic/blink.ogg', 50, vary = TRUE) @@ -92,16 +139,33 @@ sparks.set_up(5, location = get_turf(cache)) sparks.start() -/// Returns a turf if it's not dense, else will find a neighbor. -/obj/machinery/quantum_server/proc/validate_turf(turf/chosen_turf) - if(!chosen_turf.is_blocked_turf()) - return chosen_turf - for(var/turf/tile in get_adjacent_open_turfs(chosen_turf)) - if(!tile.is_blocked_turf()) - return chosen_turf +/// Starts building a new avatar for the player. +/// Called by netpods when they don't have a current avatar. +/// This is a procedural proc which links several others together. +/obj/machinery/quantum_server/proc/start_new_connection(mob/living/carbon/human/neo, datum/outfit/netsuit) as /mob/living/carbon/human + var/atom/entry_atom = get_avatar_destination() + if(isnull(entry_atom)) + return + + var/mob/living/carbon/new_avatar = generate_avatar(get_turf(entry_atom), netsuit) + stock_gear(new_avatar, neo, generated_domain) + + // Cleanup for domains with one time use custom spawns + if(!length(generated_domain.custom_spawns)) + return new_avatar + + // If we're spawning from some other fuckery, no need for this + if(istype(entry_atom, /obj/effect/mob_spawn/ghost_role/human/virtual_domain)) + var/obj/effect/mob_spawn/ghost_role/human/virtual_domain/spawner = entry_atom + spawner.artificial_spawn(new_avatar) + + if(!generated_domain.keep_custom_spawns) + generated_domain.custom_spawns -= entry_atom + qdel(entry_atom) + + return new_avatar -#undef MAX_DISTANCE /// Toggles broadcast on and off /obj/machinery/quantum_server/proc/toggle_broadcast() @@ -116,3 +180,16 @@ // And we only flip TVs when there's a domain, because otherwise there's no cams to watch set_network_broadcast_status(BITRUNNER_CAMERA_NET, broadcasting) return TRUE + + +/// Returns a turf if it's not dense, else will find a neighbor. +/obj/machinery/quantum_server/proc/validate_turf(turf/chosen_turf) + if(!chosen_turf.is_blocked_turf()) + return chosen_turf + + for(var/turf/tile in get_adjacent_open_turfs(chosen_turf)) + if(!tile.is_blocked_turf()) + return chosen_turf + + +#undef MAX_DISTANCE diff --git a/code/modules/bitrunning/spawners.dm b/code/modules/bitrunning/spawners.dm index 5fa889ac655fd..4b5f79a43b186 100644 --- a/code/modules/bitrunning/spawners.dm +++ b/code/modules/bitrunning/spawners.dm @@ -3,12 +3,9 @@ prompt_name = "a virtual domain debug entity" flavour_text = "You probably shouldn't be seeing this, contact a coder!" you_are_text = "You are NOT supposed to be here. How did you let this happen?" - important_text = "You must eliminate any bitrunners from the domain." + important_text = "Bitrunning is a crime, and your primary threat." temp_body = TRUE -/obj/effect/mob_spawn/ghost_role/human/virtual_domain/Initialize(mapload) - . = ..() - notify_ghosts("The [name] has been created. The virtual world calls for aid!", src, "Virtual Insanity!") /obj/effect/mob_spawn/ghost_role/human/virtual_domain/special(mob/living/spawned_mob, mob/mob_possessor) var/datum/mind/ghost_mind = mob_possessor.mind @@ -19,6 +16,12 @@ spawned_mob.mind.add_antag_datum(/datum/antagonist/domain_ghost_actor) + +/// Simulates a ghost role spawn without calling special(), ie a bitrunner spawn instead of a ghost. +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/proc/artificial_spawn(mob/living/runner) + SEND_SIGNAL(src, COMSIG_BITRUNNER_SPAWNED, runner) + + /obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate name = "Virtual Pirate Remains" desc = "Some inanimate bones. They feel like they could spring to life at any moment!" @@ -27,22 +30,25 @@ icon_state = "remains" prompt_name = "a virtual skeleton pirate" you_are_text = "You are a virtual pirate. Yarrr!" - flavour_text = "You have awoken, without instruction. There's a LANDLUBBER after yer booty. Stop them!" + flavour_text = " There's a LANDLUBBER after yer booty. Stop them!" + /obj/effect/mob_spawn/ghost_role/human/virtual_domain/pirate/special(mob/living/spawned_mob, mob/mob_possessor) . = ..() spawned_mob.fully_replace_character_name(spawned_mob.real_name, "[pick(strings(PIRATE_NAMES_FILE, "generic_beginnings"))][pick(strings(PIRATE_NAMES_FILE, "generic_endings"))]") + /obj/effect/mob_spawn/ghost_role/human/virtual_domain/syndie name = "Virtual Syndicate Sleeper" icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper_s" prompt_name = "a virtual syndicate operative" you_are_text = "You are a virtual syndicate operative." - flavour_text = "You have awoken, without instruction. Alarms blare! We are being boarded!" + flavour_text = "Alarms blare! We are being boarded!" outfit = /datum/outfit/virtual_syndicate spawner_job_path = /datum/job/space_syndicate + /datum/outfit/virtual_syndicate name = "Virtual Syndie" id = /obj/item/card/id/advanced/chameleon @@ -53,5 +59,6 @@ shoes = /obj/item/clothing/shoes/combat implants = list(/obj/item/implant/weapons_auth) + /datum/outfit/virtual_syndicate/post_equip(mob/living/carbon/human/user, visualsOnly) user.faction |= ROLE_SYNDICATE diff --git a/code/modules/bitrunning/virtual_domain/domains/island_brawl.dm b/code/modules/bitrunning/virtual_domain/domains/island_brawl.dm new file mode 100644 index 0000000000000..b745a4746aa24 --- /dev/null +++ b/code/modules/bitrunning/virtual_domain/domains/island_brawl.dm @@ -0,0 +1,46 @@ +/datum/lazy_template/virtual_domain/island_brawl + name = "Island Brawl" + announce_to_ghosts = TRUE + cost = BITRUNNER_COST_HIGH + desc = "A 'peaceful' island tucked away in the middle of nowhere. This map will auto-complete after a number of deaths have occurred." + difficulty = BITRUNNER_DIFFICULTY_HIGH + forced_outfit = /datum/outfit/beachbum_combat + help_text = "There may be bounties laid out across the island, but the primary objective is to survive. Deaths on the island will count towards the final score." + key = "island_brawl" + map_name = "island_brawl" + reward_points = BITRUNNER_REWARD_HIGH + secondary_loot = list( + /obj/item/toy/beach_ball = 2, + /obj/item/clothing/shoes/sandal = 1, + /obj/item/clothing/glasses/sunglasses = 1, + /obj/item/gun/ballistic/automatic/mini_uzi = 1, + ) + + +/datum/lazy_template/virtual_domain/island_brawl/setup_domain(list/created_atoms) + for(var/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander/spawner in created_atoms) + custom_spawns += spawner + + RegisterSignals(spawner, list(COMSIG_GHOSTROLE_SPAWNED, COMSIG_BITRUNNER_SPAWNED), PROC_REF(on_spawn)) + + +/// Someone has spawned in, so we check for their death +/datum/lazy_template/virtual_domain/island_brawl/proc/on_spawn(datum/source, mob/living/spawned_mob) + SIGNAL_HANDLER + + RegisterSignals(spawned_mob, list(COMSIG_LIVING_DEATH), PROC_REF(on_death)) + + +/// Mob has died, so we add a point to the domain +/datum/lazy_template/virtual_domain/island_brawl/proc/on_death(datum/source, gibbed) + SIGNAL_HANDLER + + add_points(1) + + +/obj/effect/mob_spawn/ghost_role/human/virtual_domain/islander + name = "Islander" + outfit = /datum/outfit/beachbum_combat + prompt_name = "a combat beach bum" + you_are_text = "You are a virtual islander." + flavour_text = "Don't let anyone ruin your idyllic vacation spot. Coordinate with others- or don't!" diff --git a/code/modules/bitrunning/virtual_domain/domains/pirates.dm b/code/modules/bitrunning/virtual_domain/domains/pirates.dm index 3c756caacc6eb..80981e759f6e4 100644 --- a/code/modules/bitrunning/virtual_domain/domains/pirates.dm +++ b/code/modules/bitrunning/virtual_domain/domains/pirates.dm @@ -1,5 +1,6 @@ /datum/lazy_template/virtual_domain/pirates name = "Бухта корсаров" + announce_to_ghosts = TRUE cost = BITRUNNER_COST_MEDIUM desc = "Пробейтесь с боем к спрятанным сокровищам, захватите добычу и поспешите сбежать, прежде чем пираты переломят ситуацию." difficulty = BITRUNNER_DIFFICULTY_MEDIUM diff --git a/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm b/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm index e17c24edd29c3..ae7bbd7c63c96 100644 --- a/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm +++ b/code/modules/bitrunning/virtual_domain/domains/syndicate_assault.dm @@ -1,5 +1,6 @@ /datum/lazy_template/virtual_domain/syndicate_assault name = "Нападение Синдиката" + announce_to_ghosts = TRUE cost = BITRUNNER_COST_MEDIUM desc = "Возьмите на абордаж вражеский корабль и верните украденный груз." difficulty = BITRUNNER_DIFFICULTY_MEDIUM diff --git a/code/modules/bitrunning/virtual_domain/virtual_domain.dm b/code/modules/bitrunning/virtual_domain/virtual_domain.dm index 21898daad72d7..f81f6186cbe6e 100644 --- a/code/modules/bitrunning/virtual_domain/virtual_domain.dm +++ b/code/modules/bitrunning/virtual_domain/virtual_domain.dm @@ -7,50 +7,82 @@ map_name = "None" key = "Virtual Domain" place_on_top = TRUE + /// Whether to tell observers this map is being used + var/announce_to_ghosts = FALSE + /// The map file to load + var/filename = "virtual_domain.dmm" + /// The start time of the map. Used to calculate time taken + var/start_time + /// This map is specifically for unit tests. Shouldn't display in game + var/test_only = FALSE + + /** + * Generic settings / UI + */ /// Cost of this map to load var/cost = BITRUNNER_COST_NONE - /// Any outfit that you wish to force on avatars. Overrides preferences - var/datum/outfit/forced_outfit /// The description of the map for the console UI var/desc = "A map." /// Affects the ui and ability to scan info. var/difficulty = BITRUNNER_DIFFICULTY_NONE - /// The map file to load - var/filename = "virtual_domain.dmm" + /// Write these to help complete puzzles and other objectives. Viewed in the domain info ability. + var/help_text + // Name to show in the UI + var/name = "Virtual Domain" + /// Points to reward for completion. Used to purchase new domains and calculate ore rewards. + var/reward_points = BITRUNNER_REWARD_MIN + + /** + * Player customization + */ + /// If this domain blocks the use of items from disks, for whatever reason var/forbids_disk_items = FALSE /// If this domain blocks the use of spells from disks, for whatever reason var/forbids_disk_spells = FALSE - /// Information given to connected clients via ability - var/help_text - /// Whether to display this as a modular map - var/is_modular = FALSE - /// Byond will look for modular mob segment landmarks then choose from here at random. You can make them unique also. - var/list/datum/modular_mob_segment/mob_modules = list() + /// Any outfit that you wish to force on avatars. Overrides preferences + var/datum/outfit/forced_outfit + + /** + * Loot + */ + /// An assoc list of typepath/amount to spawn on completion. Not weighted - the value is the amount var/list/completion_loot - /// An accoc list of typepath/amount to spawn from secondary objectives. Not weighted - the value is the total number of items that can be obtained. + /// An assoc list of typepath/amount to spawn from secondary objectives. Not weighted - the value is the total number of items that can be obtained. var/list/secondary_loot = list() /// Number of secondary loot boxes generated. Resets when the domain is reloaded. var/secondary_loot_generated - /// Forces all mob modules to only load once - var/modular_unique_mobs = FALSE - // Name to show in the UI - var/name = "Virtual Domain" - /// Points to reward for completion. Used to purchase new domains and calculate ore rewards. - var/reward_points = BITRUNNER_REWARD_MIN - /// The start time of the map. Used to calculate time taken - var/start_time - /// This map is specifically for unit tests. Shouldn't display in game - var/test_only = FALSE /// Has this domain been beaten with high enough score to spawn a tech disk? var/disk_reward_spawned = FALSE + /** + * Modularity + */ + + /// Whether to display this as a modular map + var/is_modular = FALSE + /// Byond will look for modular mob segment landmarks then choose from here at random. You can make them unique also. + var/list/datum/modular_mob_segment/mob_modules = list() + /// Forces all mob modules to only load once + var/modular_unique_mobs = FALSE + + /** + * Spawning + */ + + /// Looks for random landmarks to spawn on. + var/list/custom_spawns = list() + /// Set TRUE if you want reusable custom spawners + var/keep_custom_spawns = FALSE + + /// Sends a point to any loot signals on the map /datum/lazy_template/virtual_domain/proc/add_points(points_to_add) SEND_SIGNAL(src, COMSIG_BITRUNNER_GOAL_POINT, points_to_add) + /// Overridable proc to be called after the map is loaded. /datum/lazy_template/virtual_domain/proc/setup_domain(list/created_atoms) return diff --git a/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm b/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm index 3c4a55748c4c6..09ed5b40b1f20 100644 --- a/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm +++ b/code/modules/capture_the_flag/medieval_sim/medisim_classes.dm @@ -26,7 +26,7 @@ name = "Redfield Castle Archer" icon_state = "medisim_archer" - belt = /obj/item/storage/bag/quiver + belt = /obj/item/storage/bag/quiver/full suit = /obj/item/clothing/suit/armor/vest/cuirass l_hand = /obj/item/gun/ballistic/bow diff --git a/code/modules/capture_the_flag/medieval_sim/medisim_game.dm b/code/modules/capture_the_flag/medieval_sim/medisim_game.dm index 18e1cd13e7ede..118184698a3cc 100644 --- a/code/modules/capture_the_flag/medieval_sim/medisim_game.dm +++ b/code/modules/capture_the_flag/medieval_sim/medisim_game.dm @@ -22,7 +22,7 @@ if(!.) return var/mob/living/carbon/human/human_knight = . - randomize_human(human_knight) + randomize_human_normie(human_knight) human_knight.dna.add_mutation(/datum/mutation/human/medieval, MUT_OTHER) var/oldname = human_knight.name var/title = "error" diff --git a/code/modules/cargo/bounties/science.dm b/code/modules/cargo/bounties/science.dm index 9da701d097ecc..ae2752a3b17bb 100644 --- a/code/modules/cargo/bounties/science.dm +++ b/code/modules/cargo/bounties/science.dm @@ -9,7 +9,7 @@ if(!..()) return FALSE var/obj/item/relic/experiment = O - if(experiment.revealed) + if(experiment.activated) return TRUE return diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm index b48ef268da683..2d19c276ec115 100644 --- a/code/modules/cargo/packs/emergency.dm +++ b/code/modules/cargo/packs/emergency.dm @@ -6,8 +6,8 @@ name = "Biological Emergency Crate" desc = "This crate includes 2 complete bio suits, along with a box containing sterile masks and latex gloves, providing effective protection against viruses." cost = CARGO_CRATE_VALUE * 2 - contains = list(/obj/item/clothing/head/bio_hood = 2, - /obj/item/clothing/suit/bio_suit = 2, + contains = list(/obj/item/clothing/head/bio_hood/general = 2, + /obj/item/clothing/suit/bio_suit/general = 2, /obj/item/storage/bag/bio, /obj/item/reagent_containers/syringe/antiviral = 2, /obj/item/clothing/gloves/latex/nitrile = 2, diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm index 3f7645559ff7f..f270b1da11f39 100644 --- a/code/modules/cargo/packs/imports.dm +++ b/code/modules/cargo/packs/imports.dm @@ -309,11 +309,12 @@ risky espionage hallway operations. Enjoy our product!" contraband = TRUE cost = CARGO_CRATE_VALUE * 6 - contains = list(/obj/item/clothing/under/syndicate/floortilecamo = 3, - /obj/item/clothing/mask/floortilebalaclava = 3, - /obj/item/clothing/gloves/combat/floortile = 3, - /obj/item/clothing/shoes/jackboots/floortile = 3, - /obj/item/storage/backpack/floortile = 3 + contains = list( + /obj/item/clothing/under/syndicate/floortilecamo = 3, + /obj/item/clothing/mask/floortilebalaclava = 3, + /obj/item/clothing/gloves/combat/floortile = 3, + /obj/item/clothing/shoes/jackboots/floortile = 3, + /obj/item/storage/backpack/floortile = 3 ) crate_name = "floortile camouflauge crate" crate_type = /obj/structure/closet/crate/secure/weapon diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index 4059b330e2f66..dfa2a66359336 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -176,7 +176,8 @@ /obj/item/biopsy_tool, /obj/item/storage/box/petridish = 2, /obj/item/storage/box/swab, - /obj/item/construction/plumbing/research, + /obj/item/circuitboard/machine/vatgrower, + /obj/item/reagent_containers/condiment/protein, ) crate_name = "cytology supplies crate" diff --git a/code/modules/cargo/packs/service.dm b/code/modules/cargo/packs/service.dm index fddd093b4fb7e..228d0d3e2fa46 100644 --- a/code/modules/cargo/packs/service.dm +++ b/code/modules/cargo/packs/service.dm @@ -303,3 +303,17 @@ contains = list(/obj/item/wallframe/barsign/all_access) crate_name = "bar sign crate" discountable = SUPPLY_PACK_RARE_DISCOUNTABLE + +/datum/supply_pack/service/bowmaking + name = "Fletching and Bow-Making Starter Kit" + desc = "A fairly outdated copy of 'Whittle Me This: Fletching for the Modern Spacer', along with some useful materials. \ + For those looking to get into bow-making, or give their LARPing a little more edge, you can't go wrong. Also has \ + instructions for making violins." + cost = CARGO_CRATE_VALUE * 5 + contains = list( + /obj/item/book/granter/crafting_recipe/fletching = 1, + /obj/item/stack/sheet/mineral/wood = 10, + /obj/item/stack/sheet/cloth = 10, + ) + crate_name = "bowmaking starter kit crate" + crate_type = /obj/structure/closet/crate/wooden diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index 1209b5c35823c..4ca500a9e7198 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -180,9 +180,15 @@ /datum/client_colour/glass_colour/yellow colour = "#ffff66" +/datum/client_colour/glass_colour/lightyellow + colour = "#ffffaa" + /datum/client_colour/glass_colour/red colour = "#ffaaaa" +/datum/client_colour/glass_colour/lightred + colour = "#ffcccc" + /datum/client_colour/glass_colour/darkred colour = "#bb5555" @@ -195,9 +201,19 @@ /datum/client_colour/glass_colour/purple colour = "#ff99ff" +/datum/client_colour/glass_colour/lightpurple + colour = "#ffccff" + /datum/client_colour/glass_colour/gray colour = "#cccccc" +///A client colour that makes the screen look a bit more grungy, halloweenesque even. +/datum/client_colour/halloween_helmet + colour = list(0.75,0.13,0.13,0, 0.13,0.7,0.13,0, 0.13,0.13,0.75,0, -0.06,-0.09,-0.08,1, 0,0,0,0) + +/datum/client_colour/flash_hood + colour = COLOR_MATRIX_POLAROID + /datum/client_colour/glass_colour/nightmare colour = list(255,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, -130,0,0,0) //every color is either red or black diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm index 485276b4ade2a..1ba43cf3d8a63 100644 --- a/code/modules/client/preferences/_preference.dm +++ b/code/modules/client/preferences/_preference.dm @@ -18,16 +18,19 @@ /// support the "use gender" option. #define PREFERENCE_PRIORITY_BODY_TYPE 5 +/// Used for preferences that rely on body setup being finalized. +#define PREFERENCE_PRORITY_LATE_BODY_TYPE 6 + /// Equpping items based on preferences. /// Should happen after species and body type to make sure it looks right. /// Mostly redundant, but a safety net for saving/loading. -#define PREFERENCE_PRIORITY_LOADOUT 6 +#define PREFERENCE_PRIORITY_LOADOUT 7 /// The priority at which names are decided, needed for proper randomization. -#define PREFERENCE_PRIORITY_NAMES 7 +#define PREFERENCE_PRIORITY_NAMES 8 /// Preferences that aren't names, but change the name changes set by PREFERENCE_PRIORITY_NAMES. -#define PREFERENCE_PRIORITY_NAME_MODIFICATIONS 8 +#define PREFERENCE_PRIORITY_NAME_MODIFICATIONS 9 /// The maximum preference priority, keep this updated, but don't use it for `priority`. #define MAX_PREFERENCE_PRIORITY PREFERENCE_PRIORITY_NAME_MODIFICATIONS diff --git a/code/modules/client/preferences/age.dm b/code/modules/client/preferences/age.dm index cad9786ce1fef..07b4644bc6a9e 100644 --- a/code/modules/client/preferences/age.dm +++ b/code/modules/client/preferences/age.dm @@ -8,3 +8,6 @@ /datum/preference/numeric/age/apply_to_human(mob/living/carbon/human/target, value) target.age = value + +/datum/preference/numeric/age/create_informed_default_value(datum/preferences/preferences) + return rand(max(minimum, 21), min(maximum, 50)) diff --git a/code/modules/client/preferences/blindfold_color.dm b/code/modules/client/preferences/blindfold_color.dm index 9e6504579acb6..8081ac15be8ae 100644 --- a/code/modules/client/preferences/blindfold_color.dm +++ b/code/modules/client/preferences/blindfold_color.dm @@ -4,6 +4,9 @@ savefile_key = "blindfold_color" savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/color/blindfold_color/create_default_value() + return COLOR_WHITE + /datum/preference/color/blindfold_color/is_accessible(datum/preferences/preferences) if (!..(preferences)) return FALSE diff --git a/code/modules/client/preferences/body_type.dm b/code/modules/client/preferences/body_type.dm index 469b564e46f7b..6b27e0f0f0da7 100644 --- a/code/modules/client/preferences/body_type.dm +++ b/code/modules/client/preferences/body_type.dm @@ -5,6 +5,7 @@ priority = PREFERENCE_PRIORITY_BODY_TYPE savefile_key = "body_type" savefile_identifier = PREFERENCE_CHARACTER + can_randomize = FALSE /datum/preference/choiced/body_type/init_possible_values() return list(USE_GENDER, MALE, FEMALE) diff --git a/code/modules/client/preferences/clothing.dm b/code/modules/client/preferences/clothing.dm index b4d3e98082469..b2cf6c5c1ef0a 100644 --- a/code/modules/client/preferences/clothing.dm +++ b/code/modules/client/preferences/clothing.dm @@ -33,6 +33,9 @@ DMESSENGER, ) +/datum/preference/choiced/backpack/create_default_value() + return GBACKPACK + /datum/preference/choiced/backpack/icon_for(value) switch (value) if (GBACKPACK) @@ -66,6 +69,7 @@ /datum/preference/choiced/jumpsuit savefile_key = "jumpsuit_style" savefile_identifier = PREFERENCE_CHARACTER + priority = PREFERENCE_PRIORITY_BODY_TYPE main_feature_name = "Комбинезон" category = PREFERENCE_CATEGORY_CLOTHING should_generate_icons = TRUE @@ -86,6 +90,15 @@ /datum/preference/choiced/jumpsuit/apply_to_human(mob/living/carbon/human/target, value) target.jumpsuit_style = value +/datum/preference/choiced/jumpsuit/create_informed_default_value(datum/preferences/preferences) + switch(preferences.read_preference(/datum/preference/choiced/gender)) + if(MALE) + return PREF_SUIT + if(FEMALE) + return PREF_SKIRT + + return ..() + /// Socks preference /datum/preference/choiced/socks savefile_key = "socks" @@ -93,10 +106,14 @@ main_feature_name = "Носки" category = PREFERENCE_CATEGORY_CLOTHING should_generate_icons = TRUE + can_randomize = FALSE /datum/preference/choiced/socks/init_possible_values() return assoc_to_keys_features(SSaccessories.socks_list) +/datum/preference/choiced/socks/create_default_value() + return /datum/sprite_accessory/socks/nude::name + /datum/preference/choiced/socks/icon_for(value) var/static/icon/lower_half @@ -114,13 +131,27 @@ /datum/preference/choiced/undershirt savefile_key = "undershirt" savefile_identifier = PREFERENCE_CHARACTER + priority = PREFERENCE_PRIORITY_BODY_TYPE main_feature_name = "Одежда" category = PREFERENCE_CATEGORY_CLOTHING should_generate_icons = TRUE + can_randomize = FALSE /datum/preference/choiced/undershirt/init_possible_values() return assoc_to_keys_features(SSaccessories.undershirt_list) +/datum/preference/choiced/undershirt/create_default_value() + return /datum/sprite_accessory/undershirt/nude::name + +/datum/preference/choiced/undershirt/create_informed_default_value(datum/preferences/preferences) + switch(preferences.read_preference(/datum/preference/choiced/gender)) + if(MALE) + return /datum/sprite_accessory/undershirt/nude::name + if(FEMALE) + return /datum/sprite_accessory/undershirt/sports_bra::name + + return ..() + /datum/preference/choiced/undershirt/icon_for(value) var/static/icon/body if (isnull(body)) @@ -152,10 +183,14 @@ main_feature_name = "Нижнее белье" category = PREFERENCE_CATEGORY_CLOTHING should_generate_icons = TRUE + can_randomize = FALSE /datum/preference/choiced/underwear/init_possible_values() return assoc_to_keys_features(SSaccessories.underwear_list) +/datum/preference/choiced/underwear/create_default_value() + return /datum/sprite_accessory/underwear/male_hearts::name + /datum/preference/choiced/underwear/icon_for(value) var/static/icon/lower_half diff --git a/code/modules/client/preferences/gender.dm b/code/modules/client/preferences/gender.dm index bea6674d7b086..a95874f160680 100644 --- a/code/modules/client/preferences/gender.dm +++ b/code/modules/client/preferences/gender.dm @@ -11,3 +11,8 @@ if(!target.dna.species.sexes) value = PLURAL //disregard gender preferences on this species target.gender = value + +/datum/preference/choiced/gender/create_informed_default_value(datum/preferences/preferences) + // The only reason I'm limiting this to male or female + // is that hairstyle randomization handles enbies poorly + return pick(MALE, FEMALE) diff --git a/code/modules/client/preferences/glasses.dm b/code/modules/client/preferences/glasses.dm index a08f15955eaa4..e5158f1acbbde 100644 --- a/code/modules/client/preferences/glasses.dm +++ b/code/modules/client/preferences/glasses.dm @@ -4,6 +4,9 @@ savefile_identifier = PREFERENCE_CHARACTER should_generate_icons = TRUE +/datum/preference/choiced/glasses/create_default_value() + return "Random" + /datum/preference/choiced/glasses/init_possible_values() return assoc_to_keys(GLOB.nearsighted_glasses) + "Random" diff --git a/code/modules/client/preferences/language.dm b/code/modules/client/preferences/language.dm index f602d6b3a66c9..637c4542da277 100644 --- a/code/modules/client/preferences/language.dm +++ b/code/modules/client/preferences/language.dm @@ -3,6 +3,9 @@ savefile_key = "language" savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/choiced/language/create_default_value() + return "Random" + /datum/preference/choiced/language/is_accessible(datum/preferences/preferences) if (!..(preferences)) return FALSE diff --git a/code/modules/client/preferences/names.dm b/code/modules/client/preferences/names.dm index 4652550e1ffd5..9b671f416b787 100644 --- a/code/modules/client/preferences/names.dm +++ b/code/modules/client/preferences/names.dm @@ -17,21 +17,26 @@ /// If the highest priority job matches this, will prioritize this name in the UI var/relevant_job + /datum/preference/name/apply_to_human(mob/living/carbon/human/target, value) // Only real_name applies directly, everything else is applied by something else return + /datum/preference/name/deserialize(input, datum/preferences/preferences) return reject_bad_name("[input]", allow_numbers) + /datum/preference/name/serialize(input) // `is_valid` should always be run before `serialize`, so it should not // be possible for this to return `null`. return reject_bad_name(input, allow_numbers) + /datum/preference/name/is_valid(value) return istext(value) && !isnull(reject_bad_name(value, allow_numbers)) + /// A character's real name /datum/preference/name/real_name explanation = "Имя" @@ -181,8 +186,21 @@ explanation = "Hacker alias" group = "bitrunning" savefile_key = "hacker_alias" - allow_numbers = TRUE relevant_job = /datum/job/bitrunner + /datum/preference/name/hacker_alias/create_default_value() return pick(GLOB.hacker_aliases) + + +/datum/preference/name/hacker_alias/is_valid(value) + return !isnull(permissive_sanitize_name(value)) + + +/datum/preference/name/hacker_alias/deserialize(input, datum/preferences/preferences) + return permissive_sanitize_name(input) + + +/datum/preference/name/hacker_alias/serialize(input) + return permissive_sanitize_name(input) + diff --git a/code/modules/client/preferences/prosthetic_limb.dm b/code/modules/client/preferences/prosthetic_limb.dm index a4d5b5a577ba1..be807ac4e1f76 100644 --- a/code/modules/client/preferences/prosthetic_limb.dm +++ b/code/modules/client/preferences/prosthetic_limb.dm @@ -3,8 +3,11 @@ savefile_key = "prosthetic" savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/choiced/prosthetic/create_default_value() + return "Random" + /datum/preference/choiced/prosthetic/init_possible_values() - return list("Random") + GLOB.limb_choice + return list("Random") + GLOB.prosthetic_limb_choice /datum/preference/choiced/prosthetic/is_accessible(datum/preferences/preferences) . = ..() diff --git a/code/modules/client/preferences/prosthetic_organ.dm b/code/modules/client/preferences/prosthetic_organ.dm index 35d3b818355eb..02e8418e3db2f 100644 --- a/code/modules/client/preferences/prosthetic_organ.dm +++ b/code/modules/client/preferences/prosthetic_organ.dm @@ -3,6 +3,9 @@ savefile_key = "prosthetic_organ" savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/choiced/prosthetic_organ/create_default_value() + return "Random" + /datum/preference/choiced/prosthetic_organ/init_possible_values() return list("Random") + GLOB.organ_choice diff --git a/code/modules/client/preferences/sounds.dm b/code/modules/client/preferences/sounds.dm index 81263de677bc9..f1778405665ad 100644 --- a/code/modules/client/preferences/sounds.dm +++ b/code/modules/client/preferences/sounds.dm @@ -7,6 +7,11 @@ /datum/preference/toggle/sound_ambience/apply_to_client(client/client, value) client.update_ambience_pref(value) +/datum/preference/toggle/sound_breathing + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "sound_breathing" + savefile_identifier = PREFERENCE_PLAYER + /// Controls hearing announcement sounds /datum/preference/toggle/sound_announcements category = PREFERENCE_CATEGORY_GAME_PREFERENCES diff --git a/code/modules/client/preferences/species_features/basic.dm b/code/modules/client/preferences/species_features/basic.dm index a09c6e2e2e9af..7e6c3758017a3 100644 --- a/code/modules/client/preferences/species_features/basic.dm +++ b/code/modules/client/preferences/species_features/basic.dm @@ -52,7 +52,7 @@ return random_eye_color() /datum/preference/choiced/facial_hairstyle - priority = PREFERENCE_PRIORITY_BODYPARTS + priority = PREFERENCE_PRORITY_LATE_BODY_TYPE savefile_key = "facial_style_name" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES @@ -69,15 +69,32 @@ /datum/preference/choiced/facial_hairstyle/apply_to_human(mob/living/carbon/human/target, value) target.set_facial_hairstyle(value, update = FALSE) +/datum/preference/choiced/facial_hairstyle/create_default_value() + return /datum/sprite_accessory/facial_hair/shaved::name + +/datum/preference/choiced/facial_hairstyle/create_informed_default_value(datum/preferences/preferences) + var/gender = preferences.read_preference(/datum/preference/choiced/gender) + var/species_type = preferences.read_preference(/datum/preference/choiced/species) + var/datum/species/species_real = GLOB.species_prototypes[species_type] + if(!gender || !species_real || !species_real.sexes) + return ..() + + var/picked_beard = random_facial_hairstyle(gender) + var/datum/sprite_accessory/beard_style = SSaccessories.facial_hairstyles_list[picked_beard] + if(!beard_style || !beard_style.natural_spawn || beard_style.locked) // Invalid, go with god(bald) + return ..() + + return picked_beard + /datum/preference/choiced/facial_hairstyle/compile_constant_data() var/list/data = ..() - data[SUPPLEMENTAL_FEATURE_KEY] = "facial_hair_color" + data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/color/facial_hair_color::savefile_key return data /datum/preference/color/facial_hair_color - priority = PREFERENCE_PRIORITY_BODYPARTS + priority = PREFERENCE_PRORITY_LATE_BODY_TYPE // Need to happen after hair oclor is set so we can match by default savefile_key = "facial_hair_color" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES @@ -86,12 +103,16 @@ /datum/preference/color/facial_hair_color/apply_to_human(mob/living/carbon/human/target, value) target.set_facial_haircolor(value, update = FALSE) +/datum/preference/color/facial_hair_color/create_informed_default_value(datum/preferences/preferences) + return preferences.read_preference(/datum/preference/color/hair_color) || random_hair_color() + /datum/preference/choiced/facial_hair_gradient - priority = PREFERENCE_PRIORITY_BODYPARTS + priority = PREFERENCE_PRORITY_LATE_BODY_TYPE category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "facial_hair_gradient" relevant_head_flag = HEAD_FACIAL_HAIR + can_randomize = FALSE /datum/preference/choiced/facial_hair_gradient/init_possible_values() return assoc_to_keys_features(SSaccessories.facial_hair_gradients_list) @@ -100,10 +121,10 @@ target.set_facial_hair_gradient_style(new_style = value, update = FALSE) /datum/preference/choiced/facial_hair_gradient/create_default_value() - return "None" + return /datum/sprite_accessory/gradient/none::name /datum/preference/color/facial_hair_gradient - priority = PREFERENCE_PRIORITY_BODYPARTS + priority = PREFERENCE_PRORITY_LATE_BODY_TYPE category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "facial_hair_gradient_color" @@ -115,10 +136,10 @@ /datum/preference/color/facial_hair_gradient/is_accessible(datum/preferences/preferences) if (!..(preferences)) return FALSE - return preferences.read_preference(/datum/preference/choiced/facial_hair_gradient) != "None" + return preferences.read_preference(/datum/preference/choiced/facial_hair_gradient) != /datum/sprite_accessory/gradient/none::name /datum/preference/color/hair_color - priority = PREFERENCE_PRIORITY_BODYPARTS + priority = PREFERENCE_PRIORITY_BODY_TYPE savefile_key = "hair_color" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SUPPLEMENTAL_FEATURES @@ -127,8 +148,11 @@ /datum/preference/color/hair_color/apply_to_human(mob/living/carbon/human/target, value) target.set_haircolor(value, update = FALSE) +/datum/preference/color/hair_color/create_informed_default_value(datum/preferences/preferences) + return random_hair_color() + /datum/preference/choiced/hairstyle - priority = PREFERENCE_PRIORITY_BODYPARTS + priority = PREFERENCE_PRIORITY_BODY_TYPE // Happens after gender so we can picka hairstyle based on that savefile_key = "hairstyle_name" savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_FEATURES @@ -146,19 +170,37 @@ /datum/preference/choiced/hairstyle/apply_to_human(mob/living/carbon/human/target, value) target.set_hairstyle(value, update = FALSE) +/datum/preference/choiced/hairstyle/create_default_value() + return /datum/sprite_accessory/hair/bald::name + +/datum/preference/choiced/hairstyle/create_informed_default_value(datum/preferences/preferences) + var/gender = preferences.read_preference(/datum/preference/choiced/gender) + var/species_type = preferences.read_preference(/datum/preference/choiced/species) + var/datum/species/species_real = GLOB.species_prototypes[species_type] + if(!gender || !species_real || !species_real.sexes) + return ..() + + var/picked_hair = random_hairstyle(gender) + var/datum/sprite_accessory/hair_style = SSaccessories.hairstyles_list[picked_hair] + if(!hair_style || !hair_style.natural_spawn || hair_style.locked) // Invalid, go with god(bald) + return ..() + + return picked_hair + /datum/preference/choiced/hairstyle/compile_constant_data() var/list/data = ..() - data[SUPPLEMENTAL_FEATURE_KEY] = "hair_color" + data[SUPPLEMENTAL_FEATURE_KEY] = /datum/preference/color/hair_color::savefile_key return data /datum/preference/choiced/hair_gradient - priority = PREFERENCE_PRIORITY_BODYPARTS + priority = PREFERENCE_PRIORITY_BODY_TYPE category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "hair_gradient" relevant_head_flag = HEAD_HAIR + can_randomize = FALSE /datum/preference/choiced/hair_gradient/init_possible_values() return assoc_to_keys_features(SSaccessories.hair_gradients_list) @@ -167,10 +209,10 @@ target.set_hair_gradient_style(new_style = value, update = FALSE) /datum/preference/choiced/hair_gradient/create_default_value() - return "None" + return /datum/sprite_accessory/gradient/none::name /datum/preference/color/hair_gradient - priority = PREFERENCE_PRIORITY_BODYPARTS + priority = PREFERENCE_PRIORITY_BODY_TYPE category = PREFERENCE_CATEGORY_SECONDARY_FEATURES savefile_identifier = PREFERENCE_CHARACTER savefile_key = "hair_gradient_color" @@ -182,4 +224,4 @@ /datum/preference/color/hair_gradient/is_accessible(datum/preferences/preferences) if (!..(preferences)) return FALSE - return preferences.read_preference(/datum/preference/choiced/hair_gradient) != "None" + return preferences.read_preference(/datum/preference/choiced/hair_gradient) != /datum/sprite_accessory/gradient/none::name diff --git a/code/modules/client/preferences/species_features/felinid.dm b/code/modules/client/preferences/species_features/felinid.dm index a6d43736cf46c..4c874ea7df750 100644 --- a/code/modules/client/preferences/species_features/felinid.dm +++ b/code/modules/client/preferences/species_features/felinid.dm @@ -29,5 +29,4 @@ target.dna.features["ears"] = value /datum/preference/choiced/ears/create_default_value() - var/datum/sprite_accessory/ears/cat/ears = /datum/sprite_accessory/ears/cat - return initial(ears.name) + return /datum/sprite_accessory/ears/cat::name diff --git a/code/modules/client/preferences/species_features/lizard.dm b/code/modules/client/preferences/species_features/lizard.dm index 5e4faf37d1f46..62df9e846aa51 100644 --- a/code/modules/client/preferences/species_features/lizard.dm +++ b/code/modules/client/preferences/species_features/lizard.dm @@ -142,5 +142,4 @@ target.dna.features["tail_lizard"] = value /datum/preference/choiced/lizard_tail/create_default_value() - var/datum/sprite_accessory/tails/lizard/smooth/tail = /datum/sprite_accessory/tails/lizard/smooth - return initial(tail.name) + return /datum/sprite_accessory/tails/lizard/smooth::name diff --git a/code/modules/client/preferences/species_features/monkey.dm b/code/modules/client/preferences/species_features/monkey.dm index adf9e367723de..8417cd7142e07 100644 --- a/code/modules/client/preferences/species_features/monkey.dm +++ b/code/modules/client/preferences/species_features/monkey.dm @@ -3,6 +3,7 @@ savefile_identifier = PREFERENCE_CHARACTER category = PREFERENCE_CATEGORY_SECONDARY_FEATURES relevant_external_organ = /obj/item/organ/external/tail/monkey + can_randomize = FALSE /datum/preference/choiced/monkey_tail/init_possible_values() return assoc_to_keys_features(SSaccessories.tails_list_monkey) @@ -11,5 +12,4 @@ target.dna.features["tail_monkey"] = value /datum/preference/choiced/monkey_tail/create_default_value() - var/datum/sprite_accessory/tails/monkey/default/tail = /datum/sprite_accessory/tails/monkey/default - return initial(tail.name) + return /datum/sprite_accessory/tails/monkey/default::name diff --git a/code/modules/client/preferences/trans_prosthetic.dm b/code/modules/client/preferences/trans_prosthetic.dm index fd28cb1ecf8c8..ea8128a1f44e4 100644 --- a/code/modules/client/preferences/trans_prosthetic.dm +++ b/code/modules/client/preferences/trans_prosthetic.dm @@ -3,6 +3,9 @@ savefile_key = "trans_prosthetic" savefile_identifier = PREFERENCE_CHARACTER +/datum/preference/choiced/trans_prosthetic/create_default_value() + return "Random" + /datum/preference/choiced/trans_prosthetic/init_possible_values() return list("Random") + GLOB.part_choice_transhuman diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 9a6448e2e6d54..5e848879d01f7 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -291,13 +291,13 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car return FALSE // Read everything into cache - for (var/preference_type in GLOB.preference_entries) - var/datum/preference/preference = GLOB.preference_entries[preference_type] + // Uses priority order as some values may rely on others for creating default values + for (var/datum/preference/preference as anything in get_preferences_in_priority_order()) if (preference.savefile_identifier != PREFERENCE_CHARACTER) continue - value_cache -= preference_type - read_preference(preference_type) + value_cache -= preference.type + read_preference(preference.type) //Character randomise = save_data?["randomise"] diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 358bff5ce80d5..e2632dd394e0c 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -27,15 +27,15 @@ /// Whether or not vision coloring is forcing var/forced_glass_color = FALSE +/obj/item/clothing/glasses/Initialize(mapload) + . = ..() + if(glass_colour_type) + AddElement(/datum/element/wearable_client_colour, glass_colour_type, ITEM_SLOT_EYES, forced = forced_glass_color) + /obj/item/clothing/glasses/suicide_act(mob/living/carbon/user) user.visible_message(span_suicide("[user] is stabbing \the [src] into [user.p_their()] eyes! It looks like [user.p_theyre()] trying to commit suicide!")) return BRUTELOSS -/obj/item/clothing/glasses/examine(mob/user) - . = ..() - if(glass_colour_type && !forced_glass_color && ishuman(user)) - . += span_notice("Alt-click to toggle [p_their()] colors.") - /obj/item/clothing/glasses/visor_toggling() . = ..() alternate_worn_layer = up ? ABOVE_BODY_FRONT_HEAD_LAYER : null @@ -62,37 +62,12 @@ H.set_eye_blur_if_lower(10 SECONDS) eyes.apply_organ_damage(5) -/obj/item/clothing/glasses/click_alt(mob/user) - if(isnull(glass_colour_type) || forced_glass_color || !ishuman(user)) - return NONE - var/mob/living/carbon/human/human_user = user - - if (HAS_TRAIT_FROM(human_user, TRAIT_SEE_GLASS_COLORS, GLASSES_TRAIT)) - REMOVE_TRAIT(human_user, TRAIT_SEE_GLASS_COLORS, GLASSES_TRAIT) - to_chat(human_user, span_notice("You will no longer see glasses colors.")) - else - ADD_TRAIT(human_user, TRAIT_SEE_GLASS_COLORS, GLASSES_TRAIT) - to_chat(human_user, span_notice("You will now see glasses colors.")) - human_user.update_glasses_color(src, TRUE) - return CLICK_ACTION_SUCCESS - -/obj/item/clothing/glasses/proc/change_glass_color(mob/living/carbon/human/H, datum/client_colour/glass_colour/new_color_type) - var/old_colour_type = glass_colour_type - if(!new_color_type || ispath(new_color_type)) //the new glass colour type must be null or a path. - glass_colour_type = new_color_type - if(H && H.glasses == src) - if(old_colour_type) - H.remove_client_colour(old_colour_type) - if(glass_colour_type) - H.update_glasses_color(src, 1) - - -/mob/living/carbon/human/proc/update_glasses_color(obj/item/clothing/glasses/G, glasses_equipped) - if((HAS_TRAIT(src, TRAIT_SEE_GLASS_COLORS) || G.forced_glass_color) && glasses_equipped) - add_client_colour(G.glass_colour_type) - else - remove_client_colour(G.glass_colour_type) - +/obj/item/clothing/glasses/proc/change_glass_color(new_color_type) + if(glass_colour_type) + RemoveElement(/datum/element/wearable_client_colour, glass_colour_type, ITEM_SLOT_EYES, forced = forced_glass_color) + glass_colour_type = new_color_type + if(glass_colour_type) + AddElement(/datum/element/wearable_client_colour, glass_colour_type, ITEM_SLOT_EYES, forced = forced_glass_color) /obj/item/clothing/glasses/meson name = "optical meson scanner" @@ -117,8 +92,14 @@ inhand_icon_state = "nvgmeson" flash_protect = FLASH_PROTECTION_SENSITIVE // Night vision mesons get the same but more intense - color_cutoffs = list(10, 30, 10) - glass_colour_type = /datum/client_colour/glass_colour/green + color_cutoffs = list(10, 35, 10) + glass_colour_type = /datum/client_colour/glass_colour/lightgreen + actions_types = list(/datum/action/item_action/toggle_nv) + forced_glass_color = TRUE + +/obj/item/clothing/glasses/meson/night/update_icon_state() + . = ..() + icon_state = length(color_cutoffs) ? initial(icon_state) : "nvgmeson_off" /obj/item/clothing/glasses/meson/gar name = "gar mesons" @@ -163,8 +144,14 @@ icon_state = "scihudnight" flash_protect = FLASH_PROTECTION_SENSITIVE // Real vivid purple - color_cutoffs = list(50, 10, 30) - glass_colour_type = /datum/client_colour/glass_colour/green + color_cutoffs = list(30, 5, 15) + glass_colour_type = /datum/client_colour/glass_colour/lightpurple + actions_types = list(/datum/action/item_action/toggle_nv) + forced_glass_color = TRUE + +/obj/item/clothing/glasses/science/night/update_icon_state() + . = ..() + icon_state = length(color_cutoffs) ? initial(icon_state) : "night_off" /obj/item/clothing/glasses/night name = "night vision goggles" @@ -174,8 +161,18 @@ flags_cover = GLASSESCOVERSEYES flash_protect = FLASH_PROTECTION_SENSITIVE // Dark green - color_cutoffs = list(10, 30, 10) - glass_colour_type = /datum/client_colour/glass_colour/green + color_cutoffs = list(10, 25, 10) + glass_colour_type = /datum/client_colour/glass_colour/lightgreen + actions_types = list(/datum/action/item_action/toggle_nv) + forced_glass_color = TRUE + +/obj/item/clothing/glasses/night/update_icon_state() + . = ..() + icon_state = length(color_cutoffs) ? initial(icon_state) : "night_off" + +/obj/item/clothing/glasses/night/colorless + desc = parent_type::desc + " Now with 50% less green!" + forced_glass_color = FALSE /obj/item/clothing/glasses/eyepatch name = "eyepatch" @@ -351,8 +348,8 @@ /obj/item/clothing/glasses/sunglasses/proc/add_glasses_slapcraft_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunsec, /datum/crafting_recipe/hudsunmed, /datum/crafting_recipe/hudsundiag, /datum/crafting_recipe/scienceglasses) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -371,8 +368,8 @@ /obj/item/clothing/glasses/sunglasses/chemical/add_glasses_slapcraft_component() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/scienceglassesremoval) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index c9fbb159126f3..064a24cf5c779 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -47,21 +47,21 @@ if(MODE_MESON) vision_flags = SEE_TURFS color_cutoffs = list(15, 12, 0) - change_glass_color(user, /datum/client_colour/glass_colour/yellow) + change_glass_color(/datum/client_colour/glass_colour/yellow) if(MODE_TRAY) //undoes the last mode, meson vision_flags = NONE color_cutoffs = null - change_glass_color(user, /datum/client_colour/glass_colour/lightblue) + change_glass_color(/datum/client_colour/glass_colour/lightblue) if(MODE_PIPE_CONNECTABLE) - change_glass_color(user, /datum/client_colour/glass_colour/lightblue) + change_glass_color(/datum/client_colour/glass_colour/lightblue) if(MODE_SHUTTLE) - change_glass_color(user, /datum/client_colour/glass_colour/red) + change_glass_color(/datum/client_colour/glass_colour/red) if(MODE_NONE) - change_glass_color(user, initial(glass_colour_type)) + change_glass_color(initial(glass_colour_type)) if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 46900c1caa9a5..4f5668f7bcce7 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -4,7 +4,7 @@ flags_1 = null //doesn't protect eyes because it's a monocle, duh var/hud_type = null - // NOTE: Just because you have a HUD display doesn't mean you should be able to interact with stuff on examine, that's where the associated trait (TRAIT_MEDICAL_HUD, TRAIT_SECURITY_HUD, etc) is necessary. + // NOTE: Just because you have a HUD display doesn't mean you should be able to interact with stuff on examine, that's where the associated trait (TRAIT_MEDICAL_HUD, TRAIT_SECURITY_HUD, etc) is necessary. /obj/item/clothing/glasses/hud/equipped(mob/living/carbon/human/user, slot) ..() @@ -67,8 +67,14 @@ flash_protect = FLASH_PROTECTION_SENSITIVE flags_cover = GLASSESCOVERSEYES // Blue green, dark - color_cutoffs = list(5, 15, 30) - glass_colour_type = /datum/client_colour/glass_colour/green + color_cutoffs = list(20, 20, 45) + glass_colour_type = /datum/client_colour/glass_colour/lightgreen + actions_types = list(/datum/action/item_action/toggle_nv) + forced_glass_color = TRUE + +/obj/item/clothing/glasses/hud/health/night/update_icon_state() + . = ..() + icon_state = length(color_cutoffs) ? initial(icon_state) : "night_off" /obj/item/clothing/glasses/hud/health/night/meson name = "night vision meson health scanner HUD" @@ -79,7 +85,8 @@ name = "night vision medical science scanner HUD" desc = "An clandestine medical science heads-up display that allows operatives to find \ dying captains and the perfect poison to finish them off in complete darkness." - clothing_traits = list(TRAIT_REAGENT_SCANNER) + clothing_traits = list(TRAIT_REAGENT_SCANNER, TRAIT_MEDICAL_HUD) + forced_glass_color = FALSE /obj/item/clothing/glasses/hud/health/sunglasses name = "medical HUDSunglasses" @@ -94,8 +101,8 @@ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunmedremoval) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -115,8 +122,14 @@ flash_protect = FLASH_PROTECTION_SENSITIVE flags_cover = GLASSESCOVERSEYES // Pale yellow - color_cutoffs = list(30, 20, 5) - glass_colour_type = /datum/client_colour/glass_colour/green + color_cutoffs = list(25, 15, 5) + glass_colour_type = /datum/client_colour/glass_colour/lightyellow + actions_types = list(/datum/action/item_action/toggle_nv) + forced_glass_color = TRUE + +/obj/item/clothing/glasses/hud/diagnostic/night/update_icon_state() + . = ..() + icon_state = length(color_cutoffs) ? initial(icon_state) : "night_off" /obj/item/clothing/glasses/hud/diagnostic/sunglasses name = "diagnostic sunglasses" @@ -131,8 +144,8 @@ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsundiagremoval) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -175,8 +188,8 @@ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/hudsunsecremoval) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -187,8 +200,14 @@ flash_protect = FLASH_PROTECTION_SENSITIVE flags_cover = GLASSESCOVERSEYES // Red with a tint of green - color_cutoffs = list(35, 5, 5) - glass_colour_type = /datum/client_colour/glass_colour/green + color_cutoffs = list(40, 15, 10) + glass_colour_type = /datum/client_colour/glass_colour/lightred + actions_types = list(/datum/action/item_action/toggle_nv) + forced_glass_color = TRUE + +/obj/item/clothing/glasses/hud/security/night/update_icon_state() + . = ..() + icon_state = length(color_cutoffs) ? initial(icon_state) : "night_off" /obj/item/clothing/glasses/hud/security/sunglasses/gars name = "\improper HUD gar glasses" @@ -257,15 +276,15 @@ if (DATA_HUD_MEDICAL_ADVANCED) icon_state = "meson" color_cutoffs = list(5, 15, 5) - change_glass_color(user, /datum/client_colour/glass_colour/green) + change_glass_color(/datum/client_colour/glass_colour/green) if (DATA_HUD_SECURITY_ADVANCED) icon_state = "thermal" color_cutoffs = list(25, 8, 5) - change_glass_color(user, /datum/client_colour/glass_colour/red) + change_glass_color(/datum/client_colour/glass_colour/red) else icon_state = "purple" color_cutoffs = list(15, 0, 25) - change_glass_color(user, /datum/client_colour/glass_colour/purple) + change_glass_color(/datum/client_colour/glass_colour/purple) user.update_sight() user.update_worn_glasses() diff --git a/code/modules/clothing/gloves/boxing.dm b/code/modules/clothing/gloves/boxing.dm index 03b1cbb5bf782..021d895f69c36 100644 --- a/code/modules/clothing/gloves/boxing.dm +++ b/code/modules/clothing/gloves/boxing.dm @@ -13,8 +13,8 @@ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/extendohand_l, /datum/crafting_recipe/extendohand_r) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index ddb0e07dd9986..bb0e12809955e 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -15,8 +15,8 @@ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/radiogloves) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -37,8 +37,8 @@ . = ..() var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/gripperoffbrand) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/modules/clothing/head/frenchberet.dm b/code/modules/clothing/head/frenchberet.dm index 40d8abc5b62ce..de63c6fddfdd1 100644 --- a/code/modules/clothing/head/frenchberet.dm +++ b/code/modules/clothing/head/frenchberet.dm @@ -6,37 +6,17 @@ greyscale_config_worn = /datum/greyscale_config/beret/worn greyscale_colors = "#972A2A" +/obj/item/clothing/head/frenchberet/Initialize(mapload) + . = ..() + AddComponent(/datum/component/speechmod, replacements = strings("french_replacement.json", "french"), end_string = list(" Honh honh honh!"," Honh!"," Zut Alors!"), end_string_chance = 3, slots = ITEM_SLOT_HEAD) /obj/item/clothing/head/frenchberet/equipped(mob/M, slot) . = ..() if (slot & ITEM_SLOT_HEAD) - RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) ADD_TRAIT(M, TRAIT_GARLIC_BREATH, type) else - UnregisterSignal(M, COMSIG_MOB_SAY) REMOVE_TRAIT(M, TRAIT_GARLIC_BREATH, type) /obj/item/clothing/head/frenchberet/dropped(mob/M) . = ..() - UnregisterSignal(M, COMSIG_MOB_SAY) REMOVE_TRAIT(M, TRAIT_GARLIC_BREATH, type) - -/obj/item/clothing/head/frenchberet/proc/handle_speech(datum/source, list/speech_args) - SIGNAL_HANDLER - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = " [message]" - var/list/french_words = strings("french_replacement.json", "french") - - for(var/key in french_words) - var/value = french_words[key] - if(islist(value)) - value = pick(value) - - message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") - message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") - message = replacetextEx(message, " [key]", " [value]") - - if(prob(3)) - message += pick(" Honh honh honh!"," Honh!"," Zut Alors!") - speech_args[SPEECH_MESSAGE] = trim(message) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 018543d93a33c..fc56f83342346 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -123,7 +123,7 @@ flash_protect = FLASH_PROTECTION_WELDER tint = 2 flags_inv = HIDEEYES | HIDEFACE | HIDESNOUT - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT visor_flags_inv = HIDEEYES | HIDEFACE | HIDESNOUT visor_flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF @@ -158,6 +158,14 @@ if(!up) . += visor_state +/obj/item/clothing/head/utility/hardhat/welding/up + up = TRUE // for calls to worn_overlays before init (prefs) + +/obj/item/clothing/head/utility/hardhat/welding/up/Initialize(mapload) + . = ..() + up = FALSE + visor_toggling() + /obj/item/clothing/head/utility/hardhat/welding/orange icon_state = "hardhat0_orange" inhand_icon_state = null @@ -175,6 +183,15 @@ cold_protection = HEAD min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT +/obj/item/clothing/head/utility/hardhat/welding/white/up + up = TRUE // for calls to worn_overlays before init (prefs) + +/obj/item/clothing/head/utility/hardhat/welding/white/up/Initialize(mapload) + . = ..() + up = FALSE + visor_toggling() + + /obj/item/clothing/head/utility/hardhat/welding/dblue icon_state = "hardhat0_dblue" inhand_icon_state = null @@ -226,6 +243,10 @@ . = ..() if(isnull(.)) return + if(new_value) + AddElement(/datum/element/wearable_client_colour, /datum/client_colour/halloween_helmet, ITEM_SLOT_HEAD, forced = TRUE) + else + RemoveElement(/datum/element/wearable_client_colour, /datum/client_colour/halloween_helmet, ITEM_SLOT_HEAD, forced = TRUE) update_icon(UPDATE_OVERLAYS) /obj/item/clothing/head/utility/hardhat/pumpkinhead/update_overlays() diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 27be2799b7d2e..4d41d9daa5c76 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/clothing/head/helmet.dmi' worn_icon = 'icons/mob/clothing/head/helmet.dmi' icon_state = "helmet" + base_icon_state = "helmet" inhand_icon_state = "helmet" armor_type = /datum/armor/head_helmet cold_protection = HEAD @@ -31,6 +32,7 @@ AddElement(/datum/element/update_icon_updates_onmob) /obj/item/clothing/head/helmet/sec + var/flipped_visor = FALSE /obj/item/clothing/head/helmet/sec/Initialize(mapload) . = ..() @@ -60,6 +62,19 @@ return ..() +/obj/item/clothing/head/helmet/sec/click_alt(mob/user) + flipped_visor = !flipped_visor + balloon_alert(user, "visor flipped") + // base_icon_state is modified for seclight attachment component + base_icon_state = "[initial(base_icon_state)][flipped_visor ? "-novisor" : ""]" + icon_state = base_icon_state + if (flipped_visor) + flags_cover &= ~HEADCOVERSEYES + else + flags_cover |= HEADCOVERSEYES + update_appearance() + return CLICK_ACTION_SUCCESS + /obj/item/clothing/head/helmet/alt name = "bulletproof helmet" desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." @@ -395,6 +410,7 @@ armor_type = /datum/armor/helmet_knight flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + resistance_flags = NONE strip_delay = 80 dog_fashion = null clothing_traits = list(TRAIT_HEAD_INJURY_BLOCKED) diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 5ea7d62313bd4..a5041de7fa0a9 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -412,8 +412,8 @@ /datum/crafting_recipe/sturdy_shako,\ ) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/modules/clothing/head/welding.dm b/code/modules/clothing/head/welding.dm index cb785447174f7..e3f014875dde4 100644 --- a/code/modules/clothing/head/welding.dm +++ b/code/modules/clothing/head/welding.dm @@ -2,7 +2,7 @@ name = "welding helmet" desc = "A head-mounted face cover designed to protect the wearer completely from space-arc eye." icon_state = "welding" - flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF inhand_icon_state = "welding" lefthand_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi' righthand_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' diff --git a/code/modules/clothing/masks/_masks.dm b/code/modules/clothing/masks/_masks.dm index c1d29d65c8641..5255b758b6faf 100644 --- a/code/modules/clothing/masks/_masks.dm +++ b/code/modules/clothing/masks/_masks.dm @@ -8,7 +8,6 @@ strip_delay = 40 equip_delay_other = 40 visor_vars_to_toggle = NONE - var/modifies_speech = FALSE var/adjusted_flags = null ///Did we install a filtering cloth? var/has_filter = FALSE @@ -25,31 +24,6 @@ var/status = !(clothing_flags & VOICEBOX_DISABLED) to_chat(user, span_notice("You turn the voice box in [src] [status ? "on" : "off"].")) -/obj/item/clothing/mask/equipped(mob/M, slot) - . = ..() - if ((slot & ITEM_SLOT_MASK) && modifies_speech) - RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - else - UnregisterSignal(M, COMSIG_MOB_SAY) - -/obj/item/clothing/mask/dropped(mob/M) - . = ..() - UnregisterSignal(M, COMSIG_MOB_SAY) - -/obj/item/clothing/mask/vv_edit_var(vname, vval) - if(vname == NAMEOF(src, modifies_speech) && ismob(loc)) - var/mob/M = loc - if(M.get_item_by_slot(ITEM_SLOT_MASK) == src) - if(vval) - if(!modifies_speech) - RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) - else if(modifies_speech) - UnregisterSignal(M, COMSIG_MOB_SAY) - return ..() - -/obj/item/clothing/mask/proc/handle_speech() - SIGNAL_HANDLER - /obj/item/clothing/mask/worn_overlays(mutable_appearance/standing, isinhands = FALSE) . = ..() if(isinhands) diff --git a/code/modules/clothing/masks/animal_masks.dm b/code/modules/clothing/masks/animal_masks.dm index 5df5c6738d8e5..05e5888168e12 100644 --- a/code/modules/clothing/masks/animal_masks.dm +++ b/code/modules/clothing/masks/animal_masks.dm @@ -16,7 +16,7 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( /obj/item/clothing/mask/animal w_class = WEIGHT_CLASS_SMALL clothing_flags = VOICEBOX_TOGGLABLE - modifies_speech = TRUE + var/modifies_speech = TRUE flags_cover = MASKCOVERSMOUTH var/animal_type ///what kind of animal the masks represents. used for automatic name and description generation. @@ -32,6 +32,17 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( if(cursed) make_cursed() +/obj/item/clothing/mask/animal/equipped(mob/M, slot) + . = ..() + if ((slot & ITEM_SLOT_MASK) && modifies_speech) + RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + else + UnregisterSignal(M, COMSIG_MOB_SAY) + +/obj/item/clothing/mask/animal/dropped(mob/M) + . = ..() + UnregisterSignal(M, COMSIG_MOB_SAY) + /obj/item/clothing/mask/animal/vv_edit_var(vname, vval) if(vname == NAMEOF(src, cursed)) if(vval) @@ -39,6 +50,14 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( make_cursed() else if(cursed) clear_curse() + if(vname == NAMEOF(src, modifies_speech) && ismob(loc)) + var/mob/M = loc + if(M.get_item_by_slot(ITEM_SLOT_MASK) == src) + if(vval) + if(!modifies_speech) + RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + else if(modifies_speech) + UnregisterSignal(M, COMSIG_MOB_SAY) return ..() /obj/item/clothing/mask/animal/examine(mob/user) @@ -90,7 +109,9 @@ GLOBAL_LIST_INIT(cursed_animal_masks, list( UnregisterSignal(M, COMSIG_MOB_SAY) M.update_worn_mask() -/obj/item/clothing/mask/animal/handle_speech(datum/source, list/speech_args) +/obj/item/clothing/mask/animal/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + if(clothing_flags & VOICEBOX_DISABLED) return if(!modifies_speech || !LAZYLEN(animal_sounds)) diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 468b1272f8604..9ac45c42d9919 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -34,31 +34,10 @@ inhand_icon_state = null flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT w_class = WEIGHT_CLASS_SMALL - modifies_speech = TRUE -/obj/item/clothing/mask/luchador/handle_speech(datum/source, list/speech_args) - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = replacetext(message, "captain", "CAPITÁN") - message = replacetext(message, "station", "ESTACIÓN") - message = replacetext(message, "sir", "SEÑOR") - message = replacetext(message, "the ", "el ") - message = replacetext(message, "my ", "mi ") - message = replacetext(message, "is ", "es ") - message = replacetext(message, "it's", "es") - message = replacetext(message, "friend", "amigo") - message = replacetext(message, "buddy", "amigo") - message = replacetext(message, "hello", "hola") - message = replacetext(message, " hot", " caliente") - message = replacetext(message, " very ", " muy ") - message = replacetext(message, "sword", "espada") - message = replacetext(message, "library", "biblioteca") - message = replacetext(message, "traitor", "traidor") - message = replacetext(message, "wizard", "mago") - message = uppertext(message) //Things end up looking better this way (no mixed cases), and it fits the macho wrestler image. - if(prob(25)) - message += " OLE!" - speech_args[SPEECH_MESSAGE] = message +/obj/item/clothing/head/frenchberet/Initialize(mapload) + . = ..() + AddComponent(/datum/component/speechmod, replacements = strings("luchador_replacement.json", "luchador"), end_string = " OLE!", end_string_chance = 25, uppercase = TRUE, slots = ITEM_SLOT_MASK) /obj/item/clothing/mask/luchador/tecnicos name = "Tecnicos Mask" diff --git a/code/modules/clothing/masks/gondola.dm b/code/modules/clothing/masks/gondola.dm index 7a8283293ded2..bfaae3cb3f314 100644 --- a/code/modules/clothing/masks/gondola.dm +++ b/code/modules/clothing/masks/gondola.dm @@ -5,18 +5,7 @@ inhand_icon_state = null flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT w_class = WEIGHT_CLASS_SMALL - modifies_speech = TRUE -/obj/item/clothing/mask/gondola/handle_speech(datum/source, list/speech_args) - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = " [message]" - var/list/spurdo_words = strings("spurdo_replacement.json", "spurdo") - for(var/key in spurdo_words) - var/value = spurdo_words[key] - if(islist(value)) - value = pick(value) - message = replacetextEx(message,regex(uppertext(key),"g"), "[uppertext(value)]") - message = replacetextEx(message,regex(capitalize(key),"g"), "[capitalize(value)]") - message = replacetextEx(message,regex(key,"g"), "[value]") - speech_args[SPEECH_MESSAGE] = trim(message) +/obj/item/clothing/mask/gondola/Initialize(mapload) + . = ..() + AddComponent(/datum/component/speechmod, replacements = strings("spurdo_replacement.json", "spurdo"), slots = ITEM_SLOT_MASK) diff --git a/code/modules/clothing/masks/moustache.dm b/code/modules/clothing/masks/moustache.dm index aaf59be51e4fd..5b71e7a426090 100644 --- a/code/modules/clothing/masks/moustache.dm +++ b/code/modules/clothing/masks/moustache.dm @@ -10,23 +10,7 @@ /obj/item/clothing/mask/fakemoustache/italian name = "italian moustache" desc = "Made from authentic Italian moustache hairs. Gives the wearer an irresistable urge to gesticulate wildly." - modifies_speech = TRUE -/obj/item/clothing/mask/fakemoustache/italian/handle_speech(datum/source, list/speech_args) - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = " [message]" - var/list/italian_words = strings("italian_replacement.json", "italian") - - for(var/key in italian_words) - var/value = italian_words[key] - if(islist(value)) - value = pick(value) - - message = replacetextEx(message, " [uppertext(key)]", " [uppertext(value)]") - message = replacetextEx(message, " [capitalize(key)]", " [capitalize(value)]") - message = replacetextEx(message, " [key]", " [value]") - - if(prob(3)) - message += pick(" Ravioli, ravioli, give me the formuoli!"," Mamma-mia!"," Mamma-mia! That's a spicy meat-ball!", " La la la la la funiculi funicula!") - speech_args[SPEECH_MESSAGE] = trim(message) +/obj/item/clothing/mask/fakemoustache/italian/Initialize(mapload) + . = ..() + AddComponent(/datum/component/speechmod, replacements = strings("italian_replacement.json", "italian"), end_string = list(" Ravioli, ravioli, give me the formuoli!"," Mamma-mia!"," Mamma-mia! That's a spicy meat-ball!", " La la la la la funiculi funicula!"), end_string_chance = 3, slots = ITEM_SLOT_MASK) diff --git a/code/modules/clothing/masks/muzzle.dm b/code/modules/clothing/masks/muzzle.dm index 32f29a54a1f43..6154e7762cb52 100644 --- a/code/modules/clothing/masks/muzzle.dm +++ b/code/modules/clothing/masks/muzzle.dm @@ -5,11 +5,14 @@ inhand_icon_state = "blindfold" lefthand_file = 'icons/mob/inhands/clothing/glasses_lefthand.dmi' righthand_file = 'icons/mob/inhands/clothing/glasses_righthand.dmi' - clothing_flags = BLOCKS_SPEECH flags_cover = MASKCOVERSMOUTH w_class = WEIGHT_CLASS_SMALL equip_delay_other = 20 +/obj/item/clothing/mask/muzzle/Initialize(mapload) + . = ..() + AddElement(/datum/element/muffles_speech) + /obj/item/clothing/mask/muzzle/attack_paw(mob/user, list/modifiers) if(iscarbon(user)) var/mob/living/carbon/carbon_user = user @@ -26,7 +29,7 @@ lefthand_file = 'icons/mob/inhands/clothing/masks_lefthand.dmi' righthand_file = 'icons/mob/inhands/clothing/masks_righthand.dmi' body_parts_covered = NONE - clothing_flags = MASKINTERNALS | BLOCKS_SPEECH + clothing_flags = MASKINTERNALS armor_type = /datum/armor/muzzle_breath equip_delay_other = 25 // my sprite has 4 straps, a-la a head harness. takes a while to equip, longer than a muzzle @@ -37,7 +40,7 @@ worn_icon_state = "tape_piece_worn" inhand_icon_state = null w_class = WEIGHT_CLASS_TINY - clothing_flags = INEDIBLE_CLOTHING|BLOCKS_SPEECH + clothing_flags = INEDIBLE_CLOTHING equip_delay_other = 40 strip_delay = 40 greyscale_config = /datum/greyscale_config/tape_piece diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index db20562039b23..2aa61b0046070 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -242,7 +242,7 @@ /obj/item/storage/box/lights/mixed = 1, ) belt = /obj/item/storage/belt/janitor/full - glasses = /obj/item/clothing/glasses/night + glasses = /obj/item/clothing/glasses/night/colorless l_pocket = /obj/item/grenade/chem_grenade/cleaner r_pocket = /obj/item/grenade/chem_grenade/cleaner l_hand = /obj/item/storage/bag/trash/bluespace diff --git a/code/modules/clothing/spacesuits/pirate.dm b/code/modules/clothing/spacesuits/pirate.dm index 946c0c2b66fdd..ca041d68d036f 100644 --- a/code/modules/clothing/spacesuits/pirate.dm +++ b/code/modules/clothing/spacesuits/pirate.dm @@ -30,3 +30,15 @@ armor_type = /datum/armor/space_pirate strip_delay = 40 equip_delay_other = 20 + +/obj/item/clothing/head/helmet/space/pirate/tophat + name = "designer pirate helmet" + desc = "A modified EVA helmet with a five-thousand credit Lizzy Vuitton hat affixed to the top, proving that working in deep space is no excuse for being poor." + icon_state = "spacetophat" + +/obj/item/clothing/suit/space/pirate/silverscale + name = "designer pirate suit" + desc = "A specially-made Cybersun branded space suit; the fine plastisilk exterior is woven from the coccons of black-market Lümlan mothroaches \ + and the trim is lined with the ivory of the critically endagered Zanzibarian dwarf elephant. Baby seal leather boots sold seperately." + inhand_icon_state = "syndicate-black" + icon_state = "syndicate-black-white" diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 67702582ff857..9cca1cfc3af08 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -28,6 +28,7 @@ GLOBAL_LIST_INIT(syndicate_space_suits_to_helmets,list( /obj/item/clothing/suit/space/syndicate/black/blue = /obj/item/clothing/head/helmet/space/syndicate/black/blue, /obj/item/clothing/suit/space/syndicate/black/orange = /obj/item/clothing/head/helmet/space/syndicate/black/orange, /obj/item/clothing/suit/space/syndicate/black/red = /obj/item/clothing/head/helmet/space/syndicate/black/red, + /obj/item/clothing/suit/space/syndicate/black/white = /obj/item/clothing/head/helmet/space/syndicate/black, /obj/item/clothing/suit/space/syndicate/black/med = /obj/item/clothing/head/helmet/space/syndicate/black/med, /obj/item/clothing/suit/space/syndicate/black/engie = /obj/item/clothing/head/helmet/space/syndicate/black/engie, )) @@ -132,6 +133,13 @@ GLOBAL_LIST_INIT(syndicate_space_suits_to_helmets,list( inhand_icon_state = "syndicate-black-blue" helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black/blue +//Black and white syndicate space suit without the medical iconography +/obj/item/clothing/suit/space/syndicate/black/white + name = "black and white space suit" + icon_state = "syndicate-black-white" + inhand_icon_state = "syndicate-black" + helmet_type = /obj/item/clothing/head/helmet/space/syndicate/black + //Black medical syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/black/med diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index 9cf86a396e95a..929e8d931d5ca 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -21,6 +21,10 @@ body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK|HIDESNOUT +/obj/item/clothing/head/hooded/flashsuit/Initialize(mapload) + . = ..() + AddElement(/datum/element/wearable_client_colour, /datum/client_colour/flash_hood, ITEM_SLOT_HEAD, forced = TRUE) + /obj/item/clothing/suit/costume/pirate name = "pirate coat" desc = "Yarr." diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index f333ec53917a9..2b8fef5bb5b46 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -385,27 +385,6 @@ body_parts_covered = HEAD flags_inv = HIDEHAIR|HIDEEARS -// Research Director - -/obj/item/clothing/suit/jacket/research_director - name = "research director's coat" - desc = "A mix between a labcoat and just a regular coat. It's made out of a special anti-bacterial, anti-acidic, and anti-biohazardous synthetic fabric." - icon_state = "labcoat_rd" - armor_type = /datum/armor/jacket_research_director - body_parts_covered = CHEST|GROIN|ARMS - -/datum/armor/jacket_research_director - bio = 75 - fire = 75 - acid = 75 - -/obj/item/clothing/suit/jacket/research_director/Initialize(mapload) - . = ..() - allowed += list( - /obj/item/storage/bag/xeno, - /obj/item/melee/baton/telescopic, - ) - // Atmos /obj/item/clothing/suit/atmos_overalls name = "atmospherics overalls" diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index f48e49c11b701..e5cda21a78a77 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -69,6 +69,10 @@ greyscale_config_worn = /datum/greyscale_config/labcoat/worn greyscale_colors = "#EEEEEE#4A77A1#4A77A1#7095C2" +/obj/item/clothing/suit/toggle/labcoat/genetics/Initialize(mapload) + . = ..() + allowed += /obj/item/sequence_scanner + /obj/item/clothing/suit/toggle/labcoat/chemist name = "chemist labcoat" desc = "A suit that protects against minor chemical spills. Has an orange stripe on the shoulder." @@ -138,3 +142,24 @@ greyscale_config = /datum/greyscale_config/labcoat greyscale_config_worn = /datum/greyscale_config/labcoat/worn greyscale_colors = "#EEEEEE#88242D#88242D#39393F" + +// Research Director + +/obj/item/clothing/suit/toggle/labcoat/research_director + name = "research director's coat" + desc = "A mix between a labcoat and just a regular coat. It's made out of a special anti-bacterial, anti-acidic, and anti-biohazardous synthetic fabric." + icon_state = "labcoat_rd" + armor_type = /datum/armor/jacket_research_director + body_parts_covered = CHEST|GROIN|ARMS + +/datum/armor/jacket_research_director + bio = 75 + fire = 75 + acid = 75 + +/obj/item/clothing/suit/toggle/labcoat/research_director/Initialize(mapload) + . = ..() + allowed += list( + /obj/item/storage/bag/xeno, + /obj/item/melee/baton/telescopic, + ) diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm index 02c3399db7b4d..dcc33fb65376b 100644 --- a/code/modules/clothing/suits/wintercoats.dm +++ b/code/modules/clothing/suits/wintercoats.dm @@ -49,6 +49,7 @@ /obj/item/clothing/suit/hooded/wintercoat/click_alt(mob/user) zipped = !zipped + playsound(src, 'sound/items/zip_up.ogg', 30, TRUE, -3) worn_icon_state = "[initial(icon_state)][zipped ? "_t" : ""]" balloon_alert(user, "[zipped ? "" : "un"]zipped") @@ -502,6 +503,10 @@ inhand_icon_state = null hoodtype = /obj/item/clothing/head/hooded/winterhood/science/genetics +/obj/item/clothing/suit/hooded/wintercoat/science/genetics/Initialize(mapload) + . = ..() + allowed += /obj/item/sequence_scanner + /obj/item/clothing/head/hooded/winterhood/science/genetics desc = "A white winter coat hood. It's warm." icon_state = "hood_genetics" diff --git a/code/modules/deathmatch/deathmatch_loadouts.dm b/code/modules/deathmatch/deathmatch_loadouts.dm index a24663b3ba439..911e5bf6e1b15 100644 --- a/code/modules/deathmatch/deathmatch_loadouts.dm +++ b/code/modules/deathmatch/deathmatch_loadouts.dm @@ -673,7 +673,7 @@ /datum/outfit/deathmatch_loadout/battler/clown/upgraded name = "Deathmatch: Clown (Syndicate Gear)" - display_name = "Clown" + display_name = "Clown Commando" desc = "They were bound to show up sooner or later." shoes = /obj/item/clothing/shoes/clown_shoes/combat @@ -727,7 +727,7 @@ /datum/outfit/deathmatch_loadout/chef/upgraded name = "Deathmatch: Master Chef" - display_name = "Chef" + display_name = "Master Chef" desc = "Let him cook." belt = /obj/item/gun/magic/hook diff --git a/code/modules/deathmatch/deathmatch_lobby.dm b/code/modules/deathmatch/deathmatch_lobby.dm index 028653a2f2124..ffc41c887162d 100644 --- a/code/modules/deathmatch/deathmatch_lobby.dm +++ b/code/modules/deathmatch/deathmatch_lobby.dm @@ -21,6 +21,8 @@ var/list/modifiers = list() /// Is the modifiers modal menu open (for the host) var/mod_menu_open = FALSE + /// artificial time padding when we start loading to give lighting a breather (admin starts will set this to 0) + var/start_time = 8 SECONDS /datum/deathmatch_lobby/New(mob/player) . = ..() @@ -79,7 +81,7 @@ UnregisterSignal(source, COMSIG_LAZY_TEMPLATE_LOADED) map.template_in_use = FALSE - addtimer(CALLBACK(src, PROC_REF(start_game_after_delay)), 8 SECONDS) + addtimer(CALLBACK(src, PROC_REF(start_game_after_delay)), start_time) /datum/deathmatch_lobby/proc/start_game_after_delay() if (!length(player_spawns) || length(player_spawns) < length(players)) @@ -152,7 +154,14 @@ GLOB.deathmatch_game.modifiers[modifier].apply(new_player, src) // register death handling. - RegisterSignals(new_player, list(COMSIG_LIVING_DEATH, COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING), PROC_REF(player_died)) + register_player_signals(new_player) + +/datum/deathmatch_lobby/proc/register_player_signals(new_player) + RegisterSignals(new_player, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING, COMSIG_MOB_GHOSTIZED), PROC_REF(player_died)) + RegisterSignal(new_player, COMSIG_LIVING_ON_WABBAJACKED, PROC_REF(player_wabbajacked)) + +/datum/deathmatch_lobby/proc/unregister_player_signals(new_player) + UnregisterSignal(new_player, list(COMSIG_LIVING_DEATH, COMSIG_QDELETING, COMSIG_MOB_GHOSTIZED, COMSIG_LIVING_ON_WABBAJACKED)) /datum/deathmatch_lobby/proc/game_took_too_long() if (!location || QDELING(src)) @@ -173,9 +182,9 @@ for(var/ckey in players) var/mob/loser = players[ckey]["mob"] - UnregisterSignal(loser, list(COMSIG_MOB_GHOSTIZED, COMSIG_QDELETING)) + unregister_player_signals(loser) players[ckey]["mob"] = null - loser.ghostize() + loser.ghostize(can_reenter_corpse = FALSE) qdel(loser) for(var/datum/deathmatch_modifier/modifier in modifiers) @@ -185,12 +194,18 @@ GLOB.deathmatch_game.remove_lobby(host) log_game("Deathmatch game [host] ended.") +/datum/deathmatch_lobby/proc/player_wabbajacked(mob/living/player, mob/living/new_mob) + SIGNAL_HANDLER + unregister_player_signals(player) + players[player.ckey]["mob"] = new_mob + register_player_signals(new_mob) + /datum/deathmatch_lobby/proc/player_died(mob/living/player, gibbed) SIGNAL_HANDLER - if(isnull(player) || QDELING(src)) + if(isnull(player) || QDELING(src) || HAS_TRAIT_FROM(player, TRAIT_NO_TRANSFORM, MAGIC_TRAIT)) //this trait check fixes polymorphing return - var/ckey = player.ckey + var/ckey = player.ckey ? player.ckey : player.mind?.key if(!islist(players[ckey])) // potentially the player info could hold a reference to this mob so we can figure the ckey out without worrying about ghosting and suicides n such for(var/potential_ckey in players) var/list/player_info = players[potential_ckey] @@ -209,8 +224,9 @@ announce(span_reallybig("[player.real_name] HAS DIED.
    [players.len] REMAIN.")) - if(!gibbed && !QDELING(player)) + if(!gibbed && !QDELING(player) && !isdead(player)) if(!HAS_TRAIT(src, TRAIT_DEATHMATCH_EXPLOSIVE_IMPLANTS)) + unregister_player_signals(player) player.dust(TRUE, TRUE, TRUE) if (players.len <= 1) end_game() @@ -338,6 +354,7 @@ .["maps"] = list() for (var/map_key in GLOB.deathmatch_game.maps) .["maps"] += map_key + .["maps"] = sort_list(.["maps"]) /datum/deathmatch_lobby/ui_data(mob/user) @@ -499,12 +516,13 @@ if ("admin") // Admin functions if (!check_rights(R_ADMIN)) - message_admins("[usr.key] has attempted to use admin functions in a deathmatch lobby!") + message_admins("[usr.key] has attempted to use admin functions in a deathmatch lobby without being an admin!") log_admin("[key_name(usr)] tried to use the deathmatch lobby admin functions without authorization.") return switch (params["func"]) if ("Force start") log_admin("[key_name(usr)] force started deathmatch lobby [host].") + start_time = 0 start_game() return FALSE diff --git a/code/modules/deathmatch/deathmatch_mapping.dm b/code/modules/deathmatch/deathmatch_mapping.dm index 320b87d2fd15d..9f006e1524295 100644 --- a/code/modules/deathmatch/deathmatch_mapping.dm +++ b/code/modules/deathmatch/deathmatch_mapping.dm @@ -2,7 +2,7 @@ name = "Deathmatch Arena" requires_power = FALSE has_gravity = STANDARD_GRAVITY - area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | QUIET_LOGS + area_flags = UNIQUE_AREA | NOTELEPORT | EVENT_PROTECTED | QUIET_LOGS | NO_DEATH_MESSAGE | BINARY_JAMMING /area/deathmatch/fullbright static_lighting = FALSE @@ -12,7 +12,7 @@ name = "Deathmatch Player Spawner" /area/deathmatch/teleport //Prevent access to cross-z teleportation in the map itself (no wands of safety/teleportation scrolls). Cordons should prevent same-z teleportations outside of the arena. - area_flags = UNIQUE_AREA | EVENT_PROTECTED | QUIET_LOGS + area_flags = /area/deathmatch::area_flags & ~NOTELEPORT // for the illusion of a moving train /turf/open/chasm/true/no_smooth/fake_motion_sand diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 358057e1de0d9..0a41f5ffb6c9a 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -22,7 +22,7 @@ var/holidayID = "" //string which should be in the SSeventss.holidays list if you wish this event to be holiday-specific //anything with a (non-null) holidayID which does not match holiday, cannot run. var/wizardevent = FALSE - var/alert_observers = TRUE //should we let the ghosts and admins know this event is firing + var/alert_observers = TRUE //should we let the ghosts know this event is firing //should be disabled on events that fire a lot /// Minimum wizard rituals at which to trigger this event, inclusive @@ -101,15 +101,14 @@ triggering = TRUE - // We sleep HERE, in pre-event setup (because there's no sense doing it in run_event() 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) (SOMETHING ELSE)") - 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)) - message_admins("Second pre-condition check for [name] failed, rerolling...") - SSevents.spawnEvent(excluded_event = src) - return EVENT_INTERRUPTED + // We sleep HERE, in pre-event setup (because there's no sense doing it in run_event() 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 or at least reroll it. + message_admins("Random Event triggering in [DisplayTimeText(RANDOM_EVENT_ADMIN_INTERVENTION_TIME)]: [name]. (CANCEL) (SOMETHING ELSE)") + 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)) + message_admins("Second pre-condition check for [name] failed, rerolling...") + SSevents.spawnEvent(excluded_event = src) + return EVENT_INTERRUPTED if(!triggering) return EVENT_CANCELLED //admin cancelled diff --git a/code/modules/events/ghost_role/fugitive_event.dm b/code/modules/events/ghost_role/fugitive_event.dm index 88d63d91bb5fe..9eb792a6f6ab3 100644 --- a/code/modules/events/ghost_role/fugitive_event.dm +++ b/code/modules/events/ghost_role/fugitive_event.dm @@ -61,6 +61,7 @@ HUNTER_PACK_RUSSIAN, HUNTER_PACK_BOUNTY, HUNTER_PACK_PSYKER, + HUNTER_PACK_MI13, ) addtimer(CALLBACK(src, PROC_REF(check_spawn_hunters), hunter_backstory, 10 MINUTES), 1 MINUTES) role_name = "fugitive hunter" @@ -124,6 +125,8 @@ ship = new /datum/map_template/shuttle/hunter/bounty if(HUNTER_PACK_PSYKER) ship = new /datum/map_template/shuttle/hunter/psyker + if(HUNTER_PACK_MI13) + ship = new/datum/map_template/shuttle/hunter/mi13_foodtruck var/x = rand(TRANSITIONEDGE,world.maxx - TRANSITIONEDGE - ship.width) var/y = rand(TRANSITIONEDGE,world.maxy - TRANSITIONEDGE - ship.height) @@ -152,6 +155,38 @@ header = "Spawn Here!", ) - priority_announce("Unidentified ship detected near the station.") + var/list/announcement_text_list = list() + var/announcement_title = "" + switch(backstory) + if(HUNTER_PACK_COPS) + announcement_text_list += "Attention Crew of [GLOB.station_name], this is the Police. A wanted criminal has been reported taking refuge on your station." + announcement_text_list += "We have a warrant from the SSC authorities to take them into custody. Officers have been dispatched to your location." + announcement_text_list += "We demand your cooperation in bringing this criminal to justice." + announcement_title += "Spacepol Command" + if(HUNTER_PACK_RUSSIAN) + announcement_text_list += "Zdraviya zhelaju, [GLOB.station_name] crew. We are coming to your station." + announcement_text_list += "There is a criminal aboard. We will arrest them and return them to the gulag. That's good, yes?" + announcement_title += "Russian Freighter" + if(HUNTER_PACK_BOUNTY) + announcement_text_list += "[GLOB.station_name]. One of our bounty marks has ended up on your station. We will be arriving to collect shortly." + announcement_text_list += "Let's make this quick. If you don't want trouble, stay the hell out of our way." + announcement_title += "Unregistered Signal" + if(HUNTER_PACK_PSYKER) + announcement_text_list += "HEY, CAN YOU HEAR US? We're coming to your station. There's a bad guy down there, really bad guy. We need to arrest them." + announcement_text_list += "We're also offering fortune telling services out of the front door if you have paying customers." + announcement_title += "Fortune-Telling Entertainment Shuttle" + if(HUNTER_PACK_MI13) + announcement_text_list += "Illegal intrusion detected in the crew monitoring network. Central Command has been informed." + announcement_text_list += "Please report any suspicious individuals or behaviour to your local security team." + announcement_title += "Nanotrasen Intrusion Countermeasures Electronics" + if(!length(announcement_text_list)) + announcement_text_list += "Unidentified ship detected near the station." + stack_trace("Fugitive hunter announcement was unable to generate an announcement text based on backstory: [backstory]") + + if(!length(announcement_title)) + announcement_title += "Unknown Signal" + stack_trace("Fugitive hunter announcement was unable to generate an announcement title based on backstory: [backstory]") + + priority_announce(jointext(announcement_text_list, " "), announcement_title) #undef TEAM_BACKSTORY_SIZE diff --git a/code/modules/events/space_vines/vine_mutations.dm b/code/modules/events/space_vines/vine_mutations.dm index 0571f4d0509f3..c2f8e2d41393c 100644 --- a/code/modules/events/space_vines/vine_mutations.dm +++ b/code/modules/events/space_vines/vine_mutations.dm @@ -335,6 +335,7 @@ //This specific mutation only covers floors instead of structures, items, mobs and cant tangle mobs /datum/spacevine_mutation/timid/on_birth(obj/structure/spacevine/holder) SET_PLANE_IMPLICIT(holder, FLOOR_PLANE) + holder.layer = ABOVE_OPEN_TURF_LAYER holder.light_state = PASS_LIGHT holder.can_tangle = FALSE return ..() diff --git a/code/modules/events/space_vines/vine_structure.dm b/code/modules/events/space_vines/vine_structure.dm index 4b3a10d9256cc..a7b9aa2fce516 100644 --- a/code/modules/events/space_vines/vine_structure.dm +++ b/code/modules/events/space_vines/vine_structure.dm @@ -161,7 +161,7 @@ if(!istype(stepturf)) return - if(isspaceturf(stepturf) || isopenspaceturf(stepturf) || !stepturf.Enter(src)) + if(is_space_or_openspace(stepturf) || !stepturf.Enter(src)) return if(ischasm(stepturf) && !HAS_TRAIT(stepturf, TRAIT_CHASM_STOPPED)) return diff --git a/code/modules/events/wizard/embeddies.dm b/code/modules/events/wizard/embeddies.dm index ea8c5fd176bc1..8b4568942154a 100644 --- a/code/modules/events/wizard/embeddies.dm +++ b/code/modules/events/wizard/embeddies.dm @@ -43,9 +43,12 @@ GLOBAL_DATUM(global_funny_embedding, /datum/global_funny_embedding) * Makes every item in the world embed when thrown, but also hooks into global signals for new items created to also bless them with embed-ability(??). */ /datum/global_funny_embedding - var/embed_type = EMBED_POINTY + var/embed_type = /datum/embed_data/global_funny var/prefix = "error" +/datum/embed_data/global_funny + ignore_throwspeed_threshold = TRUE + /datum/global_funny_embedding/New() . = ..() //second operation takes MUCH longer, so lets set up signals first. @@ -61,11 +64,11 @@ GLOBAL_DATUM(global_funny_embedding, /datum/global_funny_embedding) SIGNAL_HANDLER // this proc says it's for initializing components, but we're initializing elements too because it's you and me against the world >:) - if(LAZYLEN(created_item.embedding)) - return //already embeds to some degree, so whatever 🐀 - created_item.embedding = embed_type + if(created_item.get_embed()) + return //already embeds to some degree, so whatever // No rat allowed + created_item.name = "[prefix] [created_item.name]" - created_item.updateEmbedding() + created_item.set_embed(embed_type) /** * ### handle_current_items @@ -77,17 +80,20 @@ GLOBAL_DATUM(global_funny_embedding, /datum/global_funny_embedding) CHECK_TICK if(!(embed_item.flags_1 & INITIALIZED_1)) continue - if(!embed_item.embedding) - embed_item.embedding = embed_type - embed_item.updateEmbedding() - embed_item.name = "[prefix] [embed_item.name]" + if(embed_item.get_embed()) + continue + embed_item.set_embed(embed_type) + embed_item.name = "[prefix] [embed_item.name]" ///everything will be... POINTY!!!! /datum/global_funny_embedding/pointy - embed_type = EMBED_POINTY prefix = "pointy" ///everything will be... sticky? sure, why not /datum/global_funny_embedding/sticky - embed_type = EMBED_HARMLESS + embed_type = /datum/embed_data/global_funny/sticky prefix = "sticky" + +/datum/embed_data/global_funny/sticky + pain_mult = 0 + jostle_pain_mult = 0 diff --git a/code/modules/experisci/experiment/experiments.dm b/code/modules/experisci/experiment/experiments.dm index cab4c3a582d62..858c0506fb9a7 100644 --- a/code/modules/experisci/experiment/experiments.dm +++ b/code/modules/experisci/experiment/experiments.dm @@ -326,8 +326,8 @@ name = "Материалы для экзокостюмов: стресс-тест" description = "Ваши устройства для изготовления экзокостюмов позволяют быстро производить их в небольших масштабах, но структурная целостность созданных деталей уступает более традиционным средствам." exp_tag = "Scan" + total_requirement = 2 possible_types = list(/obj/vehicle/sealed/mecha) - total_requirement = 1 ///Damage percent that each mech needs to be at for a scan to work. var/damage_percent @@ -337,6 +337,21 @@ possible_types = list(/obj/vehicle/sealed/mecha) total_requirement = 1 +/// Scan a person with any mutation +/datum/experiment/scanning/people/mutant + name = "Human Field Research: Genetic Mutations" + description = "Our new research assistants have been drinking random chemicals for science, when one of them mastered telekinesis and another started shooting lasers from the eyes. This could be useful for our studies. Repeat the experiment by making assistants drink unstable mutagen, scan them and report the results." + performance_hint = "Scan a person with a random mutation." + required_traits_desc = "random mutation" + +/datum/experiment/scanning/people/mutant/is_valid_scan_target(mob/living/carbon/human/check, datum/component/experiment_handler/experiment_handler) + . = ..() + if (!.) + return + if(!check.dna.mutations.len) + return FALSE + return TRUE + /// Scan for organs you didn't start the round with /datum/experiment/scanning/people/novel_organs name = "Исследование людского поля: дивергентная биология" @@ -380,7 +395,7 @@ /// Scan for cybernetic organs /datum/experiment/scanning/people/augmented_organs name = "Human Field Research: Augmented Organs" - description = "We need to gather data on how cybernetic vital organs integrate with human biology. Conduct a scan on a human with these implants to help us understand their compatibility" + description = "We need to gather data on how cybernetic vital organs integrate with human biology. Conduct a scan on a human with these implants to help us understand their compatibility." performance_hint = "Perform an organ manipulation surgery to replace one of the vital organs with a cybernetic variant." required_traits_desc = "augmented vital organs" required_count = 1 @@ -399,11 +414,8 @@ ) for (var/obj/item/organ/organ as anything in check.organs) - if (IS_ORGANIC_ORGAN(organ)) - continue - if (!(organ.slot in vital_organ_slots)) - continue - return TRUE + if ((organ.slot in vital_organ_slots) && IS_ROBOTIC_ORGAN(organ)) + return TRUE return FALSE /// Scan for skillchips @@ -426,12 +438,55 @@ return FALSE return TRUE +/// Scan an android +/datum/experiment/scanning/people/android + name = "Human Field Research: Full Augmentation" + description = "Perform a full cybernetic augmentation on a crewmate then scan them to test their newfound capabilities and new sensory and cognitive functions." + performance_hint = "Achieve full augmentation by performing a set of surgery operations." + required_traits_desc = "fully augmented android" + required_count = 1 + +/datum/experiment/scanning/people/android/is_valid_scan_target(mob/living/carbon/human/check, datum/component/experiment_handler/experiment_handler) + . = ..() + if (!.) + return + if (isandroid(check)) + return TRUE + if (check.organs < 6 || check.bodyparts < 6) + return FALSE + + var/static/list/augmented_organ_slots = list( + ORGAN_SLOT_EYES, + ORGAN_SLOT_EARS, + ORGAN_SLOT_HEART, + ORGAN_SLOT_LUNGS, + ORGAN_SLOT_LIVER, + ORGAN_SLOT_STOMACH, + ) + for (var/obj/item/organ/organ as anything in check.organs) + if (!(organ.slot in augmented_organ_slots)) + continue + if (!IS_ROBOTIC_ORGAN(organ)) + return FALSE + for (var/obj/item/bodypart/bodypart as anything in check.bodyparts) + if (bodypart.bodytype != BODYTYPE_ROBOTIC) + return FALSE + return TRUE + /datum/experiment/scanning/reagent/cryostylane name = "Pure Cryostylane Scan" description = "It appears that the Cryostylane reagent can potentially halt all physiological processes in the human body. Produce Cryostylane with at least 99% purity and scan the beaker." + performance_hint = "Keep the temperature as high as possible during the reaction." required_reagent = /datum/reagent/cryostylane min_purity = 0.99 +/datum/experiment/scanning/reagent/haloperidol + name = "Pure Haloperidol Scan" + description = "We require testing related to the long-term treatment of chronic psychiatric disorders. Produce Haloperidol with at least 98% purity and scan the beaker." + performance_hint = "Exothermic and consumes hydrogen during reaction." + required_reagent = /datum/reagent/medicine/haloperidol + min_purity = 0.98 + /datum/experiment/scanning/points/bluespace_crystal name = "Bluespace Crystal Sampling" description = "Investigate the properties of bluespace crystals by scanning either an artificial or naturally occurring variant. This will help us deepen our understanding of bluespace phenomena." @@ -441,10 +496,16 @@ /obj/item/stack/sheet/bluespace_crystal = 1 ) +/datum/experiment/scanning/points/anomalies + name = "Neutralized Anomaly Analysis" + description = "We have the power to deal with the anomalies now. Neutralize them with an anomaly neutralizer or refine the raw cores in the refinery and scan the results." + required_points = 4 + required_atoms = list(/obj/item/assembly/signaler/anomaly = 1) + /datum/experiment/scanning/points/machinery_tiered_scan/tier2_any name = "Upgraded Stock Parts Benchmark" description = "Our newly-designed machinery components require practical application tests for hints at possible further advancements, as well as a general confirmation that we didn't actually design worse parts somehow. Scan any machinery with Upgraded Parts and report the results." - required_points = 4 + required_points = 6 required_atoms = list( /obj/machinery = 1 ) @@ -453,7 +514,7 @@ /datum/experiment/scanning/points/machinery_tiered_scan/tier3_any name = "Advanced Stock Parts Benchmark" description = "Our newly-designed machinery components require practical application tests for hints at possible further advancements, as well as a general confirmation that we didn't actually design worse parts somehow. Scan any machinery with Advanced Parts and report the results." - required_points = 4 + required_points = 6 required_atoms = list( /obj/machinery = 1 ) diff --git a/code/modules/experisci/experiment/types/scanning_fish.dm b/code/modules/experisci/experiment/types/scanning_fish.dm index 76ead7dde9a93..91f0356cf7352 100644 --- a/code/modules/experisci/experiment/types/scanning_fish.dm +++ b/code/modules/experisci/experiment/types/scanning_fish.dm @@ -12,7 +12,7 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) performance_hint = "Сканируйте рыбу. Осмотрите сканер, чтобы просмотреть прогресс. Разблокируйте новые порталы для рыбалки." allowed_experimentors = list(/obj/item/experi_scanner, /obj/machinery/destructive_scanner, /obj/item/fishing_rod/tech, /obj/item/fish_analyzer) traits = EXPERIMENT_TRAIT_TYPECACHE - points_reward = list(TECHWEB_POINT_TYPE_GENERIC = 750) + points_reward = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS ) required_atoms = list(/obj/item/fish = 4) scan_message = "Сканируйте разные виды рыб" ///Further experiments added to the techweb when this one is completed. @@ -80,7 +80,7 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) /datum/experiment/scanning/fish/second name = "Эксперимент по скану рыбы (2)" description = "Эксперимент, требующий отсканировать больше видов рыб, чтобы разблокировать настройку \"Бездна\" для рыболовного портала." - points_reward = list(TECHWEB_POINT_TYPE_GENERIC = 1500) + points_reward = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS ) required_atoms = list(/obj/item/fish = 8) next_experiments = list(/datum/experiment/scanning/fish/third) fish_source_reward = /datum/fish_source/portal/chasm @@ -88,7 +88,7 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) /datum/experiment/scanning/fish/third name = "Эксперимент по скану рыбы (3)" description = "Эксперимент, требующий отсканировать еще больше видов рыб, чтобы разблокировать настройку \"Океан\" для рыболовного портала." - points_reward = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + points_reward = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS ) required_atoms = list(/obj/item/fish = 14) next_experiments = list(/datum/experiment/scanning/fish/fourth, /datum/experiment/scanning/fish/holographic) fish_source_reward = /datum/fish_source/portal/ocean @@ -97,7 +97,7 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) name = "Эксперимент по скану голорыбы" description = "Чтобы разблокировать настройку \"Рандомизатор\" для рыболовного портала, потребуется голографическая рыба." performance_hint = "Загрузите шаблон \"Пляж\" на Голодэке, чтобы половить голорыбу." - points_reward = list(TECHWEB_POINT_TYPE_GENERIC = 500) + points_reward = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS ) required_atoms = list(/obj/item/fish/holo = 4) scan_message = "Сканирование различных видов голографических рыб" next_experiments = null @@ -110,7 +110,7 @@ GLOBAL_LIST_EMPTY(scanned_fish_by_techweb) /datum/experiment/scanning/fish/fourth name = "Эксперимент по скану рыбы (4)" description = "Эксперимент, требующий много видов рыб, чтобы разблокировать настройку \"Гиперпространство\" для рыболовного портала." - points_reward = list(TECHWEB_POINT_TYPE_GENERIC = 3250) + points_reward = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS ) required_atoms = list(/obj/item/fish = 21) next_experiments = null fish_source_reward = /datum/fish_source/portal/hyperspace diff --git a/code/modules/experisci/experiment/types/scanning_reagent.dm b/code/modules/experisci/experiment/types/scanning_reagent.dm index 1a39e2941efeb..992c28d148d44 100644 --- a/code/modules/experisci/experiment/types/scanning_reagent.dm +++ b/code/modules/experisci/experiment/types/scanning_reagent.dm @@ -31,5 +31,5 @@ return TRUE /datum/experiment/scanning/reagent/serialize_progress_stage(atom/target, list/seen_instances) - return EXPERIMENT_PROG_INT("Scan a reagent container with [required_reagent::name] of at least [PERCENT(min_purity)] purity.", \ + return EXPERIMENT_PROG_INT("Scan a reagent container with [required_reagent::name] of at least [PERCENT(min_purity)]% purity.", \ seen_instances.len, required_atoms[target]) diff --git a/code/modules/experisci/experiment/types/scanning_vatgrown.dm b/code/modules/experisci/experiment/types/scanning_vatgrown.dm index c3bf79333e74d..8c664e6bfbd73 100644 --- a/code/modules/experisci/experiment/types/scanning_vatgrown.dm +++ b/code/modules/experisci/experiment/types/scanning_vatgrown.dm @@ -1,14 +1,17 @@ -/datum/experiment/scanning/random/cytology +/datum/experiment/scanning/cytology name = "Эксперемент по скану цитологии" - description = "Базовый эксперимент для сканирования атомов, выращенных в чашке петри." exp_tag = "Скан цитологии" - total_requirement = 1 - possible_types = list(/mob/living/basic/slime) - traits = EXPERIMENT_TRAIT_DESTRUCTIVE -/datum/experiment/scanning/random/cytology/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) +/datum/experiment/scanning/cytology/final_contributing_index_checks(datum/component/experiment_handler/experiment_handler, atom/target, typepath) return ..() && HAS_TRAIT(target, TRAIT_VATGROWN) -/datum/experiment/scanning/random/cytology/serialize_progress_stage(atom/target, list/seen_instances) - return EXPERIMENT_PROG_INT("Скан образцов [initial(target.name)], выращенных в лаборатории", \ - traits & EXPERIMENT_TRAIT_DESTRUCTIVE ? scanned[target] : seen_instances.len, required_atoms[target]) +/datum/experiment/scanning/cytology/serialize_progress_stage(atom/target, list/seen_instances) + return EXPERIMENT_PROG_INT("Скан образцов [initial(target.name)], выращенных в лаборатории", seen_instances.len, required_atoms[target]) + +/datum/experiment/scanning/cytology/slime + name = "Сканирование слаймов выращенных в лаборатории" + description = "Видели слаймов в ксенобиологическом загоне? Они появились, когда наши исследователи бросили в резервуар заплесневелый кусок хлеба. Вырастите еще одного и сообщите о результатах." + performance_hint = "Соберите клеточные линии слаймов из заплесневелого хлеба или возьмите биопсийный образец существующих слаймов. И выращивайте их в загоне." + required_atoms = list(/mob/living/basic/slime = 1) + + diff --git a/code/modules/fishing/aquarium/aquarium.dm b/code/modules/fishing/aquarium/aquarium.dm index 0a836eadafdda..cd05d0bd34baf 100644 --- a/code/modules/fishing/aquarium/aquarium.dm +++ b/code/modules/fishing/aquarium/aquarium.dm @@ -53,6 +53,9 @@ /// /obj/item/fish in the aquarium, sorted by type - does not include things with aquarium visuals that are not fish var/list/tracked_fish_by_type + /// Var used to keep track of the current beauty of the aquarium, which can be throughfully changed by aquarium content. + var/current_beauty = 150 + /obj/structure/aquarium/Initialize(mapload) . = ..() update_appearance() @@ -62,6 +65,8 @@ create_reagents(6, SEALED_CONTAINER) RegisterSignal(reagents, COMSIG_REAGENTS_NEW_REAGENT, PROC_REF(start_autofeed)) AddComponent(/datum/component/plumbing/aquarium) + if(current_beauty) + AddElement(/datum/element/beauty, current_beauty) ADD_KEEP_TOGETHER(src, INNATE_TRAIT) /obj/structure/aquarium/proc/track_if_fish(atom/source, atom/initialized) @@ -192,9 +197,9 @@ var/obj/item/stack/sheet/glass/glass = item if(istype(glass)) if(glass.get_amount() < 2) - to_chat(user, span_warning("You need two glass sheets to fix the case!")) + balloon_alert(user, "it needs two sheets!") return - to_chat(user, span_notice("You start fixing [src]...")) + balloon_alert(user, "fixing the aquarium...") if(do_after(user, 2 SECONDS, target = src)) glass.use(2) broken = FALSE @@ -202,10 +207,18 @@ update_appearance() return TRUE else - var/datum/component/aquarium_content/content_component = item.GetComponent(/datum/component/aquarium_content) - if(content_component && content_component.is_ready_to_insert(src) && user.transferItemToLoc(item, src)) - update_appearance() - return TRUE + var/insert_attempt = SEND_SIGNAL(item, COMSIG_TRY_INSERTING_IN_AQUARIUM, src) + switch(insert_attempt) + if(COMSIG_CAN_INSERT_IN_AQUARIUM) + if(!user.transferItemToLoc(item, src)) + user.balloon_alert(user, "stuck to your hand!") + return TRUE + balloon_alert(user, "added to aquarium") + update_appearance() + return TRUE + if(COMSIG_CANNOT_INSERT_IN_AQUARIUM) + balloon_alert(user, "cannot add to aquarium!") + return TRUE if(istype(item, /obj/item/fish_feed) && !panel_open) if(!item.reagents.total_volume) @@ -270,24 +283,27 @@ ///Apply mood bonus depending on aquarium status /obj/structure/aquarium/proc/admire(mob/living/user) - to_chat(user,span_notice("You take a moment to watch [src].")) - if(do_after(user, 5 SECONDS, target = src)) - var/alive_fish = 0 - var/dead_fish = 0 - var/list/tracked_fish = get_fishes() - for(var/obj/item/fish/fish in tracked_fish) - if(fish.status == FISH_ALIVE) - alive_fish++ - else - dead_fish++ - //Check if there are live fish - good mood - //All fish dead - bad mood. - //No fish - nothing. - if(alive_fish > 0) - user.add_mood_event("aquarium", /datum/mood_event/aquarium_positive) - else if(dead_fish > 0) - user.add_mood_event("aquarium", /datum/mood_event/aquarium_negative) - // Could maybe scale power of this mood with number/types of fish + user.balloon_alert(user, "admiring aquarium...") + if(!do_after(user, 5 SECONDS, target = src)) + return + var/alive_fish = 0 + var/dead_fish = 0 + var/list/tracked_fish = get_fishes() + for(var/obj/item/fish/fish in tracked_fish) + if(fish.status == FISH_ALIVE) + alive_fish++ + else + dead_fish++ + + var/morb = HAS_TRAIT(user, TRAIT_MORBID) + //Check if there are live fish - good mood + //All fish dead - bad mood. + //No fish - nothing. + if(alive_fish > 0) + user.add_mood_event("aquarium", morb ? /datum/mood_event/morbid_aquarium_bad : /datum/mood_event/aquarium_positive) + else if(dead_fish > 0) + user.add_mood_event("aquarium", morb ? /datum/mood_event/morbid_aquarium_good : /datum/mood_event/aquarium_negative) + // Could maybe scale power of this mood with number/types of fish /obj/structure/aquarium/ui_data(mob/user) . = ..() diff --git a/code/modules/fishing/aquarium/aquarium_kit.dm b/code/modules/fishing/aquarium/aquarium_kit.dm index 30c9300323126..1161648f7d15f 100644 --- a/code/modules/fishing/aquarium/aquarium_kit.dm +++ b/code/modules/fishing/aquarium/aquarium_kit.dm @@ -100,7 +100,8 @@ /obj/item/aquarium_kit/Initialize(mapload) . = ..() - AddComponent(/datum/component/slapcrafting, /datum/crafting_recipe/aquarium) + var/static/list/recipes = list(/datum/crafting_recipe/aquarium) + AddElement(/datum/element/slapcrafting, recipes) /obj/item/aquarium_prop name = "generic aquarium prop" @@ -109,10 +110,11 @@ w_class = WEIGHT_CLASS_TINY var/layer_mode = AQUARIUM_LAYER_MODE_BOTTOM + var/beauty = 150 /obj/item/aquarium_prop/Initialize(mapload) . = ..() - AddComponent(/datum/component/aquarium_content, icon) + AddComponent(/datum/component/aquarium_content, icon, beauty = beauty) /obj/item/aquarium_prop/rocks name = "rocks" diff --git a/code/modules/fishing/aquarium/aquarium_upgrades.dm b/code/modules/fishing/aquarium/aquarium_upgrades.dm index 140777d34f0ae..c73e6e9d230ae 100644 --- a/code/modules/fishing/aquarium/aquarium_upgrades.dm +++ b/code/modules/fishing/aquarium/aquarium_upgrades.dm @@ -24,6 +24,8 @@ icon_state = "bioelec_map" icon_prefix = "bioelec" + current_beauty = 0 + /obj/structure/aquarium/bioelec_gen/zap_act(power, zap_flags) var/explosive = zap_flags & ZAP_MACHINE_EXPLOSIVE if(!explosive) diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm index a12ae7e7397a9..c4be35817b7ac 100644 --- a/code/modules/fishing/fish/_fish.dm +++ b/code/modules/fishing/fish/_fish.dm @@ -143,9 +143,12 @@ /// power of the tesla zap created by the fish in a bioelectric generator var/electrogenesis_power = 10 MEGA JOULES + /// The beauty this fish provides to the aquarium it's inserted in. + var/beauty = FISH_BEAUTY_GENERIC + /obj/item/fish/Initialize(mapload, apply_qualities = TRUE) . = ..() - AddComponent(/datum/component/aquarium_content, icon, PROC_REF(get_aquarium_animation), list(COMSIG_FISH_STATUS_CHANGED,COMSIG_FISH_STIRRED)) + AddComponent(/datum/component/aquarium_content, icon, PROC_REF(get_aquarium_animation), list(COMSIG_FISH_STIRRED), beauty) RegisterSignal(src, COMSIG_ATOM_ON_LAZARUS_INJECTOR, PROC_REF(use_lazarus)) if(do_flop_animation) diff --git a/code/modules/fishing/fish/fish_types.dm b/code/modules/fishing/fish/fish_types.dm index f61cb43b22424..cc001560ee0a9 100644 --- a/code/modules/fishing/fish/fish_types.dm +++ b/code/modules/fishing/fish/fish_types.dm @@ -19,6 +19,8 @@ desc = "A great rubber duck tool for Lawyers who can't get a grasp over their case." stable_population = 1 random_case_rarity = FISH_RARITY_NOPE + show_in_catalog = FALSE + beauty = FISH_BEAUTY_GOOD /obj/item/fish/angelfish name = "angelfish" @@ -77,6 +79,7 @@ ) required_temperature_min = MIN_AQUARIUM_TEMP+12 required_temperature_max = MIN_AQUARIUM_TEMP+30 + beauty = FISH_BEAUTY_GOOD // Saltwater fish below @@ -107,6 +110,7 @@ evolution_types = null compatible_types = list(/obj/item/fish/clownfish) food = /datum/reagent/lube + beauty = FISH_BEAUTY_GREAT /obj/item/fish/cardinal name = "cardinalfish" @@ -163,8 +167,9 @@ stable_population = 3 required_temperature_min = MIN_AQUARIUM_TEMP+23 required_temperature_max = MIN_AQUARIUM_TEMP+28 - fish_traits = list(/datum/fish_trait/heavy, /datum/fish_trait/toxic) + beauty = FISH_BEAUTY_GOOD + /obj/item/fish/lanternfish name = "lanternfish" @@ -182,6 +187,7 @@ fish_traits = list(/datum/fish_trait/nocturnal) required_temperature_min = MIN_AQUARIUM_TEMP+2 //My source is that the water at a depth 6600 feet is pretty darn cold. required_temperature_max = MIN_AQUARIUM_TEMP+18 + beauty = FISH_BEAUTY_NULL //Tiziran Fish /obj/item/fish/dwarf_moonfish @@ -195,6 +201,7 @@ average_weight = 2000 required_temperature_min = MIN_AQUARIUM_TEMP+20 required_temperature_max = MIN_AQUARIUM_TEMP+30 + beauty = FISH_BEAUTY_GOOD /obj/item/fish/gunner_jellyfish name = "gunner jellyfish" @@ -205,6 +212,7 @@ fillet_type = /obj/item/food/fishmeat/gunner_jellyfish required_temperature_min = MIN_AQUARIUM_TEMP+24 required_temperature_max = MIN_AQUARIUM_TEMP+32 + beauty = FISH_BEAUTY_GOOD /obj/item/fish/needlefish name = "needlefish" @@ -261,6 +269,7 @@ ) evolution_types = list(/datum/fish_evolution/ice_chrab) compatible_types = list(/obj/item/fish/chasm_crab/ice) + beauty = FISH_BEAUTY_GOOD /obj/item/fish/chasm_crab/ice name = "arctic chrab" @@ -271,13 +280,7 @@ required_temperature_max = MIN_AQUARIUM_TEMP+15 evolution_types = list(/datum/fish_evolution/chasm_chrab) compatible_types = list(/obj/item/fish/chasm_crab) - -/obj/item/storage/box/fish_debug - name = "box full of fish" - -/obj/item/storage/box/fish_debug/PopulateContents() - for(var/fish_type in subtypesof(/obj/item/fish)) - new fish_type(src) + beauty = FISH_BEAUTY_GREAT /obj/item/fish/donkfish name = "donk co. company patent donkfish" @@ -290,6 +293,7 @@ fish_traits = list(/datum/fish_trait/yucky) required_temperature_min = MIN_AQUARIUM_TEMP+15 required_temperature_max = MIN_AQUARIUM_TEMP+28 + beauty = FISH_BEAUTY_EXCELLENT /obj/item/fish/emulsijack name = "toxic emulsijack" @@ -301,6 +305,7 @@ fish_traits = list(/datum/fish_trait/emulsijack) required_temperature_min = MIN_AQUARIUM_TEMP+5 required_temperature_max = MIN_AQUARIUM_TEMP+40 + beauty = FISH_BEAUTY_BAD /obj/item/fish/jumpercable name = "monocloning jumpercable" @@ -322,6 +327,7 @@ /datum/fish_trait/mixotroph, /datum/fish_trait/electrogenesis, ) + beauty = FISH_BEAUTY_UGLY /obj/item/fish/ratfish name = "ratfish" @@ -341,6 +347,7 @@ "Value" = DAIRY ) ) + beauty = FISH_BEAUTY_DISGUSTING /obj/item/fish/ratfish/Initialize(mapload) . = ..() @@ -364,6 +371,7 @@ required_temperature_min = MIN_AQUARIUM_TEMP+10 required_temperature_max = MIN_AQUARIUM_TEMP+40 evolution_types = list(/datum/fish_evolution/purple_sludgefish) + beauty = FISH_BEAUTY_NULL /obj/item/fish/sludgefish/purple name = "purple sludgefish" @@ -401,6 +409,7 @@ ), ) required_temperature_min = MIN_AQUARIUM_TEMP+20 + beauty = FISH_BEAUTY_GREAT /obj/item/fish/boned name = "unmarine bonemass" @@ -423,6 +432,7 @@ average_weight = 2000 death_text = "%SRC stops moving." //It's dead... or is it? evolution_types = list(/datum/fish_evolution/mastodon) + beauty = FISH_BEAUTY_UGLY /obj/item/fish/mastodon name = "unmarine mastodon" @@ -451,6 +461,7 @@ average_weight = 5000 death_text = "%SRC stops moving." fish_traits = list(/datum/fish_trait/heavy, /datum/fish_trait/amphibious, /datum/fish_trait/revival, /datum/fish_trait/carnivore, /datum/fish_trait/predator, /datum/fish_trait/aggressive) + beauty = FISH_BEAUTY_BAD /obj/item/fish/holo name = "holographic goldfish" @@ -501,6 +512,7 @@ sprite_height = 8 average_size = 60 average_weight = 1000 + beauty = FISH_BEAUTY_GOOD /obj/item/fish/holo/angel name = "holographic angelfish" @@ -524,6 +536,7 @@ icon_state = "checkered" //it's a meta joke, buddy. dedicated_in_aquarium_icon_state = "checkered_small" sprite_width = 4 + beauty = FISH_BEAUTY_NULL /obj/item/fish/holo/halffish name = "holographic half-fish" @@ -533,6 +546,7 @@ sprite_height = 4 sprite_width = 10 average_size = 50 + beauty = FISH_BEAUTY_UGLY /obj/item/fish/starfish name = "cosmostarfish" @@ -554,6 +568,7 @@ grind_results = list(/datum/reagent/bluespace = 10, /datum/reagent/consumable/liquidgibs = 5) fillet_type = null fish_traits = list(/datum/fish_trait/antigrav, /datum/fish_trait/mixotroph) + beauty = FISH_BEAUTY_GREAT /obj/item/fish/starfish/Initialize(mapload) . = ..() @@ -589,6 +604,7 @@ ) hitsound = null throwforce = 5 + beauty = FISH_BEAUTY_GOOD ///maximum bonus damage when winded up var/maximum_bonus = 25 @@ -662,3 +678,4 @@ ) //anxiety naturally limits the amount of zipzaps per tank, so they are stronger alone electrogenesis_power = 20 MEGA JOULES + beauty = FISH_BEAUTY_GOOD diff --git a/code/modules/fishing/fish_catalog.dm b/code/modules/fishing/fish_catalog.dm index 3e1cb6cfcfa6b..49a84413ded06 100644 --- a/code/modules/fishing/fish_catalog.dm +++ b/code/modules/fishing/fish_catalog.dm @@ -37,6 +37,25 @@ else fish_data["feed"] = "[AQUARIUM_COMPANY] Fish Feed" fish_data["fishing_tips"] = build_fishing_tips(fish) + var/beauty_score = initial(fish.beauty) + switch(beauty_score) + if(-INFINITY to FISH_BEAUTY_DISGUSTING) + beauty_score = "OH HELL NAW!" + if(FISH_BEAUTY_DISGUSTING to FISH_BEAUTY_UGLY) + beauty_score = "☆☆☆☆☆" + if(FISH_BEAUTY_UGLY to FISH_BEAUTY_BAD) + beauty_score = "★☆☆☆☆" + if(FISH_BEAUTY_BAD to FISH_BEAUTY_NULL) + beauty_score = "★★☆☆☆" + if(FISH_BEAUTY_NULL to FISH_BEAUTY_GENERIC) + beauty_score = "★★★☆☆" + if(FISH_BEAUTY_GENERIC to FISH_BEAUTY_GOOD) + beauty_score = "★★★★☆" + if(FISH_BEAUTY_GOOD to FISH_BEAUTY_GREAT) + beauty_score = "★★★★★" + if(FISH_BEAUTY_GREAT to INFINITY) + beauty_score = "★★★★★★" + fish_data["beauty"] = beauty_score fish_info += list(fish_data) // TODO: Custom entries for unusual stuff diff --git a/code/modules/fishing/fishing_equipment.dm b/code/modules/fishing/fishing_equipment.dm index df6c4eee9c254..f6b49a9b52314 100644 --- a/code/modules/fishing/fishing_equipment.dm +++ b/code/modules/fishing/fishing_equipment.dm @@ -304,5 +304,12 @@ new /obj/item/fishing_line/reinforced(src) new /obj/item/fishing_line/cloaked(src) +/obj/item/storage/box/fish_debug + name = "box full of fish" + +/obj/item/storage/box/fish_debug/PopulateContents() + for(var/fish_type in subtypesof(/obj/item/fish)) + new fish_type(src) + #undef MAGNET_HOOK_BONUS_MULTIPLIER #undef RESCUE_HOOK_FISH_MULTIPLIER diff --git a/code/modules/fishing/sources/_fish_source.dm b/code/modules/fishing/sources/_fish_source.dm index 66d2bf0a880e3..3c94ff8277d94 100644 --- a/code/modules/fishing/sources/_fish_source.dm +++ b/code/modules/fishing/sources/_fish_source.dm @@ -239,6 +239,21 @@ GLOBAL_LIST(fishing_property_cache) /// Builds a fish weights table modified by bait/rod/user properties /datum/fish_source/proc/get_modified_fish_table(obj/item/fishing_rod/rod, mob/fisherman) var/obj/item/bait = rod.bait + ///An exponent used to level out the difference in probabilities between fishes/mobs on the table depending on bait quality. + var/leveling_exponent = 0 + ///Multiplier used to make fishes more common compared to everything else. + var/result_multiplier = 1 + + if(bait) + if(HAS_TRAIT(bait, TRAIT_GREAT_QUALITY_BAIT)) + result_multiplier = 9 + leveling_exponent = 0.5 + else if(HAS_TRAIT(bait, TRAIT_GOOD_QUALITY_BAIT)) + result_multiplier = 3.5 + leveling_exponent = 0.25 + else if(HAS_TRAIT(bait, TRAIT_BASIC_QUALITY_BAIT)) + result_multiplier = 2 + leveling_exponent = 0.1 var/list/fish_list_properties = collect_fish_properties() @@ -246,17 +261,13 @@ GLOBAL_LIST(fishing_property_cache) for(var/result in final_table) final_table[result] *= rod.hook?.get_hook_bonus_multiplicative(result) final_table[result] += rod.hook?.get_hook_bonus_additive(result)//Decide on order here so it can be multiplicative + if(ispath(result, /obj/item/fish)) //Modify fish roll chance var/obj/item/fish/caught_fish = result if(bait) - if(HAS_TRAIT(bait, TRAIT_GREAT_QUALITY_BAIT)) - final_table[result] *= 10 - else if(HAS_TRAIT(bait, TRAIT_GOOD_QUALITY_BAIT)) - final_table[result] = round(final_table[result] * 3.5, 1) - else if(HAS_TRAIT(bait, TRAIT_BASIC_QUALITY_BAIT)) - final_table[result] *= 2 + final_table[result] = round(final_table[result] * result_multiplier, 1) if(!HAS_TRAIT(bait, TRAIT_OMNI_BAIT)) //Bait matching likes doubles the chance var/list/fav_bait = fish_list_properties[result][NAMEOF(caught_fish, favorite_bait)] @@ -286,4 +297,22 @@ GLOBAL_LIST(fishing_property_cache) if(final_table[result] <= 0) final_table -= result + + ///here we even out the chances of fishie based on bait quality: better baits lead rarer fishes being more common. + if(leveling_exponent) + var/highest_fish_weight + var/list/collected_fish_weights = list() + for(var/fishable in final_table) + if(ispath(fishable, /obj/item/fish)) + var/fish_weight = fish_table[fishable] + collected_fish_weights[fishable] = fish_weight + if(fish_weight > highest_fish_weight) + highest_fish_weight = fish_weight + + for(var/fish in collected_fish_weights) + var/difference = collected_fish_weights[fish] - highest_fish_weight + if(!difference) + continue + final_table[fish] += round(difference**leveling_exponent, 1) + return final_table diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm index eba5ff63f3f8c..8b0c8eb14a5ca 100644 --- a/code/modules/food_and_drinks/machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm @@ -95,6 +95,8 @@ context[SCREENTIP_CONTEXT_RMB] = "Transfer beaker reagents" else if(istype(held_item, /obj/item/food/icecream)) context[SCREENTIP_CONTEXT_LMB] = "Take scoop of [selected_flavour] ice cream" + else if(istype(held_item, /obj/item/kitchen/spoon) || istype(held_item, /obj/item/kitchen/spoon/soup_ladle)) + context[SCREENTIP_CONTEXT_RMB] = "Spill reagent" return CONTEXTUAL_SCREENTIP_SET switch(vat_mode) @@ -106,10 +108,20 @@ context[SCREENTIP_CONTEXT_RMB] = "Change mode to flavors" return CONTEXTUAL_SCREENTIP_SET -/obj/machinery/icecream_vat/attackby(obj/item/reagent_containers/beaker, mob/user, params) +/obj/machinery/icecream_vat/examine(mob/user) + . = ..() + . += "You can use a [EXAMINE_HINT("spoon")] or [EXAMINE_HINT("soup ladle")] to spill reagents." + +/obj/machinery/icecream_vat/attackby(obj/item/weapon, mob/user, params) . = ..() if(.) return + + if(istype(weapon, /obj/item/kitchen/spoon) || istype(weapon, /obj/item/kitchen/spoon/soup_ladle)) + spill_reagents(user) + return TRUE + + var/obj/item/reagent_containers/beaker = weapon if(!istype(beaker) || !beaker.reagents || (beaker.item_flags & ABSTRACT) || !beaker.is_open_container()) return @@ -204,6 +216,14 @@ if(cone) make_cone(user, choice, cone.ingredients) +///Lets the user select a reagent in the vat to spill out. +/obj/machinery/icecream_vat/proc/spill_reagents(mob/living/user) + var/datum/reagent/reagent_to_remove = tgui_input_list(user, "Select a reagent to purge from the vat.", "Remove reagent", reagents.reagent_list, ui_state = GLOB.conscious_state) + if(isnull(reagent_to_remove) || !user.can_perform_action(src, action_bitflags = ALLOW_RESTING)) + return + balloon_alert(user, "spilled [reagent_to_remove.name]") + reagents.remove_reagent(reagent_to_remove.type, reagent_to_remove.volume) + /obj/machinery/icecream_vat/proc/make_ice_cream_color(datum/ice_cream_flavour/flavor) if(!flavor.color) return diff --git a/code/modules/food_and_drinks/machinery/microwave.dm b/code/modules/food_and_drinks/machinery/microwave.dm index 88256eaf1d27e..bc5adfbd0f951 100644 --- a/code/modules/food_and_drinks/machinery/microwave.dm +++ b/code/modules/food_and_drinks/machinery/microwave.dm @@ -114,6 +114,7 @@ QDEL_LIST(ingredients) QDEL_NULL(wires) QDEL_NULL(soundloop) + QDEL_NULL(particles) if(!isnull(cell)) QDEL_NULL(cell) return ..() @@ -366,8 +367,10 @@ return ITEM_INTERACT_SUCCESS /obj/machinery/microwave/tool_act(mob/living/user, obj/item/tool, list/modifiers) + if(!tool.tool_behaviour) + return ..() if(operating) - return ITEM_INTERACT_SKIP_TO_ATTACK // Don't use tools if we're dirty + return ITEM_INTERACT_SKIP_TO_ATTACK // Don't use tools if we're operating if(dirty >= MAX_MICROWAVE_DIRTINESS) return ITEM_INTERACT_SKIP_TO_ATTACK // Don't insert items if we're dirty if(panel_open && is_wire_tool(tool)) @@ -375,15 +378,13 @@ return ITEM_INTERACT_SUCCESS return ..() -/obj/machinery/microwave/attackby(obj/item/item, mob/living/user, params) +/obj/machinery/microwave/item_interaction(mob/living/user, obj/item/item, list/modifiers) if(operating) - return + return NONE if(broken > NOT_BROKEN) - if(IS_EDIBLE(item)) - balloon_alert(user, "it's broken!") - return TRUE - return ..() + balloon_alert(user, "it's broken!") + return ITEM_INTERACT_BLOCKING if(istype(item, /obj/item/stock_parts/power_store/cell) && cell_powered) var/swapped = FALSE @@ -395,27 +396,23 @@ swapped = TRUE if(!user.transferItemToLoc(item, src)) update_appearance() - return TRUE + return ITEM_INTERACT_BLOCKING cell = item balloon_alert(user, "[swapped ? "swapped" : "inserted"] cell") update_appearance() - return TRUE + return ITEM_INTERACT_SUCCESS if(!anchored) - if(IS_EDIBLE(item)) - balloon_alert(user, "not secured!") - return TRUE - return ..() + balloon_alert(user, "not secured!") + return ITEM_INTERACT_BLOCKING if(dirty >= MAX_MICROWAVE_DIRTINESS) // The microwave is all dirty so can't be used! - if(IS_EDIBLE(item)) - balloon_alert(user, "it's too dirty!") - return TRUE - return ..() + balloon_alert(user, "it's too dirty!") + return ITEM_INTERACT_BLOCKING if(vampire_charging_capable && istype(item, /obj/item/modular_computer) && ingredients.len > 0) balloon_alert(user, "max 1 device!") - return FALSE + return ITEM_INTERACT_BLOCKING if(istype(item, /obj/item/storage)) var/obj/item/storage/tray = item @@ -425,14 +422,14 @@ // Non-tray dumping requires a do_after to_chat(user, span_notice("You start dumping out the contents of [item] into [src]...")) if(!do_after(user, 2 SECONDS, target = tray)) - return + return ITEM_INTERACT_BLOCKING for(var/obj/tray_item in tray.contents) if(!IS_EDIBLE(tray_item)) continue if(ingredients.len >= max_n_of_items) balloon_alert(user, "it's full!") - return TRUE + return ITEM_INTERACT_BLOCKING if(tray.atom_storage.attempt_remove(tray_item, src)) loaded++ ingredients += tray_item @@ -440,23 +437,21 @@ open(autoclose = 0.6 SECONDS) to_chat(user, span_notice("You insert [loaded] items into \the [src].")) update_appearance() - return + return ITEM_INTERACT_SUCCESS - if(item.w_class <= WEIGHT_CLASS_NORMAL && !istype(item, /obj/item/storage) && !user.combat_mode) + if(item.w_class <= WEIGHT_CLASS_NORMAL && !user.combat_mode) if(ingredients.len >= max_n_of_items) balloon_alert(user, "it's full!") - return TRUE + return ITEM_INTERACT_BLOCKING if(!user.transferItemToLoc(item, src)) balloon_alert(user, "it's stuck to your hand!") - return FALSE + return ITEM_INTERACT_BLOCKING ingredients += item open(autoclose = 0.6 SECONDS) user.visible_message(span_notice("[user] adds \a [item] to \the [src]."), span_notice("You add [item] to \the [src].")) update_appearance() - return - - return ..() + return ITEM_INTERACT_SUCCESS /obj/machinery/microwave/attack_hand_secondary(mob/user, list/modifiers) if(user.can_perform_action(src, ALLOW_SILICON_REACH)) @@ -541,8 +536,9 @@ /obj/machinery/microwave/proc/eject() var/atom/drop_loc = drop_location() - for(var/atom/movable/movable_ingredient as anything in ingredients) - movable_ingredient.forceMove(drop_loc) + for(var/obj/item/item_ingredient as anything in ingredients) + item_ingredient.forceMove(drop_loc) + item_ingredient.dropped() //Mob holders can be on the ground if we don't do this open(autoclose = 1.4 SECONDS) /obj/machinery/microwave/proc/start_cycle(mob/user) @@ -674,10 +670,34 @@ if(MICROWAVE_PRE) pre_success(cooker) return + + if(cycles == 1) //Only needs to try to shock mobs once, towards the end of the loop + var/successful_shock + var/list/microwave_contents = list() + microwave_contents += get_all_contents() //Mobs are often hid inside of mob holders, which could be fried and made into a burger... + for(var/mob/living/victim in microwave_contents) + if(victim.electrocute_act(shock_damage = 100, source = src, siemens_coeff = 1, flags = SHOCK_NOGLOVES)) + successful_shock = TRUE + if(victim.stat == DEAD) //This is mostly so humans that can_be_held don't get gibbed from one microwave run alone, but mice become burnt messes + victim.gib() + muck() + if(successful_shock) //We only want to give feedback once, regardless of how many mobs got shocked + var/list/cant_smell = list() + for(var/mob/smeller in get_hearers_in_view(DEFAULT_MESSAGE_RANGE, src)) + if(HAS_TRAIT(smeller, TRAIT_ANOSMIA)) + cant_smell += smeller + visible_message(span_danger("You smell a burnt smell coming from [src]!"), ignored_mobs = cant_smell) + particles = new /particles/smoke() + addtimer(CALLBACK(src, PROC_REF(remove_smoke)), 10 SECONDS) + Shake(duration = 1 SECONDS) + cycles-- use_energy(active_power_usage) addtimer(CALLBACK(src, PROC_REF(cook_loop), type, cycles, wait, cooker), wait) +/obj/machinery/microwave/proc/remove_smoke() + QDEL_NULL(particles) + /obj/machinery/microwave/power_change() . = ..() if(cell_powered) diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm index 392d716965d6a..114d7d020f6c9 100644 --- a/code/modules/food_and_drinks/machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/machinery/smartfridge.dm @@ -647,7 +647,7 @@ return istype(weapon, /obj/item/petri_dish) /obj/machinery/smartfridge/petri/preloaded - initial_contents = list(/obj/item/petri_dish = 5) + initial_contents = list(/obj/item/petri_dish/random = 3) // ------------------------- // Organ Surgery Smartfridge diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm index 7761a57fcfdbd..742e8c1f3c89b 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_sandwich.dm @@ -10,6 +10,7 @@ name = "Sandwich" reqs = list( /obj/item/food/breadslice/plain = 2, + /obj/item/food/grown/cabbage = 1, /obj/item/food/meat/steak = 1, /obj/item/food/cheese/wedge = 1 ) diff --git a/code/modules/hallucination/body.dm b/code/modules/hallucination/body.dm index 2d017f969679d..8cd34cfcd4071 100644 --- a/code/modules/hallucination/body.dm +++ b/code/modules/hallucination/body.dm @@ -10,7 +10,7 @@ /// Whether we apply the floating anim to the body var/body_floats = FALSE /// The layer this body will be drawn on, in case we want to bypass lighting - var/body_layer = TURF_LAYER + var/body_layer = LOW_FLOOR_LAYER /// if TRUE, spawns the body under the hallucinator instead of somewhere in view var/spawn_under_hallucinator = FALSE diff --git a/code/modules/hallucination/bubblegum_attack.dm b/code/modules/hallucination/bubblegum_attack.dm index 5ee39ed8e8649..529d67dcd3551 100644 --- a/code/modules/hallucination/bubblegum_attack.dm +++ b/code/modules/hallucination/bubblegum_attack.dm @@ -36,7 +36,7 @@ if(hallucinator.client) - fake_broken_wall = image('icons/turf/floors.dmi', wall_source, "plating", layer = TURF_LAYER) + fake_broken_wall = image('icons/turf/floors.dmi', wall_source, "plating", layer = LOW_FLOOR_LAYER) SET_PLANE_EXPLICIT(fake_broken_wall, FLOOR_PLANE, wall_source) fake_broken_wall.override = TRUE fake_rune = image('icons/effects/96x96.dmi', target_landing_image_turf, "landing", layer = ABOVE_OPEN_TURF_LAYER) diff --git a/code/modules/hallucination/hazard.dm b/code/modules/hallucination/hazard.dm index 1dfdfd23970e7..34bcee62f6a87 100644 --- a/code/modules/hallucination/hazard.dm +++ b/code/modules/hallucination/hazard.dm @@ -29,7 +29,8 @@ /// These hallucination effects cause side effects when the hallucinator walks into them. /obj/effect/client_image_holder/hallucination/danger - image_layer = TURF_LAYER + image_layer = LOW_FLOOR_LAYER + image_plane = FLOOR_PLANE /obj/effect/client_image_holder/hallucination/danger/Initialize(mapload, list/mobs_which_see_us, datum/hallucination/parent) . = ..() diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 3d80ef6d968c0..7a27aecb4bcfe 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -14,7 +14,7 @@ throw_speed = 2 block_chance = 0 throwforce = 0 - embedding = null + embed_type = null sword_color_icon = null active_throwforce = 0 diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 7432de695175e..ee62a12b3d0e1 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -127,6 +127,7 @@ desc = "Space-looking floor. Thankfully, the deadly aspects of space are not emulated here." icon = 'icons/turf/space.dmi' icon_state = "space" + layer = SPACE_LAYER plane = PLANE_SPACE /turf/open/floor/holofloor/hyperspace @@ -164,7 +165,7 @@ /turf/open/floor/holofloor/carpet/update_icon(updates=ALL) . = ..() - if((updates & UPDATE_SMOOTHING) && overfloor_placed && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if((updates & UPDATE_SMOOTHING) && overfloor_placed && smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH(src) /turf/open/floor/holofloor/wood diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index 5c8a7049eb825..5f72806ca3635 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -478,13 +478,18 @@ throwforce = 15 throw_speed = 4 throw_range = 7 - embedding = list("pain_mult" = 4, "embed_chance" = 35, "fall_chance" = 10) + embed_type = /datum/embed_data/hatchet custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*7.5) attack_verb_continuous = list("chops", "tears", "lacerates", "cuts") attack_verb_simple = list("chop", "tear", "lacerate", "cut") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = SHARP_EDGED +/datum/embed_data/hatchet + pain_mult = 4 + embed_chance = 35 + fall_chance = 10 + /obj/item/hatchet/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, \ diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index 791b7ac51a253..34fb9fc04622e 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -249,7 +249,7 @@ // So we'll let it leak in, and move the water over. set_recipient_reagents_holder(nutri_reagents) reagents = nutri_reagents - process_request(dir = dir) + process_request(dir = dir, round_robin = FALSE) // Move the leaked water from nutrients to... water var/leaking_water_amount = nutri_reagents.get_reagent_amount(/datum/reagent/water) @@ -267,7 +267,7 @@ process_request( amount = extra_water_to_gather, reagent = /datum/reagent/water, - dir = dir, + dir = dir ) // Now transfer all remaining water in that buffer and clear it out. diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index c5861140e4e56..6fc671ccd4c94 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -859,12 +859,15 @@ return var/obj/item/seeds/our_seed = our_plant.get_plant_seed() - if(our_seed.get_gene(/datum/plant_gene/trait/stinging)) - our_plant.embedding = EMBED_POINTY - else - our_plant.embedding = EMBED_HARMLESS - our_plant.updateEmbedding() our_plant.throwforce = (our_seed.potency/20) + if (!our_plant.get_embed()) + return + + if(our_seed.get_gene(/datum/plant_gene/trait/stinging)) + our_plant.set_embed(our_plant.get_embed().generate_with_values(ignore_throwspeed_threshold = TRUE)) + return + + our_plant.set_embed(our_plant.get_embed().generate_with_values(ignore_throwspeed_threshold = TRUE, pain_mult = 0, jostle_pain_mult = 0)) /** * This trait automatically heats up the plant's chemical contents when harvested. diff --git a/code/modules/jobs/job_types/chaplain/chaplain.dm b/code/modules/jobs/job_types/chaplain/chaplain.dm index 7b587fe06fbf5..9138b335a544b 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain.dm @@ -78,8 +78,8 @@ else holy_bible.deity_name = pick("Gay Space Jesus", "Gandalf", "Dumbledore") human_spawned.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100) // starts off brain damaged as fuck - if("lol", "wtf", "poo", "badmin", "shitmin", "deadmin", "meme", "memes") - new_bible = pick("Woody's Got Wood: The Aftermath", "Sweet Bro and Hella Jeff: Expanded Edition","F.A.T.A.L. Rulebook") + if("lol", "wtf", "poo", "badmin", "shitmin", "deadmin", "meme", "memes", "skibidi") + new_bible = pick("Woody's Got Wood: The Aftermath", "Sweet Bro and Hella Jeff: Expanded Edition","F.A.T.A.L. Rulebook", "Toilet Humor") switch(new_bible) if("Woody's Got Wood: The Aftermath") holy_bible.deity_name = pick("Woody", "Andy", "Cherry Flavored Lube") @@ -87,6 +87,8 @@ holy_bible.deity_name = pick("Sweet Bro", "Hella Jeff", "Stairs", "AH") if("F.A.T.A.L. Rulebook") holy_bible.deity_name = "Twenty Ten-Sided Dice" + if("Toilet Humor") + holy_bible.deity_name = pick("Skibidi Toilet", "Skibidi Wizard", "Skibidi Bathtub", "John Skibidi", "Skibidi Skibidi", "G-Toilet 1.0", "John Freeman") human_spawned.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100) // also starts off brain damaged as fuck if("servicianism", "partying") holy_bible.desc = "Happy, Full, Clean. Live it and give it." diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm index f204518acc53b..df658d71dddc2 100644 --- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm +++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm @@ -48,6 +48,7 @@ Allows you to behead targets for empowered strikes. \ Harms you if you dismiss the scythe without first causing harm to a creature. \ The shard also causes you to become Morbid, shifting your interests towards the macabre." + rods[/obj/item/melee/skateboard/holyboard] = "A skateboard that grants you flight and anti-magic abilities while ridden. Fits in your bag." AddComponent(/datum/component/subtype_picker, rods, CALLBACK(src, PROC_REF(on_holy_weapon_picked))) /obj/item/nullrod/proc/on_holy_weapon_picked(obj/item/nullrod/holy_weapon_type) diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index 5d007522baf6c..3a62a4b446a56 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -71,7 +71,7 @@ belt = /obj/item/storage/belt/utility/chief/full ears = /obj/item/radio/headset/heads/ce gloves = /obj/item/clothing/gloves/color/black - head = /obj/item/clothing/head/utility/hardhat/white + head = /obj/item/clothing/head/utility/hardhat/welding/white/up shoes = /obj/item/clothing/shoes/sneakers/brown l_pocket = /obj/item/modular_computer/pda/heads/ce diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm index ceb4a279d0b84..3dcc5ac005fec 100644 --- a/code/modules/jobs/job_types/detective.dm +++ b/code/modules/jobs/job_types/detective.dm @@ -73,6 +73,8 @@ ) implants = list(/obj/item/implant/mindshield) + skillchips = list(/obj/item/skillchip/job/detectives_taste) + /datum/outfit/job/detective/pre_equip(mob/living/carbon/human/human, visualsOnly = FALSE) . = ..() if (human.age < AGE_MINOR) diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index c78999b3b73bc..22ef734958326 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -58,7 +58,7 @@ id = /obj/item/card/id/advanced/silver id_trim = /datum/id_trim/job/research_director uniform = /obj/item/clothing/under/rank/rnd/research_director/turtleneck - suit = /obj/item/clothing/suit/jacket/research_director + suit = /obj/item/clothing/suit/toggle/labcoat/research_director backpack_contents = list( /obj/item/melee/baton/telescopic = 1, ) diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index 9738f64a482ba..d273092a1eaa1 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -112,8 +112,8 @@ var/obj/item/stack/sheet/animalhide/goliath_hide/plating = new() explorer_suit.hood.attackby(plating) for(var/obj/item/gun/energy/recharge/kinetic_accelerator/accelerator in miner_contents) - var/obj/item/knife/combat/survival/knife = new(accelerator) - accelerator.bayonet = knife + var/datum/component/bayonet_attachable/bayonet = accelerator.GetComponent(/datum/component/bayonet_attachable) + bayonet.add_bayonet(new /obj/item/knife/combat/survival(accelerator)) var/obj/item/flashlight/seclite/flashlight = new() var/datum/component/seclite_attachable/light_component = accelerator.GetComponent(/datum/component/seclite_attachable) light_component.add_light(flashlight) diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index faa01a28d21d5..4506a2ae22535 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -48,7 +48,7 @@ uniform = /obj/item/clothing/under/rank/engineering/engineer belt = /obj/item/storage/belt/utility/full/engi ears = /obj/item/radio/headset/headset_eng - head = /obj/item/clothing/head/utility/hardhat + head = /obj/item/clothing/head/utility/hardhat/welding/up shoes = /obj/item/clothing/shoes/workboots l_pocket = /obj/item/modular_computer/pda/engineering r_pocket = /obj/item/t_scanner diff --git a/code/modules/library/skill_learning/job_skillchips/detective.dm b/code/modules/library/skill_learning/job_skillchips/detective.dm new file mode 100644 index 0000000000000..427b8566e7e1f --- /dev/null +++ b/code/modules/library/skill_learning/job_skillchips/detective.dm @@ -0,0 +1,9 @@ +/obj/item/skillchip/job/detectives_taste + name = "DET.ekt skillchip" + desc = "Detective \"Encyclopedic Knowledge of Tastes\" v1.21" + auto_traits = list(TRAIT_DETECTIVES_TASTE) + skill_name = "Detective's Taste" + skill_description = "Deduce the minute chemical compositions of any liquid substance just by swishing it around your mouth for a bit." + skill_icon = "vial" + activate_message = span_notice("An explosion of flavors hit your mouth as you remember the secret tastebuds long forgotten.") + deactivate_message = span_notice("Your mouth dulls to the hidden tastes of the world.") diff --git a/code/modules/lootpanel/contents.dm b/code/modules/lootpanel/contents.dm index 4bb255b15611b..44f4acd47f24c 100644 --- a/code/modules/lootpanel/contents.dm +++ b/code/modules/lootpanel/contents.dm @@ -18,6 +18,9 @@ for(var/atom/thing as anything in source_turf.contents) // validate + if(!istype(thing)) + stack_trace("Non-atom in the contents of [source_turf]!") + continue if(thing.mouse_opacity == MOUSE_OPACITY_TRANSPARENT) continue if(thing.IsObscured()) diff --git a/code/modules/lootpanel/search_object.dm b/code/modules/lootpanel/search_object.dm index 4de60b04a678a..149be76e71064 100644 --- a/code/modules/lootpanel/search_object.dm +++ b/code/modules/lootpanel/search_object.dm @@ -26,6 +26,9 @@ if(isturf(item)) RegisterSignal(item, COMSIG_TURF_CHANGE, PROC_REF(on_turf_change)) else + // Lest we find ourselves here again, this is intentionally stupid. + // It tracks items going out and user actions, otherwise they can refresh the lootpanel. + // If this is to be made to track everything, we'll need to make a new signal to specifically create/delete a search object RegisterSignals(item, list( COMSIG_ITEM_PICKUP, COMSIG_MOVABLE_MOVED, diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/lavaland_incursion.dm b/code/modules/mapfluff/ruins/icemoonruin_code/lavaland_incursion.dm new file mode 100644 index 0000000000000..6674123c4089a --- /dev/null +++ b/code/modules/mapfluff/ruins/icemoonruin_code/lavaland_incursion.dm @@ -0,0 +1,20 @@ +/mob/living/basic/mining/legion/cult_skeleton + corpse_type = /obj/effect/mob_spawn/corpse/human/skeleton/cultist + +/obj/effect/mob_spawn/corpse/human/skeleton/cultist + name = "skeleton cultist" + outfit = /datum/outfit/skeleton_cultist + +/datum/outfit/skeleton_cultist + name = "Skeleton Cultist" + uniform = /obj/item/clothing/under/rank/civilian/chaplain + suit = /obj/item/clothing/suit/hooded/cultrobes + shoes = /obj/item/clothing/shoes/cult + +/obj/item/paper/crumpled/bloody/ruins/lavaland_incursion + name = "blood-written note" + default_raw_text = "

    Here, far above Indecipheres, shrouded in snow and ice, I sign the death warrant of the last of a species. The Dragons kneel beneath us." + +/obj/item/paper/crumpled/bloody/ruins/lavaland_incursion/last + name = "blood-written note" + default_raw_text = "

    SHE WAS WRONG. KILL IT? WE COULD BARELY CONTAIN IT. AND NOW, INDECIPHERES WANTS IT TO COME HOME" diff --git a/code/modules/mapfluff/ruins/icemoonruin_code/library.dm b/code/modules/mapfluff/ruins/icemoonruin_code/library.dm index 1de9ce2dc728c..2f3b6381f0484 100644 --- a/code/modules/mapfluff/ruins/icemoonruin_code/library.dm +++ b/code/modules/mapfluff/ruins/icemoonruin_code/library.dm @@ -5,6 +5,18 @@ puzzle_id = "library" open_message = "The door opens with a loud creak." +/obj/machinery/door/puzzle/keycard/library/animation_length(animation) + switch(animation) + if(DOOR_OPENING_ANIMATION) + return 1.2 SECONDS + +/obj/machinery/door/puzzle/keycard/library/animation_segment_delay(animation) + switch(animation) + if(DOOR_OPENING_PASSABLE) + return 1.0 SECONDS + if(DOOR_OPENING_FINISHED) + return 1.2 SECONDS + /obj/item/keycard/library name = "golden key" desc = "A dull, golden key." diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm index 1c0a5392fb9b2..57f20abb1aa19 100644 --- a/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm +++ b/code/modules/mapfluff/ruins/objects_and_mobs/museum.dm @@ -78,15 +78,15 @@ desc = /obj/machinery/atmospherics/components/unary/vent_scrubber::desc icon = /obj/machinery/atmospherics/components/unary/vent_scrubber::icon layer = /obj/machinery/atmospherics/components/unary/vent_scrubber::layer - plane = FLOOR_PLANE + plane = /obj/machinery/atmospherics/components/unary/vent_scrubber::plane icon_state = "scrub_on" /obj/structure/fluff/fake_vent name = /obj/machinery/atmospherics/components/unary/vent_pump::name desc = /obj/machinery/atmospherics/components/unary/vent_pump::desc icon = /obj/machinery/atmospherics/components/unary/vent_pump::icon - layer = /obj/machinery/atmospherics/components/unary/vent_scrubber::layer - plane = FLOOR_PLANE + layer = /obj/machinery/atmospherics/components/unary/vent_pump::layer + plane = /obj/machinery/atmospherics/components/unary/vent_pump::plane icon_state = "vent_out" /turf/open/mirage diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index e59b04e6c7efa..e830718e12ed6 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -107,6 +107,12 @@ return return ..(ceiling) +///Used for marking mapping errors. These should only be created by cases explicitly caught by unit tests, and should NEVER actually appear in production. +/obj/effect/mapping_error + name = "I AM ERROR" + desc = "IF YOU SEE ME, YELL AT A MAPPER!!!" + icon = 'icons/effects/mapping_helpers.dmi' + icon_state = "mapping_error" /obj/effect/mapping_helpers icon = 'icons/effects/mapping_helpers.dmi' @@ -1183,7 +1189,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_atoms_ontop) if(response.errored || response.status_code != 200) query_in_progress = FALSE CRASH("Failed to fetch mapped custom json from url [json_url], code: [response.status_code], error: [response.error]") - var/json_data = response["body"] + var/json_data = response.body json_cache[json_url] = json_data query_in_progress = FALSE return json_data diff --git a/code/modules/meteors/meteor_changeling.dm b/code/modules/meteors/meteor_changeling.dm index 5733e2dbe93e2..9c25f8b6776a6 100644 --- a/code/modules/meteors/meteor_changeling.dm +++ b/code/modules/meteors/meteor_changeling.dm @@ -30,7 +30,7 @@ return TRUE //If the meteor misses the station and deletes itself, we make absolutely sure the changeling reaches the station. -/obj/effect/meteor/meaty/changeling/handle_stopping() +/obj/effect/meteor/meaty/changeling/moved_off_z() if(!landing_target) //If our destination turf is gone for some reason, we chuck them at the observer_start landmark (usually at the center of the station) as a last resort. landing_target = locate(/obj/effect/landmark/observer_start) in GLOB.landmarks_list diff --git a/code/modules/meteors/meteor_dark_matteor.dm b/code/modules/meteors/meteor_dark_matteor.dm index f965605048204..f72bbcff6fa13 100644 --- a/code/modules/meteors/meteor_dark_matteor.dm +++ b/code/modules/meteors/meteor_dark_matteor.dm @@ -60,7 +60,7 @@ qdel(defender) return FALSE -/obj/effect/meteor/dark_matteor/handle_stopping() +/obj/effect/meteor/dark_matteor/moved_off_z() . = ..() if(previous_security_level && SSsecurity_level.get_current_level_as_number() != SEC_LEVEL_DELTA) SSsecurity_level.set_level(previous_security_level) diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm index 9096ab24afec8..199f6517abb1e 100644 --- a/code/modules/meteors/meteor_types.dm +++ b/code/modules/meteors/meteor_types.dm @@ -60,8 +60,7 @@ get_hit() if(z != z_original || loc == get_turf(dest)) - qdel(src) - return + moved_off_z() /obj/effect/meteor/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) return TRUE //Keeps us from drifting for no reason @@ -80,13 +79,9 @@ if(!new_loop) return - RegisterSignal(new_loop, COMSIG_QDELETING, PROC_REF(handle_stopping)) - ///Deals with what happens when we stop moving, IE we die -/obj/effect/meteor/proc/handle_stopping() - SIGNAL_HANDLER - if(!QDELETED(src)) - qdel(src) +/obj/effect/meteor/proc/moved_off_z() + qdel(src) /obj/effect/meteor/proc/ram_turf(turf/T) //first yell at mobs about them dying horribly @@ -459,8 +454,8 @@ /obj/effect/meteor/pumpkin name = "PUMPKING" desc = "THE PUMPKING'S COMING!" - icon = 'icons/obj/meteor_spooky.dmi' - icon_state = "pumpkin" + icon = 'icons/obj/meteor.dmi' + icon_state = "spooky" hits = 10 heavy = TRUE dropamt = 1 diff --git a/code/modules/mining/boulder_processing/boulder_types.dm b/code/modules/mining/boulder_processing/boulder_types.dm index 1ffce8737bdd4..8f6889b7c8470 100644 --- a/code/modules/mining/boulder_processing/boulder_types.dm +++ b/code/modules/mining/boulder_processing/boulder_types.dm @@ -4,7 +4,7 @@ desc = "This boulder is brimming with strange energy. Cracking it open could contain something unusual for science." icon_state = "boulder_artifact" /// This is the type of item that will be inside the boulder. Default is a strange object. - var/artifact_type = /obj/item/relic + var/artifact_type = /obj/item/relic/lavaland /// References to the relic inside the boulder, if any. var/obj/item/artifact_inside diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 56b65c456197b..649acabfcae4a 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -97,13 +97,10 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) if(uses_left <= 0) user.transferItemToLoc(src, thing, TRUE) - var/mutable_appearance/balloon - var/mutable_appearance/balloon2 - var/mutable_appearance/balloon3 - if(isliving(thing)) var/mob/living/creature = thing creature.Paralyze(32 SECONDS) // Keep them from moving during the duration of the extraction + ADD_TRAIT(creature, TRAIT_FORCED_STANDING, FULTON_PACK_TRAIT) // Prevents animation jank from happening if(creature.buckled) creature.buckled.unbuckle_mob(creature, TRUE) // Unbuckle them to prevent anchoring problems else @@ -113,14 +110,15 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) var/obj/effect/extraction_holder/holder_obj = new(get_turf(thing)) holder_obj.appearance = thing.appearance thing.forceMove(holder_obj) - balloon2 = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_expand") + var/mutable_appearance/balloon2 = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_expand", layer = VEHICLE_LAYER) balloon2.pixel_y = 10 balloon2.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.add_overlay(balloon2) + addtimer(CALLBACK(src, PROC_REF(create_balloon), thing, user, holder_obj, balloon2), 0.4 SECONDS) + return ITEM_INTERACT_SUCCESS - sleep(0.4 SECONDS) - - balloon = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_balloon") +/obj/item/extraction_pack/proc/create_balloon(atom/movable/thing, mob/living/user, obj/effect/extraction_holder/holder_obj, mutable_appearance/balloon2) + var/mutable_appearance/balloon = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_balloon", layer = VEHICLE_LAYER) balloon.pixel_y = 10 balloon.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.cut_overlay(balloon2) @@ -132,6 +130,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) animate(pixel_z = -5, time = 1 SECONDS, flags = ANIMATION_RELATIVE) animate(pixel_z = 5, time = 1 SECONDS, flags = ANIMATION_RELATIVE) animate(pixel_z = -5, time = 1 SECONDS, flags = ANIMATION_RELATIVE) + sleep(6 SECONDS) playsound(holder_obj.loc, 'sound/items/fultext_launch.ogg', vol = 50, vary = TRUE, extrarange = -3) @@ -146,7 +145,7 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) sleep(3 SECONDS) var/turf/flooring_near_beacon = list() - var/turf/beacon_turf = get_turf(beacon) + var/turf/beacon_turf = get_turf(beacon_ref.resolve()) for(var/turf/floor as anything in RANGE_TURFS(1, beacon_turf)) if(!floor.is_blocked_turf()) flooring_near_beacon += floor @@ -159,26 +158,28 @@ GLOBAL_LIST_EMPTY(total_extraction_beacons) animate(holder_obj, pixel_z = -990, time = 5 SECONDS, flags = ANIMATION_RELATIVE) animate(pixel_z = 5, time = 1 SECONDS, flags = ANIMATION_RELATIVE) animate(pixel_z = -5, time = 1 SECONDS, flags = ANIMATION_RELATIVE) + sleep(7 SECONDS) - balloon3 = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_retract") + var/mutable_appearance/balloon3 = mutable_appearance('icons/effects/fulton_balloon.dmi', "fulton_retract", layer = VEHICLE_LAYER) balloon3.pixel_y = 10 balloon3.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM holder_obj.cut_overlay(balloon) holder_obj.add_overlay(balloon3) + sleep(0.4 SECONDS) holder_obj.cut_overlay(balloon3) + if (isliving(thing)) + REMOVE_TRAIT(thing, TRAIT_FORCED_STANDING, FULTON_PACK_TRAIT) thing.set_anchored(FALSE) // An item has to be unanchored to be extracted in the first place. thing.set_density(initial(thing.density)) animate(holder_obj, pixel_z = -10, time = 0.5 SECONDS, flags = ANIMATION_RELATIVE) sleep(0.5 SECONDS) - thing.forceMove(holder_obj.loc) qdel(holder_obj) if(uses_left <= 0) qdel(src) - return ITEM_INTERACT_SUCCESS /obj/item/fulton_core name = "extraction beacon assembly kit" diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index a52107ce8b260..385afb0f81f3e 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -31,13 +31,10 @@ machine = null return ..() -/obj/machinery/mineral/stacking_unit_console/multitool_act(mob/living/user, obj/item/I) - if(!multitool_check_buffer(user, I)) - return - var/obj/item/multitool/M = I +/obj/machinery/mineral/stacking_unit_console/multitool_act(mob/living/user, obj/item/multitool/M) M.set_buffer(src) balloon_alert(user, "saved to multitool buffer") - return TRUE + return ITEM_INTERACT_SUCCESS /obj/machinery/mineral/stacking_unit_console/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 1a7b362ec2e73..c1a81b9d33847 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -359,6 +359,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp abstract_move(destination) // move like the wind return TRUE +/mob/dead/observer/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + var/area/new_area = get_area(src) + if(new_area != ambience_tracked_area) + update_ambience_area(new_area) + /mob/dead/observer/verb/reenter_corpse() set category = "Ghost" set name = "Re-enter Corpse" diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 7a63d0fc8e622..2d22c11ee71f8 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -405,22 +405,6 @@ items -= held_items return items -/** - * Used to return a list of equipped items on a human mob; does not by default include held items, see include_flags - * - * Argument(s): - * * Optional - include_flags, (see obj.flags.dm) describes which optional things to include or not (pockets, accessories, held items) - */ - -/mob/living/carbon/human/get_equipped_items(include_flags = NONE) - var/list/items = ..() - if(!(include_flags & INCLUDE_POCKETS)) - items -= list(l_store, r_store, s_store) - if((include_flags & INCLUDE_ACCESSORIES) && w_uniform) - var/obj/item/clothing/under/worn_under = w_uniform - items += worn_under.attached_accessories - return items - /** * Returns the items that were succesfully unequipped. */ @@ -439,36 +423,88 @@ dropped_items |= return_val return dropped_items -/mob/living/carbon/proc/check_obscured_slots(transparent_protection) - var/obscured = NONE - var/hidden_slots = NONE - - for(var/obj/item/equipped_item in get_equipped_items()) - hidden_slots |= equipped_item.flags_inv - if(transparent_protection) - hidden_slots |= equipped_item.transparent_protection - - if(hidden_slots & HIDENECK) - obscured |= ITEM_SLOT_NECK - if(hidden_slots & HIDEMASK) - obscured |= ITEM_SLOT_MASK - if(hidden_slots & HIDEEYES) - obscured |= ITEM_SLOT_EYES - if(hidden_slots & HIDEEARS) - obscured |= ITEM_SLOT_EARS - if(hidden_slots & HIDEGLOVES) - obscured |= ITEM_SLOT_GLOVES - if(hidden_slots & HIDEJUMPSUIT) - obscured |= ITEM_SLOT_ICLOTHING - if(hidden_slots & HIDESHOES) - obscured |= ITEM_SLOT_FEET - if(hidden_slots & HIDESUITSTORAGE) - obscured |= ITEM_SLOT_SUITSTORE - if(hidden_slots & HIDEHEADGEAR) - obscured |= ITEM_SLOT_HEAD - - return obscured +/** + * Try to equip an item to a slot on the mob + * + * This is a SAFE proc. Use this instead of equip_to_slot()! + * + * set qdel_on_fail to have it delete W if it fails to equip + * + * set disable_warning to disable the 'you are unable to equip that' warning. + * + * unset redraw_mob to prevent the mob icons from being redrawn at the end. + * + * Initial is used to indicate whether or not this is the initial equipment (job datums etc) or just a player doing it + * + * set indirect_action to allow insertions into "soft" locked objects, things that are easily opened by the owning mob + */ +/mob/proc/equip_to_slot_if_possible(obj/item/W, slot, qdel_on_fail = FALSE, disable_warning = FALSE, redraw_mob = TRUE, bypass_equip_delay_self = FALSE, initial = FALSE, indirect_action = FALSE) + if(!istype(W) || QDELETED(W)) //This qdeleted is to prevent stupid behavior with things that qdel during init, like say stacks + return FALSE + if(!W.mob_can_equip(src, slot, disable_warning, bypass_equip_delay_self, indirect_action = indirect_action)) + if(qdel_on_fail) + qdel(W) + else if(!disable_warning) + to_chat(src, span_warning("You are unable to equip that!")) + return FALSE + equip_to_slot(W, slot, initial, redraw_mob, indirect_action = indirect_action) //This proc should not ever fail. + return TRUE + +/** + * Actually equips an item to a slot (UNSAFE) + * + * This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on + * whether you can or can't equip need to be done before! Use mob_can_equip() for that task. + * + *In most cases you will want to use equip_to_slot_if_possible() + */ +/mob/proc/equip_to_slot(obj/item/equipping, slot, initial = FALSE, redraw_mob = FALSE, indirect_action = FALSE) + return + +/** + * Equip an item to the slot or delete + * + * This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to + * equip people when the round starts and when events happen and such. + * + * Also bypasses equip delay checks, since the mob isn't actually putting it on. + * Initial is used to indicate whether or not this is the initial equipment (job datums etc) or just a player doing it + * set indirect_action to allow insertions into "soft" locked objects, things that are easily opened by the owning mob + */ +/mob/proc/equip_to_slot_or_del(obj/item/W, slot, initial = FALSE, indirect_action = FALSE) + return equip_to_slot_if_possible(W, slot, TRUE, TRUE, FALSE, TRUE, initial, indirect_action) + +/** + * Auto equip the passed in item the appropriate slot based on equipment priority + * + * puts the item "W" into an appropriate slot in a human's inventory + * + * returns 0 if it cannot, 1 if successful + */ +/mob/proc/equip_to_appropriate_slot(obj/item/W, qdel_on_fail = FALSE, indirect_action = FALSE) + if(!istype(W)) + return FALSE + var/slot_priority = W.slot_equipment_priority + + if(!slot_priority) + slot_priority = list( \ + ITEM_SLOT_BACK, ITEM_SLOT_ID,\ + ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\ + ITEM_SLOT_MASK, ITEM_SLOT_HEAD, ITEM_SLOT_NECK,\ + ITEM_SLOT_FEET, ITEM_SLOT_GLOVES,\ + ITEM_SLOT_EARS, ITEM_SLOT_EYES,\ + ITEM_SLOT_BELT, ITEM_SLOT_SUITSTORE,\ + ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET,\ + ITEM_SLOT_DEX_STORAGE\ + ) + for(var/slot in slot_priority) + if(equip_to_slot_if_possible(W, slot, disable_warning = TRUE, redraw_mob = TRUE, indirect_action = indirect_action)) + return TRUE + + if(qdel_on_fail) + qdel(W) + return FALSE /// Tries to equip an item, store it in open storage, or in next best storage /obj/item/proc/equip_to_best_slot(mob/user) @@ -549,27 +585,6 @@ if(hud_used) hud_used.build_hand_slots() -/mob/living/carbon/human/change_number_of_hands(amt) - var/old_limbs = held_items.len - if(amt < old_limbs) - for(var/i in hand_bodyparts.len to amt step -1) - var/obj/item/bodypart/BP = hand_bodyparts[i] - BP.dismember() - hand_bodyparts[i] = null - hand_bodyparts.len = amt - else if(amt > old_limbs) - hand_bodyparts.len = amt - for(var/i in old_limbs+1 to amt) - var/path = /obj/item/bodypart/arm/left - if(!(i % 2)) - path = /obj/item/bodypart/arm/right - - var/obj/item/bodypart/BP = new path () - BP.held_index = i - BP.try_attach_limb(src, TRUE) - hand_bodyparts[i] = BP - ..() //Don't redraw hands until we have organs for them - //GetAllContents that is reasonable and not stupid /mob/living/proc/get_all_gear() var/list/processing_list = get_equipped_items(INCLUDE_POCKETS | INCLUDE_ACCESSORIES | INCLUDE_HELD) diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling.dm b/code/modules/mob/living/basic/jungle/seedling/seedling.dm index 5a958d3ca7c18..7a853b8a9d086 100644 --- a/code/modules/mob/living/basic/jungle/seedling/seedling.dm +++ b/code/modules/mob/living/basic/jungle/seedling/seedling.dm @@ -30,6 +30,7 @@ lighting_cutoff_green = 20 lighting_cutoff_blue = 25 mob_size = MOB_SIZE_LARGE + faction = list(FACTION_PLANTS) attack_sound = 'sound/weapons/bladeslice.ogg' attack_vis_effect = ATTACK_EFFECT_SLASH ai_controller = /datum/ai_controller/basic_controller/seedling @@ -206,7 +207,7 @@ /mob/living/basic/seedling/meanie maxHealth = 400 health = 400 - faction = list(FACTION_JUNGLE) + faction = list(FACTION_JUNGLE, FACTION_PLANTS) ai_controller = /datum/ai_controller/basic_controller/seedling/meanie seedling_commands = list( /datum/pet_command/idle, diff --git a/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm b/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm index 030ae6d64b837..ba6346ea19159 100644 --- a/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm +++ b/code/modules/mob/living/basic/lavaland/goliath/tentacle.dm @@ -20,7 +20,7 @@ if (ismineralturf(loc)) var/turf/closed/mineral/floor = loc floor.gets_drilled() - if (!isopenturf(loc) || isspaceturf(loc) || isopenspaceturf(loc)) + if (!isopenturf(loc) || is_space_or_openspace(loc)) return INITIALIZE_HINT_QDEL for (var/obj/effect/goliath_tentacle/tentacle in loc) if (tentacle != src) diff --git a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm index 8cd3c567a7d2d..784f5dd369907 100644 --- a/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm +++ b/code/modules/mob/living/basic/lavaland/raptor/_raptor.dm @@ -309,4 +309,8 @@ GLOBAL_LIST_EMPTY(raptor_population) animated = FALSE insert_on_attack = FALSE +/datum/storage/raptor_storage/on_mousedropped_onto(datum/source, obj/item/dropping, mob/user) + ..() + return NONE + #undef HAPPINESS_BOOST_DAMPENER 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 541a4ed9e1c7e..a61ea0743f9a4 100644 --- a/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm +++ b/code/modules/mob/living/basic/lavaland/watcher/watcher_overwatch.dm @@ -76,7 +76,7 @@ COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_THROW, COMSIG_MOB_USED_MECH_EQUIPMENT, - COMSIG_MOB_USED_MECH_MELEE, + COMSIG_MOB_USED_CLICK_MECH_MELEE, COMSIG_MOVABLE_MOVED, ) 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 index 7484cbfe6751c..ad9a56b3acfdd 100644 --- 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 @@ -29,7 +29,7 @@ /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)) + if(is_space_or_openspace(candidate)) continue if(candidate.is_blocked_turf(source_atom = controller.pawn)) continue diff --git a/code/modules/mob/living/basic/ruin_defender/flesh.dm b/code/modules/mob/living/basic/ruin_defender/flesh.dm index 6f46e69070038..f59ef674e860d 100644 --- a/code/modules/mob/living/basic/ruin_defender/flesh.dm +++ b/code/modules/mob/living/basic/ruin_defender/flesh.dm @@ -71,7 +71,7 @@ continue if(movable == victim) continue - if(!victim.CanReach(movable)) + if(!victim.CanReach(movable) || victim.invisibility) continue candidates += movable if(!length(candidates)) @@ -80,7 +80,7 @@ if(isnull(candidate)) return victim.start_pulling(candidate, supress_message = TRUE) - victim.visible_message(span_warning("[victim][victim.p_s()] [current_bodypart] instinctually starts feeling [candidate]!")) + victim.visible_message(span_warning("[victim]'s [current_bodypart.name] instinctively starts feeling [candidate]!")) return if(HAS_TRAIT(victim, TRAIT_IMMOBILIZED)) @@ -127,7 +127,11 @@ if(BODY_ZONE_R_LEG) part_type = /obj/item/bodypart/leg/right/flesh - target.visible_message(span_danger("[src] [target_part ? "tears off and attaches itself" : "attaches itself"] to where [target][target.p_s()] limb used to be!")) + if (!isnull(target_part)) + target.visible_message(span_danger("[src] tears off [target]'s [target_part.plaintext_zone] and attaches itself in [target_part.p_their()] place!"), span_userdanger("[src] tears off your [target_part.plaintext_zone] and attaches itself in [target_part.p_their()] place!")) + else + target.visible_message(span_danger("[src] attaches itself to where [target]'s [target.parse_zone_with_bodypart(target_zone)] used to be!"), span_userdanger("[src] attaches itself to where your [target.parse_zone_with_bodypart(target_zone)] used to be!")) + var/obj/item/bodypart/new_bodypart = new part_type() forceMove(new_bodypart) new_bodypart.replace_limb(target, TRUE) diff --git a/code/modules/mob/living/basic/ruin_defender/living_floor.dm b/code/modules/mob/living/basic/ruin_defender/living_floor.dm index 851a0873657a0..105838f0c55dd 100644 --- a/code/modules/mob/living/basic/ruin_defender/living_floor.dm +++ b/code/modules/mob/living/basic/ruin_defender/living_floor.dm @@ -35,7 +35,7 @@ move_resist = INFINITY density = FALSE combat_mode = TRUE - layer = TURF_LAYER + layer = LOW_FLOOR_LAYER plane = FLOOR_PLANE faction = list(FACTION_HOSTILE) melee_damage_lower = 20 diff --git a/code/modules/mob/living/basic/slime/defense.dm b/code/modules/mob/living/basic/slime/defense.dm index b747c24201971..a3242525170c7 100644 --- a/code/modules/mob/living/basic/slime/defense.dm +++ b/code/modules/mob/living/basic/slime/defense.dm @@ -19,7 +19,7 @@ return attacker.visible_message(span_warning("[attacker] manages to wrestle \the [defender_slime.name] off!"), span_notice("You manage to wrestle \the [defender_slime.name] off!")) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + playsound(loc, 'sound/weapons/shove.ogg', 50, TRUE, -1) defender_slime.discipline_slime() diff --git a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_eyeball.dm b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_eyeball.dm index 44775ea7217ce..0318b044a21ce 100644 --- a/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_eyeball.dm +++ b/code/modules/mob/living/basic/space_fauna/meteor_heart/meteor_eyeball.dm @@ -10,7 +10,7 @@ GLOBAL_LIST_EMPTY(meteor_eyeballs) desc = "An eyeball growing out of the ground, gross." icon_state = "eyeball" max_integrity = 15 - layer = LOW_OBJ_LAYER + layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE /obj/structure/meateor_fluff/eyeball/Initialize(mapload) diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm index 3cce5e3481784..724833af16f2a 100644 --- a/code/modules/mob/living/basic/vermin/mouse.dm +++ b/code/modules/mob/living/basic/vermin/mouse.dm @@ -117,11 +117,19 @@ . = ..(TRUE) // Now if we were't ACTUALLY gibbed, spawn the dead mouse if(!gibbed) - var/obj/item/food/deadmouse/mouse = new(loc) - mouse.copy_corpse(src) - if(HAS_TRAIT(src, TRAIT_BEING_SHOCKED)) - mouse.desc = "They're toast." - mouse.add_atom_colour("#3A3A3A", FIXED_COLOUR_PRIORITY) + var/make_a_corpse = TRUE + var/place_to_make_corpse = loc + if(istype(loc, /obj/item/clothing/head/mob_holder))//If our mouse is dying in place holder we want to put the dead mouse where the place holder was + var/obj/item/clothing/head/mob_holder/found_holder = loc + place_to_make_corpse = found_holder.loc + if(istype(found_holder.loc, /obj/machinery/microwave))//Microwaves gib things that die when cooked, so we don't need to make a dead body too + make_a_corpse = FALSE + if(make_a_corpse) + var/obj/item/food/deadmouse/mouse = new(place_to_make_corpse) + mouse.copy_corpse(src) + if(HAS_TRAIT(src, TRAIT_BEING_SHOCKED)) + mouse.desc = "They're toast." + mouse.add_atom_colour("#3A3A3A", FIXED_COLOUR_PRIORITY) qdel(src) /mob/living/basic/mouse/UnarmedAttack(atom/attack_target, proximity_flag, list/modifiers) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index a5162dea0dc42..5ac120fcee3f3 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -103,15 +103,15 @@ investigate_log("has died of bloodloss.", INVESTIGATE_DEATHS) death() - // Blood ratio! if you have 230 blood, this equals 0.5 as that's half of the current value, 560. - var/effective_blood_ratio = blood_volume/BLOOD_VOLUME_NORMAL + // Blood ratio! if you have 280 blood, this equals 0.5 as that's half of the current value, 560. + var/effective_blood_ratio = blood_volume / BLOOD_VOLUME_NORMAL - // If your ratio is less than one (you're missing any blood) and your oxyloss is under that ratio %, start getting oxy damage. + // If your ratio is less than one (you're missing any blood) and your oxyloss is under missing blood %, start getting oxy damage. // This damage accrues faster the less blood you have. // If KO or in hardcrit, the damage accrues even then to prevent being perma-KO. - if(((effective_blood_ratio < 1) && (getOxyLoss() < (effective_blood_ratio * 100))) || (stat in list(UNCONSCIOUS, HARD_CRIT))) + if(((effective_blood_ratio < 1) && (getOxyLoss() < ((1 - effective_blood_ratio) * 100))) || (stat in list(UNCONSCIOUS, HARD_CRIT))) // At roughly half blood this equals to 3 oxyloss per tick. At 90% blood it's close to 0.5 - var/rounded_oxyloss = round(0.01 * (BLOOD_VOLUME_NORMAL - blood_volume) * seconds_per_tick, 0.25) + var/rounded_oxyloss = round(0.01 * (BLOOD_VOLUME_NORMAL - blood_volume), 0.25) * seconds_per_tick adjustOxyLoss(rounded_oxyloss, updating_health = TRUE) /// Has each bodypart update its bleed/wound overlay icon states @@ -227,7 +227,7 @@ ****************************************************/ //Gets blood from mob to a container or other mob, preserving all data in it. -/mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced) +/mob/living/proc/transfer_blood_to(atom/movable/AM, amount, forced, ignore_incompatibility) if(!blood_volume || !AM.reagents) return FALSE if(blood_volume < BLOOD_VOLUME_BAD && !forced) @@ -254,7 +254,7 @@ if((D.spread_flags & DISEASE_SPREAD_SPECIAL) || (D.spread_flags & DISEASE_SPREAD_NON_CONTAGIOUS)) continue C.ForceContractDisease(D) - if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type))) + if(!(blood_data["blood_type"] in get_safe_blood(C.dna.blood_type)) && !(ignore_incompatibility)) C.reagents.add_reagent(/datum/reagent/toxin, amount * 0.5) return TRUE @@ -349,6 +349,15 @@ if(safe) . = safe +/** + * Returns TRUE if src is compatible with donor's blood, otherwise FALSE. + * * donor: Carbon mob, the one that is donating blood. + */ +/mob/living/carbon/proc/get_blood_compatibility(mob/living/carbon/donor) + var/patient_blood_data = get_blood_data(get_blood_id()) + var/donor_blood_data = donor.get_blood_data(donor.get_blood_id()) + return donor_blood_data["blood_type"] in get_safe_blood(patient_blood_data["blood_type"]) + //to add a splatter of blood or other mob liquid. /mob/living/proc/add_splatter_floor(turf/T, small_drip) if(get_blood_id() != /datum/reagent/blood) diff --git a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm index f3cfbfda8a9ee..999ec07f41a65 100644 --- a/code/modules/mob/living/carbon/alien/adult/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/adult/alien_powers.dm @@ -251,7 +251,8 @@ Doesn't work on other aliens/AI.*/ plasma_cost = 50 /datum/action/cooldown/alien/acid/neurotoxin/IsAvailable(feedback = FALSE) - if(owner.is_muzzled()) + var/mob/living/carbon/as_carbon = owner + if(istype(as_carbon) && as_carbon.is_mouth_covered(ITEM_SLOT_MASK)) return FALSE if(!isturf(owner.loc)) return FALSE diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index f8210c77368cc..a995eafbb3ac0 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -76,6 +76,7 @@ return pick (list("xltrails_1", "xltrails2")) else return pick (list("xttrails_1", "xttrails2")) + /*---------------------------------------- Proc: AddInfectionImages() Des: Gives the client of the alien an image on each infected mob. diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index d068610b28f7a..d1ec6d7e88038 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -24,6 +24,7 @@ layer = MOB_LAYER max_integrity = 100 item_flags = XENOMORPH_HOLDABLE + slowdown = 2 var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case var/sterile = FALSE @@ -39,6 +40,7 @@ ) AddElement(/datum/element/connect_loc, loc_connections) AddElement(/datum/element/atmos_sensitive, mapload) + AddElement(/datum/element/muffles_speech) RegisterSignal(src, COMSIG_LIVING_TRYING_TO_PULL, PROC_REF(react_to_mob)) @@ -122,7 +124,7 @@ /obj/item/clothing/mask/facehugger/proc/valid_to_attach(mob/living/hit_mob) // valid targets: carbons except aliens and devils - // facehugger state early exit checks + // facehugger state early exit checks (Note: Melbert does not want dead people to be huggable) if(stat != CONSCIOUS) return FALSE if(attached) @@ -171,9 +173,12 @@ log_combat(target, src, "was facehugged by") return TRUE // time for a smoke -/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/M) - if(!valid_to_attach(M)) +/obj/item/clothing/mask/facehugger/proc/Attach(mob/living/victim) + if(!valid_to_attach(victim)) return + + if(victim.stat < UNCONSCIOUS) //sorry bro you gotta be awake + victim.say("AAAA!!") //triggers muffled speech and also visual feedback i guess // early returns and validity checks done: attach. attached++ //ensure we detach once we no longer need to be attached @@ -181,12 +186,12 @@ if(!sterile) - M.take_bodypart_damage(strength,0) //done here so that humans in helmets take damage - M.Unconscious(MAX_IMPREGNATION_TIME/0.3) //something like 25 ticks = 20 seconds with the default settings - + victim.take_bodypart_damage(strength,0) //done here so that humans in helmets take damage + if(real && !sterile) + victim.Knockdown(5 SECONDS) GoIdle() //so it doesn't jump the people that tear it off - addtimer(CALLBACK(src, PROC_REF(Impregnate), M), rand(MIN_IMPREGNATION_TIME, MAX_IMPREGNATION_TIME)) + addtimer(CALLBACK(src, PROC_REF(Impregnate), victim), rand(MIN_IMPREGNATION_TIME, MAX_IMPREGNATION_TIME)) /obj/item/clothing/mask/facehugger/proc/detach() attached = 0 @@ -249,6 +254,29 @@ visible_message(span_danger("[src] curls up into a ball!")) + // chest maybe because getting slammed in the chest would knock it off your face while dead + AddComponent(/datum/component/knockoff, knockoff_chance = 40, target_zones = list(BODY_ZONE_HEAD, BODY_ZONE_CHEST), slots_knockoffable = slot_flags) + +/obj/item/clothing/mask/facehugger/allow_attack_hand_drop(mob/living/carbon/human/user) + if(!real || sterile || user.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo)) + return ..() + if(istype(user) && ishuman(loc) && stat != DEAD) + if(user == loc && user.get_item_by_slot(slot_flags) == src) + to_chat(user, span_userdanger("[src] is latched on too tight! Get help or wait for it to let go!")) + return FALSE + return ..() + +/obj/item/clothing/mask/facehugger/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) + var/mob/living/carbon/human/wearer = loc + if(!istype(wearer) || user != wearer) + return + if(!real || sterile || user.get_organ_by_type(/obj/item/organ/internal/body_egg/alien_embryo)) + return ..() + if(wearer.get_item_by_slot(slot_flags) == src && stat != DEAD) + to_chat(user, span_userdanger("[src] is latched on too tight! Get help or wait for it to let go!")) + return + return ..() + /proc/CanHug(mob/living/M) if(!istype(M)) return FALSE @@ -268,6 +296,7 @@ name = "Lamarr" desc = "The Research Director's pet, a domesticated and debeaked xenomorph facehugger. Friendly, but may still try to couple with your head." sterile = TRUE + slowdown = 1.5 //lamarr is too fat after being fed in captivity to effectively slow people down or something /obj/item/clothing/mask/facehugger/dead icon_state = "facehugger_dead" @@ -287,6 +316,7 @@ real = FALSE sterile = TRUE tint = 3 //Makes it feel more authentic when it latches on + slowdown = 0 /obj/item/clothing/mask/facehugger/toy/Die() return diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 539dfd64ce353..8965bccd0007c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -6,6 +6,7 @@ GLOB.carbon_list += src 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 + breathing_loop = new(src) /mob/living/carbon/Destroy() //This must be done first, so the mob ghosts correctly before DNA etc is nulled @@ -21,6 +22,7 @@ qdel(scar) remove_from_all_data_huds() QDEL_NULL(dna) + QDEL_NULL(breathing_loop) GLOB.carbon_list -= src /mob/living/carbon/item_interaction(mob/living/user, obj/item/tool, list/modifiers) @@ -228,13 +230,6 @@ . = ..() loc.handle_fall(src)//it's loc so it doesn't call the mob's handle_fall which does nothing -/mob/living/carbon/is_muzzled() - for (var/obj/item/clothing/clothing in get_equipped_items()) - if(clothing.clothing_flags & BLOCKS_SPEECH) - return TRUE - return FALSE - - /mob/living/carbon/resist_buckle() if(!HAS_TRAIT(src, TRAIT_RESTRAINED)) buckled.user_unbuckle_mob(src, src) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index d6dc119de58a3..8ef981b189da4 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -415,7 +415,7 @@ // this way, we only visibly try to examine ourselves if we have something embedded, otherwise we'll still hug ourselves :) visible_message(span_notice("[src] examines [p_them()]self."), \ span_notice("You check yourself for shrapnel.")) - if(I.isEmbedHarmless()) + if(I.is_embed_harmless()) to_chat(src, "\t There is \a [I] stuck to your [LB.name]!") else to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") @@ -696,7 +696,7 @@ /mob/living/carbon/get_shove_flags(mob/living/shover, obj/item/weapon) . = ..() . |= SHOVE_CAN_STAGGER - if(IsKnockdown() && !IsParalyzed()) + if(IsKnockdown() && !IsParalyzed() && HAS_TRAIT(src, TRAIT_STUN_ON_NEXT_SHOVE)) . |= SHOVE_CAN_KICK_SIDE if(HAS_TRAIT(src, TRAIT_NO_SIDE_KICK)) // added as an extra check, just in case . &= ~SHOVE_CAN_KICK_SIDE diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index dcab69f531ee3..dbfa3849b25ad 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -53,6 +53,8 @@ ///This is used to determine if the mob failed a breath. If they did fail a breath, they will attempt to breathe each tick, otherwise just once per 4 ticks. var/failed_last_breath = FALSE + ///Sound loop for breathing when using internals + var/datum/looping_sound/breathing/breathing_loop /// Used in [carbon/proc/check_breath] and [lungs/proc/check_breath]] var/co2overloadtime = null diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index 5fdd3498f1559..8d4e66bccda6e 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -3,7 +3,7 @@ return losebreath = 0 - + breathing_loop.stop() //This would've happened eventually but it's nice to make it stop immediatelly in this case if(!gibbed) add_memory_in_range(src, 7, /datum/memory/witnessed_death, protagonist = src) reagents.end_metabolization(src) diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 856622203927a..00699196ae9b6 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -20,7 +20,6 @@ key = "clap" key_third_person = "claps" message = "claps." - muzzle_ignore = TRUE hands_use_check = TRUE emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE audio_cooldown = 5 SECONDS @@ -185,7 +184,6 @@ message_param = "snaps their fingers at %t." emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE hands_use_check = TRUE - muzzle_ignore = TRUE /datum/emote/living/carbon/snap/get_sound(mob/living/user) if(ishuman(user)) diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index e37048ca32fee..6d6d7ada73ceb 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -36,7 +36,7 @@ var/list/msg = list("") for(var/obj/item/bodypart/bodypart as anything in bodyparts) for(var/obj/item/embedded_item as anything in bodypart.embedded_objects) - if(embedded_item.isEmbedHarmless()) + if(embedded_item.is_embed_harmless()) msg += "[t_He] [t_has] [icon2html(embedded_item, user)] \a [embedded_item] stuck to [t_his] [bodypart.name]!\n" else msg += "[t_He] [t_has] [icon2html(embedded_item, user)] \a [embedded_item] embedded in [t_his] [bodypart.name]!\n" diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 3340e34064052..f13e90719c1dc 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -76,7 +76,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) cut_overlays(TRUE) /mob/living/carbon/human/dummy/setup_human_dna() - randomize_human(src, randomize_mutations = FALSE) + randomize_human_normie(src, randomize_mutations = FALSE) /mob/living/carbon/human/dummy/log_mob_tag(text) return diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index bf01bfda6f119..b229898cae1db 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -138,7 +138,7 @@ disabled += body_part missing -= body_part.body_zone for(var/obj/item/I in body_part.embedded_objects) - if(I.isEmbedHarmless()) + if(I.is_embed_harmless()) msg += "[t_He] [t_has] [icon2html(I, user)] \a [I] stuck to [t_his] [body_part.name]!\n" else msg += "[t_He] [t_has] [icon2html(I, user)] \a [I] embedded in [t_his] [body_part.name]!\n" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 9d3d8c2d5a81b..1dd47f8060426 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -56,7 +56,7 @@ ADD_TRAIT(src, TRAIT_AGEUSIA, NO_TONGUE_TRAIT) /mob/living/carbon/human/proc/setup_human_dna() - randomize_human(src, randomize_mutations = TRUE) + randomize_human_normie(src, randomize_mutations = TRUE) /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index aa2daa1675e91..976d7475c813b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -146,8 +146,10 @@ return if(!(shove_flags & SHOVE_KNOCKDOWN_BLOCKED)) target.Knockdown(SHOVE_KNOCKDOWN_HUMAN) + target.apply_status_effect(/datum/status_effect/next_shove_stuns) if(!HAS_TRAIT(src, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED)) Knockdown(SHOVE_KNOCKDOWN_COLLATERAL) + apply_status_effect(/datum/status_effect/next_shove_stuns) target.visible_message(span_danger("[shover] shoves [target.name] into [name]!"), span_userdanger("You're shoved into [name] by [shover]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) to_chat(src, span_danger("You shove [target.name] into [name]!")) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 14003b86da496..fda6d7a9142ea 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -26,8 +26,9 @@ /mob/living/carbon/human/Move(NewLoc, direct) . = ..() - if(shoes && body_position == STANDING_UP && loc == NewLoc && has_gravity(loc)) - SEND_SIGNAL(shoes, COMSIG_SHOES_STEP_ACTION) + if(shoes && body_position == STANDING_UP && has_gravity(loc)) + if((. && !moving_diagonally) || (!. && moving_diagonally == SECOND_DIAG_STEP)) + SEND_SIGNAL(shoes, COMSIG_SHOES_STEP_ACTION) /mob/living/carbon/human/Process_Spacemove(movement_dir = 0, continuous_move = FALSE) if(movement_type & FLYING || HAS_TRAIT(src, TRAIT_FREE_FLOAT_MOVEMENT)) diff --git a/code/modules/mob/living/carbon/human/human_say.dm b/code/modules/mob/living/carbon/human/human_say.dm index 8bf21e3c809a6..0ce34ffa27205 100644 --- a/code/modules/mob/living/carbon/human/human_say.dm +++ b/code/modules/mob/living/carbon/human/human_say.dm @@ -70,6 +70,9 @@ var/obj/item/radio/headset/dongle = ears if(!istype(dongle)) return FALSE + var/area/our_area = get_area(src) + if(our_area.area_flags & BINARY_JAMMING) + return FALSE return dongle.translate_binary /mob/living/carbon/human/radio(message, list/message_mods = list(), list/spans, language) //Poly has a copy of this, lazy bastard diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index b1efa734321c5..a24e9cd070d86 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -1,3 +1,20 @@ + +/** + * Used to return a list of equipped items on a human mob; does not by default include held items, see include_flags + * + * Argument(s): + * * Optional - include_flags, (see obj.flags.dm) describes which optional things to include or not (pockets, accessories, held items) + */ + +/mob/living/carbon/human/get_equipped_items(include_flags = NONE) + var/list/items = ..() + if(!(include_flags & INCLUDE_POCKETS)) + items -= list(l_store, r_store, s_store) + if((include_flags & INCLUDE_ACCESSORIES) && w_uniform) + var/obj/item/clothing/under/worn_under = w_uniform + items += worn_under.attached_accessories + return items + /mob/living/carbon/human/can_equip(obj/item/equip_target, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE, ignore_equipped = FALSE, indirect_action = FALSE) if(SEND_SIGNAL(src, COMSIG_HUMAN_EQUIPPING_ITEM, equip_target, slot) == COMPONENT_BLOCK_EQUIP) return FALSE @@ -139,8 +156,6 @@ if(glasses) return glasses = equipping - if(glasses.glass_colour_type) - update_glasses_color(glasses, 1) if(glasses.vision_flags || glasses.invis_override || glasses.invis_view || !isnull(glasses.lighting_cutoff)) update_sight() update_worn_glasses() @@ -233,10 +248,8 @@ update_worn_gloves() else if(I == glasses) glasses = null - var/obj/item/clothing/glasses/G = I - if(G.glass_colour_type) - update_glasses_color(G, 0) - if(G.vision_flags || G.invis_override || G.invis_view || !isnull(G.lighting_cutoff)) + var/obj/item/clothing/glasses/old_glasses = I + if(old_glasses.vision_flags || old_glasses.invis_override || old_glasses.invis_view || !isnull(old_glasses.lighting_cutoff)) update_sight() if(!QDELETED(src)) update_worn_glasses() @@ -390,3 +403,24 @@ return stored.attack_hand(src) // take out thing from item in storage slot return + +/mob/living/carbon/human/change_number_of_hands(amt) + var/old_limbs = held_items.len + if(amt < old_limbs) + for(var/i in hand_bodyparts.len to amt step -1) + var/obj/item/bodypart/BP = hand_bodyparts[i] + BP.dismember() + hand_bodyparts[i] = null + hand_bodyparts.len = amt + else if(amt > old_limbs) + hand_bodyparts.len = amt + for(var/i in old_limbs+1 to amt) + var/path = /obj/item/bodypart/arm/left + if(!(i % 2)) + path = /obj/item/bodypart/arm/right + + var/obj/item/bodypart/BP = new path () + BP.held_index = i + BP.try_attach_limb(src, TRUE) + hand_bodyparts[i] = BP + ..() //Don't redraw hands until we have organs for them 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 7d29260616f41..b37a4de5f6de5 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -62,6 +62,7 @@ /datum/outfit/syndicate/reinforcement/mi13 = /datum/outfit/syndicate/reinforcement/plasmaman, /datum/outfit/syndicate/reinforcement/waffle = /datum/outfit/syndicate/reinforcement/plasmaman, /datum/outfit/syndicate/support = /datum/outfit/syndicate/support/plasmaman, + /datum/outfit/syndicate/full/loneop = /datum/outfit/syndicate/full/plasmaman/loneop, ) /// If the bones themselves are burning clothes won't help you much diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index de6a2692c9b6f..e59a6328aa72e 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -1,3 +1,33 @@ +/mob/living/carbon/proc/check_obscured_slots(transparent_protection) + var/obscured = NONE + var/hidden_slots = NONE + + for(var/obj/item/equipped_item in get_equipped_items()) + hidden_slots |= equipped_item.flags_inv + if(transparent_protection) + hidden_slots |= equipped_item.transparent_protection + + if(hidden_slots & HIDENECK) + obscured |= ITEM_SLOT_NECK + if(hidden_slots & HIDEMASK) + obscured |= ITEM_SLOT_MASK + if(hidden_slots & HIDEEYES) + obscured |= ITEM_SLOT_EYES + if(hidden_slots & HIDEEARS) + obscured |= ITEM_SLOT_EARS + if(hidden_slots & HIDEGLOVES) + obscured |= ITEM_SLOT_GLOVES + if(hidden_slots & HIDEJUMPSUIT) + obscured |= ITEM_SLOT_ICLOTHING + if(hidden_slots & HIDESHOES) + obscured |= ITEM_SLOT_FEET + if(hidden_slots & HIDESUITSTORAGE) + obscured |= ITEM_SLOT_SUITSTORE + if(hidden_slots & HIDEHEADGEAR) + obscured |= ITEM_SLOT_HEAD + + return obscured + /mob/living/carbon/get_item_by_slot(slot_id) switch(slot_id) if(ITEM_SLOT_BACK) @@ -280,6 +310,8 @@ internal = null target_tank.after_internals_closed(src) update_mob_action_buttons() + //To make sure it stops at a timely manner when you turn off internals + breathing_loop.stop() return TRUE /// Close the the currently open external (that's EX-ternal) air tank. Returns TRUE if successful. diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 7fb92c26e6183..01531b77d63a9 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -64,6 +64,7 @@ // Second link in a breath chain, calls [carbon/proc/check_breath()] /mob/living/carbon/proc/breathe(seconds_per_tick, times_fired) var/obj/item/organ/internal/lungs = get_organ_slot(ORGAN_SLOT_LUNGS) + var/is_on_internals = FALSE if(SEND_SIGNAL(src, COMSIG_CARBON_ATTEMPT_BREATHE, seconds_per_tick, times_fired) & COMSIG_CARBON_BLOCK_BREATH) return @@ -108,15 +109,26 @@ breath = loc.remove_air(breath_moles) else //Breathe from loc as obj again + is_on_internals = TRUE + if(isobj(loc)) var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src,0) - check_breath(breath) + if(check_breath(breath) && is_on_internals) + try_breathing_sound(breath) if(breath) loc.assume_air(breath) +//Tries to play the carbon a breathing sound when using internals, also invokes check_breath +/mob/living/carbon/proc/try_breathing_sound(breath) + var/should_be_on = canon_client?.prefs?.read_preference(/datum/preference/toggle/sound_breathing) + if(should_be_on && !breathing_loop.timer_id) + breathing_loop.start() + else if(!should_be_on && breathing_loop.timer_id) + breathing_loop.stop() + /mob/living/carbon/proc/has_smoke_protection() if(HAS_TRAIT(src, TRAIT_NOBREATH)) return TRUE diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index eb1e95ad9db5d..b1ca17337115e 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -5,19 +5,6 @@ /mob/living/carbon/IsParalyzed(include_stamcrit = TRUE) return ..() || (include_stamcrit && HAS_TRAIT_FROM(src, TRAIT_INCAPACITATED, STAMINA)) -/mob/living/carbon/proc/enter_stamcrit() - if(HAS_TRAIT_FROM(src, TRAIT_INCAPACITATED, STAMINA)) //Already in stamcrit - return - if(check_stun_immunity(CANKNOCKDOWN)) - return - if (SEND_SIGNAL(src, COMSIG_CARBON_ENTER_STAMCRIT) & STAMCRIT_CANCELLED) - return - - to_chat(src, span_notice("You're too exhausted to keep going...")) - add_traits(list(TRAIT_INCAPACITATED, TRAIT_IMMOBILIZED, TRAIT_FLOORED), STAMINA) - if(getStaminaLoss() < 120) // Puts you a little further into the initial stamcrit, makes stamcrit harder to outright counter with chems. - adjustStaminaLoss(30, FALSE) - /mob/living/carbon/adjust_disgust(amount, max = DISGUST_LEVEL_MAXEDOUT) disgust = clamp(disgust + amount, 0, max) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 3ee43801a7621..d3dfa7e55f605 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -411,7 +411,7 @@ if(!user.get_bodypart(BODY_ZONE_HEAD)) return FALSE - if(user.is_muzzled() || user.is_mouth_covered(ITEM_SLOT_MASK)) + if(user.is_mouth_covered(ITEM_SLOT_MASK)) to_chat(user, span_warning("You can't bite with your mouth covered!")) return FALSE @@ -659,7 +659,7 @@ playsound(target, 'sound/effects/glassbash.ogg', 50, TRUE, -1) else do_attack_animation(target, ATTACK_EFFECT_DISARM) - playsound(target, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) + playsound(target, 'sound/weapons/shove.ogg', 50, TRUE, -1) if (ishuman(target) && isnull(weapon)) var/mob/living/carbon/human/human_target = target human_target.w_uniform?.add_fingerprint(src) @@ -700,6 +700,7 @@ return if((shove_flags & SHOVE_BLOCKED) && !(shove_flags & (SHOVE_KNOCKDOWN_BLOCKED|SHOVE_CAN_KICK_SIDE))) target.Knockdown(SHOVE_KNOCKDOWN_SOLID) + target.apply_status_effect(/datum/status_effect/next_shove_stuns) target.visible_message(span_danger("[name] shoves [target.name], knocking [target.p_them()] down!"), span_userdanger("You're knocked down from a shove by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) to_chat(src, span_danger("You shove [target.name], knocking [target.p_them()] down!")) @@ -708,6 +709,7 @@ if(shove_flags & SHOVE_CAN_KICK_SIDE) //KICK HIM IN THE NUTS target.Paralyze(SHOVE_CHAIN_PARALYZE) + target.apply_status_effect(/datum/status_effect/no_side_kick) target.visible_message(span_danger("[name] kicks [target.name] onto [target.p_their()] side!"), span_userdanger("You're kicked onto your side by [name]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, src) to_chat(src, span_danger("You kick [target.name] onto [target.p_their()] side!")) @@ -720,10 +722,8 @@ //Take their lunch money var/target_held_item = target.get_active_held_item() var/append_message = weapon ? " with [weapon]" : "" - if(!is_type_in_typecache(target_held_item, GLOB.shove_disarming_types)) //It's too expensive we'll get caught - target_held_item = null - - if(target_held_item && target.get_timed_status_effect_duration(/datum/status_effect/staggered)) + // If it's in our typecache, they're staggered and it exists, disarm. If they're knocked down, disarm too. + if(target_held_item && target.get_timed_status_effect_duration(/datum/status_effect/staggered) && is_type_in_typecache(target_held_item, GLOB.shove_disarming_types) || target_held_item && target.body_position == LYING_DOWN) target.dropItemToGround(target_held_item) append_message = "causing [target.p_them()] to drop [target_held_item]" target.visible_message(span_danger("[target.name] drops \the [target_held_item]!"), diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 0b844a2362afb..6ec18d0d5392c 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -3,6 +3,7 @@ hud_possible = list(HEALTH_HUD,STATUS_HUD,ANTAG_HUD) pressure_resistance = 10 hud_type = /datum/hud/living + interaction_flags_click = ALLOW_RESTING interaction_flags_mouse_drop = ALLOW_RESTING ///Tracks the current size of the mob in relation to its original size. Use update_transform(resize) to change it. diff --git a/code/modules/mob/living/silicon/ai/vox_sounds.dm b/code/modules/mob/living/silicon/ai/vox_sounds.dm index dacb1eeb8131c..d69bb2e1cc3b8 100644 --- a/code/modules/mob/living/silicon/ai/vox_sounds.dm +++ b/code/modules/mob/living/silicon/ai/vox_sounds.dm @@ -8,12 +8,15 @@ // For vim // :%s/\(\(.*\)\.ogg\)/"\2" = 'sound\/vox_fem\/\1',/g GLOBAL_LIST_INIT(vox_sounds, list( - "abduction" = 'sound/vox_fem/abduction.ogg', "," = 'sound/vox_fem/,.ogg', "." = 'sound/vox_fem/..ogg', "a" = 'sound/vox_fem/a.ogg', + "abduction" = 'sound/vox_fem/abduction.ogg', "abortions" = 'sound/vox_fem/abortions.ogg', "above" = 'sound/vox_fem/above.ogg', + "absorb" = 'sound/vox_fem/absorb.ogg', + "absorbed" = 'sound/vox_fem/absorbed.ogg', + "absorbing" = 'sound/vox_fem/absorbing.ogg', "abstain" = 'sound/vox_fem/abstain.ogg', "accelerating" = 'sound/vox_fem/accelerating.ogg', "accelerator" = 'sound/vox_fem/accelerator.ogg', @@ -26,11 +29,17 @@ GLOBAL_LIST_INIT(vox_sounds, list( "across" = 'sound/vox_fem/across.ogg', "activate" = 'sound/vox_fem/activate.ogg', "activated" = 'sound/vox_fem/activated.ogg', + "activating" = 'sound/vox_fem/activating.ogg', + "activation" = 'sound/vox_fem/activation.ogg', + "active" = 'sound/vox_fem/active.ogg', "activity" = 'sound/vox_fem/activity.ogg', "adios" = 'sound/vox_fem/adios.ogg', "administration" = 'sound/vox_fem/administration.ogg', "advanced" = 'sound/vox_fem/advanced.ogg', "advised" = 'sound/vox_fem/advised.ogg', + "affect" = 'sound/vox_fem/affect.ogg', + "affected" = 'sound/vox_fem/affected.ogg', + "affecting" = 'sound/vox_fem/affecting.ogg', "aft" = 'sound/vox_fem/aft.ogg', "after" = 'sound/vox_fem/after.ogg', "agent" = 'sound/vox_fem/agent.ogg', @@ -40,44 +49,59 @@ GLOBAL_LIST_INIT(vox_sounds, list( "alarm" = 'sound/vox_fem/alarm.ogg', "alarmed" = 'sound/vox_fem/alarmed.ogg', "alarming" = 'sound/vox_fem/alarming.ogg', + "alcohol" = 'sound/vox_fem/alcohol.ogg', "alert" = 'sound/vox_fem/alert.ogg', "alerted" = 'sound/vox_fem/alerted.ogg', "alerting" = 'sound/vox_fem/alerting.ogg', "alien" = 'sound/vox_fem/alien.ogg', + "align" = 'sound/vox_fem/align.ogg', "aligned" = 'sound/vox_fem/aligned.ogg', "all" = 'sound/vox_fem/all.ogg', + "allow" = 'sound/vox_fem/allow.ogg', + "alongside" = 'sound/vox_fem/alongside.ogg', "alpha" = 'sound/vox_fem/alpha.ogg', "also" = 'sound/vox_fem/also.ogg', "am" = 'sound/vox_fem/am.ogg', "amigo" = 'sound/vox_fem/amigo.ogg', "ammunition" = 'sound/vox_fem/ammunition.ogg', + "amount" = 'sound/vox_fem/amount.ogg', "an" = 'sound/vox_fem/an.ogg', "and" = 'sound/vox_fem/and.ogg', "animal" = 'sound/vox_fem/animal.ogg', + "annihilate" = 'sound/vox_fem/annihilate.ogg', + "annihilated" = 'sound/vox_fem/annihilated.ogg', + "annihilating" = 'sound/vox_fem/annihilating.ogg', + "annihilation" = 'sound/vox_fem/annihilation.ogg', "announcement" = 'sound/vox_fem/announcement.ogg', "anomalous" = 'sound/vox_fem/anomalous.ogg', "answer" = 'sound/vox_fem/answer.ogg', "antenna" = 'sound/vox_fem/antenna.ogg', + "anti-noblium" = 'sound/vox_fem/anti-noblium.ogg', "any" = 'sound/vox_fem/any.ogg', "apc" = 'sound/vox_fem/apc.ogg', "apprehend" = 'sound/vox_fem/apprehend.ogg', "approach" = 'sound/vox_fem/approach.ogg', + "arc" = 'sound/vox_fem/arc.ogg', + "arcs" = 'sound/vox_fem/arcs.ogg', "are" = 'sound/vox_fem/are.ogg', "area" = 'sound/vox_fem/area.ogg', "arm" = 'sound/vox_fem/arm.ogg', "armed" = 'sound/vox_fem/armed.ogg', "armor" = 'sound/vox_fem/armor.ogg', "armory" = 'sound/vox_fem/armory.ogg', + "around" = 'sound/vox_fem/around.ogg', "array" = 'sound/vox_fem/array.ogg', "arrest" = 'sound/vox_fem/arrest.ogg', "artillery" = 'sound/vox_fem/artillery.ogg', "asimov" = 'sound/vox_fem/asimov.ogg', + "ask" = 'sound/vox_fem/ask.ogg', "ass" = 'sound/vox_fem/ass.ogg', "asshole" = 'sound/vox_fem/asshole.ogg', "assholes" = 'sound/vox_fem/assholes.ogg', "assistance" = 'sound/vox_fem/assistance.ogg', "assistant" = 'sound/vox_fem/assistant.ogg', "at" = 'sound/vox_fem/at.ogg', + "ate" = 'sound/vox_fem/ate.ogg', "atmosphere" = 'sound/vox_fem/atmosphere.ogg', "atmospheric" = 'sound/vox_fem/atmospheric.ogg', "atmospherics" = 'sound/vox_fem/atmospherics.ogg', @@ -101,10 +125,14 @@ GLOBAL_LIST_INIT(vox_sounds, list( "base" = 'sound/vox_fem/base.ogg', "bay" = 'sound/vox_fem/bay.ogg', "be" = 'sound/vox_fem/be.ogg', + "beaker" = 'sound/vox_fem/beaker.ogg', "beam" = 'sound/vox_fem/beam.ogg', "been" = 'sound/vox_fem/been.ogg', "beep" = 'sound/vox_fem/beep.ogg', "before" = 'sound/vox_fem/before.ogg', + "began" = 'sound/vox_fem/began.ogg', + "begin" = 'sound/vox_fem/begin.ogg', + "begins" = 'sound/vox_fem/begins.ogg', "below" = 'sound/vox_fem/below.ogg', "beside" = 'sound/vox_fem/beside.ogg', "beware" = 'sound/vox_fem/beware.ogg', @@ -133,6 +161,7 @@ GLOBAL_LIST_INIT(vox_sounds, list( "bone" = 'sound/vox_fem/bone.ogg', "botanist" = 'sound/vox_fem/botanist.ogg', "botany" = 'sound/vox_fem/botany.ogg', + "bottle" = 'sound/vox_fem/bottle.ogg', "bottom" = 'sound/vox_fem/bottom.ogg', "bravo" = 'sound/vox_fem/bravo.ogg', "breach" = 'sound/vox_fem/breach.ogg', @@ -140,6 +169,11 @@ GLOBAL_LIST_INIT(vox_sounds, list( "break" = 'sound/vox_fem/break.ogg', "bridge" = 'sound/vox_fem/bridge.ogg', "brig" = 'sound/vox_fem/brig.ogg', + "broke" = 'sound/vox_fem/broke.ogg', + "broken" = 'sound/vox_fem/broken.ogg', + "bump" = 'sound/vox_fem/bump.ogg', + "bumped" = 'sound/vox_fem/bumped.ogg', + "bumps" = 'sound/vox_fem/bumps.ogg', "bust" = 'sound/vox_fem/bust.ogg', "but" = 'sound/vox_fem/but.ogg', "button" = 'sound/vox_fem/button.ogg', @@ -148,6 +182,7 @@ GLOBAL_LIST_INIT(vox_sounds, list( "cable" = 'sound/vox_fem/cable.ogg', "call" = 'sound/vox_fem/call.ogg', "called" = 'sound/vox_fem/called.ogg', + "can" = 'sound/vox_fem/can.ogg', "canal" = 'sound/vox_fem/canal.ogg', "canister" = 'sound/vox_fem/canister.ogg', "cap" = 'sound/vox_fem/cap.ogg', @@ -155,7 +190,12 @@ GLOBAL_LIST_INIT(vox_sounds, list( "capture" = 'sound/vox_fem/capture.ogg', "carbon" = 'sound/vox_fem/carbon.ogg', "cargo" = 'sound/vox_fem/cargo.ogg', + "cascade" = 'sound/vox_fem/cascade.ogg', "cat" = 'sound/vox_fem/cat.ogg', + "cause" = 'sound/vox_fem/cause.ogg', + "caused" = 'sound/vox_fem/caused.ogg', + "causes" = 'sound/vox_fem/causes.ogg', + "causing" = 'sound/vox_fem/causing.ogg', "ce" = 'sound/vox_fem/ce.ogg', "cease" = 'sound/vox_fem/cease.ogg', "ceiling" = 'sound/vox_fem/ceiling.ogg', @@ -171,6 +211,7 @@ GLOBAL_LIST_INIT(vox_sounds, list( "changeling" = 'sound/vox_fem/changeling.ogg', "chapel" = 'sound/vox_fem/chapel.ogg', "chaplain" = 'sound/vox_fem/chaplain.ogg', + "charge" = 'sound/vox_fem/charge.ogg', "charlie" = 'sound/vox_fem/charlie.ogg', "check" = 'sound/vox_fem/check.ogg', "checkpoint" = 'sound/vox_fem/checkpoint.ogg', @@ -185,35 +226,51 @@ GLOBAL_LIST_INIT(vox_sounds, list( "clear" = 'sound/vox_fem/clear.ogg', "clearance" = 'sound/vox_fem/clearance.ogg', "clockwork" = 'sound/vox_fem/clockwork.ogg', + "clog" = 'sound/vox_fem/clog.ogg', "close" = 'sound/vox_fem/close.ogg', "closed" = 'sound/vox_fem/closed.ogg', "closing" = 'sound/vox_fem/closing.ogg', + "clothing" = 'sound/vox_fem/clothing.ogg', "clown" = 'sound/vox_fem/clown.ogg', "clowning" = 'sound/vox_fem/clowning.ogg', "cmo" = 'sound/vox_fem/cmo.ogg', "code" = 'sound/vox_fem/code.ogg', "coded" = 'sound/vox_fem/coded.ogg', + "coil" = 'sound/vox_fem/coil.ogg', + "coils" = 'sound/vox_fem/coils.ogg', "cold" = 'sound/vox_fem/cold.ogg', "collider" = 'sound/vox_fem/collider.ogg', + "combat" = 'sound/vox_fem/combat.ogg', + "combatant" = 'sound/vox_fem/combatant.ogg', "come" = 'sound/vox_fem/come.ogg', "command" = 'sound/vox_fem/command.ogg', "communication" = 'sound/vox_fem/communication.ogg', + "complete" = 'sound/vox_fem/complete.ogg', + "completed" = 'sound/vox_fem/completed.ogg', + "completion" = 'sound/vox_fem/completion.ogg', "complex" = 'sound/vox_fem/complex.ogg', "comply" = 'sound/vox_fem/comply.ogg', "computer" = 'sound/vox_fem/computer.ogg', "condition" = 'sound/vox_fem/condition.ogg', + "conditions" = 'sound/vox_fem/conditions.ogg', "condom" = 'sound/vox_fem/condom.ogg', + "configure" = 'sound/vox_fem/configure.ogg', + "configured" = 'sound/vox_fem/configured.ogg', + "configuring" = 'sound/vox_fem/configuring.ogg', "confirmed" = 'sound/vox_fem/confirmed.ogg', "connor" = 'sound/vox_fem/connor.ogg', "console" = 'sound/vox_fem/console.ogg', "console2" = 'sound/vox_fem/console2.ogg', "construct" = 'sound/vox_fem/construct.ogg', + "container" = 'sound/vox_fem/container.ogg', "containment" = 'sound/vox_fem/containment.ogg', "contamination" = 'sound/vox_fem/contamination.ogg', "contraband" = 'sound/vox_fem/contraband.ogg', "control" = 'sound/vox_fem/control.ogg', "cook" = 'sound/vox_fem/cook.ogg', + "cool" = 'sound/vox_fem/cool.ogg', "coolant" = 'sound/vox_fem/coolant.ogg', + "cooling" = 'sound/vox_fem/cooling.ogg', "coomer" = 'sound/vox_fem/coomer.ogg', "core" = 'sound/vox_fem/core.ogg', "corgi" = 'sound/vox_fem/corgi.ogg', @@ -221,10 +278,15 @@ GLOBAL_LIST_INIT(vox_sounds, list( "correct" = 'sound/vox_fem/correct.ogg', "corridor" = 'sound/vox_fem/corridor.ogg', "corridors" = 'sound/vox_fem/corridors.ogg', + "could" = 'sound/vox_fem/could.ogg', + "couldnt" = 'sound/vox_fem/couldnt.ogg', + "countdown" = 'sound/vox_fem/countdown.ogg', "coward" = 'sound/vox_fem/coward.ogg', "cowards" = 'sound/vox_fem/cowards.ogg', "crate" = 'sound/vox_fem/crate.ogg', + "create" = 'sound/vox_fem/create.ogg', "created" = 'sound/vox_fem/created.ogg', + "creating" = 'sound/vox_fem/creating.ogg', "creature" = 'sound/vox_fem/creature.ogg', "crew" = 'sound/vox_fem/crew.ogg', "critical" = 'sound/vox_fem/critical.ogg', @@ -251,9 +313,12 @@ GLOBAL_LIST_INIT(vox_sounds, list( "deeoo" = 'sound/vox_fem/deeoo.ogg', "defense" = 'sound/vox_fem/defense.ogg', "degrees" = 'sound/vox_fem/degrees.ogg', + "delaminating" = 'sound/vox_fem/delaminating.ogg', + "delamination" = 'sound/vox_fem/delamination.ogg', "delta" = 'sound/vox_fem/delta.ogg', "demon" = 'sound/vox_fem/demon.ogg', "denied" = 'sound/vox_fem/denied.ogg', + "deny" = 'sound/vox_fem/deny.ogg', "departures" = 'sound/vox_fem/departures.ogg', "deploy" = 'sound/vox_fem/deploy.ogg', "deployed" = 'sound/vox_fem/deployed.ogg', @@ -263,7 +328,9 @@ GLOBAL_LIST_INIT(vox_sounds, list( "destroyed" = 'sound/vox_fem/destroyed.ogg', "destruction" = 'sound/vox_fem/destruction.ogg', "detain" = 'sound/vox_fem/detain.ogg', + "detect" = 'sound/vox_fem/detect.ogg', "detected" = 'sound/vox_fem/detected.ogg', + "detecting" = 'sound/vox_fem/detecting.ogg', "detective" = 'sound/vox_fem/detective.ogg', "detonation" = 'sound/vox_fem/detonation.ogg', "device" = 'sound/vox_fem/device.ogg', @@ -271,8 +338,10 @@ GLOBAL_LIST_INIT(vox_sounds, list( "did" = 'sound/vox_fem/did.ogg', "die" = 'sound/vox_fem/die.ogg', "died" = 'sound/vox_fem/died.ogg', + "different" = 'sound/vox_fem/different.ogg', "dimensional" = 'sound/vox_fem/dimensional.ogg', "dioxide" = 'sound/vox_fem/dioxide.ogg', + "direct" = 'sound/vox_fem/direct.ogg', "director" = 'sound/vox_fem/director.ogg', "dirt" = 'sound/vox_fem/dirt.ogg', "disabled" = 'sound/vox_fem/disabled.ogg', @@ -286,31 +355,47 @@ GLOBAL_LIST_INIT(vox_sounds, list( "do" = 'sound/vox_fem/do.ogg', "doctor" = 'sound/vox_fem/doctor.ogg', "dog" = 'sound/vox_fem/dog.ogg', + "dont" = 'sound/vox_fem/dont.ogg', "doomsday" = 'sound/vox_fem/doomsday.ogg', "doop" = 'sound/vox_fem/doop.ogg', "door" = 'sound/vox_fem/door.ogg', "dormitory" = 'sound/vox_fem/dormitory.ogg', "dot" = 'sound/vox_fem/dot.ogg', + "double" = 'sound/vox_fem/double.ogg', "down" = 'sound/vox_fem/down.ogg', + "dress" = 'sound/vox_fem/dress.ogg', + "dressed" = 'sound/vox_fem/dressed.ogg', + "dressing" = 'sound/vox_fem/dressing.ogg', "drone" = 'sound/vox_fem/drone.ogg', "dual" = 'sound/vox_fem/dual.ogg', "duct" = 'sound/vox_fem/duct.ogg', "e" = 'sound/vox_fem/e.ogg', + "easily" = 'sound/vox_fem/easily.ogg', "east" = 'sound/vox_fem/east.ogg', + "eat" = 'sound/vox_fem/eat.ogg', + "eaten" = 'sound/vox_fem/eaten.ogg', "echo" = 'sound/vox_fem/echo.ogg', "ed" = 'sound/vox_fem/ed.ogg', + "education" = 'sound/vox_fem/education.ogg', "effect" = 'sound/vox_fem/effect.ogg', + "effects" = 'sound/vox_fem/effects.ogg', "egress" = 'sound/vox_fem/egress.ogg', "eight" = 'sound/vox_fem/eight.ogg', "eighteen" = 'sound/vox_fem/eighteen.ogg', "eighty" = 'sound/vox_fem/eighty.ogg', "electric" = 'sound/vox_fem/electric.ogg', + "electrical" = 'sound/vox_fem/electrical.ogg', "electromagnetic" = 'sound/vox_fem/electromagnetic.ogg', "elevator" = 'sound/vox_fem/elevator.ogg', "eleven" = 'sound/vox_fem/eleven.ogg', "eliminate" = 'sound/vox_fem/eliminate.ogg', "emergency" = 'sound/vox_fem/emergency.ogg', + "emitted" = 'sound/vox_fem/emitted.ogg', + "emitter" = 'sound/vox_fem/emitter.ogg', + "emitting" = 'sound/vox_fem/emitting.ogg', "enabled" = 'sound/vox_fem/enabled.ogg', + "end" = 'sound/vox_fem/end.ogg', + "ends" = 'sound/vox_fem/ends.ogg', "energy" = 'sound/vox_fem/energy.ogg', "engage" = 'sound/vox_fem/engage.ogg', "engaged" = 'sound/vox_fem/engaged.ogg', @@ -318,6 +403,7 @@ GLOBAL_LIST_INIT(vox_sounds, list( "engineer" = 'sound/vox_fem/engineer.ogg', "engineering" = 'sound/vox_fem/engineering.ogg', "enormous" = 'sound/vox_fem/enormous.ogg', + "enough" = 'sound/vox_fem/enough.ogg', "enter" = 'sound/vox_fem/enter.ogg', "entity" = 'sound/vox_fem/entity.ogg', "entry" = 'sound/vox_fem/entry.ogg', @@ -329,7 +415,11 @@ GLOBAL_LIST_INIT(vox_sounds, list( "ethereal" = 'sound/vox_fem/ethereal.ogg', "eva" = 'sound/vox_fem/eva.ogg', "evacuate" = 'sound/vox_fem/evacuate.ogg', + "even" = 'sound/vox_fem/even.ogg', "ever" = 'sound/vox_fem/ever.ogg', + "every" = 'sound/vox_fem/every.ogg', + "everybody" = 'sound/vox_fem/everybody.ogg', + "everyone" = 'sound/vox_fem/everyone.ogg', "exchange" = 'sound/vox_fem/exchange.ogg', "execute" = 'sound/vox_fem/execute.ogg', "exit" = 'sound/vox_fem/exit.ogg', @@ -337,12 +427,16 @@ GLOBAL_LIST_INIT(vox_sounds, list( "experiment" = 'sound/vox_fem/experiment.ogg', "experimental" = 'sound/vox_fem/experimental.ogg', "explode" = 'sound/vox_fem/explode.ogg', + "exploded" = 'sound/vox_fem/exploded.ogg', + "exploding" = 'sound/vox_fem/exploding.ogg', "explosion" = 'sound/vox_fem/explosion.ogg', "explosive" = 'sound/vox_fem/explosive.ogg', "exposure" = 'sound/vox_fem/exposure.ogg', "exterminate" = 'sound/vox_fem/exterminate.ogg', + "external" = 'sound/vox_fem/external.ogg', "extinguish" = 'sound/vox_fem/extinguish.ogg', "extinguisher" = 'sound/vox_fem/extinguisher.ogg', + "extra" = 'sound/vox_fem/extra.ogg', "extreme" = 'sound/vox_fem/extreme.ogg', "f" = 'sound/vox_fem/f.ogg', "facility" = 'sound/vox_fem/facility.ogg', @@ -354,12 +448,19 @@ GLOBAL_LIST_INIT(vox_sounds, list( "farthest" = 'sound/vox_fem/farthest.ogg', "fast" = 'sound/vox_fem/fast.ogg', "fauna" = 'sound/vox_fem/fauna.ogg', + "feature" = 'sound/vox_fem/feature.ogg', + "featured" = 'sound/vox_fem/featured.ogg', + "features" = 'sound/vox_fem/features.ogg', + "featuring" = 'sound/vox_fem/featuring.ogg', "feet" = 'sound/vox_fem/feet.ogg', "felinid" = 'sound/vox_fem/felinid.ogg', + "few" = 'sound/vox_fem/few.ogg', "field" = 'sound/vox_fem/field.ogg', "fifteen" = 'sound/vox_fem/fifteen.ogg', "fifth" = 'sound/vox_fem/fifth.ogg', "fifty" = 'sound/vox_fem/fifty.ogg', + "filter" = 'sound/vox_fem/filter.ogg', + "filters" = 'sound/vox_fem/filters.ogg', "final" = 'sound/vox_fem/final.ogg', "fine" = 'sound/vox_fem/fine.ogg', "fire" = 'sound/vox_fem/fire.ogg', @@ -370,6 +471,7 @@ GLOBAL_LIST_INIT(vox_sounds, list( "floor" = 'sound/vox_fem/floor.ogg', "flyman" = 'sound/vox_fem/flyman.ogg', "fool" = 'sound/vox_fem/fool.ogg', + "foolish" = 'sound/vox_fem/foolish.ogg', "for" = 'sound/vox_fem/for.ogg', "forbidden" = 'sound/vox_fem/forbidden.ogg', "force" = 'sound/vox_fem/force.ogg', @@ -389,6 +491,7 @@ GLOBAL_LIST_INIT(vox_sounds, list( "freeze" = 'sound/vox_fem/freeze.ogg', "freezer" = 'sound/vox_fem/freezer.ogg', "freezing" = 'sound/vox_fem/freezing.ogg', + "freon" = 'sound/vox_fem/freon.ogg', "from" = 'sound/vox_fem/from.ogg', "front" = 'sound/vox_fem/front.ogg', "froze" = 'sound/vox_fem/froze.ogg', @@ -399,9 +502,19 @@ GLOBAL_LIST_INIT(vox_sounds, list( "fuel" = 'sound/vox_fem/fuel.ogg', "g" = 'sound/vox_fem/g.ogg', "gas" = 'sound/vox_fem/gas.ogg', + "gases" = 'sound/vox_fem/gases.ogg', + "gave" = 'sound/vox_fem/gave.ogg', + "gear" = 'sound/vox_fem/gear.ogg', + "geared" = 'sound/vox_fem/geared.ogg', + "gearing" = 'sound/vox_fem/gearing.ogg', + "generate" = 'sound/vox_fem/generate.ogg', + "generated" = 'sound/vox_fem/generated.ogg', + "generating" = 'sound/vox_fem/generating.ogg', "generator" = 'sound/vox_fem/generator.ogg', "geneticist" = 'sound/vox_fem/geneticist.ogg', "get" = 'sound/vox_fem/get.ogg', + "give" = 'sound/vox_fem/give.ogg', + "given" = 'sound/vox_fem/given.ogg', "glory" = 'sound/vox_fem/glory.ogg', "go" = 'sound/vox_fem/go.ogg', "god" = 'sound/vox_fem/god.ogg', @@ -428,17 +541,29 @@ GLOBAL_LIST_INIT(vox_sounds, list( "had" = 'sound/vox_fem/had.ogg', "hall" = 'sound/vox_fem/hall.ogg', "hallway" = 'sound/vox_fem/hallway.ogg', + "halon" = 'sound/vox_fem/halon.ogg', "handling" = 'sound/vox_fem/handling.ogg', "hangar" = 'sound/vox_fem/hangar.ogg', + "hard" = 'sound/vox_fem/hard.ogg', + "hardly" = 'sound/vox_fem/hardly.ogg', "harm" = 'sound/vox_fem/harm.ogg', "harmful" = 'sound/vox_fem/harmful.ogg', + "harness" = 'sound/vox_fem/harness.ogg', + "harnessed" = 'sound/vox_fem/harnessed.ogg', + "harnessing" = 'sound/vox_fem/harnessing.ogg', "has" = 'sound/vox_fem/has.ogg', "have" = 'sound/vox_fem/have.ogg', "hazard" = 'sound/vox_fem/hazard.ogg', "he" = 'sound/vox_fem/he.ogg', "head" = 'sound/vox_fem/head.ogg', + "heal" = 'sound/vox_fem/heal.ogg', + "healed" = 'sound/vox_fem/healed.ogg', + "healing" = 'sound/vox_fem/healing.ogg', + "healium" = 'sound/vox_fem/healium.ogg', "health" = 'sound/vox_fem/health.ogg', "heat" = 'sound/vox_fem/heat.ogg', + "heated" = 'sound/vox_fem/heated.ogg', + "heating" = 'sound/vox_fem/heating.ogg', "helicopter" = 'sound/vox_fem/helicopter.ogg', "helium" = 'sound/vox_fem/helium.ogg', "hello" = 'sound/vox_fem/hello.ogg', @@ -468,7 +593,9 @@ GLOBAL_LIST_INIT(vox_sounds, list( "hunger" = 'sound/vox_fem/hunger.ogg', "hurt" = 'sound/vox_fem/hurt.ogg', "hydro" = 'sound/vox_fem/hydro.ogg', + "hydrogen" = 'sound/vox_fem/hydrogen.ogg', "hydroponics" = 'sound/vox_fem/hydroponics.ogg', + "hyper-noblium" = 'sound/vox_fem/hyper-noblium.ogg', "i" = 'sound/vox_fem/i.ogg', "ian" = 'sound/vox_fem/ian.ogg', "idiot" = 'sound/vox_fem/idiot.ogg', @@ -482,26 +609,33 @@ GLOBAL_LIST_INIT(vox_sounds, list( "in" = 'sound/vox_fem/in.ogg', "inches" = 'sound/vox_fem/inches.ogg', "india" = 'sound/vox_fem/india.ogg', + "inert" = 'sound/vox_fem/inert.ogg', "ing" = 'sound/vox_fem/ing.ogg', "inoperative" = 'sound/vox_fem/inoperative.ogg', "inside" = 'sound/vox_fem/inside.ogg', "inspection" = 'sound/vox_fem/inspection.ogg', "inspector" = 'sound/vox_fem/inspector.ogg', "interchange" = 'sound/vox_fem/interchange.ogg', + "internal" = 'sound/vox_fem/internal.ogg', "internals" = 'sound/vox_fem/internals.ogg', "intruder" = 'sound/vox_fem/intruder.ogg', "invalid" = 'sound/vox_fem/invalid.ogg', "invalidate" = 'sound/vox_fem/invalidate.ogg', "invasion" = 'sound/vox_fem/invasion.ogg', + "irradiate" = 'sound/vox_fem/irradiate.ogg', "is" = 'sound/vox_fem/is.ogg', "it" = 'sound/vox_fem/it.ogg', + "its" = 'sound/vox_fem/its.ogg', "j" = 'sound/vox_fem/j.ogg', "janitor" = 'sound/vox_fem/janitor.ogg', "jesus" = 'sound/vox_fem/jesus.ogg', + "job" = 'sound/vox_fem/job.ogg', + "jobs" = 'sound/vox_fem/jobs.ogg', "johnson" = 'sound/vox_fem/johnson.ogg', "jolly" = 'sound/vox_fem/jolly.ogg', "juliet" = 'sound/vox_fem/juliet.ogg', "k" = 'sound/vox_fem/k.ogg', + "kelvin" = 'sound/vox_fem/kelvin.ogg', "key" = 'sound/vox_fem/key.ogg', "kidnapped" = 'sound/vox_fem/kidnapped.ogg', "kidnapping" = 'sound/vox_fem/kidnapping.ogg', @@ -536,7 +670,10 @@ GLOBAL_LIST_INIT(vox_sounds, list( "light" = 'sound/vox_fem/light.ogg', "lightbulb" = 'sound/vox_fem/lightbulb.ogg', "lima" = 'sound/vox_fem/lima.ogg', + "limit" = 'sound/vox_fem/limit.ogg', + "limited" = 'sound/vox_fem/limited.ogg', "liquid" = 'sound/vox_fem/liquid.ogg', + "list" = 'sound/vox_fem/list.ogg', "live" = 'sound/vox_fem/live.ogg', "live2" = 'sound/vox_fem/live2.ogg', "lizard" = 'sound/vox_fem/lizard.ogg', @@ -559,12 +696,14 @@ GLOBAL_LIST_INIT(vox_sounds, list( "lusty" = 'sound/vox_fem/lusty.ogg', "m" = 'sound/vox_fem/m.ogg', "machine" = 'sound/vox_fem/machine.ogg', + "made" = 'sound/vox_fem/made.ogg', "magic" = 'sound/vox_fem/magic.ogg', "magnetic" = 'sound/vox_fem/magnetic.ogg', "main" = 'sound/vox_fem/main.ogg', "maintainer" = 'sound/vox_fem/maintainer.ogg', "maintenance" = 'sound/vox_fem/maintenance.ogg', "major" = 'sound/vox_fem/major.ogg', + "making" = 'sound/vox_fem/making.ogg', "malfunction" = 'sound/vox_fem/malfunction.ogg', "man" = 'sound/vox_fem/man.ogg', "many" = 'sound/vox_fem/many.ogg', @@ -573,15 +712,21 @@ GLOBAL_LIST_INIT(vox_sounds, list( "maximum" = 'sound/vox_fem/maximum.ogg', "may" = 'sound/vox_fem/may.ogg', "me" = 'sound/vox_fem/me.ogg', + "mean" = 'sound/vox_fem/mean.ogg', + "means" = 'sound/vox_fem/means.ogg', "meat" = 'sound/vox_fem/meat.ogg', "medbay" = 'sound/vox_fem/medbay.ogg', "medical" = 'sound/vox_fem/medical.ogg', + "medium" = 'sound/vox_fem/medium.ogg', "megafauna" = 'sound/vox_fem/megafauna.ogg', "men" = 'sound/vox_fem/men.ogg', "mercy" = 'sound/vox_fem/mercy.ogg', "mesa" = 'sound/vox_fem/mesa.ogg', + "meson" = 'sound/vox_fem/meson.ogg', "message" = 'sound/vox_fem/message.ogg', "meter" = 'sound/vox_fem/meter.ogg', + "method" = 'sound/vox_fem/method.ogg', + "miasma" = 'sound/vox_fem/miasma.ogg', "micro" = 'sound/vox_fem/micro.ogg', "middle" = 'sound/vox_fem/middle.ogg', "mike" = 'sound/vox_fem/mike.ogg', @@ -594,17 +739,22 @@ GLOBAL_LIST_INIT(vox_sounds, list( "miner" = 'sound/vox_fem/miner.ogg', "minimum" = 'sound/vox_fem/minimum.ogg', "minor" = 'sound/vox_fem/minor.ogg', + "minute" = 'sound/vox_fem/minute.ogg', "minutes" = 'sound/vox_fem/minutes.ogg', "mister" = 'sound/vox_fem/mister.ogg', + "mixture" = 'sound/vox_fem/mixture.ogg', "mode" = 'sound/vox_fem/mode.ogg', "modification" = 'sound/vox_fem/modification.ogg', "money" = 'sound/vox_fem/money.ogg', "monkey" = 'sound/vox_fem/monkey.ogg', + "most" = 'sound/vox_fem/most.ogg', "moth" = 'sound/vox_fem/moth.ogg', "mothperson" = 'sound/vox_fem/mothperson.ogg', "motor" = 'sound/vox_fem/motor.ogg', "motorpool" = 'sound/vox_fem/motorpool.ogg', "move" = 'sound/vox_fem/move.ogg', + "moved" = 'sound/vox_fem/moved.ogg', + "moving" = 'sound/vox_fem/moving.ogg', "multitude" = 'sound/vox_fem/multitude.ogg', "murder" = 'sound/vox_fem/murder.ogg', "murderer" = 'sound/vox_fem/murderer.ogg', @@ -613,7 +763,9 @@ GLOBAL_LIST_INIT(vox_sounds, list( "mythic" = 'sound/vox_fem/mythic.ogg', "n" = 'sound/vox_fem/n.ogg', "nanotrasen" = 'sound/vox_fem/nanotrasen.ogg', + "near" = 'sound/vox_fem/near.ogg', "nearest" = 'sound/vox_fem/nearest.ogg', + "nearly" = 'sound/vox_fem/nearly.ogg', "need" = 'sound/vox_fem/need.ogg', "never" = 'sound/vox_fem/never.ogg', "nice" = 'sound/vox_fem/nice.ogg', @@ -624,16 +776,21 @@ GLOBAL_LIST_INIT(vox_sounds, list( "nitrogen" = 'sound/vox_fem/nitrogen.ogg', "no" = 'sound/vox_fem/no.ogg', "nominal" = 'sound/vox_fem/nominal.ogg', + "none" = 'sound/vox_fem/none.ogg', + "normal" = 'sound/vox_fem/normal.ogg', + "normally" = 'sound/vox_fem/normally.ogg', "north" = 'sound/vox_fem/north.ogg', "northeast" = 'sound/vox_fem/northeast.ogg', "northwest" = 'sound/vox_fem/northwest.ogg', "not" = 'sound/vox_fem/not.ogg', + "notably" = 'sound/vox_fem/notably.ogg', "november" = 'sound/vox_fem/november.ogg', "now" = 'sound/vox_fem/now.ogg', "nuclear" = 'sound/vox_fem/nuclear.ogg', "nuke" = 'sound/vox_fem/nuke.ogg', "number" = 'sound/vox_fem/number.ogg', "o" = 'sound/vox_fem/o.ogg', + "object" = 'sound/vox_fem/object.ogg', "objective" = 'sound/vox_fem/objective.ogg', "obliterate" = 'sound/vox_fem/obliterate.ogg', "obliterated" = 'sound/vox_fem/obliterated.ogg', @@ -660,13 +817,17 @@ GLOBAL_LIST_INIT(vox_sounds, list( "option" = 'sound/vox_fem/option.ogg', "or" = 'sound/vox_fem/or.ogg', "order" = 'sound/vox_fem/order.ogg', + "ordered" = 'sound/vox_fem/ordered.ogg', + "ordering" = 'sound/vox_fem/ordering.ogg', "organic" = 'sound/vox_fem/organic.ogg', "oscar" = 'sound/vox_fem/oscar.ogg', "out" = 'sound/vox_fem/out.ogg', + "output" = 'sound/vox_fem/output.ogg', "outside" = 'sound/vox_fem/outside.ogg', "over" = 'sound/vox_fem/over.ogg', "overload" = 'sound/vox_fem/overload.ogg', "override" = 'sound/vox_fem/override.ogg', + "own" = 'sound/vox_fem/own.ogg', "oxygen" = 'sound/vox_fem/oxygen.ogg', "p" = 'sound/vox_fem/p.ogg', "pacification" = 'sound/vox_fem/pacification.ogg', @@ -676,6 +837,7 @@ GLOBAL_LIST_INIT(vox_sounds, list( "panel" = 'sound/vox_fem/panel.ogg', "panting" = 'sound/vox_fem/panting.ogg', "pathetic" = 'sound/vox_fem/pathetic.ogg', + "pda" = 'sound/vox_fem/pda.ogg', "percent" = 'sound/vox_fem/percent.ogg', "perfect" = 'sound/vox_fem/perfect.ogg', "perhaps" = 'sound/vox_fem/perhaps.ogg', @@ -690,28 +852,46 @@ GLOBAL_LIST_INIT(vox_sounds, list( "plasma" = 'sound/vox_fem/plasma.ogg', "plasmaman" = 'sound/vox_fem/plasmaman.ogg', "platform" = 'sound/vox_fem/platform.ogg', + "plating" = 'sound/vox_fem/plating.ogg', "plausible" = 'sound/vox_fem/plausible.ogg', "please" = 'sound/vox_fem/please.ogg', + "pluoxium" = 'sound/vox_fem/pluoxium.ogg', "point" = 'sound/vox_fem/point.ogg', "port" = 'sound/vox_fem/port.ogg', "portal" = 'sound/vox_fem/portal.ogg', + "portion" = 'sound/vox_fem/portion.ogg', "possible" = 'sound/vox_fem/possible.ogg', "power" = 'sound/vox_fem/power.ogg', + "powered" = 'sound/vox_fem/powered.ogg', + "powering" = 'sound/vox_fem/powering.ogg', + "premature" = 'sound/vox_fem/premature.ogg', + "prematurely" = 'sound/vox_fem/prematurely.ogg', "presence" = 'sound/vox_fem/presence.ogg', "present" = 'sound/vox_fem/present.ogg', "presents" = 'sound/vox_fem/presents.ogg', "press" = 'sound/vox_fem/press.ogg', "pressure" = 'sound/vox_fem/pressure.ogg', "primary" = 'sound/vox_fem/primary.ogg', + "priority" = 'sound/vox_fem/priority.ogg', "prison" = 'sound/vox_fem/prison.ogg', "prisoner" = 'sound/vox_fem/prisoner.ogg', "proceed" = 'sound/vox_fem/proceed.ogg', "processing" = 'sound/vox_fem/processing.ogg', "progress" = 'sound/vox_fem/progress.ogg', + "projectile" = 'sound/vox_fem/projectile.ogg', "proper" = 'sound/vox_fem/proper.ogg', "propulsion" = 'sound/vox_fem/propulsion.ogg', "prosecute" = 'sound/vox_fem/prosecute.ogg', + "protect" = 'sound/vox_fem/protect.ogg', + "protected" = 'sound/vox_fem/protected.ogg', + "protection" = 'sound/vox_fem/protection.ogg', "protective" = 'sound/vox_fem/protective.ogg', + "proto-nitrate" = 'sound/vox_fem/proto-nitrate.ogg', + "pull" = 'sound/vox_fem/pull.ogg', + "pulled" = 'sound/vox_fem/pulled.ogg', + "pulling" = 'sound/vox_fem/pulling.ogg', + "pump" = 'sound/vox_fem/pump.ogg', + "pumps" = 'sound/vox_fem/pumps.ogg', "push" = 'sound/vox_fem/push.ogg', "put" = 'sound/vox_fem/put.ogg', "q" = 'sound/vox_fem/q.ogg', @@ -737,9 +917,14 @@ GLOBAL_LIST_INIT(vox_sounds, list( "reactor" = 'sound/vox_fem/reactor.ogg', "red" = 'sound/vox_fem/red.ogg', "relay" = 'sound/vox_fem/relay.ogg', + "release" = 'sound/vox_fem/release.ogg', "released" = 'sound/vox_fem/released.ogg', + "releasing" = 'sound/vox_fem/releasing.ogg', "remaining" = 'sound/vox_fem/remaining.ogg', "removal" = 'sound/vox_fem/removal.ogg', + "remove" = 'sound/vox_fem/remove.ogg', + "removed" = 'sound/vox_fem/removed.ogg', + "removing" = 'sound/vox_fem/removing.ogg', "renegade" = 'sound/vox_fem/renegade.ogg', "repair" = 'sound/vox_fem/repair.ogg', "report" = 'sound/vox_fem/report.ogg', @@ -752,6 +937,9 @@ GLOBAL_LIST_INIT(vox_sounds, list( "research" = 'sound/vox_fem/research.ogg', "resevoir" = 'sound/vox_fem/resevoir.ogg', "resistance" = 'sound/vox_fem/resistance.ogg', + "resistant" = 'sound/vox_fem/resistant.ogg', + "resisting" = 'sound/vox_fem/resisting.ogg', + "resonance" = 'sound/vox_fem/resonance.ogg', "rest" = 'sound/vox_fem/rest.ogg', "restoration" = 'sound/vox_fem/restoration.ogg', "revolution" = 'sound/vox_fem/revolution.ogg', @@ -770,18 +958,28 @@ GLOBAL_LIST_INIT(vox_sounds, list( "runtime" = 'sound/vox_fem/runtime.ogg', "s" = 'sound/vox_fem/s.ogg', "sabotage" = 'sound/vox_fem/sabotage.ogg', + "sabotaged" = 'sound/vox_fem/sabotaged.ogg', + "sabotaging" = 'sound/vox_fem/sabotaging.ogg', "safe" = 'sound/vox_fem/safe.ogg', "safety" = 'sound/vox_fem/safety.ogg', "sairhorn" = 'sound/vox_fem/sairhorn.ogg', + "same" = 'sound/vox_fem/same.ogg', "sarah" = 'sound/vox_fem/sarah.ogg', "sargeant" = 'sound/vox_fem/sargeant.ogg', "satellite" = 'sound/vox_fem/satellite.ogg', "save" = 'sound/vox_fem/save.ogg', + "saw" = 'sound/vox_fem/saw.ogg', + "scan" = 'sound/vox_fem/scan.ogg', + "scanned" = 'sound/vox_fem/scanned.ogg', + "scanner" = 'sound/vox_fem/scanner.ogg', + "scanners" = 'sound/vox_fem/scanners.ogg', + "scanning" = 'sound/vox_fem/scanning.ogg', "scensor" = 'sound/vox_fem/scensor.ogg', "science" = 'sound/vox_fem/science.ogg', "scientist" = 'sound/vox_fem/scientist.ogg', "scream" = 'sound/vox_fem/scream.ogg', "screen" = 'sound/vox_fem/screen.ogg', + "screw" = 'sound/vox_fem/screw.ogg', "search" = 'sound/vox_fem/search.ogg', "second" = 'sound/vox_fem/second.ogg', "secondary" = 'sound/vox_fem/secondary.ogg', @@ -791,21 +989,32 @@ GLOBAL_LIST_INIT(vox_sounds, list( "secure" = 'sound/vox_fem/secure.ogg', "secured" = 'sound/vox_fem/secured.ogg', "security" = 'sound/vox_fem/security.ogg', + "seen" = 'sound/vox_fem/seen.ogg', "select" = 'sound/vox_fem/select.ogg', "selected" = 'sound/vox_fem/selected.ogg', "self" = 'sound/vox_fem/self.ogg', "sensors" = 'sound/vox_fem/sensors.ogg', "server" = 'sound/vox_fem/server.ogg', "service" = 'sound/vox_fem/service.ogg', + "set" = 'sound/vox_fem/set.ogg', "seven" = 'sound/vox_fem/seven.ogg', "seventeen" = 'sound/vox_fem/seventeen.ogg', "seventy" = 'sound/vox_fem/seventy.ogg', + "sever" = 'sound/vox_fem/sever.ogg', "severe" = 'sound/vox_fem/severe.ogg', + "severed" = 'sound/vox_fem/severed.ogg', + "severing" = 'sound/vox_fem/severing.ogg', "sewage" = 'sound/vox_fem/sewage.ogg', "sewer" = 'sound/vox_fem/sewer.ogg', "shaft" = 'sound/vox_fem/shaft.ogg', + "shame" = 'sound/vox_fem/shame.ogg', + "shameful" = 'sound/vox_fem/shameful.ogg', + "shameless" = 'sound/vox_fem/shameless.ogg', + "shard" = 'sound/vox_fem/shard.ogg', "she" = 'sound/vox_fem/she.ogg', "shield" = 'sound/vox_fem/shield.ogg', + "shift" = 'sound/vox_fem/shift.ogg', + "shifts" = 'sound/vox_fem/shifts.ogg', "shipment" = 'sound/vox_fem/shipment.ogg', "shirt" = 'sound/vox_fem/shirt.ogg', "shit" = 'sound/vox_fem/shit.ogg', @@ -820,11 +1029,15 @@ GLOBAL_LIST_INIT(vox_sounds, list( "shuttle" = 'sound/vox_fem/shuttle.ogg', "sick" = 'sound/vox_fem/sick.ogg', "side" = 'sound/vox_fem/side.ogg', + "sides" = 'sound/vox_fem/sides.ogg', "sierra" = 'sound/vox_fem/sierra.ogg', "sight" = 'sound/vox_fem/sight.ogg', "silicon" = 'sound/vox_fem/silicon.ogg', "silo" = 'sound/vox_fem/silo.ogg', + "single" = 'sound/vox_fem/single.ogg', "singularity" = 'sound/vox_fem/singularity.ogg', + "siphon" = 'sound/vox_fem/siphon.ogg', + "siphoning" = 'sound/vox_fem/siphoning.ogg', "six" = 'sound/vox_fem/six.ogg', "sixteen" = 'sound/vox_fem/sixteen.ogg', "sixty" = 'sound/vox_fem/sixty.ogg', @@ -837,6 +1050,7 @@ GLOBAL_LIST_INIT(vox_sounds, list( "sm" = 'sound/vox_fem/sm.ogg', "small" = 'sound/vox_fem/small.ogg', "sockmuncher" = 'sound/vox_fem/sockmuncher.ogg', + "soft" = 'sound/vox_fem/soft.ogg', "solar" = 'sound/vox_fem/solar.ogg', "solars" = 'sound/vox_fem/solars.ogg', "soldier" = 'sound/vox_fem/soldier.ogg', @@ -845,16 +1059,23 @@ GLOBAL_LIST_INIT(vox_sounds, list( "something" = 'sound/vox_fem/something.ogg', "son" = 'sound/vox_fem/son.ogg', "sorry" = 'sound/vox_fem/sorry.ogg', + "source" = 'sound/vox_fem/source.ogg', "south" = 'sound/vox_fem/south.ogg', "southeast" = 'sound/vox_fem/southeast.ogg', "southwest" = 'sound/vox_fem/southwest.ogg', "space" = 'sound/vox_fem/space.ogg', + "special" = 'sound/vox_fem/special.ogg', + "spew" = 'sound/vox_fem/spew.ogg', "squad" = 'sound/vox_fem/squad.ogg', "square" = 'sound/vox_fem/square.ogg', "ss13" = 'sound/vox_fem/ss13.ogg', "stairway" = 'sound/vox_fem/stairway.ogg', "starboard" = 'sound/vox_fem/starboard.ogg', + "start" = 'sound/vox_fem/start.ogg', + "starts" = 'sound/vox_fem/starts.ogg', "station" = 'sound/vox_fem/station.ogg', + "stations" = 'sound/vox_fem/stations.ogg', + "stationwide" = 'sound/vox_fem/stationwide.ogg', "status" = 'sound/vox_fem/status.ogg', "stay" = 'sound/vox_fem/stay.ogg', "sterile" = 'sound/vox_fem/sterile.ogg', @@ -865,9 +1086,12 @@ GLOBAL_LIST_INIT(vox_sounds, list( "stuck" = 'sound/vox_fem/stuck.ogg', "sub" = 'sound/vox_fem/sub.ogg', "subsurface" = 'sound/vox_fem/subsurface.ogg', + "such" = 'sound/vox_fem/such.ogg', "sudden" = 'sound/vox_fem/sudden.ogg', "suffer" = 'sound/vox_fem/suffer.ogg', "suit" = 'sound/vox_fem/suit.ogg', + "suited" = 'sound/vox_fem/suited.ogg', + "super" = 'sound/vox_fem/super.ogg', "superconducting" = 'sound/vox_fem/superconducting.ogg', "supercooled" = 'sound/vox_fem/supercooled.ogg', "supermatter" = 'sound/vox_fem/supermatter.ogg', @@ -904,6 +1128,7 @@ GLOBAL_LIST_INIT(vox_sounds, list( "terminate" = 'sound/vox_fem/terminate.ogg', "terminated" = 'sound/vox_fem/terminated.ogg', "termination" = 'sound/vox_fem/termination.ogg', + "tesla" = 'sound/vox_fem/tesla.ogg', "test" = 'sound/vox_fem/test.ogg', "text" = 'sound/vox_fem/text.ogg', "thank" = 'sound/vox_fem/thank.ogg', @@ -924,23 +1149,33 @@ GLOBAL_LIST_INIT(vox_sounds, list( "threat" = 'sound/vox_fem/threat.ogg', "three" = 'sound/vox_fem/three.ogg', "through" = 'sound/vox_fem/through.ogg', + "tick" = 'sound/vox_fem/tick.ogg', "tide" = 'sound/vox_fem/tide.ogg', + "tile" = 'sound/vox_fem/tile.ogg', "time" = 'sound/vox_fem/time.ogg', "tiny" = 'sound/vox_fem/tiny.ogg', "to" = 'sound/vox_fem/to.ogg', "top" = 'sound/vox_fem/top.ogg', "topside" = 'sound/vox_fem/topside.ogg', "touch" = 'sound/vox_fem/touch.ogg', + "touched" = 'sound/vox_fem/touched.ogg', + "touching" = 'sound/vox_fem/touching.ogg', "towards" = 'sound/vox_fem/towards.ogg', "toxins" = 'sound/vox_fem/toxins.ogg', "track" = 'sound/vox_fem/track.ogg', "train" = 'sound/vox_fem/train.ogg', "traitor" = 'sound/vox_fem/traitor.ogg', "transportation" = 'sound/vox_fem/transportation.ogg', + "trigger" = 'sound/vox_fem/trigger.ogg', + "triggered" = 'sound/vox_fem/triggered.ogg', + "triggering" = 'sound/vox_fem/triggering.ogg', + "triple" = 'sound/vox_fem/triple.ogg', + "tritium" = 'sound/vox_fem/tritium.ogg', "truck" = 'sound/vox_fem/truck.ogg', "true" = 'sound/vox_fem/true.ogg', "tunnel" = 'sound/vox_fem/tunnel.ogg', "turn" = 'sound/vox_fem/turn.ogg', + "turned" = 'sound/vox_fem/turned.ogg', "turret" = 'sound/vox_fem/turret.ogg', "twelve" = 'sound/vox_fem/twelve.ogg', "twenty" = 'sound/vox_fem/twenty.ogg', @@ -952,10 +1187,13 @@ GLOBAL_LIST_INIT(vox_sounds, list( "unauthorized" = 'sound/vox_fem/unauthorized.ogg', "under" = 'sound/vox_fem/under.ogg', "uniform" = 'sound/vox_fem/uniform.ogg', + "unique" = 'sound/vox_fem/unique.ogg', "unknown" = 'sound/vox_fem/unknown.ogg', "unlocked" = 'sound/vox_fem/unlocked.ogg', "unsafe" = 'sound/vox_fem/unsafe.ogg', "until" = 'sound/vox_fem/until.ogg', + "unwrench" = 'sound/vox_fem/unwrench.ogg', + "unwrenching" = 'sound/vox_fem/unwrenching.ogg', "up" = 'sound/vox_fem/up.ogg', "update" = 'sound/vox_fem/update.ogg', "updated" = 'sound/vox_fem/updated.ogg', @@ -967,6 +1205,8 @@ GLOBAL_LIST_INIT(vox_sounds, list( "usa" = 'sound/vox_fem/usa.ogg', "use" = 'sound/vox_fem/use.ogg', "used" = 'sound/vox_fem/used.ogg', + "useful" = 'sound/vox_fem/useful.ogg', + "useless" = 'sound/vox_fem/useless.ogg', "user" = 'sound/vox_fem/user.ogg', "v" = 'sound/vox_fem/v.ogg', "vacate" = 'sound/vox_fem/vacate.ogg', @@ -987,8 +1227,8 @@ GLOBAL_LIST_INIT(vox_sounds, list( "vitals" = 'sound/vox_fem/vitals.ogg', "voltage" = 'sound/vox_fem/voltage.ogg', "vox" = 'sound/vox_fem/vox.ogg', - "vox_login" = 'sound/vox_fem/vox_login.ogg', "voxtest" = 'sound/vox_fem/voxtest.ogg', + "vox_login" = 'sound/vox_fem/vox_login.ogg', "w" = 'sound/vox_fem/w.ogg', "walk" = 'sound/vox_fem/walk.ogg', "wall" = 'sound/vox_fem/wall.ogg', @@ -1002,15 +1242,19 @@ GLOBAL_LIST_INIT(vox_sounds, list( "was" = 'sound/vox_fem/was.ogg', "waste" = 'sound/vox_fem/waste.ogg', "water" = 'sound/vox_fem/water.ogg', + "way" = 'sound/vox_fem/way.ogg', + "ways" = 'sound/vox_fem/ways.ogg', "we" = 'sound/vox_fem/we.ogg', "weak" = 'sound/vox_fem/weak.ogg', "weapon" = 'sound/vox_fem/weapon.ogg', "welcome" = 'sound/vox_fem/welcome.ogg', + "weld" = 'sound/vox_fem/weld.ogg', "west" = 'sound/vox_fem/west.ogg', "wew" = 'sound/vox_fem/wew.ogg', "what" = 'sound/vox_fem/what.ogg', "when" = 'sound/vox_fem/when.ogg', "where" = 'sound/vox_fem/where.ogg', + "which" = 'sound/vox_fem/which.ogg', "while" = 'sound/vox_fem/while.ogg', "whiskey" = 'sound/vox_fem/whiskey.ogg', "white" = 'sound/vox_fem/white.ogg', @@ -1025,7 +1269,15 @@ GLOBAL_LIST_INIT(vox_sounds, list( "wood" = 'sound/vox_fem/wood.ogg', "woody" = 'sound/vox_fem/woody.ogg', "woop" = 'sound/vox_fem/woop.ogg', + "work" = 'sound/vox_fem/work.ogg', + "worked" = 'sound/vox_fem/worked.ogg', + "working" = 'sound/vox_fem/working.ogg', + "works" = 'sound/vox_fem/works.ogg', + "would" = 'sound/vox_fem/would.ogg', + "wouldnt" = 'sound/vox_fem/wouldnt.ogg', "wow" = 'sound/vox_fem/wow.ogg', + "wrench" = 'sound/vox_fem/wrench.ogg', + "wrenching" = 'sound/vox_fem/wrenching.ogg', "x" = 'sound/vox_fem/x.ogg', "xeno" = 'sound/vox_fem/xeno.ogg', "xenobiology" = 'sound/vox_fem/xenobiology.ogg', @@ -1041,6 +1293,8 @@ GLOBAL_LIST_INIT(vox_sounds, list( "your" = 'sound/vox_fem/your.ogg', "yourself" = 'sound/vox_fem/yourself.ogg', "z" = 'sound/vox_fem/z.ogg', + "zap" = 'sound/vox_fem/zap.ogg', + "zauker" = 'sound/vox_fem/zauker.ogg', "zero" = 'sound/vox_fem/zero.ogg', "zombie" = 'sound/vox_fem/zombie.ogg', "zone" = 'sound/vox_fem/zone.ogg', diff --git a/code/modules/mob/living/silicon/robot/robot_model.dm b/code/modules/mob/living/silicon/robot/robot_model.dm index 4fc4bd5d8c15d..1721d6ec2c102 100644 --- a/code/modules/mob/living/silicon/robot/robot_model.dm +++ b/code/modules/mob/living/silicon/robot/robot_model.dm @@ -53,17 +53,9 @@ var/list/ride_offset_y = list("north" = 4, "south" = 4, "east" = 3, "west" = 3) ///List of skins the borg can be reskinned to, optional var/list/borg_skins - ///Omnitoolbox, holder of certain borg tools. Not all models have one - var/obj/item/cyborg_omnitoolbox/toolbox - ///Path to toolbox, if a model gets one - var/toolbox_path /obj/item/robot_model/Initialize(mapload) . = ..() - - if(toolbox_path) - toolbox = new toolbox_path(src) - for(var/path in basic_modules) var/obj/item/new_module = new path(src) basic_modules += new_module @@ -406,7 +398,6 @@ model_select_icon = "engineer" model_traits = list(TRAIT_NEGATES_GRAVITY) hat_offset = -4 - toolbox_path = /obj/item/cyborg_omnitoolbox/engineering /obj/item/robot_model/janitor name = "Janitor" @@ -687,7 +678,6 @@ /obj/item/reagent_containers/syringe, /obj/item/borg/cyborg_omnitool/medical, /obj/item/borg/cyborg_omnitool/medical, - /obj/item/surgical_drapes/cyborg, /obj/item/blood_filter, /obj/item/extinguisher/mini, /obj/item/emergency_bed/silicon, @@ -705,7 +695,6 @@ model_select_icon = "medical" model_traits = list(TRAIT_PUSHIMMUNE) hat_offset = 3 - toolbox_path = /obj/item/cyborg_omnitoolbox/medical borg_skins = list( "Machinified Doctor" = list(SKIN_ICON_STATE = "medical"), "Qualified Doctor" = list(SKIN_ICON_STATE = "qualified_doctor"), @@ -888,7 +877,6 @@ /obj/item/healthanalyzer, /obj/item/borg/cyborg_omnitool/medical, /obj/item/borg/cyborg_omnitool/medical, - /obj/item/surgical_drapes/cyborg, /obj/item/blood_filter, /obj/item/melee/energy/sword/cyborg/saw, /obj/item/emergency_bed/silicon, @@ -904,7 +892,6 @@ model_select_icon = "malf" model_traits = list(TRAIT_PUSHIMMUNE) hat_offset = 3 - toolbox_path = /obj/item/cyborg_omnitoolbox/medical /obj/item/robot_model/saboteur name = "Syndicate Saboteur" @@ -934,7 +921,6 @@ model_select_icon = "malf" model_traits = list(TRAIT_PUSHIMMUNE, TRAIT_NEGATES_GRAVITY) hat_offset = -4 - toolbox_path = /obj/item/cyborg_omnitoolbox/engineering canDispose = TRUE /obj/item/robot_model/syndicate/kiltborg diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 6d94c2c5be978..9ca655740cd08 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -76,6 +76,7 @@ TRAIT_MARTIAL_ARTS_IMMUNE, TRAIT_NOFIRE_SPREAD, TRAIT_BRAWLING_KNOCKDOWN_BLOCKED, + TRAIT_FENCE_CLIMBER, ) add_traits(traits_to_apply, ROUNDSTART_TRAIT) diff --git a/code/modules/mob/living/silicon/silicon_say.dm b/code/modules/mob/living/silicon/silicon_say.dm index 1468b9c736591..9310211aa0e6d 100644 --- a/code/modules/mob/living/silicon/silicon_say.dm +++ b/code/modules/mob/living/silicon/silicon_say.dm @@ -70,6 +70,9 @@ ) /mob/living/silicon/binarycheck() + var/area/our_area = get_area(src) + if(our_area.area_flags & BINARY_JAMMING) + return FALSE return TRUE /mob/living/silicon/radio(message, list/message_mods = list(), list/spans, language) 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 b4cafdb6d538d..4156d9678bca0 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -538,12 +538,12 @@ Difficulty: Hard /obj/effect/temp_visual/hierophant/wall/Initialize(mapload, new_caster) . = ..() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) QUEUE_SMOOTH(src) /obj/effect/temp_visual/hierophant/wall/Destroy() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) return ..() 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 8558601f12467..ae0011f998a68 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 @@ -272,8 +272,8 @@ While using this makes the system rely on OnFire, it still gives options for tim var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(mychild)) H.color = COLOR_RED -/obj/structure/elite_tumor/attackby(obj/item/attacking_item, mob/user, params) - . = ..() +/obj/structure/elite_tumor/item_interaction(mob/living/user, obj/item/attacking_item, list/modifiers) + . = NONE if(istype(attacking_item, /obj/item/organ/internal/monster_core/regenerative_core) && activity == TUMOR_INACTIVE && !boosted) var/obj/item/organ/internal/monster_core/regenerative_core/core = attacking_item visible_message(span_boldwarning("As [user] drops the core into [src], [src] appears to swell.")) @@ -282,7 +282,7 @@ While using this makes the system rely on OnFire, it still gives options for tim set_light_range(6) desc = "[desc] This one seems to glow with a strong intensity." qdel(core) - return TRUE + return ITEM_INTERACT_SUCCESS /obj/structure/elite_tumor/proc/arena_checks() if(activity != TUMOR_ACTIVE || QDELETED(src)) @@ -408,12 +408,12 @@ While using this makes the system rely on OnFire, it still gives options for tim /obj/effect/temp_visual/elite_tumor_wall/Initialize(mapload, new_caster) . = ..() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) QUEUE_SMOOTH(src) /obj/effect/temp_visual/elite_tumor_wall/Destroy() - if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH_NEIGHBORS(src) return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index e20ecc2337a4d..f69c010ac6bfb 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -375,7 +375,7 @@ name = "mending globule" icon_state = "glob_projectile" shrapnel_type = /obj/item/mending_globule - embedding = list("embed_chance" = 100, ignore_throwspeed_threshold = TRUE, "pain_mult" = 0, "jostle_pain_mult" = 0, "fall_chance" = 0.5) + embed_type = /datum/embed_data/mending_globule damage = 0 ///This item is what is embedded into the mob, and actually handles healing of mending globules @@ -384,10 +384,17 @@ desc = "It somehow heals those who touch it." icon = 'icons/obj/science/vatgrowing.dmi' icon_state = "globule" - embedding = list("embed_chance" = 100, ignore_throwspeed_threshold = TRUE, "pain_mult" = 0, "jostle_pain_mult" = 0, "fall_chance" = 0.5) + embed_type = /datum/embed_data/mending_globule var/obj/item/bodypart/bodypart var/heals_left = 35 +/datum/embed_data/mending_globule + embed_chance = 100 + ignore_throwspeed_threshold = TRUE + pain_mult = 0 + jostle_pain_mult = 0 + fall_chance = 0.5 + /obj/item/mending_globule/Destroy() . = ..() bodypart = null diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 81a9fa7c62447..a4964add6c865 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -99,7 +99,8 @@ update_client_colour() update_mouse_pointer() - refresh_looping_ambience() + update_ambience_area(get_area(src)) + if(!can_hear()) stop_sound_channel(CHANNEL_AMBIENCE) diff --git a/code/modules/mob/logout.dm b/code/modules/mob/logout.dm index cf937e42bb74f..09d50c8436c71 100644 --- a/code/modules/mob/logout.dm +++ b/code/modules/mob/logout.dm @@ -3,6 +3,7 @@ log_message("[key_name(src)] is no longer owning mob [src]([src.type])", LOG_OWNERSHIP) SStgui.on_logout(src) remove_from_player_list() + update_ambience_area(null) // Unset ambience vars so it plays again on login ..() if(loc) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index f24f5a58c0d8d..6ec820bc469c9 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -6,7 +6,6 @@ * * GLOB.dead_mob_list * * GLOB.alive_mob_list * * GLOB.all_clockwork_mobs - * * GLOB.mob_directory * * Unsets the focus var * @@ -67,7 +66,6 @@ * * Adds to global lists * * GLOB.mob_list - * * GLOB.mob_directory (by tag) * * GLOB.dead_mob_list - if mob is dead * * GLOB.alive_mob_list - if the mob is alive * @@ -441,88 +439,6 @@ return FALSE -/** - * Try to equip an item to a slot on the mob - * - * This is a SAFE proc. Use this instead of equip_to_slot()! - * - * set qdel_on_fail to have it delete W if it fails to equip - * - * set disable_warning to disable the 'you are unable to equip that' warning. - * - * unset redraw_mob to prevent the mob icons from being redrawn at the end. - * - * Initial is used to indicate whether or not this is the initial equipment (job datums etc) or just a player doing it - * - * set indirect_action to allow insertions into "soft" locked objects, things that are easily opened by the owning mob - */ -/mob/proc/equip_to_slot_if_possible(obj/item/W, slot, qdel_on_fail = FALSE, disable_warning = FALSE, redraw_mob = TRUE, bypass_equip_delay_self = FALSE, initial = FALSE, indirect_action = FALSE) - if(!istype(W) || QDELETED(W)) //This qdeleted is to prevent stupid behavior with things that qdel during init, like say stacks - return FALSE - if(!W.mob_can_equip(src, slot, disable_warning, bypass_equip_delay_self, indirect_action = indirect_action)) - if(qdel_on_fail) - qdel(W) - else if(!disable_warning) - to_chat(src, span_warning("You are unable to equip that!")) - return FALSE - equip_to_slot(W, slot, initial, redraw_mob, indirect_action = indirect_action) //This proc should not ever fail. - return TRUE - -/** - * Actually equips an item to a slot (UNSAFE) - * - * This is an UNSAFE proc. It merely handles the actual job of equipping. All the checks on - * whether you can or can't equip need to be done before! Use mob_can_equip() for that task. - * - *In most cases you will want to use equip_to_slot_if_possible() - */ -/mob/proc/equip_to_slot(obj/item/equipping, slot, initial = FALSE, redraw_mob = FALSE, indirect_action = FALSE) - return - -/** - * Equip an item to the slot or delete - * - * This is just a commonly used configuration for the equip_to_slot_if_possible() proc, used to - * equip people when the round starts and when events happen and such. - * - * Also bypasses equip delay checks, since the mob isn't actually putting it on. - * Initial is used to indicate whether or not this is the initial equipment (job datums etc) or just a player doing it - * set indirect_action to allow insertions into "soft" locked objects, things that are easily opened by the owning mob - */ -/mob/proc/equip_to_slot_or_del(obj/item/W, slot, initial = FALSE, indirect_action = FALSE) - return equip_to_slot_if_possible(W, slot, TRUE, TRUE, FALSE, TRUE, initial, indirect_action) - -/** - * Auto equip the passed in item the appropriate slot based on equipment priority - * - * puts the item "W" into an appropriate slot in a human's inventory - * - * returns 0 if it cannot, 1 if successful - */ -/mob/proc/equip_to_appropriate_slot(obj/item/W, qdel_on_fail = FALSE, indirect_action = FALSE) - if(!istype(W)) - return FALSE - var/slot_priority = W.slot_equipment_priority - - if(!slot_priority) - slot_priority = list( \ - ITEM_SLOT_BACK, ITEM_SLOT_ID,\ - ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\ - ITEM_SLOT_MASK, ITEM_SLOT_HEAD, ITEM_SLOT_NECK,\ - ITEM_SLOT_FEET, ITEM_SLOT_GLOVES,\ - ITEM_SLOT_EARS, ITEM_SLOT_EYES,\ - ITEM_SLOT_BELT, ITEM_SLOT_SUITSTORE,\ - ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET,\ - ITEM_SLOT_DEX_STORAGE\ - ) - - for(var/slot in slot_priority) - if(equip_to_slot_if_possible(W, slot, disable_warning = TRUE, redraw_mob = TRUE, indirect_action = indirect_action)) - return TRUE - - if(qdel_on_fail) - qdel(W) - return FALSE /** * Reset the attached clients perspective (viewpoint) * @@ -889,10 +805,6 @@ set category = null return -///Is the mob muzzled (default false) -/mob/proc/is_muzzled() - return FALSE - /// Adds this list to the output to the stat browser /mob/proc/get_status_tab_items() . = list("") //we want to offset unique stuff from standard stuff diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index a0658c3a02b38..2206efd0e13ce 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -191,3 +191,6 @@ var/active_typing_indicator ///the icon currently used for the thinking indicator's bubble var/active_thinking_indicator + + /// A ref of the area we're taking our ambient loop from. + var/area/ambience_tracked_area diff --git a/code/modules/mob/mob_lists.dm b/code/modules/mob/mob_lists.dm index 9fd097a1fd6a4..f43f82ac24609 100644 --- a/code/modules/mob/mob_lists.dm +++ b/code/modules/mob/mob_lists.dm @@ -1,12 +1,10 @@ ///Adds the mob reference to the list and directory of all mobs. Called on Initialize(). /mob/proc/add_to_mob_list() GLOB.mob_list |= src - GLOB.mob_directory[tag] = src ///Removes the mob reference from the list and directory of all mobs. Called on Destroy(). /mob/proc/remove_from_mob_list() GLOB.mob_list -= src - GLOB.mob_directory -= tag ///Adds the mob reference to the list of all mobs alive. If mob is cliented, it adds it to the list of all living player-mobs. /mob/proc/add_to_alive_mob_list() diff --git a/code/modules/mob/mob_say.dm b/code/modules/mob/mob_say.dm index 568aee6690292..6b8c8f9aa6b2a 100644 --- a/code/modules/mob/mob_say.dm +++ b/code/modules/mob/mob_say.dm @@ -106,9 +106,6 @@ if(!allow_mimes && HAS_MIND_TRAIT(src, TRAIT_MIMING)) return FALSE - if(is_muzzled()) - return FALSE - return ..() ///Speak as a dead person (ghost etc) diff --git a/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm b/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm index 5b9e043349ea0..0165b27f21a1a 100644 --- a/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/fugitive_hunter_roles.dm @@ -96,3 +96,18 @@ if I assisted them with my 'flesh-gaze'. They're a bunch of freaks, but at least they leave me be after I'm done helping them..." back_story = HUNTER_PACK_PSYKER outfit = /datum/outfit/psyker_seer + +/obj/effect/mob_spawn/ghost_role/human/fugitive/mi13 + name = "top-secret pod" + desc = "You don't have the classification to know what this pod contains or what its purpose is." + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper_s" + prompt_name = "a MI13 agent" + you_are_text = "I am an agent sent by MI13." + flavour_text = "Your mission is to infiltrate the space around SS13 and capture the fugitives on board, dead or alive. Your shuttle has been disguised as an ordinary food truck to help you remain undetected. \ + This is a stealth mission in enemy territory. Reinforcements will not be sent to save you. Microbombs have been implanted in case of capture. Do not disappoint." + back_story = HUNTER_PACK_MI13 + outfit = /datum/outfit/mi13_hunter + +/obj/effect/mob_spawn/ghost_role/human/fugitive/mi13/chef + outfit = /datum/outfit/mi13_hunter/chef diff --git a/code/modules/mob_spawn/ghost_roles/unused_roles.dm b/code/modules/mob_spawn/ghost_roles/unused_roles.dm index d9cdd699ade70..80f584d52c2b6 100644 --- a/code/modules/mob_spawn/ghost_roles/unused_roles.dm +++ b/code/modules/mob_spawn/ghost_roles/unused_roles.dm @@ -308,7 +308,7 @@ /datum/outfit/syndicatespace/syndicrew name = "Syndicate Ship Crew Member" - glasses = /obj/item/clothing/glasses/night + glasses = /obj/item/clothing/glasses/night/colorless mask = /obj/item/clothing/mask/gas/syndicate l_pocket = /obj/item/gun/ballistic/automatic/pistol r_pocket = /obj/item/knife/combat/survival diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm index c9130fb706e1b..3337a15b441c5 100644 --- a/code/modules/mob_spawn/mob_spawn.dm +++ b/code/modules/mob_spawn/mob_spawn.dm @@ -59,26 +59,15 @@ spawned_human.underwear = "Nude" spawned_human.undershirt = "Nude" spawned_human.socks = "Nude" + randomize_human_normie(spawned_human) if(hairstyle) - spawned_human.hairstyle = hairstyle - else - spawned_human.hairstyle = random_hairstyle(spawned_human.gender) + spawned_human.set_hairstyle(hairstyle, update = FALSE) if(facial_hairstyle) - spawned_human.facial_hairstyle = facial_hairstyle - else - spawned_human.facial_hairstyle = random_facial_hairstyle(spawned_human.gender) + spawned_human.set_facial_hairstyle(facial_hairstyle, update = FALSE) if(haircolor) - spawned_human.hair_color = haircolor - else - spawned_human.hair_color = "#[random_color()]" + spawned_human.set_haircolor(haircolor, update = FALSE) if(facial_haircolor) - spawned_human.facial_hair_color = facial_haircolor - else - spawned_human.facial_hair_color = "#[random_color()]" - if(skin_tone) - spawned_human.skin_tone = skin_tone - else - spawned_human.skin_tone = pick(GLOB.skin_tones) + spawned_human.set_facial_haircolor(facial_haircolor, update = FALSE) spawned_human.update_body(is_creating = TRUE) /obj/effect/mob_spawn/proc/name_mob(mob/living/spawned_mob, forced_name) diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm index 5733d48f45f6f..aa5307957f981 100644 --- a/code/modules/mod/mod_link.dm +++ b/code/modules/mod/mod_link.dm @@ -16,7 +16,7 @@ /proc/get_link_visual_generic(datum/mod_link/mod_link, atom/movable/visuals, proc_path) var/mob/living/user = mod_link.get_user_callback.Invoke() playsound(mod_link.holder, 'sound/machines/terminal_processing.ogg', 50, vary = TRUE) - visuals.add_overlay(mutable_appearance('icons/effects/effects.dmi', "static_base", TURF_LAYER)) + visuals.add_overlay(mutable_appearance('icons/effects/effects.dmi', "static_base", ABOVE_NORMAL_TURF_LAYER)) visuals.add_overlay(mutable_appearance('icons/effects/effects.dmi', "modlink", ABOVE_ALL_MOB_LAYER)) visuals.add_filter("crop_square", 1, alpha_mask_filter(icon = icon('icons/effects/effects.dmi', "modlink_filter"))) visuals.maptext_height = 6 @@ -77,29 +77,34 @@ ) /obj/item/mod/control/multitool_act_secondary(mob/living/user, obj/item/multitool/tool) - if(!multitool_check_buffer(user, tool)) - return + . = NONE + var/tool_frequency = null if(istype(tool.buffer, /datum/mod_link)) var/datum/mod_link/buffer_link = tool.buffer tool_frequency = buffer_link.frequency balloon_alert(user, "frequency set") + . = ITEM_INTERACT_SUCCESS if(!tool_frequency && mod_link.frequency) tool.set_buffer(mod_link) balloon_alert(user, "frequency copied") + . = ITEM_INTERACT_SUCCESS else if(tool_frequency && !mod_link.frequency) mod_link.frequency = tool_frequency + . = ITEM_INTERACT_SUCCESS else if(tool_frequency && mod_link.frequency) var/response = tgui_alert(user, "Would you like to copy or imprint the frequency?", "MODlink Frequency", list("Copy", "Imprint")) if(!user.is_holding(tool)) - return + return ITEM_INTERACT_BLOCKING switch(response) if("Copy") tool.set_buffer(mod_link) balloon_alert(user, "frequency copied") + . = ITEM_INTERACT_SUCCESS if("Imprint") mod_link.frequency = tool_frequency balloon_alert(user, "frequency set") + . = ITEM_INTERACT_SUCCESS /obj/item/mod/control/proc/can_call() return get_charge() && wearer && wearer.stat < DEAD @@ -227,29 +232,34 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN /obj/item/clothing/neck/link_scryer/multitool_act_secondary(mob/living/user, obj/item/multitool/tool) - if(!multitool_check_buffer(user, tool)) - return + . = NONE + var/tool_frequency = null if(istype(tool.buffer, /datum/mod_link)) var/datum/mod_link/buffer_link = tool.buffer tool_frequency = buffer_link.frequency balloon_alert(user, "frequency set") + . = ITEM_INTERACT_SUCCESS if(!tool_frequency && mod_link.frequency) tool.set_buffer(mod_link) balloon_alert(user, "frequency copied") + . = ITEM_INTERACT_SUCCESS else if(tool_frequency && !mod_link.frequency) mod_link.frequency = tool_frequency + . = ITEM_INTERACT_SUCCESS else if(tool_frequency && mod_link.frequency) var/response = tgui_alert(user, "Would you like to copy or imprint the frequency?", "MODlink Frequency", list("Copy", "Imprint")) if(!user.is_holding(tool)) - return + return ITEM_INTERACT_BLOCKING switch(response) if("Copy") tool.set_buffer(mod_link) balloon_alert(user, "frequency copied") + . = ITEM_INTERACT_SUCCESS if("Imprint") mod_link.frequency = tool_frequency balloon_alert(user, "frequency set") + . = ITEM_INTERACT_SUCCESS /obj/item/clothing/neck/link_scryer/worn_overlays(mutable_appearance/standing, isinhands) . = ..() diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index d6465960beb28..c6d0869c6e987 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -5,7 +5,7 @@ /// The MOD core we apply to the suit. var/applied_core = /obj/item/mod/core/standard /// The cell we apply to the core. Only applies to standard core suits. - var/applied_cell = /obj/item/stock_parts/power_store/cell/high + var/applied_cell = /obj/item/stock_parts/power_store/cell/super /// List of modules we spawn with. var/list/applied_modules = list() /// Modules that we pin when the suit is installed for the first time, for convenience, can be applied or theme inbuilt modules. @@ -165,9 +165,9 @@ /obj/item/mod/module/storage, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, + /obj/item/mod/module/jetpack, /obj/item/mod/module/pepper_shoulders, /obj/item/mod/module/criminalcapture, - /obj/item/mod/module/dispenser/mirage, /obj/item/mod/module/quick_cuff, /obj/item/mod/module/headprotector, ) @@ -197,13 +197,13 @@ /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/hat_stabilizer, /obj/item/mod/module/magnetic_harness, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/pathfinder, /obj/item/mod/module/quick_cuff, /obj/item/mod/module/headprotector, ) default_pins = list( - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, ) /obj/item/mod/control/pre_equipped/cosmohonk @@ -245,7 +245,7 @@ /obj/item/mod/module/shock_absorber, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, @@ -254,7 +254,7 @@ ) default_pins = list( /obj/item/mod/module/armor_booster, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet, ) @@ -268,7 +268,7 @@ /obj/item/mod/module/shock_absorber, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, /obj/item/mod/module/hat_stabilizer/syndicate, @@ -276,14 +276,14 @@ ) default_pins = list( /obj/item/mod/module/armor_booster, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet, ) /obj/item/mod/control/pre_equipped/nuclear/no_jetpack /obj/item/mod/control/pre_equipped/nuclear/no_jetpack/Initialize(mapload, new_theme, new_skin, new_core) - applied_modules -= list(/obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/jump_jet) + applied_modules -= list(/obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet) return ..() /obj/item/mod/control/pre_equipped/nuclear/plasmaman @@ -305,7 +305,7 @@ /obj/item/mod/module/shock_absorber, /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, /obj/item/mod/module/hat_stabilizer/syndicate, @@ -313,7 +313,7 @@ ) default_pins = list( /obj/item/mod/module/armor_booster, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet, ) @@ -324,7 +324,7 @@ /obj/item/mod/module/emp_shield, /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/thermal_regulator, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, /obj/item/mod/module/hat_stabilizer/syndicate, @@ -333,7 +333,7 @@ ) default_pins = list( /obj/item/mod/module/armor_booster, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet, /obj/item/mod/module/flamethrower, ) @@ -357,7 +357,7 @@ starting_frequency = MODLINK_FREQ_SYNDICATE applied_cell = /obj/item/stock_parts/power_store/cell/super applied_modules = list( - /obj/item/mod/module/organ_thrower, + /obj/item/mod/module/organizer, /obj/item/mod/module/defibrillator/combat, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, @@ -426,13 +426,13 @@ applied_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/magnetic_harness, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet, /obj/item/mod/module/flashlight, ) default_pins = list( /obj/item/mod/module/armor_booster, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/jump_jet, ) @@ -623,7 +623,7 @@ /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/magboot/advanced, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/anomaly_locked/kinesis/admin, /obj/item/mod/module/shove_blocker, /obj/item/mod/module/quick_cuff, @@ -631,7 +631,7 @@ default_pins = list( /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/magboot/advanced, - /obj/item/mod/module/jetpack/advanced, + /obj/item/mod/module/jetpack, /obj/item/mod/module/anomaly_locked/kinesis/admin, ) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index fc21937eef049..40e1889efd968 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -120,7 +120,7 @@ hitsound = 'sound/weapons/batonextend.ogg' hitsound_wall = 'sound/weapons/batonextend.ogg' suppressed = SUPPRESSED_VERY - hit_threshhold = LATTICE_LAYER + hit_threshhold = ABOVE_NORMAL_TURF_LAYER /// Reference to the beam following the projectile. var/line diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 3ef6b9558712a..815cfb0a144bc 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -108,8 +108,6 @@ overlay_state_inactive = "module_jetpack" overlay_state_active = "module_jetpack_on" required_slots = list(ITEM_SLOT_BACK) - /// Do we give the wearer a speed buff. - var/full_speed = FALSE /// Do we have stabilizers? If yes the user won't move from inertia. var/stabilize = TRUE /// Callback to see if we can thrust the user. @@ -143,14 +141,6 @@ /datum/effect_system/trail_follow/ion/grav_allowed \ ) -/obj/item/mod/module/jetpack/on_activation() - if(full_speed) - mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) - -/obj/item/mod/module/jetpack/on_deactivation(display_message = TRUE, deleting = FALSE) - if(full_speed) - mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) - /obj/item/mod/module/jetpack/get_configuration() . = ..() .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilize) @@ -167,15 +157,6 @@ return FALSE return TRUE -/obj/item/mod/module/jetpack/advanced - name = "MOD advanced ion jetpack module" - desc = "An improvement on the previous model of electric thrusters. This one achieves higher speeds through \ - mounting of more jets and application of red paint." - icon_state = "jetpack_advanced" - overlay_state_inactive = "module_jetpackadv" - overlay_state_active = "module_jetpackadv_on" - full_speed = TRUE - /// Cooldown to use if we didn't actually launch a jump jet #define FAILED_ACTIVATION_COOLDOWN 3 SECONDS diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index 3cf1d34a63a83..a0d58d721f3d4 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -119,19 +119,19 @@ volume = 30 inject_flags = INJECT_CHECK_PENETRATE_THICK -///Organ Thrower - Lets you shoot organs, immediately replacing them if the target has the organ manipulation surgery. -/obj/item/mod/module/organ_thrower - name = "MOD organ thrower module" +///Organizer - Lets you shoot organs, immediately replacing them if the target has the organ manipulation surgery. +/obj/item/mod/module/organizer + name = "MOD organizer module" desc = "A device recovered from a crashed Interdyne Pharmaceuticals vessel, \ this module has been unearthed for better or for worse. \ - It's an arm-mounted device utilizing technology similar to modern-day part replacers, \ - capable of storing and inserting organs into open patients. \ + It's an arm-mounted device utilizing technology similar to modern rapid part exchange devices, \ + capable of instantly replacing up to 5 organs at once in surgery without the need to remove them first, even from range. \ It's recommended by the DeForest Medical Corporation to not inform patients it has been used." - icon_state = "organ_thrower" + icon_state = "organizer" module_type = MODULE_ACTIVE complexity = 2 use_energy_cost = DEFAULT_CHARGE_DRAIN - incompatible_modules = list(/obj/item/mod/module/organ_thrower, /obj/item/mod/module/microwave_beam) + incompatible_modules = list(/obj/item/mod/module/organizer, /obj/item/mod/module/microwave_beam) cooldown_time = 0.5 SECONDS required_slots = list(ITEM_SLOT_GLOVES) /// How many organs the module can hold. @@ -139,7 +139,7 @@ /// A list of all our organs. var/organ_list = list() -/obj/item/mod/module/organ_thrower/on_select_use(atom/target) +/obj/item/mod/module/organizer/on_select_use(atom/target) . = ..() if(!.) return diff --git a/code/modules/mod/modules/modules_ninja.dm b/code/modules/mod/modules/modules_ninja.dm index a868eb6205659..0e0de691e030b 100644 --- a/code/modules/mod/modules/modules_ninja.dm +++ b/code/modules/mod/modules/modules_ninja.dm @@ -418,11 +418,7 @@ if(IS_SPACE_NINJA(mod.wearer)) mod.wearer.say(pick_list_replacements(NINJA_FILE, "lines"), forced = type) to_chat(mod.wearer, span_notice("You have used the adrenaline boost.")) - mod.wearer.SetUnconscious(0) - mod.wearer.SetStun(0) - mod.wearer.SetKnockdown(0) - mod.wearer.SetImmobilized(0) - mod.wearer.SetParalyzed(0) + mod.wearer.SetAllImmobility(0) mod.wearer.adjustStaminaLoss(-200) mod.wearer.remove_status_effect(/datum/status_effect/speech/stutter) mod.wearer.reagents.add_reagent(/datum/reagent/medicine/stimulants, 5) @@ -430,24 +426,18 @@ addtimer(CALLBACK(src, PROC_REF(boost_aftereffects), mod.wearer), 7 SECONDS) /obj/item/mod/module/adrenaline_boost/on_install() - RegisterSignal(mod, COMSIG_ATOM_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(mod, COMSIG_ATOM_ITEM_INTERACTION, PROC_REF(try_boost)) /obj/item/mod/module/adrenaline_boost/on_uninstall(deleting = FALSE) - UnregisterSignal(mod, COMSIG_ATOM_ATTACKBY) + UnregisterSignal(mod, COMSIG_ATOM_ITEM_INTERACTION) -/obj/item/mod/module/adrenaline_boost/attackby(obj/item/attacking_item, mob/user, params) - if(charge_boost(attacking_item, user)) - return TRUE - return ..() - -/obj/item/mod/module/adrenaline_boost/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user) +/obj/item/mod/module/adrenaline_boost/proc/try_boost(source, mob/user, obj/item/attacking_item) SIGNAL_HANDLER - - if(charge_boost(attacking_item, user)) + if(charge_boost(attacking_item)) return COMPONENT_NO_AFTERATTACK return NONE -/obj/item/mod/module/adrenaline_boost/proc/charge_boost(obj/item/attacking_item, mob/user) +/obj/item/mod/module/adrenaline_boost/proc/charge_boost(obj/item/attacking_item) if(!attacking_item.is_open_container()) return FALSE if(reagents.has_reagent(reagent_required, reagent_required_amount)) diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 2a317becf18e6..19150b8a4cd67 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -308,6 +308,8 @@ var/field_radius = 2 /// Damage multiplier on projectiles. var/damage_multiplier = 0.75 + /// Debuff multiplier on projectiles. + var/debuff_multiplier = 0.66 /// Speed multiplier on projectiles, higher means slower. var/speed_multiplier = 2.5 /// List of all tracked projectiles. @@ -338,6 +340,9 @@ SIGNAL_HANDLER projectile.damage *= damage_multiplier + projectile.stamina *= damage_multiplier + projectile.stun *= debuff_multiplier + projectile.knockdown *= debuff_multiplier projectile.speed *= speed_multiplier projectile.add_overlay(projectile_effect) @@ -346,6 +351,9 @@ projectile.damage /= damage_multiplier projectile.speed /= speed_multiplier + projectile.stamina /= damage_multiplier + projectile.stun /= debuff_multiplier + projectile.knockdown /= debuff_multiplier projectile.cut_overlay(projectile_effect) ///Active Sonar - Displays a hud circle on the turf of any living creatures in the given radius diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 044137f0f2d07..4d2650585b1c0 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -35,7 +35,7 @@ module_type = MODULE_ACTIVE complexity = 1 use_energy_cost = DEFAULT_CHARGE_DRAIN * 5 - incompatible_modules = list(/obj/item/mod/module/microwave_beam, /obj/item/mod/module/organ_thrower) + incompatible_modules = list(/obj/item/mod/module/microwave_beam, /obj/item/mod/module/organizer) cooldown_time = 10 SECONDS required_slots = list(ITEM_SLOT_GLOVES) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index c86cb182c6b84..0e2bffd0aa6a7 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -559,7 +559,7 @@ light_range = 1 light_power = 1 light_color = COLOR_LIGHT_ORANGE - embedding = null + embed_type = null /obj/projectile/bullet/mining_bomb/Initialize(mapload) . = ..() diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm index 2fb7863445de2..f1fced454e4d3 100644 --- a/code/modules/modular_computers/computers/item/pda.dm +++ b/code/modules/modular_computers/computers/item/pda.dm @@ -149,14 +149,14 @@ if(tool.w_class >= WEIGHT_CLASS_SMALL) // Anything equal to or larger than small won't work user.balloon_alert(user, "too big!") return ITEM_INTERACT_BLOCKING - if(inserted_item) - balloon_alert(user, "no room!") - return ITEM_INTERACT_BLOCKING if(!user.transferItemToLoc(tool, src)) return ITEM_INTERACT_BLOCKING - balloon_alert(user, "inserted [tool]") - inserted_item = tool - playsound(src, 'sound/machines/pda_button1.ogg', 50, TRUE) + if(inserted_item) + swap_pen(user, tool) + else + balloon_alert(user, "inserted [tool]") + inserted_item = tool + playsound(src, 'sound/machines/pda_button1.ogg', 50, TRUE) return ITEM_INTERACT_SUCCESS @@ -185,6 +185,14 @@ update_appearance() playsound(src, 'sound/machines/pda_button2.ogg', 50, TRUE) +/obj/item/modular_computer/pda/proc/swap_pen(mob/user, obj/item/tool) + if(inserted_item) + balloon_alert(user, "swapped pens") + user.put_in_hands(inserted_item) + inserted_item = tool + update_appearance() + playsound(src, 'sound/machines/pda_button1.ogg', 50, TRUE) + /obj/item/modular_computer/pda/proc/explode(mob/target, mob/bomber, from_message_menu = FALSE) var/turf/current_turf = get_turf(src) diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index ad87960603c35..94ff9439e3b11 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -33,6 +33,17 @@ /datum/computer_file/program/scipaper_program, ) +/obj/machinery/modular_computer/preset/research/away + name = "old research console" + desc = "An old computer used for writing research papers." + starting_programs = list( + /datum/computer_file/program/scipaper_program, + ) + +/obj/machinery/modular_computer/preset/research/away/Initialize(mapload) + . = ..() + cpu.device_theme = PDA_THEME_RETRO + // ===== COMMAND CONSOLE ===== /obj/machinery/modular_computer/preset/command name = "command console" diff --git a/code/modules/movespeed/modifiers/items.dm b/code/modules/movespeed/modifiers/items.dm index 6bdf2f31760d5..601ecc2289261 100644 --- a/code/modules/movespeed/modifiers/items.dm +++ b/code/modules/movespeed/modifiers/items.dm @@ -5,9 +5,6 @@ /datum/movespeed_modifier/jetpack/cybernetic multiplicative_slowdown = -0.5 -/datum/movespeed_modifier/jetpack/fullspeed - multiplicative_slowdown = -0.5 - /datum/movespeed_modifier/die_of_fate multiplicative_slowdown = 1 diff --git a/code/modules/pai/pai.dm b/code/modules/pai/pai.dm index acde3c51a5c50..4268c040e2bcd 100644 --- a/code/modules/pai/pai.dm +++ b/code/modules/pai/pai.dm @@ -164,7 +164,6 @@ QDEL_NULL(signaler) QDEL_NULL(leash) card = null - GLOB.pai_list.Remove(src) return ..() // Need to override parent here because the message we dispatch is turf-based, not based on the location of the object because that could be fuckin anywhere @@ -221,7 +220,6 @@ if(istype(loc, /obj/item/modular_computer)) give_messenger_ability() START_PROCESSING(SSfastprocess, src) - GLOB.pai_list += src make_laws() for(var/law in laws.inherent) lawcheck += law diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 36949b65c7cdd..d37d97c167792 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -29,7 +29,7 @@ var/degrees = 0 var/font = PEN_FONT var/requires_gravity = TRUE // can you use this to write in zero-g - embedding = list(embed_chance = 50) + embed_type = /datum/embed_data/pen sharpness = SHARP_POINTY var/dart_insert_icon = 'icons/obj/weapons/guns/toy.dmi' var/dart_insert_casing_icon_state = "overlay_pen" @@ -37,6 +37,9 @@ /// If this pen can be clicked in order to retract it var/can_click = TRUE +/datum/embed_data/pen + embed_chance = 50 + /obj/item/pen/Initialize(mapload) . = ..() AddComponent(/datum/component/dart_insert, \ @@ -73,7 +76,7 @@ if(user) balloon_alert(user, "clicked") - playsound(src, 'sound/machines/click.ogg', 30, TRUE, -3) + playsound(src, 'sound/items/pen_click.ogg', 30, TRUE, -3) icon_state = initial(icon_state) + (active ? "_retracted" : "") update_appearance(UPDATE_ICON) @@ -86,7 +89,7 @@ return list( "damage" = max(5, throwforce), "speed" = max(0, throw_speed - 3), - "embedding" = embedding, + "embedding" = get_embed(), "armour_penetration" = armour_penetration, "wound_bonus" = wound_bonus, "bare_wound_bonus" = bare_wound_bonus, @@ -191,7 +194,7 @@ "Black and Silver" = "pen-fountain-b", "Command Blue" = "pen-fountain-cb" ) - embedding = list("embed_chance" = 75) + embed_type = /datum/embed_data/pen/captain dart_insert_casing_icon_state = "overlay_fountainpen_gold" dart_insert_projectile_icon_state = "overlay_fountainpen_gold_proj" var/list/overlay_reskin = list( @@ -202,6 +205,9 @@ "Command Blue" = "overlay_fountainpen_gold" ) +/datum/embed_data/pen/captain + embed_chance = 50 + /obj/item/pen/fountain/captain/Initialize(mapload) . = ..() AddComponent(/datum/component/butchering, \ @@ -414,7 +420,7 @@ inhand_icon_state = hidden_icon lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - embedding = list(embed_chance = 100) // Rule of cool + set_embed(/datum/embed_data/edagger_active) else name = initial(name) desc = initial(desc) @@ -422,15 +428,17 @@ inhand_icon_state = initial(inhand_icon_state) lefthand_file = initial(lefthand_file) righthand_file = initial(righthand_file) - embedding = list(embed_chance = EMBED_CHANCE) + set_embed(embed_type) - updateEmbedding() if(user) balloon_alert(user, "[hidden_name] [active ? "active" : "concealed"]") playsound(src, active ? 'sound/weapons/saberon.ogg' : 'sound/weapons/saberoff.ogg', 5, TRUE) set_light_on(active) return COMPONENT_NO_DEFAULT_MESSAGE +/datum/embed_data/edagger_active + embed_chance = 100 + /obj/item/pen/edagger/proc/on_scan(datum/source, mob/user, list/extra_data) SIGNAL_HANDLER LAZYADD(extra_data[DETSCAN_CATEGORY_ILLEGAL], "Hard-light generator detected.") diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm index 5c849f4a530cd..b4e97615a923a 100644 --- a/code/modules/paperwork/ticketmachine.dm +++ b/code/modules/paperwork/ticketmachine.dm @@ -49,13 +49,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32) . += span_notice("The ticket machine shows that ticket #[current_number] is currently being served.") . += span_notice("You can take a ticket out with Left-Click to be number [ticket_number + 1] in queue.") -/obj/machinery/ticket_machine/multitool_act(mob/living/user, obj/item/I) - if(!multitool_check_buffer(user, I)) //make sure it has a data buffer - return - var/obj/item/multitool/M = I +/obj/machinery/ticket_machine/multitool_act(mob/living/user, obj/item/multitool/M) M.set_buffer(src) balloon_alert(user, "saved to multitool buffer") - return TRUE + return ITEM_INTERACT_SUCCESS /obj/machinery/ticket_machine/emag_act(mob/user, obj/item/card/emag/emag_card) //Emag the ticket machine to dispense burning tickets, as well as randomize its number to destroy the HoP's mind. if(obj_flags & EMAGGED) diff --git a/code/modules/photography/camera/camera_image_capturing.dm b/code/modules/photography/camera/camera_image_capturing.dm index d928164ff014d..64eeb192a2286 100644 --- a/code/modules/photography/camera/camera_image_capturing.dm +++ b/code/modules/photography/camera/camera_image_capturing.dm @@ -10,11 +10,18 @@ step_y = AM.step_y . = ..() +#define PHYSICAL_POSITION(atom) ((atom.y * world.icon_size) + (atom.pixel_y)) + /obj/item/camera/proc/camera_get_icon(list/turfs, turf/center, psize_x = 96, psize_y = 96, datum/turf_reservation/clone_area, size_x, size_y, total_x, total_y) var/list/atoms = list() + var/list/lighting = list() var/skip_normal = FALSE var/wipe_atoms = FALSE + var/mutable_appearance/backdrop = mutable_appearance('icons/hud/screen_gen.dmi', "flash") + backdrop.blend_mode = BLEND_OVERLAY + backdrop.color = "#292319" + if(istype(clone_area) && total_x == clone_area.width && total_y == clone_area.height && size_x >= 0 && size_y > 0) var/turf/bottom_left = clone_area.bottom_left_turfs[1] var/cloned_center_x = round(bottom_left.x + ((total_x - 1) / 2)) @@ -29,6 +36,12 @@ atoms += new /obj/effect/appearance_clone(newT, T) if(T.loc.icon_state) atoms += new /obj/effect/appearance_clone(newT, T.loc) + if(T.lighting_object) + var/obj/effect/appearance_clone/lighting_overlay = new(newT) + lighting_overlay.appearance = T.lighting_object.current_underlay + lighting_overlay.underlays += backdrop + lighting_overlay.blend_mode = BLEND_MULTIPLY + lighting += lighting_overlay for(var/i in T.contents) var/atom/A = i if(!A.invisibility || (see_ghosts && isobserver(A))) @@ -41,6 +54,12 @@ for(var/i in turfs) var/turf/T = i atoms += T + if(T.lighting_object) + var/obj/effect/appearance_clone/lighting_overlay = new(T) + lighting_overlay.appearance = T.lighting_object.current_underlay + lighting_overlay.underlays += backdrop + lighting_overlay.blend_mode = BLEND_MULTIPLY + lighting += lighting_overlay for(var/atom/movable/A in T) if(A.invisibility) if(!(see_ghosts && isobserver(A))) @@ -50,6 +69,7 @@ var/icon/res = icon('icons/blanks/96x96.dmi', "nothing") res.Scale(psize_x, psize_y) + atoms += lighting var/list/sorted = list() var/j @@ -57,7 +77,19 @@ var/atom/c = atoms[i] for(j = sorted.len, j > 0, --j) var/atom/c2 = sorted[j] - if((c2.plane <= c.plane) && (c2.layer <= c.layer)) + if(c2.plane > c.plane) + continue + if(c2.plane < c.plane) + break + var/c_position = PHYSICAL_POSITION(c) + var/c2_position = PHYSICAL_POSITION(c2) + // If you are above me, I layer above you + if(c2_position - 32 >= c_position) + break + // If I am above you you will always layer above me + if(c2_position <= c_position - 32) + continue + if(c2.layer < c.layer) break sorted.Insert(j+1, c) CHECK_TICK @@ -80,32 +112,34 @@ for(var/X in sorted) //these are clones var/obj/effect/appearance_clone/clone = X var/icon/img = getFlatIcon(clone, no_anim = TRUE) - if(img) - // Center of the image in X - var/xo = (clone.x - center.x) * world.icon_size + clone.pixel_x + xcomp + clone.step_x - // Center of the image in Y - var/yo = (clone.y - center.y) * world.icon_size + clone.pixel_y + ycomp + clone.step_y - - if(clone.transform) // getFlatIcon doesn't give a snot about transforms. - var/datum/decompose_matrix/decompose = clone.transform.decompose() - // Scale in X, Y - if(decompose.scale_x != 1 || decompose.scale_y != 1) - var/base_w = img.Width() - var/base_h = img.Height() - // scale_x can be negative - img.Scale(base_w * abs(decompose.scale_x), base_h * decompose.scale_y) - if(decompose.scale_x < 0) - img.Flip(EAST) - xo -= base_w * (decompose.scale_x - SIGN(decompose.scale_x)) / 2 * SIGN(decompose.scale_x) - yo -= base_h * (decompose.scale_y - 1) / 2 - // Rotation - if(decompose.rotation != 0) - img.Turn(decompose.rotation) - // Shift - xo += decompose.shift_x - yo += decompose.shift_y - - res.Blend(img, blendMode2iconMode(clone.blend_mode), xo, yo) + if(!img) + CHECK_TICK + continue + // Center of the image in X + var/xo = (clone.x - center.x) * world.icon_size + clone.pixel_x + xcomp + clone.step_x + // Center of the image in Y + var/yo = (clone.y - center.y) * world.icon_size + clone.pixel_y + ycomp + clone.step_y + + if(clone.transform) // getFlatIcon doesn't give a snot about transforms. + var/datum/decompose_matrix/decompose = clone.transform.decompose() + // Scale in X, Y + if(decompose.scale_x != 1 || decompose.scale_y != 1) + var/base_w = img.Width() + var/base_h = img.Height() + // scale_x can be negative + img.Scale(base_w * abs(decompose.scale_x), base_h * decompose.scale_y) + if(decompose.scale_x < 0) + img.Flip(EAST) + xo -= base_w * (decompose.scale_x - SIGN(decompose.scale_x)) / 2 * SIGN(decompose.scale_x) + yo -= base_h * (decompose.scale_y - 1) / 2 + // Rotation + if(decompose.rotation != 0) + img.Turn(decompose.rotation) + // Shift + xo += decompose.shift_x + yo += decompose.shift_y + + res.Blend(img, blendMode2iconMode(clone.blend_mode), xo, yo) CHECK_TICK if(!silent) @@ -116,5 +150,9 @@ if(wipe_atoms) QDEL_LIST(atoms) + else + QDEL_LIST(lighting) return res + +#undef PHYSICAL_POSITION diff --git a/code/modules/plumbing/plumbers/_plumb_machinery.dm b/code/modules/plumbing/plumbers/_plumb_machinery.dm index 2e8eaee9d6dec..c8564b15f1215 100644 --- a/code/modules/plumbing/plumbers/_plumb_machinery.dm +++ b/code/modules/plumbing/plumbers/_plumb_machinery.dm @@ -12,6 +12,7 @@ active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 2.75 resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF interaction_flags_machine = parent_type::interaction_flags_machine | INTERACT_MACHINE_OFFLINE + reagents = /datum/reagents/plumbing ///Plumbing machinery is always gonna need reagents, so we might aswell put it here var/buffer = 50 @@ -25,6 +26,12 @@ AddComponent(/datum/component/simple_rotation) register_context() +/obj/machinery/plumbing/create_reagents(max_vol, flags) + if(!ispath(reagents)) + qdel(reagents) + reagents = new reagents(max_vol, flags) + reagents.my_atom = src + /obj/machinery/plumbing/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = NONE if(isnull(held_item)) @@ -96,58 +103,114 @@ reagents.expose(get_turf(src), TOUCH) //splash on the floor reagents.clear_reagents() -///We can empty beakers in here and everything -/obj/machinery/plumbing/input - name = "input gate" - desc = "Can be manually filled with reagents from containers." - icon_state = "pipe_input" - pass_flags_self = PASSMACHINE | LETPASSTHROW // Small - reagent_flags = TRANSPARENT | REFILLABLE - - -/obj/machinery/plumbing/input/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_supply, bolt, layer) - -///We can fill beakers in here and everything. we dont inheret from input because it has nothing that we need -/obj/machinery/plumbing/output - name = "output gate" - desc = "A manual output for plumbing systems, for taking reagents directly into containers." - icon_state = "pipe_output" - pass_flags_self = PASSMACHINE | LETPASSTHROW // Small - reagent_flags = TRANSPARENT | DRAINABLE - -/obj/machinery/plumbing/output/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) - -/obj/machinery/plumbing/output/tap - name = "drinking tap" - desc = "A manual output for plumbing systems, for taking drinks directly into glasses." - icon_state = "tap_output" - -/obj/machinery/plumbing/tank - name = "chemical tank" - desc = "A massive chemical holding tank." - icon_state = "tank" - buffer = 400 - -/obj/machinery/plumbing/tank/Initialize(mapload, bolt, layer) - . = ..() - AddComponent(/datum/component/plumbing/tank, bolt, layer) - -///Layer manifold machine that connects a bunch of layers -/obj/machinery/plumbing/layer_manifold - name = "layer manifold" - desc = "A plumbing manifold for layers." - icon_state = "manifold" - density = FALSE - -/obj/machinery/plumbing/layer_manifold/Initialize(mapload, bolt, layer) - . = ..() - - AddComponent(/datum/component/plumbing/manifold, bolt, FIRST_DUCT_LAYER) - AddComponent(/datum/component/plumbing/manifold, bolt, SECOND_DUCT_LAYER) - AddComponent(/datum/component/plumbing/manifold, bolt, THIRD_DUCT_LAYER) - AddComponent(/datum/component/plumbing/manifold, bolt, FOURTH_DUCT_LAYER) - AddComponent(/datum/component/plumbing/manifold, bolt, FIFTH_DUCT_LAYER) +/** + * Specialized reagent container for plumbing. Uses the round robin approach of transferring reagents + * so transfer 5 from 15 water, 15 sugar and 15 plasma becomes 10, 15, 15 instead of 13.3333, 13.3333 13.3333. Good if you hate floating point errors + */ +/datum/reagents/plumbing + +/** + * Same as the parent trans_to except only a few arguments have impact here & the rest of the arguments are discarded. + * Arguments + * + * * atom/target - the target we are transfering to + * * amount - amount to transfer + * * datum/reagent/target_id - the reagent id we want to transfer. if null everything gets transfered + * * methods - this is key for deciding between round-robin or proportional transfer. It does not mean the same as the + * parent proc. LINEAR for round robin(in this technique reagents are missing/lost/not preserved when there isn't enough space to hold them) + * NONE means everything is transfered regardless of how much space is available in the receiver in proportions + */ +/datum/reagents/plumbing/trans_to( + atom/target, + amount = 1, + multiplier = 1, //unused for plumbing + datum/reagent/target_id, + preserve_data = TRUE, //unused for plumbing + no_react = FALSE, //unused for plumbing we always want reactions + mob/transferred_by, //unused for plumbing logging is not important inside plumbing machines + remove_blacklisted = FALSE, //unused for plumbing, we don't care what reagents are inside us + methods = LINEAR, //default round robin technique for transferring reagents + show_message = TRUE, //unused for plumbing, used for logging only + ignore_stomach = FALSE //unused for plumbing, reagents flow only between machines & is not injected to mobs at any point in time +) + if(QDELETED(target) || !total_volume) + return FALSE + + if(!IS_FINITE(amount)) + stack_trace("non finite amount passed to trans_to [amount] amount of reagents") + return FALSE + + if(!isnull(target_id) && !ispath(target_id)) + stack_trace("invalid target reagent id [target_id] passed to trans_to") + return FALSE + + var/datum/reagents/target_holder + if(istype(target, /datum/reagents)) + target_holder = target + else + target_holder = target.reagents + + // Prevents small amount problems, as well as zero and below zero amounts. + amount = round(min(amount, total_volume, target_holder.maximum_volume - target_holder.total_volume), CHEMICAL_QUANTISATION_LEVEL) + if(amount <= 0) + return FALSE + + //Set up new reagents to inherit the old ongoing reactions + transfer_reactions(target_holder) + + var/list/cached_reagents = reagent_list + var/list/reagents_to_remove = list() + var/transfer_amount + var/transfered_amount + var/total_transfered_amount = 0 + + var/round_robin = methods & LINEAR + var/part + var/to_transfer + if(round_robin) + to_transfer = amount + else + part = amount / total_volume + + //first add reagents to target + for(var/datum/reagent/reagent as anything in cached_reagents) + if(round_robin && !to_transfer) + break + + if(!isnull(target_id)) + if(reagent.type == target_id) + force_stop_reagent_reacting(reagent) + transfer_amount = min(amount, reagent.volume) + else + continue + else + if(round_robin) + transfer_amount = min(to_transfer, reagent.volume) + else + transfer_amount = reagent.volume * part + + if(reagent.intercept_reagents_transfer(target_holder, amount)) + continue + + transfered_amount = target_holder.add_reagent(reagent.type, transfer_amount, copy_data(reagent), chem_temp, reagent.purity, reagent.ph, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) //we only handle reaction after every reagent has been transferred. + if(!transfered_amount) + continue + reagents_to_remove += list(list("R" = reagent, "T" = transfer_amount)) + total_transfered_amount += transfered_amount + if(round_robin) + to_transfer -= transfered_amount + + if(!isnull(target_id)) + break + + //remove chemicals that were added above + for(var/list/data as anything in reagents_to_remove) + var/datum/reagent/reagent = data["R"] + transfer_amount = data["T"] + remove_reagent(reagent.type, transfer_amount) + + //handle reactions + target_holder.handle_reactions() + src.handle_reactions() + + return round(total_transfered_amount, CHEMICAL_VOLUME_ROUNDING) diff --git a/code/modules/plumbing/plumbers/bottler.dm b/code/modules/plumbing/plumbers/bottler.dm index 5f63a3070bd2a..b3421e9ffc362 100644 --- a/code/modules/plumbing/plumbers/bottler.dm +++ b/code/modules/plumbing/plumbers/bottler.dm @@ -2,6 +2,7 @@ name = "chemical bottler" desc = "Puts reagents into containers, like bottles and beakers in the tile facing the green light spot, they will exit on the red light spot if successfully filled." icon_state = "bottler" + reagents = /datum/reagents layer = ABOVE_ALL_MOB_LAYER plane = ABOVE_GAME_PLANE reagent_flags = TRANSPARENT | DRAINABLE diff --git a/code/modules/plumbing/plumbers/iv_drip.dm b/code/modules/plumbing/plumbers/iv_drip.dm index 6e2585553849c..45c2ebca27acb 100644 --- a/code/modules/plumbing/plumbers/iv_drip.dm +++ b/code/modules/plumbing/plumbers/iv_drip.dm @@ -10,7 +10,7 @@ /obj/machinery/iv_drip/plumbing/Initialize(mapload, bolt, layer) . = ..() - AddComponent(/datum/component/plumbing/iv_drip, bolt, layer) + AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) AddComponent(/datum/component/simple_rotation) /obj/machinery/iv_drip/plumbing/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) diff --git a/code/modules/plumbing/plumbers/simple_machines.dm b/code/modules/plumbing/plumbers/simple_machines.dm new file mode 100644 index 0000000000000..c2ef308297324 --- /dev/null +++ b/code/modules/plumbing/plumbers/simple_machines.dm @@ -0,0 +1,57 @@ +///We can empty beakers in here and everything +/obj/machinery/plumbing/input + name = "input gate" + desc = "Can be manually filled with reagents from containers." + icon_state = "pipe_input" + pass_flags_self = PASSMACHINE | LETPASSTHROW // Small + reagent_flags = TRANSPARENT | REFILLABLE + +/obj/machinery/plumbing/input/Initialize(mapload, bolt, layer) + . = ..() + AddComponent(/datum/component/plumbing/simple_supply, bolt, layer) + +///We can fill beakers in here and everything. we dont inheret from input because it has nothing that we need +/obj/machinery/plumbing/output + name = "output gate" + desc = "A manual output for plumbing systems, for taking reagents directly into containers." + icon_state = "pipe_output" + pass_flags_self = PASSMACHINE | LETPASSTHROW // Small + reagent_flags = TRANSPARENT | DRAINABLE + reagents = /datum/reagents + +/obj/machinery/plumbing/output/Initialize(mapload, bolt, layer) + . = ..() + AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) + +///For pouring reagents from ducts directly into cups +/obj/machinery/plumbing/output/tap + name = "drinking tap" + desc = "A manual output for plumbing systems, for taking drinks directly into glasses." + icon_state = "tap_output" + +///For storing large volume of reagents +/obj/machinery/plumbing/tank + name = "chemical tank" + desc = "A massive chemical holding tank." + icon_state = "tank" + buffer = 400 + +/obj/machinery/plumbing/tank/Initialize(mapload, bolt, layer) + . = ..() + AddComponent(/datum/component/plumbing/tank, bolt, layer) + +///Layer manifold machine that connects a bunch of layers +/obj/machinery/plumbing/layer_manifold + name = "layer manifold" + desc = "A plumbing manifold for layers." + icon_state = "manifold" + density = FALSE + +/obj/machinery/plumbing/layer_manifold/Initialize(mapload, bolt, layer) + . = ..() + + AddComponent(/datum/component/plumbing/manifold, bolt, FIRST_DUCT_LAYER) + AddComponent(/datum/component/plumbing/manifold, bolt, SECOND_DUCT_LAYER) + AddComponent(/datum/component/plumbing/manifold, bolt, THIRD_DUCT_LAYER) + AddComponent(/datum/component/plumbing/manifold, bolt, FOURTH_DUCT_LAYER) + AddComponent(/datum/component/plumbing/manifold, bolt, FIFTH_DUCT_LAYER) diff --git a/code/modules/plumbing/plumbers/teleporter.dm b/code/modules/plumbing/plumbers/teleporter.dm index df79220d15a8c..46c46d594f6f6 100644 --- a/code/modules/plumbing/plumbers/teleporter.dm +++ b/code/modules/plumbing/plumbers/teleporter.dm @@ -12,15 +12,10 @@ . = ..() AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) -/obj/machinery/plumbing/sender/multitool_act(mob/living/user, obj/item/I) - if(!multitool_check_buffer(user, I)) - return - - var/obj/item/multitool/M = I - +/obj/machinery/plumbing/sender/multitool_act(mob/living/user, obj/item/multitool/M) if(!istype(M.buffer, /obj/machinery/plumbing/receiver)) to_chat(user, span_warning("Invalid buffer.")) - return + return ITEM_INTERACT_BLOCKING if(target) lose_teleport_target() @@ -28,7 +23,7 @@ set_teleport_target(M.buffer) to_chat(user, span_green("You succesfully link [src] to the [M.buffer].")) - return TRUE + return ITEM_INTERACT_SUCCESS ///Lose our previous target and make our previous target lose us. Seperate proc because I feel like I'll need this again /obj/machinery/plumbing/sender/proc/lose_teleport_target() @@ -67,14 +62,10 @@ . = ..() AddComponent(/datum/component/plumbing/simple_supply, bolt) -/obj/machinery/plumbing/receiver/multitool_act(mob/living/user, obj/item/I) - if(!multitool_check_buffer(user, I)) - return - - var/obj/item/multitool/M = I +/obj/machinery/plumbing/receiver/multitool_act(mob/living/user, obj/item/multitool/M) M.set_buffer(src) balloon_alert(user, "saved to multitool buffer") - return TRUE + return ITEM_INTERACT_SUCCESS /obj/machinery/plumbing/receiver/process(seconds_per_tick) if(!is_operational || panel_open) diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm index 3781944ad0099..013140e399099 100644 --- a/code/modules/power/lighting/light.dm +++ b/code/modules/power/lighting/light.dm @@ -722,7 +722,7 @@ icon_state = "floor" brightness = 4 light_angle = 360 - layer = LOW_OBJ_LAYER + layer = ABOVE_OPEN_TURF_LAYER plane = FLOOR_PLANE light_type = /obj/item/light/bulb fitting = "bulb" @@ -739,4 +739,6 @@ /obj/machinery/light/floor/transport name = "transport light" break_if_moved = FALSE + // has to render above tram things (trams are stupid) layer = BELOW_OPEN_DOOR_LAYER + plane = GAME_PLANE diff --git a/code/modules/power/pipecleaners.dm b/code/modules/power/pipecleaners.dm index 7f1ef8fc2e3a8..4514c89b862e2 100644 --- a/code/modules/power/pipecleaners.dm +++ b/code/modules/power/pipecleaners.dm @@ -29,6 +29,7 @@ By design, d1 is the smallest direction and d2 is the highest icon = 'icons/obj/pipes_n_cables/pipe_cleaner.dmi' icon_state = "0-1" layer = WIRE_LAYER //Above hidden pipes, GAS_PIPE_HIDDEN_LAYER + plane = FLOOR_PLANE anchored = TRUE obj_flags = CAN_BE_HIT color = CABLE_HEX_COLOR_RED diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index b46b29538c608..da3a4e12c5662 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -51,6 +51,8 @@ no power level overlay is currently in the overlays list. var/list/obj/machinery/field/generator/connected_gens = list() ///Check for asynk cleanups for this and the connected gens var/clean_up = FALSE + /// we warm up and cool down instantly + var/instantenous = FALSE /datum/armor/field_generator melee = 25 @@ -207,8 +209,11 @@ no power level overlay is currently in the overlays list. can_atmos_pass = ATMOS_PASS_YES air_update_turf(TRUE, FALSE) INVOKE_ASYNC(src, PROC_REF(cleanup)) - addtimer(CALLBACK(src, PROC_REF(cool_down)), 5 SECONDS) RemoveElement(/datum/element/give_turf_traits, string_list(list(TRAIT_CONTAINMENT_FIELD))) + if(instantenous) + warming_up = 0 + return + addtimer(CALLBACK(src, PROC_REF(cool_down)), 5 SECONDS) /obj/machinery/field/generator/proc/cool_down() if(active || warming_up <= 0) @@ -219,9 +224,14 @@ no power level overlay is currently in the overlays list. addtimer(CALLBACK(src, PROC_REF(cool_down)), 5 SECONDS) /obj/machinery/field/generator/proc/turn_on() + AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_CONTAINMENT_FIELD))) + if(instantenous) + active = FG_ONLINE + warming_up = 3 + start_fields() + return active = FG_CHARGING addtimer(CALLBACK(src, PROC_REF(warm_up)), 5 SECONDS) - AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_CONTAINMENT_FIELD))) /obj/machinery/field/generator/proc/warm_up() if(!active) @@ -420,9 +430,20 @@ no power level overlay is currently in the overlays list. state = FG_WELDED /obj/machinery/field/generator/starts_on/Initialize(mapload) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/field/generator/starts_on/post_machine_initialize() . = ..() turn_on() +/obj/machinery/field/generator/starts_on/magic + power_level = 6 //forces the highest level overlay + instantenous = TRUE + +/obj/machinery/field/generator/starts_on/magic/process() + return PROCESS_KILL // this is the only place calc_power is called, and doing it here avoids one unnecessary proc call + #undef FG_UNSECURED #undef FG_SECURED #undef FG_WELDED diff --git a/code/modules/power/supermatter/supermatter_gas.dm b/code/modules/power/supermatter/supermatter_gas.dm index 35b9db0731f92..fe0ed388148b5 100644 --- a/code/modules/power/supermatter/supermatter_gas.dm +++ b/code/modules/power/supermatter/supermatter_gas.dm @@ -216,7 +216,7 @@ GLOBAL_LIST_INIT(sm_gas_behavior, init_sm_gas()) desc = "Will generate electrical zaps." /datum/sm_gas/zauker/extra_effects(obj/machinery/power/supermatter_crystal/sm) - if(!prob(sm.gas_percentage[/datum/gas/zauker])) + if(!prob(sm.gas_percentage[/datum/gas/zauker] * 100)) return playsound(sm.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10) sm.supermatter_zap( diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index 3a7c3fcb59d36..4c5c24a3eec89 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -20,6 +20,10 @@ /obj/item/ammo_casing/strilka310/enchanted projectile_type = /obj/projectile/bullet/strilka310/enchanted +/obj/item/ammo_casing/strilka310/phasic + name = ".310 Strilka phasic bullet casing" + desc = "A phasic .310 Strika bullet casing. " + projectile_type = /obj/projectile/bullet/strilka310/phasic // .223 (M-90gl Carbine) /obj/item/ammo_casing/a223 diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index b545500420bc1..aeb3b34ed4a64 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -140,8 +140,8 @@ var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/meteorslug, /datum/crafting_recipe/pulseslug, /datum/crafting_recipe/dragonsbreath, /datum/crafting_recipe/ionslug) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index f9d5ca5d61250..c42bcdc746e45 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -85,3 +85,10 @@ harmful = FALSE e_cost = LASER_SHOTS(2, STANDARD_CELL_CHARGE * 0.5) fire_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' // fwip fwip fwip fwip + +// Used by /obj/item/gun/energy/photon +/obj/item/ammo_casing/energy/photon + fire_sound = 'sound/weapons/lasercannonfire.ogg' + e_cost = LASER_SHOTS(4, STANDARD_CELL_CHARGE) + select_name = "flare" + projectile_type = /obj/projectile/energy/photon diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 430ef11b7dd5d..bbd89389eb809 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -130,6 +130,12 @@ name = "stripper clip (.310 Surplus)" ammo_type = /obj/item/ammo_casing/strilka310/surplus +/obj/item/ammo_box/strilka310/phasic + name = "stripper clip (.310 Phasic)" + desc = "A stripper clip filled with phasic bullets, hastily developed after an incident where a misfire resulted in the destruction of Atrakor Silverscale's priceless Vigoxian Fabergé egg. \ + These fancy bullets pass right though valuables until they end up in a far less expensive human skull." + ammo_type = /obj/item/ammo_casing/strilka310/phasic + /obj/item/ammo_box/n762 name = "ammo box (7.62x38mmR)" icon_state = "10mmbox" diff --git a/code/modules/projectiles/boxes_magazines/internal/rifle.dm b/code/modules/projectiles/boxes_magazines/internal/rifle.dm index 8c6abaa0e7798..863f29508dac0 100644 --- a/code/modules/projectiles/boxes_magazines/internal/rifle.dm +++ b/code/modules/projectiles/boxes_magazines/internal/rifle.dm @@ -9,6 +9,9 @@ /obj/item/ammo_box/magazine/internal/boltaction/surplus ammo_type = /obj/item/ammo_casing/strilka310/surplus +/obj/item/ammo_box/magazine/internal/boltaction/phasic + ammo_type = /obj/item/ammo_casing/strilka310/phasic + /obj/item/ammo_box/magazine/internal/boltaction/pipegun name = "pipegun internal magazine" caliber = CALIBER_JUNK diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 198eed66e3c92..f1df323609dd9 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -64,11 +64,6 @@ /// True if a gun dosen't need a pin, mostly used for abstract guns like tentacles and meathooks var/pinless = FALSE - var/can_bayonet = FALSE //if a bayonet can be added or removed if it already has one. - var/obj/item/knife/bayonet - var/knife_x_offset = 0 - var/knife_y_offset = 0 - var/ammo_x_offset = 0 //used for positioning ammo count overlay on sprite var/ammo_y_offset = 0 @@ -83,12 +78,11 @@ pin = new pin(src) add_seclight_point() + add_bayonet_point() /obj/item/gun/Destroy() if(isobj(pin)) //Can still be the initial path, then we skip QDEL_NULL(pin) - if(bayonet) - QDEL_NULL(bayonet) if(chambered) //Not all guns are chambered (EMP'ed energy guns etc) QDEL_NULL(chambered) if(isatom(suppressed)) //SUPPRESSED IS USED AS BOTH A TRUE/FALSE AND AS A REF, WHAT THE FUCKKKKKKKKKKKKKKKKK @@ -111,6 +105,10 @@ /obj/item/gun/proc/add_seclight_point() return +/// Similarly to add_seclight_point(), handles [the bayonet attachment component][/datum/component/bayonet_attachable] +/obj/item/gun/proc/add_bayonet_point() + return + /obj/item/gun/Exited(atom/movable/gone, direction) . = ..() if(gone == pin) @@ -120,10 +118,6 @@ update_appearance() if(gone == suppressed) clear_suppressor() - if(gone == bayonet) - bayonet = null - if(!QDELING(src)) - update_appearance() ///Clears var and updates icon. In the case of ballistic weapons, also updates the gun's weight. /obj/item/gun/proc/clear_suppressor() @@ -144,13 +138,6 @@ else . += "It doesn't have a firing pin installed, and won't fire." - if(bayonet) - . += "It has \a [bayonet] [can_bayonet ? "" : "permanently "]affixed to it." - if(can_bayonet) //if it has a bayonet and this is false, the bayonet is permanent. - . += span_info("[bayonet] looks like it can be unscrewed from [src].") - if(can_bayonet) - . += "It has a bayonet lug on it." - //called after the gun has successfully fired its chambered ammo. /obj/item/gun/proc/process_chamber(empty_chamber = TRUE, from_firing = TRUE, chamber_next_round = TRUE) handle_chamber(empty_chamber, from_firing, chamber_next_round) @@ -248,31 +235,6 @@ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN -/obj/item/gun/pre_attack(atom/A, mob/living/user, params) - . = ..() - if(.) - return . - if(isnull(bayonet) || !user.combat_mode) - return . - return bayonet.melee_attack_chain(user, A, params) - -/obj/item/gun/item_interaction(mob/living/user, obj/item/tool, list/modifiers) - if(user.combat_mode) - return NONE - - if(istype(tool, /obj/item/knife)) - var/obj/item/knife/new_stabber = tool - if(!can_bayonet || !new_stabber.bayonet || !isnull(bayonet)) //ensure the gun has an attachment point available, and that the knife is compatible with it. - return ITEM_INTERACT_BLOCKING - if(!user.transferItemToLoc(new_stabber, src)) - return ITEM_INTERACT_BLOCKING - to_chat(user, span_notice("You attach [new_stabber] to [src]'s bayonet lug.")) - bayonet = new_stabber - update_appearance() - return ITEM_INTERACT_SUCCESS - - return NONE - /obj/item/gun/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) if(user.combat_mode && isliving(interacting_with)) return ITEM_INTERACT_SKIP_TO_ATTACK // Gun bash / bayonet attack @@ -508,17 +470,7 @@ return if(!user.can_perform_action(src, FORBID_TELEKINESIS_REACH)) return - - if(bayonet && can_bayonet) //if it has a bayonet, and the bayonet can be removed - I.play_tool_sound(src) - to_chat(user, span_notice("You unfix [bayonet] from [src].")) - bayonet.forceMove(drop_location()) - - if(Adjacent(user) && !issilicon(user)) - user.put_in_hands(bayonet) - return ITEM_INTERACT_SUCCESS - - else if(pin?.pin_removable && user.is_holding(src)) + if(pin?.pin_removable && user.is_holding(src)) user.visible_message(span_warning("[user] attempts to remove [pin] from [src] with [I]."), span_notice("You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)"), null, 3) if(I.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, volume = 50)) @@ -563,19 +515,6 @@ QDEL_NULL(pin) return TRUE -/obj/item/gun/update_overlays() - . = ..() - if(bayonet) - var/mutable_appearance/knife_overlay - var/state = "bayonet" //Generic state. - if(bayonet.icon_state in icon_states('icons/obj/weapons/guns/bayonets.dmi')) //Snowflake state? - state = bayonet.icon_state - var/icon/bayonet_icons = 'icons/obj/weapons/guns/bayonets.dmi' - knife_overlay = mutable_appearance(bayonet_icons, state) - knife_overlay.pixel_x = knife_x_offset - knife_overlay.pixel_y = knife_y_offset - . += knife_overlay - /obj/item/gun/animate_atom_living(mob/living/owner) new /mob/living/simple_animal/hostile/mimic/copy/ranged(drop_location(), src, owner) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 19c67f9154190..adfd2fbf4fd54 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -638,8 +638,7 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( if(sawn_off) balloon_alert(user, "it's already shortened!") return - if(bayonet) - balloon_alert(user, "[bayonet.name] must be removed!") + if (SEND_SIGNAL(src, COMSIG_GUN_BEING_SAWNOFF, user) & COMPONENT_CANCEL_SAWING_OFF) return user.changeNext_move(CLICK_CD_MELEE) user.visible_message(span_notice("[user] begins to shorten [src]."), span_notice("You begin to shorten [src]...")) @@ -649,27 +648,30 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( user.visible_message(span_danger("[src] goes off!"), span_danger("[src] goes off in your face!")) return - if(do_after(user, 3 SECONDS, target = src)) - if(sawn_off) - return - user.visible_message(span_notice("[user] shortens [src]!"), span_notice("You shorten [src].")) - sawn_off = TRUE - if(handle_modifications) - name = "sawn-off [src.name]" - desc = sawn_desc - update_weight_class(WEIGHT_CLASS_NORMAL) - //The file might not have a "gun" icon, let's prepare for this - lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - inhand_x_dimension = 32 - inhand_y_dimension = 32 - inhand_icon_state = "gun" - worn_icon_state = "gun" - slot_flags &= ~ITEM_SLOT_BACK //you can't sling it on your back - slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) - recoil = SAWN_OFF_RECOIL - update_appearance() + if(!do_after(user, 3 SECONDS, target = src)) + return + if(sawn_off) + return + user.visible_message(span_notice("[user] shortens [src]!"), span_notice("You shorten [src].")) + sawn_off = TRUE + SEND_SIGNAL(src, COMSIG_GUN_SAWN_OFF) + if(!handle_modifications) return TRUE + name = "sawn-off [src.name]" + desc = sawn_desc + update_weight_class(WEIGHT_CLASS_NORMAL) + //The file might not have a "gun" icon, let's prepare for this + lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' + inhand_x_dimension = 32 + inhand_y_dimension = 32 + inhand_icon_state = "gun" + worn_icon_state = "gun" + slot_flags &= ~ITEM_SLOT_BACK //you can't sling it on your back + slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) + recoil = SAWN_OFF_RECOIL + update_appearance() + return TRUE /obj/item/gun/ballistic/proc/guncleaning(mob/user, obj/item/A) if(misfire_probability == initial(misfire_probability)) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 30ba65dc94a86..b86e2a9938995 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -41,13 +41,13 @@ fire_delay = 2 burst_size = 3 pin = /obj/item/firing_pin/implant/pindicate - can_bayonet = TRUE - knife_x_offset = 26 - knife_y_offset = 12 mag_display = TRUE mag_display_ammo = TRUE empty_indicator = TRUE +/obj/item/gun/ballistic/automatic/c20r/add_bayonet_point() + AddComponent(/datum/component/bayonet_attachable, offset_x = 26, offset_y = 12) + /obj/item/gun/ballistic/automatic/c20r/update_overlays() . = ..() if(!chambered && empty_indicator) //this is duplicated due to a layering issue with the select fire icon. @@ -75,9 +75,6 @@ can_suppress = FALSE burst_size = 1 actions_types = list() - can_bayonet = TRUE - knife_x_offset = 25 - knife_y_offset = 12 mag_display = TRUE mag_display_ammo = TRUE empty_indicator = TRUE @@ -86,6 +83,9 @@ . = ..() AddComponent(/datum/component/automatic_fire, 0.3 SECONDS) +/obj/item/gun/ballistic/automatic/wt550/add_bayonet_point() + AddComponent(/datum/component/bayonet_attachable, offset_x = 25, offset_y = 12) + /obj/item/gun/ballistic/automatic/plastikov name = "\improper PP-95 SMG" desc = "An ancient 9mm submachine gun pattern updated and simplified to lower costs, though perhaps simplified too much." diff --git a/code/modules/projectiles/guns/ballistic/bows/_bow.dm b/code/modules/projectiles/guns/ballistic/bows/_bow.dm index 15c89ddb8553d..c0ce0b1ef2c9d 100644 --- a/code/modules/projectiles/guns/ballistic/bows/_bow.dm +++ b/code/modules/projectiles/guns/ballistic/bows/_bow.dm @@ -27,7 +27,12 @@ /obj/item/gun/ballistic/bow/update_icon_state() . = ..() - icon_state = chambered ? "[base_icon_state]_[drawn ? "drawn" : "nocked"]" : "[base_icon_state]" + icon_state = "[base_icon_state][drawn ? "_drawn" : ""]" + +/obj/item/gun/ballistic/bow/update_overlays() + . = ..() + if(chambered) + . += "[chambered.base_icon_state][drawn ? "_drawn" : ""]" /obj/item/gun/ballistic/bow/click_alt(mob/user) if(isnull(chambered)) @@ -72,6 +77,11 @@ return FALSE return ..() //fires, removing the arrow +/obj/item/gun/ballistic/bow/postfire_empty_checks(last_shot_succeeded) + if(!chambered && !get_ammo()) + drawn = FALSE + update_appearance() + /obj/item/gun/ballistic/bow/equipped(mob/user, slot, initial) . = ..() if(slot != ITEM_SLOT_HANDS && chambered) diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm index 22e441cd56b17..92c4f19e9b333 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_arrows.dm @@ -33,16 +33,17 @@ speed = 1 range = 25 shrapnel_type = null - embedding = list( - embed_chance = 90, - fall_chance = 2, - jostle_chance = 2, - ignore_throwspeed_threshold = TRUE, - pain_stam_pct = 0.5, - pain_mult = 3, - jostle_pain_mult = 3, - rip_time = 1 SECONDS - ) + embed_type = /datum/embed_data/arrow + +/datum/embed_data/arrow + embed_chance = 90 + fall_chance = 2 + jostle_chance = 2 + ignore_throwspeed_threshold = TRUE + pain_stam_pct = 0.5 + pain_mult = 3 + jostle_pain_mult = 3 + rip_time = 1 SECONDS /// holy arrows /obj/item/ammo_casing/arrow/holy @@ -58,22 +59,34 @@ name = "holy arrow" desc = "Here it comes, cultist scum!" icon_state = "holy_arrow_projectile" - damage = 20 //still a lot but this is roundstart gear so far less - embedding = list( - embed_chance = 50, - fall_chance = 2, - jostle_chance = 0, - ignore_throwspeed_threshold = TRUE, - pain_stam_pct = 0.5, - pain_mult = 3, - rip_time = 1 SECONDS - ) /obj/projectile/bullet/arrow/holy/Initialize(mapload) . = ..() //50 damage to revenants AddElement(/datum/element/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 30) +/// plastic arrows +// completely dogshit quality and they break when they hit something. +/obj/item/ammo_casing/arrow/plastic + name = "plastic arrow" + desc = "The earliest mining teams within the Spinward Sector were the somewhat stout ancestors of the modern settlers. These teams \ + found themselves often unable to access the quality materials they were digging up for equipment maintenance, all being sent off-site. \ + Left with few options, and in need of a way to protect themselves in the hostile work enviroments of the Spinward, they turned \ + to the one material they had in abundance." + icon_state = "plastic_arrow" + base_icon_state = "plastic_arrow" + projectile_type = /obj/projectile/bullet/arrow/plastic + reusable = FALSE //cheap shit + +/// plastic arrow projectile +/obj/projectile/bullet/arrow/plastic + name = "plastic arrow" + desc = "If this is about to kill you, you should feel genuine shame." + damage = 5 + stamina = 50 + weak_against_armour = TRUE + icon_state = "plastic_arrow_projectile" + /// special pyre sect arrow /// in the future, this needs a special sprite, but bows don't support non-hardcoded arrow sprites /obj/item/ammo_casing/arrow/holy/blazing @@ -87,7 +100,7 @@ desc = "THE UNMATCHED POWER OF THE SUN" icon_state = "holy_arrow_projectile" damage = 20 - embedding = null + embed_type = null /obj/projectile/bullet/arrow/blazing/on_hit(atom/target, blocked, pierce_hit) . = ..() @@ -99,5 +112,5 @@ human_target.adjust_fire_stacks(2) human_target.ignite_mob() return - to_chat(human_target, span_danger("[src] reacts with the flames on y-")) + to_chat(human_target, span_danger("[src] reacts with the flames enveloping you! Oh shit!")) explosion(src, light_impact_range = 1, flame_range = 2) //ow diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm index 07d7cc93ce16e..2492f0d4276f5 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_quivers.dm @@ -8,6 +8,7 @@ worn_icon_state = "harpoon_quiver" /// type of arrow the quivel should hold var/arrow_path = /obj/item/ammo_casing/arrow + var/max_slots = 40 /obj/item/storage/bag/quiver/Initialize(mapload) . = ..() @@ -17,7 +18,10 @@ atom_storage.max_total_storage = 100 atom_storage.set_holdable(/obj/item/ammo_casing/arrow) -/obj/item/storage/bag/quiver/PopulateContents() +/obj/item/storage/bag/quiver/lesser + max_slots = 10 + +/obj/item/storage/bag/quiver/full/PopulateContents() . = ..() for(var/i in 1 to 10) new arrow_path(src) @@ -29,3 +33,8 @@ inhand_icon_state = "holyquiver" worn_icon_state = "holyquiver" arrow_path = /obj/item/ammo_casing/arrow/holy + +/obj/item/storage/bag/quiver/holy/PopulateContents() + . = ..() + for(var/i in 1 to 10) + new arrow_path(src) diff --git a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm index b9ac1af0cca12..83b3bc43dd174 100644 --- a/code/modules/projectiles/guns/ballistic/bows/bow_types.dm +++ b/code/modules/projectiles/guns/ballistic/bows/bow_types.dm @@ -4,6 +4,12 @@ name = "longbow" desc = "While pretty finely crafted, surely you can find something better to use in the current year." +/// Shortbow, made via the crafting recipe +/obj/item/gun/ballistic/bow/shortbow + name = "shortbow" + desc = "A simple homemade shortbow. Great for LARPing. Or poking out someones eye." + projectile_damage_multiplier = 0.36 + ///chaplain's divine archer bow /obj/item/gun/ballistic/bow/divine name = "divine bow" @@ -15,6 +21,7 @@ slot_flags = ITEM_SLOT_BACK obj_flags = UNIQUE_RENAME accepted_magazine_type = /obj/item/ammo_box/magazine/internal/bow/holy + projectile_damage_multiplier = 0.4 /obj/item/ammo_box/magazine/internal/bow/holy name = "divine bowstring" diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm index a8161ddb39612..8604e21b32503 100644 --- a/code/modules/projectiles/guns/ballistic/rifle.dm +++ b/code/modules/projectiles/guns/ballistic/rifle.dm @@ -54,9 +54,6 @@ slot_flags = ITEM_SLOT_BACK accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction - can_bayonet = TRUE - knife_x_offset = 42 - knife_y_offset = 12 can_be_sawn_off = TRUE weapon_weight = WEAPON_HEAVY var/jamming_chance = 20 @@ -67,11 +64,13 @@ SET_BASE_PIXEL(-8, 0) +/obj/item/gun/ballistic/rifle/boltaction/add_bayonet_point() + AddComponent(/datum/component/bayonet_attachable, offset_x = 32, offset_y = 12) + /obj/item/gun/ballistic/rifle/boltaction/sawoff(mob/user) . = ..() if(.) spread = 36 - can_bayonet = FALSE SET_BASE_PIXEL(0, 0) update_appearance() @@ -160,6 +159,7 @@ You are now probably one of the few people in the universe to ever hold an \"Obrez Moderna\". \ All you had to do was take an allen wrench to the stock to take it off. But no, you just had to \ go for the saw." + accepted_magazine_type = /obj/item/ammo_box/magazine/internal/boltaction/phasic /obj/item/gun/ballistic/rifle/boltaction/prime/Initialize(mapload) . = ..() @@ -271,14 +271,14 @@ projectile_damage_multiplier = 1.35 obj_flags = UNIQUE_RENAME - can_bayonet = TRUE - knife_x_offset = 35 - knife_y_offset = 10 can_be_sawn_off = FALSE trigger_guard = TRIGGER_GUARD_ALLOW_ALL SET_BASE_PIXEL(-8, 0) +/obj/item/gun/ballistic/rifle/boltaction/pipegun/add_bayonet_point() + AddComponent(/datum/component/bayonet_attachable, offset_x = 35, offset_y = 10) + /obj/item/gun/ballistic/rifle/boltaction/pipegun/handle_chamber() . = ..() do_sparks(1, TRUE, src) @@ -305,11 +305,13 @@ spread = 15 //kinda inaccurate slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_NORMAL - can_bayonet = FALSE weapon_weight = WEAPON_MEDIUM SET_BASE_PIXEL(0, 0) +/obj/item/gun/ballistic/rifle/boltaction/pipegun/pipepistol/add_bayonet_point() + return + /obj/item/gun/ballistic/rifle/boltaction/pipegun/prime name = "regal pipegun" desc = "To call this 'regal' is a cruel irony. For the only noteworthy quality of nobility is in how it is wielded to kill. \ diff --git a/code/modules/projectiles/guns/energy/crank_guns.dm b/code/modules/projectiles/guns/energy/crank_guns.dm index 64ffa86f36015..fa56075990ec5 100644 --- a/code/modules/projectiles/guns/energy/crank_guns.dm +++ b/code/modules/projectiles/guns/energy/crank_guns.dm @@ -7,9 +7,9 @@ ammo_type = list(/obj/item/ammo_casing/energy/laser/musket) slot_flags = ITEM_SLOT_BACK obj_flags = UNIQUE_RENAME - can_bayonet = TRUE - knife_x_offset = 22 - knife_y_offset = 11 + +/obj/item/gun/energy/laser/musket/add_bayonet_point() + AddComponent(/datum/component/bayonet_attachable, offset_x = 22, offset_y = 11) /obj/item/gun/energy/laser/musket/Initialize(mapload) . = ..() @@ -84,12 +84,12 @@ shaded_charge = TRUE ammo_x_offset = 1 obj_flags = UNIQUE_RENAME - can_bayonet = TRUE - knife_x_offset = 19 - knife_y_offset = 13 w_class = WEIGHT_CLASS_NORMAL dual_wield_spread = 5 //as intended by the coders +/obj/item/gun/energy/laser/thermal/add_bayonet_point() + AddComponent(/datum/component/bayonet_attachable, offset_x = 19, offset_y = 13) + /obj/item/gun/energy/laser/thermal/Initialize(mapload) . = ..() AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 3ce3338bf8749..e826e1392bf28 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -16,8 +16,8 @@ return var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/advancedegun, /datum/crafting_recipe/tempgun, /datum/crafting_recipe/beam_rifle) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 7237ee0e32747..ab023d38b55ef 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -9,9 +9,6 @@ obj_flags = UNIQUE_RENAME resistance_flags = FIRE_PROOF weapon_weight = WEAPON_LIGHT - can_bayonet = TRUE - knife_x_offset = 20 - knife_y_offset = 12 gun_flags = NOT_A_REAL_GUN ///List of all mobs that projectiles fired from this gun will ignore. var/list/ignored_mob_types @@ -20,6 +17,9 @@ ///The max capacity of modkits the PKA can have installed at once. var/max_mod_capacity = 100 +/obj/item/gun/energy/recharge/kinetic_accelerator/add_bayonet_point() + AddComponent(/datum/component/bayonet_attachable, offset_x = 20, offset_y = 12) + /obj/item/gun/energy/recharge/kinetic_accelerator/Initialize(mapload) . = ..() // Only actual KAs can be converted @@ -27,8 +27,8 @@ return var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/ebow) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 95baca98db80f..90dc0c5717275 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -16,8 +16,8 @@ return var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/xraylaser, /datum/crafting_recipe/hellgun, /datum/crafting_recipe/ioncarbine) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 0635de8037adf..839689144c2f1 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -59,6 +59,9 @@ /obj/item/gun/energy/pulse/carbine/loyalpin pin = /obj/item/firing_pin/implant/mindshield +/obj/item/gun/energy/pulse/carbine/taserless + ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/laser) + /obj/item/gun/energy/pulse/destroyer name = "pulse destroyer" desc = "A heavy-duty energy rifle built for pure destruction." @@ -79,6 +82,9 @@ inhand_icon_state = "gun" cell_type = /obj/item/stock_parts/power_store/cell/pulse/pistol +/obj/item/gun/energy/pulse/pistol/taserless + ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/laser) + /obj/item/gun/energy/pulse/pistol/loyalpin pin = /obj/item/firing_pin/implant/mindshield diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm index 0aa14b48c32f6..504dc5c9e0f4a 100644 --- a/code/modules/projectiles/guns/energy/recharge.dm +++ b/code/modules/projectiles/guns/energy/recharge.dm @@ -111,9 +111,9 @@ recharge_time = 2 SECONDS holds_charge = TRUE unique_frequency = TRUE - can_bayonet = TRUE - knife_x_offset = 20 - knife_y_offset = 12 + +/obj/item/gun/energy/recharge/ebow/add_bayonet_point() + AddComponent(/datum/component/bayonet_attachable, offset_x = 20, offset_y = 12) /obj/item/gun/energy/recharge/ebow/halloween name = "candy corn crossbow" diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 653cffcbeec7d..961d32c96ee8b 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -428,3 +428,21 @@ new_coin.preparePixelProjectile(target_turf, user) new_coin.fire() return ITEM_INTERACT_SUCCESS + +/obj/item/gun/energy/photon + name = "photon cannon" + desc = "A competitive design to the tesla cannon, that instead of charging latent electrons, releases energy into photons. Eye protection is recommended." + icon_state = "photon" + inhand_icon_state = "tesla" + fire_sound = 'sound/weapons/lasercannonfire.ogg' + ammo_type = list(/obj/item/ammo_casing/energy/photon) + shaded_charge = TRUE + weapon_weight = WEAPON_HEAVY + light_color = LIGHT_COLOR_DEFAULT + light_system = OVERLAY_LIGHT + light_power = 2 + light_range = 1 + +/obj/item/gun/energy/photon/Initialize(mapload) + . = ..() + set_light_on(TRUE) // The gun quite literally shoots mini-suns. diff --git a/code/modules/projectiles/guns/special/hand_of_midas.dm b/code/modules/projectiles/guns/special/hand_of_midas.dm index 68b8158c32d9f..e92ffe8d0bf22 100644 --- a/code/modules/projectiles/guns/special/hand_of_midas.dm +++ b/code/modules/projectiles/guns/special/hand_of_midas.dm @@ -37,20 +37,26 @@ balloon_alert(user, "not enough gold") // Siphon gold from a victim, recharging our gun & removing their Midas Blight debuff in the process. +/obj/item/gun/magic/midas_hand/interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) + if(!isliving(interacting_with)) + return ITEM_INTERACT_BLOCKING + return suck_gold(interacting_with, user) + /obj/item/gun/magic/midas_hand/ranged_interact_with_atom_secondary(atom/interacting_with, mob/living/user, list/modifiers) if(!isliving(interacting_with) || !IN_GIVEN_RANGE(user, interacting_with, gold_suck_range)) return ITEM_INTERACT_BLOCKING - if(interacting_with == user) + return suck_gold(interacting_with, user) + +/obj/item/gun/magic/midas_hand/proc/suck_gold(mob/living/victim, mob/living/user) + if(victim == user) balloon_alert(user, "can't siphon from self!") return ITEM_INTERACT_BLOCKING - if(!interacting_with.reagents) + if(!victim.reagents) return ITEM_INTERACT_BLOCKING - - var/gold_amount = interacting_with.reagents.get_reagent_amount(/datum/reagent/gold, type_check = REAGENT_SUB_TYPE) + var/gold_amount = victim.reagents.get_reagent_amount(/datum/reagent/gold, type_check = REAGENT_SUB_TYPE) if(!gold_amount) balloon_alert(user, "no gold in bloodstream!") return ITEM_INTERACT_BLOCKING - var/mob/living/victim = interacting_with var/gold_beam = user.Beam(victim, icon_state = "drain_gold") if(!do_after( user = user, diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 013cc6e4b294c..7870c10e9ef4a 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -191,7 +191,9 @@ ///If defined, on hit we create an item of this type then call hitby() on the hit target with this, mainly used for embedding items (bullets) in targets var/shrapnel_type ///If we have a shrapnel_type defined, these embedding stats will be passed to the spawned shrapnel type, which will roll for embedding on the target - var/list/embedding + var/embed_type + ///Saves embedding data + var/datum/embed_data/embed_data ///If TRUE, hit mobs, even if they are lying on the floor and are not our target within MAX_RANGE_HIT_PRONE_TARGETS tiles var/hit_prone_targets = FALSE ///if TRUE, ignores the range of MAX_RANGE_HIT_PRONE_TARGETS tiles of hit_prone_targets @@ -218,8 +220,8 @@ /obj/projectile/Initialize(mapload) . = ..() decayedRange = range - if(embedding) - updateEmbedding() + if(get_embed()) + AddElement(/datum/element/embed) AddElement(/datum/element/connect_loc, projectile_connections) /obj/projectile/proc/Range() @@ -227,8 +229,8 @@ if(wound_bonus != CANT_WOUND) wound_bonus += wound_falloff_tile bare_wound_bonus = max(0, bare_wound_bonus + wound_falloff_tile) - if(embedding) - embedding["embed_chance"] += embed_falloff_tile + if(get_embed()) + set_embed(embed_data.generate_with_values(embed_data.embed_chance + embed_falloff_tile)) // Should be rewritten in projecitle refactor if(damage_falloff_tile && damage >= 0) damage += damage_falloff_tile if(stamina_falloff_tile && stamina >= 0) @@ -1130,26 +1132,6 @@ /obj/projectile/experience_pressure_difference() return -///Like [/obj/item/proc/updateEmbedding] but for projectiles instead, call this when you want to add embedding or update the stats on the embedding element -/obj/projectile/proc/updateEmbedding() - if(!shrapnel_type || !LAZYLEN(embedding)) - return - - AddElement(/datum/element/embed,\ - embed_chance = (!isnull(embedding["embed_chance"]) ? embedding["embed_chance"] : EMBED_CHANCE),\ - fall_chance = (!isnull(embedding["fall_chance"]) ? embedding["fall_chance"] : EMBEDDED_ITEM_FALLOUT),\ - pain_chance = (!isnull(embedding["pain_chance"]) ? embedding["pain_chance"] : EMBEDDED_PAIN_CHANCE),\ - pain_mult = (!isnull(embedding["pain_mult"]) ? embedding["pain_mult"] : EMBEDDED_PAIN_MULTIPLIER),\ - remove_pain_mult = (!isnull(embedding["remove_pain_mult"]) ? embedding["remove_pain_mult"] : EMBEDDED_UNSAFE_REMOVAL_PAIN_MULTIPLIER),\ - rip_time = (!isnull(embedding["rip_time"]) ? embedding["rip_time"] : EMBEDDED_UNSAFE_REMOVAL_TIME),\ - ignore_throwspeed_threshold = (!isnull(embedding["ignore_throwspeed_threshold"]) ? embedding["ignore_throwspeed_threshold"] : FALSE),\ - impact_pain_mult = (!isnull(embedding["impact_pain_mult"]) ? embedding["impact_pain_mult"] : EMBEDDED_IMPACT_PAIN_MULTIPLIER),\ - jostle_chance = (!isnull(embedding["jostle_chance"]) ? embedding["jostle_chance"] : EMBEDDED_JOSTLE_CHANCE),\ - jostle_pain_mult = (!isnull(embedding["jostle_pain_mult"]) ? embedding["jostle_pain_mult"] : EMBEDDED_JOSTLE_PAIN_MULTIPLIER),\ - pain_stam_pct = (!isnull(embedding["pain_stam_pct"]) ? embedding["pain_stam_pct"] : EMBEDDED_PAIN_STAM_PCT),\ - projectile_payload = shrapnel_type) - return TRUE - /** * Is this projectile considered "hostile"? * @@ -1169,7 +1151,7 @@ ///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) + return get_embed() && shrapnel_type && iscarbon(hit) && !HAS_TRAIT(hit, TRAIT_PIERCEIMMUNE) /// Reflects the projectile off of something /obj/projectile/proc/reflect(atom/hit_atom) @@ -1212,3 +1194,17 @@ bullet.preparePixelProjectile(target, src) bullet.fire() return bullet + +/// Fetches embedding data +/obj/projectile/proc/get_embed() + RETURN_TYPE(/datum/embed_data) + return embed_type ? (embed_data ||= get_embed_by_type(embed_type)) : embed_data + +/obj/projectile/proc/set_embed(datum/embed_data/embed) + if(embed_data == embed) + return + // GLOB.embed_by_type stores shared "default" embedding values of datums + // Dynamically generated embeds use the base class and thus are not present in there, and should be qdeleted upon being discarded + if(!isnull(embed_data) && !GLOB.embed_by_type[embed_data.type]) + qdel(embed_data) + embed_data = ispath(embed) ? get_embed_by_type(armor) : embed diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 5e938c4995390..1d1313d9e5551 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -8,7 +8,7 @@ sharpness = SHARP_POINTY impact_effect_type = /obj/effect/temp_visual/impact_effect shrapnel_type = /obj/item/shrapnel/bullet - embedding = list(embed_chance=20, fall_chance=2, jostle_chance=0, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.5, pain_mult=3, rip_time=10) + embed_type = /datum/embed_data/bullet wound_bonus = 0 wound_falloff_tile = -5 embed_falloff_tile = -3 @@ -16,3 +16,12 @@ /obj/projectile/bullet/smite name = "divine retribution" damage = 10 + +/datum/embed_data/bullet + embed_chance=20 + fall_chance=2 + jostle_chance=0 + ignore_throwspeed_threshold=TRUE + pain_stam_pct=0.5 + pain_mult=3 + rip_time=10 diff --git a/code/modules/projectiles/projectile/bullets/_incendiary.dm b/code/modules/projectiles/projectile/bullets/_incendiary.dm index 85c2dce80c51a..e151afa294d50 100644 --- a/code/modules/projectiles/projectile/bullets/_incendiary.dm +++ b/code/modules/projectiles/projectile/bullets/_incendiary.dm @@ -30,7 +30,7 @@ pass_flags = PASSTABLE | PASSMOB sharpness = NONE shrapnel_type = null - embedding = null + embed_type = null impact_effect_type = null suppressed = SUPPRESSED_VERY damage_type = BURN diff --git a/code/modules/projectiles/projectile/bullets/cannonball.dm b/code/modules/projectiles/projectile/bullets/cannonball.dm index 1d6108ed33fd2..358a23eb63c90 100644 --- a/code/modules/projectiles/projectile/bullets/cannonball.dm +++ b/code/modules/projectiles/projectile/bullets/cannonball.dm @@ -8,7 +8,7 @@ dismemberment = 0 paralyze = 5 SECONDS stutter = 20 SECONDS - embedding = null + embed_type = null hitsound = 'sound/effects/meteorimpact.ogg' hitsound_wall = 'sound/weapons/sonic_jackhammer.ogg' /// If our cannonball hits something, it reduces the damage by this value. diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index 405552a8909c2..1bd88d75fdea0 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -2,7 +2,7 @@ name = "dart" icon_state = "cbbolt" damage = 6 - embedding = null + embed_type = null shrapnel_type = null var/inject_flags = null diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm index fdb051e7f8006..b4029b07f2da6 100644 --- a/code/modules/projectiles/projectile/bullets/dnainjector.dm +++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm @@ -4,7 +4,7 @@ var/obj/item/dnainjector/injector damage = 5 hitsound_wall = SFX_SHATTER - embedding = null + embed_type = null shrapnel_type = null /obj/projectile/bullet/dnainjector/on_hit(atom/target, blocked = 0, pierce_hit) diff --git a/code/modules/projectiles/projectile/bullets/foam_dart.dm b/code/modules/projectiles/projectile/bullets/foam_dart.dm index 3f086166e6a88..7eaa1ce6c8ee4 100644 --- a/code/modules/projectiles/projectile/bullets/foam_dart.dm +++ b/code/modules/projectiles/projectile/bullets/foam_dart.dm @@ -8,7 +8,7 @@ base_icon_state = "foamdart" range = 10 shrapnel_type = null - embedding = null + embed_type = null var/modified = FALSE var/obj/item/pen/pen = null diff --git a/code/modules/projectiles/projectile/bullets/grenade.dm b/code/modules/projectiles/projectile/bullets/grenade.dm index a99a7b57ff3ec..0814a844be4a7 100644 --- a/code/modules/projectiles/projectile/bullets/grenade.dm +++ b/code/modules/projectiles/projectile/bullets/grenade.dm @@ -5,7 +5,7 @@ desc = "USE A WEEL GUN" icon_state= "bolter" damage = 60 - embedding = null + embed_type = null shrapnel_type = null /obj/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0, pierce_hit) diff --git a/code/modules/projectiles/projectile/bullets/junk.dm b/code/modules/projectiles/projectile/bullets/junk.dm index 344a732911347..285c3ea281509 100644 --- a/code/modules/projectiles/projectile/bullets/junk.dm +++ b/code/modules/projectiles/projectile/bullets/junk.dm @@ -4,11 +4,21 @@ name = "junk bullet" icon_state = "trashball" damage = 30 - embedding = list(embed_chance=15, 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) + embed_type = /datum/embed_data/bullet_junk var/bane_mob_biotypes = MOB_ROBOTIC var/bane_multiplier = 1.5 var/bane_added_damage = 0 +/datum/embed_data/bullet_junk + embed_chance=15 + 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 + /obj/projectile/bullet/junk/Initialize(mapload) . = ..() AddElement(/datum/element/bane, mob_biotypes = bane_mob_biotypes, target_type = /mob/living, damage_multiplier = bane_multiplier, added_damage = bane_added_damage, requires_combat_mode = FALSE) @@ -28,7 +38,7 @@ name = "bundle of live electrical parts" icon_state = "tesla_projectile" damage = 15 - embedding = null + embed_type = null shrapnel_type = null bane_multiplier = 3 @@ -49,10 +59,20 @@ name = "junk ripper bullet" icon_state = "redtrac" damage = 10 - 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) + embed_type = /datum/embed_data/bullet_junk_ripper wound_bonus = 10 bare_wound_bonus = 30 +/datum/embed_data/bullet_junk_ripper + 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 + /obj/projectile/bullet/junk/reaper name = "junk reaper bullet" tracer_type = /obj/effect/projectile/tracer/sniper diff --git a/code/modules/projectiles/projectile/bullets/pistol.dm b/code/modules/projectiles/projectile/bullets/pistol.dm index 8fccc510ff8fd..6bd355219f950 100644 --- a/code/modules/projectiles/projectile/bullets/pistol.dm +++ b/code/modules/projectiles/projectile/bullets/pistol.dm @@ -3,13 +3,23 @@ /obj/projectile/bullet/c9mm name = "9mm bullet" damage = 30 - embedding = list(embed_chance=15, 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) + embed_type = /datum/embed_data/bullet_c9mm + +/datum/embed_data/bullet_c9mm + embed_chance=15 + 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 /obj/projectile/bullet/c9mm/ap name = "9mm armor-piercing bullet" damage = 27 armour_penetration = 40 - embedding = null + embed_type = null shrapnel_type = null /obj/projectile/bullet/c9mm/hp diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index 417f61534bcb7..e9d6389c89d0d 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -21,9 +21,19 @@ ricochet_auto_aim_range = 3 wound_bonus = -20 bare_wound_bonus = 10 - embedding = list(embed_chance=25, fall_chance=2, jostle_chance=2, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=3, jostle_pain_mult=5, rip_time=1 SECONDS) + embed_type = /datum/embed_data/bullet_c38 embed_falloff_tile = -4 +/datum/embed_data/bullet_c38 + embed_chance=25 + fall_chance=2 + jostle_chance=2 + ignore_throwspeed_threshold=TRUE + pain_stam_pct=0.4 + pain_mult=3 + jostle_pain_mult=5 + rip_time=1 SECONDS + /obj/projectile/bullet/c38/match name = ".38 Match bullet" ricochets_max = 4 @@ -45,7 +55,7 @@ ricochet_decay_damage = 0.8 shrapnel_type = null sharpness = NONE - embedding = null + embed_type = null // premium .38 ammo from cargo, weak against armor, lower base damage, but excellent at embedding and causing slice wounds at close range /obj/projectile/bullet/c38/dumdum @@ -56,10 +66,20 @@ sharpness = SHARP_EDGED wound_bonus = 20 bare_wound_bonus = 20 - embedding = list(embed_chance=75, fall_chance=3, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.4, pain_mult=5, jostle_pain_mult=6, rip_time=1 SECONDS) + embed_type = /datum/embed_data/bullet_c38_dumdum wound_falloff_tile = -5 embed_falloff_tile = -15 +/datum/embed_data/bullet_c38_dumdum + embed_chance=75 + fall_chance=3 + jostle_chance=4 + ignore_throwspeed_threshold=TRUE + pain_stam_pct=0.4 + pain_mult=5 + jostle_pain_mult=6 + rip_time=1 SECONDS + /obj/projectile/bullet/c38/trac name = ".38 TRAC bullet" damage = 10 diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm index 3cbb894b8fb9e..6f14df2f4c8bd 100644 --- a/code/modules/projectiles/projectile/bullets/rifle.dm +++ b/code/modules/projectiles/projectile/bullets/rifle.dm @@ -35,6 +35,10 @@ damage = 20 stamina = 80 +/obj/projectile/bullet/strilka310/phasic + name = "phasic .310 bullet" + projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINE | PASSSTRUCTURE | PASSDOORS + // Harpoons (Harpoon Gun) /obj/projectile/bullet/harpoon @@ -44,10 +48,20 @@ armour_penetration = 50 wound_bonus = -20 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) + embed_type = /datum/embed_data/harpoon wound_falloff_tile = -5 shrapnel_type = null +/datum/embed_data/harpoon + 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 + // Rebar (Rebar Crossbow) /obj/projectile/bullet/rebar name = "rebar" @@ -58,11 +72,21 @@ armour_penetration = 10 wound_bonus = -20 bare_wound_bonus = 20 - embedding = list("embed_chance" = 60, "fall_chance" = 2, "jostle_chance" = 2, "ignore_throwspeed_threshold" = TRUE, "pain_stam_pct" = 0.4, "pain_mult" = 4, "jostle_pain_mult" = 2, "rip_time" = 10) + embed_type = /datum/embed_data/rebar embed_falloff_tile = -5 wound_falloff_tile = -2 shrapnel_type = /obj/item/ammo_casing/rebar +/datum/embed_data/rebar + embed_chance = 60 + fall_chance = 2 + jostle_chance = 2 + ignore_throwspeed_threshold = TRUE + pain_stam_pct = 0.4 + pain_mult = 4 + jostle_pain_mult = 2 + rip_time = 10 + /obj/projectile/bullet/rebar/proc/handle_drop(datum/source, obj/item/ammo_casing/rebar/newcasing) /obj/projectile/bullet/rebar/syndie @@ -74,10 +98,20 @@ armour_penetration = 20 //A bit better versus armor. Gets past anti laser armor or a vest, but doesnt wound proc on sec armor. wound_bonus = 10 bare_wound_bonus = 20 - embedding = list("embed_chance" = 80, "fall_chance" = 1, "jostle_chance" = 3, "ignore_throwspeed_threshold" = TRUE, "pain_stam_pct" = 0.4, "pain_mult" = 3, "jostle_pain_mult" = 2, "rip_time" = 14) embed_falloff_tile = -3 + embed_type = /datum/embed_data/rebar_syndie shrapnel_type = /obj/item/ammo_casing/rebar/syndie +/datum/embed_data/rebar_syndie + embed_chance = 80 + fall_chance = 1 + jostle_chance = 3 + ignore_throwspeed_threshold + pain_stam_pct = 0.4 + pain_mult = 3 + jostle_pain_mult = 2 + rip_time = 14 + /obj/projectile/bullet/rebar/zaukerite name = "zaukerite shard" icon_state = "rebar_zaukerite" @@ -89,10 +123,20 @@ armour_penetration = 20 // not nearly as good, as its not as sharp. wound_bonus = 10 bare_wound_bonus = 40 - embedding = list("embed_chance" =100, "fall_chance" = 0, "jostle_chance" = 5, "ignore_throwspeed_threshold" = TRUE, "pain_stam_pct" = 0.8, "pain_mult" = 6, "jostle_pain_mult" = 2, "rip_time" = 30) + embed_type = /datum/embed_data/rebar_zaukerite embed_falloff_tile = 0 // very spiky. shrapnel_type = /obj/item/ammo_casing/rebar/zaukerite +/datum/embed_data/rebar_zaukerite + embed_chance = 100 + fall_chance = 0 + jostle_chance = 5 + ignore_throwspeed_threshold = TRUE + pain_stam_pct = 0.8 + pain_mult = 6 + jostle_pain_mult = 2 + rip_time = 30 + /obj/projectile/bullet/rebar/hydrogen name = "metallic hydrogen bolt" icon_state = "rebar_hydrogen" @@ -104,10 +148,20 @@ projectile_piercing = PASSMOB //felt this might have been a nice compromise for the lower damage for the difficulty of getting it wound_bonus = -15 bare_wound_bonus = 10 - embedding = list("embed_chance" = 50, "fall_chance" = 2, "jostle_chance" = 3, "ignore_throwspeed_threshold" = TRUE, "pain_stam_pct" = 0.6, "pain_mult" = 4, "jostle_pain_mult" = 2, "rip_time" =18) + embed_type = /datum/embed_data/rebar_hydrogen embed_falloff_tile = -3 shrapnel_type = /obj/item/ammo_casing/rebar/hydrogen +/datum/embed_data/rebar_hydrogen + embed_chance = 50 + fall_chance = 2 + jostle_chance = 3 + ignore_throwspeed_threshold = TRUE + pain_stam_pct = 0.6 + pain_mult = 4 + jostle_pain_mult = 2 + rip_time =18 + /obj/projectile/bullet/rebar/healium name = "healium bolt" icon_state = "rebar_healium" @@ -118,7 +172,7 @@ armour_penetration = 100 wound_bonus = -100 bare_wound_bonus = -100 - embedding = list(embed_chance = 0) + embed_type = null embed_falloff_tile = -3 shrapnel_type = /obj/item/ammo_casing/rebar/healium @@ -135,7 +189,6 @@ return BULLET_ACT_HIT - /obj/projectile/bullet/rebar/supermatter name = "supermatter bolt" icon_state = "rebar_supermatter" @@ -143,6 +196,7 @@ speed = 0.4 dismemberment = 0 damage_type = TOX + embed_type = null armour_penetration = 100 shrapnel_type = /obj/item/ammo_casing/rebar/supermatter @@ -160,7 +214,6 @@ return BULLET_ACT_HIT - /obj/projectile/bullet/rebar/supermatter/proc/dust_feedback(atom/target) playsound(get_turf(src), 'sound/effects/supermatter.ogg', 10, TRUE) visible_message(span_danger("[target] is hit by [src], turning [target.p_them()] to dust in a brilliant flash of light!")) @@ -170,7 +223,7 @@ damage = 1 // It's a damn toy. range = 10 shrapnel_type = null - embedding = null + embed_type = null name = "paper ball" desc = "doink!" damage_type = BRUTE diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index b3ddaf9bc9013..a013aaba691d7 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -22,7 +22,7 @@ stamina = 55 wound_bonus = 20 sharpness = NONE - embedding = null + embed_type = null /obj/projectile/bullet/shotgun_beanbag/a40mm name = "rubber slug" @@ -55,7 +55,7 @@ range = 7 icon_state = "spark" color = COLOR_YELLOW - embedding = null + embed_type = null /obj/projectile/bullet/shotgun_frag12 name ="frag12 slug" @@ -84,7 +84,7 @@ damage = 3 stamina = 11 sharpness = NONE - embedding = null + embed_type = null speed = 1.2 stamina_falloff_tile = -0.25 ricochets_max = 4 @@ -106,7 +106,7 @@ name = "incapacitating pellet" damage = 1 stamina = 6 - embedding = null + embed_type = null // Mech Scattershot diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index 8befcb690ecfa..ce78abf0662b4 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -33,7 +33,7 @@ name = "4.6x30mm armor-piercing bullet" damage = 15 armour_penetration = 40 - embedding = null + embed_type = null /obj/projectile/bullet/incendiary/c46x30mm name = "4.6x30mm incendiary bullet" diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index f595c3e116510..2af0fe7b9cb9d 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -9,7 +9,7 @@ icon = 'icons/obj/service/hydroponics/harvest.dmi' icon_state = "banana" range = 200 - embedding = null + embed_type = null shrapnel_type = null /obj/projectile/bullet/honker/Initialize(mapload) diff --git a/code/modules/projectiles/projectile/energy/photon.dm b/code/modules/projectiles/projectile/energy/photon.dm new file mode 100644 index 0000000000000..7caac3e062e01 --- /dev/null +++ b/code/modules/projectiles/projectile/energy/photon.dm @@ -0,0 +1,58 @@ +#define MULTIPLY_PIXELSPEED 0.8 + +/obj/projectile/energy/photon + name = "photon bolt" + icon_state = "solarflare" + damage_type = STAMINA + armor_flag = ENERGY + impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser + damage = 5 //It's literally a weaker tesla bolt, which is already weak. Don't worry, we'll fix that. + range = 20 + speed = 1 + pixel_speed_multiplier = 1 + projectile_piercing = PASSMOB + light_color = LIGHT_COLOR_DEFAULT + light_system = OVERLAY_LIGHT + light_power = 5 + light_range = 6 + + +/obj/projectile/energy/photon/Initialize(mapload) + . = ..() + RegisterSignals(src, list(COMSIG_MOVABLE_CROSS, COMSIG_MOVABLE_CROSS_OVER), PROC_REF(blast_touched)) + RegisterSignal(src, COMSIG_ATOM_ENTERED, PROC_REF(scorch_earth)) + set_light_on(TRUE) + +/** + * Handle side effects for the phonon bolt. + * behaves like a higher power direct flash if hit, and sparks silicons like they're getting microwaved. + */ +/obj/projectile/energy/photon/proc/blast_touched(datum/source, atom/flashed) + SIGNAL_HANDLER + if(isliving(flashed)) + var/mob/living/flashed_creature = flashed + flashed_creature.flash_act(intensity = 3, affect_silicon = TRUE, length = 6) + flashed_creature.adjust_confusion(1.5 SECONDS) + if(issilicon(flashed)) + do_sparks(rand(1, 4), FALSE, src) + +/** + * When traveling to a new turf, throws a probability to generate a hotspot across it's path. + */ +/obj/projectile/energy/photon/proc/scorch_earth(turf/open/floor/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) + SIGNAL_HANDLER + if(prob(40)) + new /obj/effect/hotspot(arrived) + +/obj/projectile/energy/photon/Range() + . = ..() + pixel_speed_multiplier *= MULTIPLY_PIXELSPEED + +/obj/projectile/energy/photon/on_range() + do_sparks(rand(4, 9), FALSE, src) + playsound(loc, 'sound/weapons/solarflare.ogg', 100, FALSE, 8, 0.9) + for(var/mob/living/flashed_mob in viewers(5, loc)) + flashed_mob.flash_act() + return ..() + +#undef MULTIPLY_PIXELSPEED diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm index db452385c987c..fe04fc7d9865e 100644 --- a/code/modules/projectiles/projectile/special/rocket.dm +++ b/code/modules/projectiles/projectile/special/rocket.dm @@ -2,7 +2,7 @@ name ="explosive bolt" icon_state= "bolter" damage = 50 - embedding = null + embed_type = null shrapnel_type = null /obj/projectile/bullet/gyro/on_hit(atom/target, blocked = 0, pierce_hit) @@ -17,7 +17,7 @@ icon_state= "missile" damage = 50 sharpness = NONE - embedding = null + embed_type = null shrapnel_type = null ricochets_max = 0 /// Whether we do extra damage when hitting a mech or silicon diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm index 2a8b6ca6b6938..182bb715466d3 100644 --- a/code/modules/projectiles/projectile/special/temperature.dm +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -61,3 +61,4 @@ var/turf/location = get_turf(src) new /obj/effect/hotspot(location) location.hotspot_expose(700, 50, 1) + return ..() diff --git a/code/modules/reagents/chemistry/holder/holder.dm b/code/modules/reagents/chemistry/holder/holder.dm index 3fe2e482f3efd..46d00e765a343 100644 --- a/code/modules/reagents/chemistry/holder/holder.dm +++ b/code/modules/reagents/chemistry/holder/holder.dm @@ -235,6 +235,7 @@ var/total_removed_amount = 0 var/remove_amount = 0 var/list/cached_reagents = reagent_list + var/list/removed_reagents = list() for(var/datum/reagent/cached_reagent as anything in cached_reagents) //check for specific type or subtypes if(!include_subtypes) @@ -243,19 +244,26 @@ else if(!istype(cached_reagent, reagent_type)) continue + //reduce the volume remove_amount = min(cached_reagent.volume, amount) cached_reagent.volume -= remove_amount - update_total() - if(!safety)//So it does not handle reactions when it need not to - handle_reactions() - SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, QDELING(cached_reagent) ? reagent_type : cached_reagent, amount) - + //record the changes + removed_reagents += cached_reagent total_removed_amount += remove_amount //if we reached here means we have found our specific reagent type so break if(!include_subtypes) - return total_removed_amount + break + + //inform others about our reagents being removed + for(var/datum/reagent/removed_reagent as anything in cached_reagents) + SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, removed_reagent, amount) + + //update the holder & handle reactions + update_total() + if(!safety) + handle_reactions() return round(total_removed_amount, CHEMICAL_VOLUME_ROUNDING) @@ -432,8 +440,6 @@ target_holder = target.reagents target_atom = target - var/cached_amount = amount - // Prevents small amount problems, as well as zero and below zero amounts. amount = round(min(amount, total_volume, target_holder.maximum_volume - target_holder.total_volume), CHEMICAL_QUANTISATION_LEVEL) if(amount <= 0) @@ -469,7 +475,7 @@ if(preserve_data) trans_data = copy_data(reagent) - if(reagent.intercept_reagents_transfer(target_holder, cached_amount)) + if(reagent.intercept_reagents_transfer(target_holder, amount)) continue transfered_amount = target_holder.add_reagent(reagent.type, transfer_amount * multiplier, trans_data, chem_temp, reagent.purity, reagent.ph, no_react = TRUE, ignore_splitting = reagent.chemical_flags & REAGENT_DONOTSPLIT) //we only handle reaction after every reagent has been transferred. if(!transfered_amount) @@ -504,8 +510,6 @@ log_target.add_hiddenprint(transferred_by) //log prints so admins can figure out who touched it last. log_combat(transferred_by, log_target, "transferred reagents to", my_atom, "which had [get_external_reagent_log_string(transfer_log)]") - update_total() - target_holder.update_total() if(!no_react) target_holder.handle_reactions() src.handle_reactions() diff --git a/code/modules/reagents/chemistry/holder/reactions.dm b/code/modules/reagents/chemistry/holder/reactions.dm index 80241173deebf..3fbcb57a43424 100644 --- a/code/modules/reagents/chemistry/holder/reactions.dm +++ b/code/modules/reagents/chemistry/holder/reactions.dm @@ -339,6 +339,7 @@ my_atom.visible_message(span_notice("[iconhtml] \The [my_atom]'s power is consumed in the reaction.")) extract.name = "used slime extract" extract.desc = "This extract has been used up." + extract.grind_results.Cut() //finish the reaction selected_reaction.on_reaction(src, null, multiplier) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index cbd6449269ccc..22e569af66021 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -278,6 +278,9 @@ var/datum/reagents/holder = beaker.reagents var/to_dispense = max(0, min(amount, holder.maximum_volume - holder.total_volume)) + if(!to_dispense) + say("The container is full!") + return if(!cell.use(to_dispense * power_cost)) say("Not enough energy to complete operation!") return diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 11947c7060271..576d62585f7a8 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -250,7 +250,9 @@ Primarily used in reagents/reaction_agents /// Should return a associative list where keys are taste descriptions and values are strength ratios /datum/reagent/proc/get_taste_description(mob/living/taster) - return list("[taste_description]" = 1) + if(isnull(taster) || !HAS_TRAIT(taster, TRAIT_DETECTIVES_TASTE)) + return list("[taste_description]" = 1) + return list("[LOWER_TEXT(name)]" = 1) /** * Used when you want the default reagents purity to be equal to the normal effects diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 2e45ecf641bc1..7c9042314458d 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -140,6 +140,7 @@ brute_heal = 0.8 //Rewards the player for eating a balanced diet. nutriment_factor = 9 //45% as calorie dense as oil. chemical_flags = REAGENT_CAN_BE_SYNTHESIZED + default_container = /obj/item/reagent_containers/condiment/protein /datum/reagent/consumable/nutriment/fat name = "Fat" diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 505647fe332aa..df7f222a496fe 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1379,7 +1379,7 @@ . = ..() affected_mob.add_traits(list(TRAIT_SLEEPIMMUNE, TRAIT_BATON_RESISTANCE), type) affected_mob.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) - RegisterSignal(affected_mob, COMSIG_CARBON_ENTER_STAMCRIT, PROC_REF(on_stamcrit)) + RegisterSignal(affected_mob, COMSIG_LIVING_ENTER_STAMCRIT, PROC_REF(on_stamcrit)) /datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/affected_mob) . = ..() @@ -1387,7 +1387,7 @@ affected_mob.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) affected_mob.remove_status_effect(/datum/status_effect/dizziness) affected_mob.remove_status_effect(/datum/status_effect/jitter) - UnregisterSignal(affected_mob, COMSIG_CARBON_ENTER_STAMCRIT) + UnregisterSignal(affected_mob, COMSIG_LIVING_ENTER_STAMCRIT) /datum/reagent/medicine/changelingadrenaline/proc/on_stamcrit(mob/living/affected_mob) SIGNAL_HANDLER diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index df14037ac1e8f..29822e3158bec 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -127,6 +127,16 @@ if(data["blood_DNA"]) bloodsplatter.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"])) +/datum/reagent/blood/get_taste_description(mob/living/taster) + if(isnull(taster)) + return ..() + if(!HAS_TRAIT(taster, TRAIT_DETECTIVES_TASTE)) + return ..() + var/blood_type = data?["blood_type"] + if(!blood_type) + return ..() + return list("[blood_type] type blood" = 1) + /datum/reagent/consumable/liquidgibs name = "Liquid Gibs" color = "#CC4633" @@ -871,7 +881,7 @@ return to_chat(affected_mob, span_warning("You grit your teeth in pain as your body rapidly mutates!")) affected_mob.visible_message("[affected_mob] suddenly transforms!") - randomize_human(affected_mob) + randomize_human_normie(affected_mob) /datum/reagent/aslimetoxin name = "Advanced Mutation Toxin" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index e1d78353bca28..e95b5eea82089 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -266,9 +266,6 @@ reagents.expose_temperature(1000) return ..() | COMPONENT_MICROWAVE_SUCCESS -/obj/item/reagent_containers/fire_act(temperature, volume) - reagents.expose_temperature(temperature) - /// Updates the icon of the container when the reagents change. Eats signal args /obj/item/reagent_containers/proc/on_reagent_change(datum/reagents/holder, ...) SIGNAL_HANDLER diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index ccabc2c410646..c8652afda8f0e 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -368,6 +368,13 @@ list_reagents = list(/datum/reagent/consumable/grounding_solution = 50) fill_icon_thresholds = null +/obj/item/reagent_containers/condiment/protein + name = "protein powder" + desc = "Fuel for your inner Hulk - because you can't spell 'swole' without 'whey'!" + icon_state = "protein" + list_reagents = list(/datum/reagent/consumable/nutriment/protein = 40) + fill_icon_thresholds = null + //technically condiment packs but they are non transparent /obj/item/reagent_containers/condiment/creamer diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm index fb3aa38271802..87df7765233ec 100644 --- a/code/modules/reagents/reagent_containers/cups/_cup.dm +++ b/code/modules/reagents/reagent_containers/cups/_cup.dm @@ -228,6 +228,8 @@ worn_icon_state = "beaker" custom_materials = list(/datum/material/glass=SMALL_MATERIAL_AMOUNT*5) fill_icon_thresholds = list(0, 1, 20, 40, 60, 80, 100) + pickup_sound = 'sound/items/handling/beaker_pickup.ogg' + drop_sound = 'sound/items/handling/beaker_place.ogg' /obj/item/reagent_containers/cup/beaker/Initialize(mapload) . = ..() diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm index a293aac7aa1b1..b246cc01e07e9 100644 --- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm +++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm @@ -42,9 +42,8 @@ /obj/item/reagent_containers/cup/glass/bottle/Initialize(mapload, vol) . = ..() - AddComponent(/datum/component/slapcrafting,\ - slapcraft_recipes = list(/datum/crafting_recipe/molotov)\ - ) + var/static/list/recipes = list(/datum/crafting_recipe/molotov) + AddElement(/datum/element/slapcrafting, recipes) /obj/item/reagent_containers/cup/glass/bottle/small name = "small glass bottle" diff --git a/code/modules/reagents/reagent_containers/cups/soda.dm b/code/modules/reagents/reagent_containers/cups/soda.dm index 5bf0eb782c54d..2e85b2273f45e 100644 --- a/code/modules/reagents/reagent_containers/cups/soda.dm +++ b/code/modules/reagents/reagent_containers/cups/soda.dm @@ -23,9 +23,7 @@ /obj/item/reagent_containers/cup/soda_cans/Initialize(mapload, vol) . = ..() - AddComponent(/datum/component/slapcrafting,\ - slapcraft_recipes = list(/datum/crafting_recipe/improv_explosive)\ - ) + AddElement(/datum/element/slapcrafting, string_list(list(/datum/crafting_recipe/improv_explosive))) /obj/item/reagent_containers/cup/soda_cans/random/Initialize(mapload) ..() diff --git a/code/modules/recycling/disposal/construction.dm b/code/modules/recycling/disposal/construction.dm index 903a59a930557..13f43b1f4a419 100644 --- a/code/modules/recycling/disposal/construction.dm +++ b/code/modules/recycling/disposal/construction.dm @@ -109,7 +109,7 @@ var/turf/T = get_turf(src) if(T.underfloor_accessibility < UNDERFLOOR_INTERACTABLE && isfloorturf(T)) - var/obj/item/crowbar/held_crowbar = user.is_holding_item_of_type(/obj/item/crowbar) + var/obj/item/crowbar/held_crowbar = user.is_holding_tool_quality(TOOL_CROWBAR) if(!held_crowbar || !T.crowbar_act(user, held_crowbar)) to_chat(user, span_warning("You can only attach the [pipename] if the floor plating is removed!")) return TRUE diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm index c370424fa7d2c..b256b4f9d4ac3 100644 --- a/code/modules/religion/burdened/psyker.dm +++ b/code/modules/religion/burdened/psyker.dm @@ -252,7 +252,7 @@ ricochet_auto_aim_angle = 10 ricochet_auto_aim_range = 3 wound_bonus = -10 - embedding = null + embed_type = null /obj/projectile/bullet/c38/holy/on_hit(atom/target, blocked, pierce_hit) . = ..() diff --git a/code/modules/research/designs/autolathe/engineering_designs.dm b/code/modules/research/designs/autolathe/engineering_designs.dm index dc87b747959ca..c376a1ac1c55a 100644 --- a/code/modules/research/designs/autolathe/engineering_designs.dm +++ b/code/modules/research/designs/autolathe/engineering_designs.dm @@ -10,18 +10,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING -/datum/design/sparker - name = "Sparker WallFrame" - id = "sparker" - build_type = PROTOLATHE | AWAY_LATHE | AUTOLATHE - materials = list(/datum/material/iron = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT) - build_path = /obj/item/wallframe/sparker - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - /datum/design/tracker_electronics name = "Solar Tracking Electronics" id = "solar_tracker" @@ -95,18 +83,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING -/datum/design/turret_control_frame - name = "Turret Control Frame" - id = "turret_control" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*6) - build_path = /obj/item/wallframe/turret_control - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - /datum/design/large_welding_tool name = "Industrial Welding Tool" id = "large_welding_tool" @@ -119,55 +95,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING -/datum/design/camera_assembly - name = "Camera Assembly" - id = "camera_assembly" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*4, /datum/material/glass = SMALL_MATERIAL_AMOUNT*2.5) - build_path = /obj/item/wallframe/camera - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/newscaster_frame - name = "Newscaster Frame" - id = "newscaster_frame" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*7, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4) - build_path = /obj/item/wallframe/newscaster - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/status_display_frame - name = "Status Display Frame" - id = "status_display_frame" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*7, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4) - build_path = /obj/item/wallframe/status_display - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - - -/datum/design/intercom_frame - name = "Intercom Frame" - id = "intercom_frame" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*0.75, /datum/material/glass =SMALL_MATERIAL_AMOUNT*0.25) - build_path = /obj/item/wallframe/intercom - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - /datum/design/earmuffs name = "Earmuffs" id = "earmuffs" @@ -323,130 +250,3 @@ RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ATMOSPHERICS, ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/requests_console - name = "Requests Console Frame" - id = "requests_console" - build_type = AUTOLATHE | PROTOLATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*7, /datum/material/glass = SHEET_MATERIAL_AMOUNT*4) - build_path = /obj/item/wallframe/requests_console - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/light_switch_frame - name = "Light Switch Frame" - id = "light_switch_frame" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT*0.75, /datum/material/glass =SMALL_MATERIAL_AMOUNT*0.25) - build_path = /obj/item/wallframe/light_switch - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/telescreen_turbine - name = "Turbine Telescreen" - id = "telescreen_turbine" - build_type = PROTOLATHE - materials = list( - /datum/material/iron = SHEET_MATERIAL_AMOUNT*5, - /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, - ) - build_path = /obj/item/wallframe/telescreen/turbine - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/telescreen_engine - name = "Engine Telescreen" - id = "telescreen_engine" - build_type = PROTOLATHE - materials = list( - /datum/material/iron = SHEET_MATERIAL_AMOUNT*5, - /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, - ) - build_path = /obj/item/wallframe/telescreen/engine - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/telescreen_auxbase - name = "Auxiliary Base Telescreen" - id = "telescreen_auxbase" - build_type = PROTOLATHE - materials = list( - /datum/material/iron = SHEET_MATERIAL_AMOUNT*5, - /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2.5, - ) - build_path = /obj/item/wallframe/telescreen/auxbase - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/tram_controller - name = "Tram Controller Cabinet" - id = "tram_controller" - build_type = PROTOLATHE - materials = list( - /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, - /datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, - /datum/material/gold = SHEET_MATERIAL_AMOUNT * 7, - /datum/material/silver = SHEET_MATERIAL_AMOUNT * 7, - /datum/material/diamond = SHEET_MATERIAL_AMOUNT * 4, - ) - build_path = /obj/item/wallframe/tram/controller - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/tram_display - name = "Tram Indicator Display" - id = "tram_display" - build_type = PROTOLATHE - materials = list( - /datum/material/titanium = SHEET_MATERIAL_AMOUNT * 4, - /datum/material/iron = SHEET_MATERIAL_AMOUNT * 1, - /datum/material/glass =SHEET_MATERIAL_AMOUNT * 2, - ) - build_path = /obj/item/wallframe/indicator_display - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MOUNTS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/tram_floor_dark - name = "Dark Tram Tile" - id = "tram_floor_dark" - build_type = PROTOLATHE - materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 0.25) - build_path = /obj/item/stack/thermoplastic - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING - -/datum/design/tram_floor_light - name = "Light Tram Tile" - id = "tram_floor_light" - build_type = PROTOLATHE - materials = list(/datum/material/plastic = SHEET_MATERIAL_AMOUNT * 0.25) - build_path = /obj/item/stack/thermoplastic/light - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING diff --git a/code/modules/research/designs/autolathe/multi-department_designs.dm b/code/modules/research/designs/autolathe/multi-department_designs.dm index ea1c94ff89c27..734dcbc97e084 100644 --- a/code/modules/research/designs/autolathe/multi-department_designs.dm +++ b/code/modules/research/designs/autolathe/multi-department_designs.dm @@ -483,43 +483,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE -/datum/design/circuit - name = "Blue Circuit Tile" - id = "circuit" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/stack/tile/circuit - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE - - -/datum/design/circuitgreen - name = "Green Circuit Tile" - id = "circuitgreen" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/stack/tile/circuit/green - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE - -/datum/design/circuitred - name = "Red Circuit Tile" - id = "circuitred" - build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron =SMALL_MATERIAL_AMOUNT*5, /datum/material/glass =SMALL_MATERIAL_AMOUNT*5) - build_path = /obj/item/stack/tile/circuit/red - category = list( - RND_CATEGORY_INITIAL, - RND_CATEGORY_CONSTRUCTION + RND_SUBCATEGORY_CONSTRUCTION_MATERIALS, - ) - departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE - /datum/design/conveyor_belt name = "Conveyor Belt" id = "conveyor_belt" diff --git a/code/modules/research/designs/computer_part_designs.dm b/code/modules/research/designs/computer_part_designs.dm index 8dab08c046d45..7a8242642a13a 100644 --- a/code/modules/research/designs/computer_part_designs.dm +++ b/code/modules/research/designs/computer_part_designs.dm @@ -5,10 +5,11 @@ /datum/design/portabledrive/basic name = "Data Disk" id = "portadrive_basic" - build_type = IMPRINTER | AWAY_IMPRINTER - materials = list(/datum/material/glass = SMALL_MATERIAL_AMOUNT*8) + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT) build_path = /obj/item/computer_disk category = list( + RND_CATEGORY_INITIAL, RND_CATEGORY_MODULAR_COMPUTERS + RND_SUBCATEGORY_MODULAR_COMPUTERS_PARTS ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING @@ -16,10 +17,11 @@ /datum/design/portabledrive/advanced name = "Advanced Data Disk" id = "portadrive_advanced" - build_type = IMPRINTER | AWAY_IMPRINTER - materials = list(/datum/material/glass = HALF_SHEET_MATERIAL_AMOUNT*1.5) + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 2) build_path = /obj/item/computer_disk/advanced category = list( + RND_CATEGORY_INITIAL, RND_CATEGORY_MODULAR_COMPUTERS + RND_SUBCATEGORY_MODULAR_COMPUTERS_PARTS ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING @@ -27,10 +29,11 @@ /datum/design/portabledrive/super name = "Super Data Disk" id = "portadrive_super" - build_type = IMPRINTER | AWAY_IMPRINTER - materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT*1.5) + build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/glass = SHEET_MATERIAL_AMOUNT * 4) build_path = /obj/item/computer_disk/super category = list( + RND_CATEGORY_INITIAL, RND_CATEGORY_MODULAR_COMPUTERS + RND_SUBCATEGORY_MODULAR_COMPUTERS_PARTS ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 8f857f77e8286..b8b11e7b44f67 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -582,6 +582,16 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE +/datum/design/board/vatgrower + name = "Growing Vat Board" + desc = "The circuit board for a growing vat." + id = "vatgrower" + build_path = /obj/item/circuitboard/machine/vatgrower + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_RESEARCH + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + /datum/design/board/monkey_recycler name = "Monkey Recycler Board" desc = "The circuit board for a monkey recycler." @@ -1178,6 +1188,36 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING +/datum/design/board/scrubber + name = "Portable Air Scrubber Board" + desc = "The circuit board for a portable air scrubber." + id = "scrubber" + build_path = /obj/item/circuitboard/machine/scrubber + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/board/pump + name = "Portable Air Pump Board" + desc = "The circuit board for a portable air pump." + id = "pump" + build_path = /obj/item/circuitboard/machine/pump + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/board/pipe_scrubber + name = "Portable Pipe Scrubber Board" + desc = "The circuit board for a portable pipe scrubber." + id = "pipe_scrubber" + build_path = /obj/item/circuitboard/machine/pipe_scrubber + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ATMOS + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING + /datum/design/board/bookbinder name = "Book Binder" desc = "The circuit board for a book binder" diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 0583269f1c6be..19b3403908f81 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -907,6 +907,104 @@ RND_CATEGORY_MECHFAB_SAVANNAH_IVANOV + RND_SUBCATEGORY_MECHFAB_CHASSIS ) +//Justice (emaged only) +/datum/design/justice_chassis + name = "Exosuit Chassis (\"Justice\")" + id = "justice_chassis" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/chassis/justice + materials = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT*20) + construction_time = 10 SECONDS + category = list( + RND_CATEGORY_MECHFAB_JUSTICE + RND_SUBCATEGORY_MECHFAB_CHASSIS + ) + +/datum/design/justice_torso + name = "Exosuit Torso (\"Justice\")" + id = "justice_torso" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/part/justice_torso + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 50, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 5, + ) + construction_time = 30 SECONDS + category = list( + RND_CATEGORY_MECHFAB_JUSTICE + RND_SUBCATEGORY_MECHFAB_CHASSIS + ) + +/datum/design/justice_left_arm + name = "Exosuit Left Arm (\"Justice\")" + id = "justice_left_arm" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/part/justice_left_arm + materials = list( + /datum/material/iron = SHEET_MATERIAL_AMOUNT * 5, + /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2, + ) + construction_time = 10 SECONDS + category = list( + RND_CATEGORY_MECHFAB_JUSTICE + RND_SUBCATEGORY_MECHFAB_CHASSIS + ) + +/datum/design/justice_right_arm + name = "Exosuit Right Arm (\"Justice\")" + id = "justice_right_arm" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/part/justice_right_arm + materials = list( + /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, + /datum/material/silver=SHEET_MATERIAL_AMOUNT*2, + ) + construction_time = 10 SECONDS + category = list( + RND_CATEGORY_MECHFAB_JUSTICE + RND_SUBCATEGORY_MECHFAB_CHASSIS + ) + +/datum/design/justice_left_leg + name = "Exosuit Left Leg (\"Justice\")" + id = "justice_left_leg" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/part/justice_left_leg + materials = list( + /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, + /datum/material/titanium=SHEET_MATERIAL_AMOUNT*2, + ) + construction_time = 10 SECONDS + category = list( + RND_CATEGORY_MECHFAB_JUSTICE + RND_SUBCATEGORY_MECHFAB_CHASSIS + ) + +/datum/design/justice_right_leg + name = "Exosuit Right Leg (\"Justice\")" + id = "justice_right_leg" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/part/justice_right_leg + materials = list( + /datum/material/iron=SHEET_MATERIAL_AMOUNT*5, + /datum/material/titanium=SHEET_MATERIAL_AMOUNT*2, + ) + construction_time = 10 SECONDS + category = list( + RND_CATEGORY_MECHFAB_JUSTICE + RND_SUBCATEGORY_MECHFAB_CHASSIS + ) + +/datum/design/justice_armor + name = "Exosuit Armor (\"Justice\")" + id = "justice_armor" + build_type = MECHFAB + build_path = /obj/item/mecha_parts/part/justice_armor + materials = list( + /datum/material/silver=SHEET_MATERIAL_AMOUNT*10, + /datum/material/titanium=SHEET_MATERIAL_AMOUNT*10, + /datum/material/plastic=SHEET_MATERIAL_AMOUNT*5, + /datum/material/diamond=SHEET_MATERIAL_AMOUNT*1, + ) + construction_time = 20 SECONDS + category = list( + RND_CATEGORY_MECHFAB_JUSTICE + RND_SUBCATEGORY_MECHFAB_CHASSIS + ) + //Clarke /datum/design/clarke_chassis name = "Exosuit Chassis (\"Clarke\")" @@ -2338,14 +2436,14 @@ RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_SUPPLY ) -/datum/design/module/mod_organ_thrower - name = "Organ Thrower Module" - id = "mod_organ_thrower" +/datum/design/module/mod_organizer + name = "Organizer Module" + id = "mod_organizer" materials = list( /datum/material/iron =HALF_SHEET_MATERIAL_AMOUNT, /datum/material/glass =HALF_SHEET_MATERIAL_AMOUNT, ) - build_path = /obj/item/mod/module/organ_thrower + build_path = /obj/item/mod/module/organizer category = list( RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_MEDICAL ) @@ -2512,6 +2610,18 @@ RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_SECURITY ) +/datum/design/module/mirage + name = "Mirage Grenade Dispenser Module" + id = "mod_mirage_grenade" + materials = list( + /datum/material/iron =HALF_SHEET_MATERIAL_AMOUNT, + /datum/material/bluespace =HALF_SHEET_MATERIAL_AMOUNT, + ) + build_path = /obj/item/mod/module/dispenser/mirage + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_SECURITY + ) + //MODsuit bepis modules /datum/design/module/disposal name = "Disposal Connector Module" diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 0ea6c41e16448..d9feba5179e08 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -166,18 +166,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE -/datum/design/air_horn - name = "Air Horn" - desc = "Damn son, where'd you find this?" - id = "air_horn" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*2, /datum/material/bananium =HALF_SHEET_MATERIAL_AMOUNT) - build_path = /obj/item/bikehorn/airhorn - category = list( - RND_CATEGORY_EQUIPMENT + RND_SUBCATEGORY_EQUIPMENT_SERVICE - ) - departmental_flags = DEPARTMENT_BITFLAG_SERVICE - /datum/design/clown_firing_pin name = "Hilarious Firing Pin" id = "clown_firing_pin" diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index 649d0c5c09dfc..901bc304dc1d7 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -226,17 +226,6 @@ ) departmental_flags = DEPARTMENT_BITFLAG_SERVICE -/datum/design/plumbing_rcd_sci - name = "Research Plumbing Constructor" - id = "plumbing_rcd_sci" - build_type = PROTOLATHE | AWAY_LATHE - materials = list(/datum/material/iron =SHEET_MATERIAL_AMOUNT*37.5, /datum/material/glass =SHEET_MATERIAL_AMOUNT*18.75, /datum/material/plastic =HALF_SHEET_MATERIAL_AMOUNT) - build_path = /obj/item/construction/plumbing/research - category = list( - RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_PLUMBING - ) - departmental_flags = DEPARTMENT_BITFLAG_SCIENCE - /datum/design/plumbing_rcd_service name = "Service Plumbing Constructor" id = "plumbing_rcd_service" diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 35d95d82d3047..f0e0978a6074a 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -449,3 +449,15 @@ RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_RANGED ) departmental_flags = DEPARTMENT_BITFLAG_SECURITY + +/datum/design/photon_cannon + name = "Photon Cannon Part Kit (Nonlethal)" + desc = "A kit to reverse-engineer a photon cannon, a weapon that generates a shortly-lived miniature sun. Technically brightens up the room, effectively blinds everyone in it. Requires a flux anomaly core to finish." + id = "photon_cannon" + build_type = PROTOLATHE | AWAY_LATHE + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 7, /datum/material/gold = SHEET_MATERIAL_AMOUNT * 5) + build_path = /obj/item/weaponcrafting/gunkit/photon + category = list( + RND_CATEGORY_WEAPONS + RND_SUBCATEGORY_WEAPONS_KITS + ) + departmental_flags = DEPARTMENT_BITFLAG_SECURITY diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index affe82275ab14..2d0ba7017d27b 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -461,9 +461,9 @@ 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) + var/obj/item/relic/loaded_artifact = loaded_item + loaded_artifact.reveal() + investigate_log("Experimentor has revealed a relic with [span_danger("[loaded_artifact.hidden_power]")] effect.", INVESTIGATE_EXPERIMENTOR) ejectItem() //Global reactions @@ -553,34 +553,74 @@ #undef FAIL -//////////////////////////////////SPECIAL ITEMS//////////////////////////////////////// +// Relic \\ /obj/item/relic name = "strange object" desc = "What mysteries could this hold? Maybe Research & Development could find out." - icon = 'icons/obj/devices/assemblies.dmi' - var/realName = "defined object" - var/revealed = FALSE - var/realProc - var/reset_timer = 60 + icon = 'icons/obj/devices/artefacts.dmi' + icon_state = "debug_artefact" + //The name this artefact will have when it's activated. + var/real_name = "artefact" + //Has this artefact been activated? + var/activated = FALSE + //What effect this artefact has when used. Randomly determined when activated. + var/hidden_power + //Minimum possible cooldown. + var/min_cooldown = 6 SECONDS + //Max possible cooldown. + var/max_cooldown = 30 SECONDS + //Cooldown length. Randomly determined at activation if it isn't determined here. + var/cooldown_timer COOLDOWN_DECLARE(cooldown) + //What visual theme this artefact has. Current possible choices: "prototype", "necrotech" + var/artifact_theme = "prototype" /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")]" + random_themed_appearance() + +/obj/item/relic/proc/random_themed_appearance() + var/themed_name_prefix + var/themed_name_suffix + if(artifact_theme == "prototype") + icon_state = pick("prototype1", "prototype2", "prototype3", "prototype4", "prototype5", "prototype6", "prototype7", "prototype8","prototype9") + themed_name_prefix = pick("experimental","prototype","artificial","handcrafted","ramshackle","odd") + themed_name_suffix = pick("device","assembly","gadget","gizmo","contraption","machine","widget","object") + real_name = "[pick(themed_name_prefix)] [pick(themed_name_suffix)]" + name = "strange [pick(themed_name_suffix)]" + if(artifact_theme == "necrotech") + icon_state = pick("necrotech1", "necrotech2", "necrotech3", "necrotech4", "necrotech5", "necrotech6") + themed_name_prefix = pick("dark","bloodied","unholy","archeotechnological","dismal","ruined","thrumming") + themed_name_suffix = pick("instrument","shard","fetish","bibelot","trinket","offering","relic") + real_name = "[pick(themed_name_prefix)] [pick(themed_name_suffix)]" + name = "strange relic" + update_appearance() +/obj/item/relic/lavaland + name = "strange relic" + artifact_theme = "necrotech" /obj/item/relic/proc/reveal() - if(revealed) //Re-rolling your relics seems a bit overpowered, yes? + if(activated) //no rerolling 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)) + activated = TRUE + name = real_name + if(!cooldown_timer) + cooldown_timer = rand(min_cooldown, max_cooldown) + if(!hidden_power) + hidden_power = pick( + PROC_REF(corgi_cannon), + PROC_REF(cleaning_foam), + PROC_REF(flashbanger), + PROC_REF(summon_animals), + PROC_REF(uncontrolled_teleport), + PROC_REF(heat_and_explode), + PROC_REF(rapid_self_dupe), + ) /obj/item/relic/attack_self(mob/user) - if(!revealed) + if(!activated) 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)) @@ -588,40 +628,39 @@ return if(loc != user) return - COOLDOWN_START(src, cooldown, reset_timer) - call(src,realProc)(user) - -//////////////// RELIC PROCS ///////////////////////////// + COOLDOWN_START(src, cooldown, cooldown_timer) + call(src, hidden_power)(user) -/obj/item/relic/proc/throwSmoke(turf/where) +/obj/item/relic/proc/throw_smoke(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) +// Artefact Powers \\ + +/obj/item/relic/proc/corgi_cannon(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)) + sad_corgi.throw_at(pick(oview(10,user)), 10, rand(3,8), callback = CALLBACK(src, PROC_REF(throw_smoke), sad_corgi)) warn_admins(user, "Corgi Cannon", 0) -/obj/item/relic/proc/clean(mob/user) +/obj/item/relic/proc/cleaning_foam(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) + var/obj/item/grenade/chem_grenade/cleaner/spawned_foamer = new/obj/item/grenade/chem_grenade/cleaner(get_turf(user)) + spawned_foamer.detonate() + qdel(spawned_foamer) warn_admins(user, "Foam", 0) -/obj/item/relic/proc/flash(mob/user) +/obj/item/relic/proc/flashbanger(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() + var/obj/item/grenade/flashbang/spawned_flashbang = new/obj/item/grenade/flashbang(user.loc) + spawned_flashbang.detonate() warn_admins(user, "Flash") -/obj/item/relic/proc/petSpray(mob/user) +/obj/item/relic/proc/summon_animals(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, @@ -637,42 +676,40 @@ /mob/living/basic/pet/fox, ) for(var/counter in 1 to rand(1, 25)) - var/mobType = pick(valid_animals) - new mobType(get_turf(src)) - + var/animal_spawn = pick(valid_animals) + new animal_spawn(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) +/obj/item/relic/proc/rapid_self_dupe(mob/user) audible_message("[src] emits a loud pop!") - var/list/dupes = list() + var/list/dummy_artifacts = 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)) + var/obj/item/relic/duped = new type(get_turf(src)) + duped.name = name + duped.desc = desc + duped.real_name = real_name + duped.hidden_power = hidden_power + duped.activated = TRUE + dummy_artifacts += duped + duped.throw_at(pick(oview(7,get_turf(src))),10,1) + QDEL_LIST_IN(dummy_artifacts, rand(1 SECONDS, 10 SECONDS)) warn_admins(user, "Rapid duplicator", 0) -/obj/item/relic/proc/explode(mob/user) +/obj/item/relic/proc/heat_and_explode(mob/user) to_chat(user, span_danger("[src] begins to heat up!")) - addtimer(CALLBACK(src, PROC_REF(do_explode), user), rand(3.5 SECONDS, 10 SECONDS)) + addtimer(CALLBACK(src, PROC_REF(blow_up), user), rand(3.5 SECONDS, 10 SECONDS)) -/obj/item/relic/proc/do_explode(mob/user) +/obj/item/relic/proc/blow_up(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) +/obj/item/relic/proc/uncontrolled_teleport(mob/user) to_chat(user, span_notice("[src] begins to vibrate!")) addtimer(CALLBACK(src, PROC_REF(do_the_teleport), user), rand(1 SECONDS, 3 SECONDS)) @@ -680,16 +717,16 @@ 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) + throw_smoke(userturf) do_teleport(user, userturf, 8, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - throwSmoke(get_turf(user)) + throw_smoke(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)]" +/obj/item/relic/proc/warn_admins(mob/user, relic_type, priority = 1) + var/turf/location = get_turf(src) + var/log_msg = "[relic_type] relic used by [key_name(user)] in [AREACOORD(location)]" 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)]") + message_admins("[relic_type] relic activated by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(location)]") log_game(log_msg) investigate_log(log_msg, "experimentor") diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm index 069447c6f4539..0cfca236d24c3 100644 --- a/code/modules/research/rdmachines.dm +++ b/code/modules/research/rdmachines.dm @@ -72,7 +72,7 @@ return CONTEXTUAL_SCREENTIP_SET else if(held_item.tool_behaviour == TOOL_MULTITOOL) - var/obj/item/multitool/tool = held_item + var/obj/item/multitool/tool = held_item.get_proxy_attacker_for(src, user) if(!QDELETED(tool.buffer) && istype(tool.buffer, /datum/techweb)) context[SCREENTIP_CONTEXT_LMB] = "Upload Techweb" context[SCREENTIP_CONTEXT_RMB] = "Upload Techweb" diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index c36eb88627137..7714946a4d290 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -40,6 +40,8 @@ var/list/experiments_to_unlock = list() /// Whether or not this node should show on the wiki var/show_on_wiki = TRUE + /// Hidden Mech nodes unlocked when mech fabricator emaged. + var/illegal_mech_node = FALSE /datum/techweb_node/error_node id = "ERROR" diff --git a/code/modules/research/techweb/nodes/atmos_nodes.dm b/code/modules/research/techweb/nodes/atmos_nodes.dm index e2f29171d9d98..ef4fee5ed92a7 100644 --- a/code/modules/research/techweb/nodes/atmos_nodes.dm +++ b/code/modules/research/techweb/nodes/atmos_nodes.dm @@ -8,6 +8,7 @@ "atmosalerts", "thermomachine", "space_heater", + "scrubber", "generic_tank", "oxygen_tank", "plasma_tank", @@ -27,6 +28,7 @@ prereq_ids = list(TECHWEB_NODE_ATMOS) design_ids = list( "tank_compressor", + "pump", "emergency_oxygen", "emergency_oxygen_engi", "power_turbine_console", @@ -47,8 +49,8 @@ description = "Experiments with high-pressure gases and electricity resulting in crystallization and controlled plasma reactions." prereq_ids = list(TECHWEB_NODE_GAS_COMPRESSION, TECHWEB_NODE_ENERGY_MANIPULATION) design_ids = list( - "crystallizer", "electrolyzer", + "pipe_scrubber", "pacman", "mech_generator", "plasmacutter", @@ -68,9 +70,11 @@ "HFR_interface", "HFR_moderator_input", "HFR_waste_output", + "adv_fire_extinguisher", "bolter_wrench", "rpd_loaded", "engine_goggles", + "crystallizer", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/ordnance/gaseous/bz) @@ -88,18 +92,18 @@ "jawsoflife", "rangedanalyzer", "rtd_loaded", + "mech_rcd", "rcd_loaded", "rcd_ammo", "weldingmask", "magboots", - "adv_fire_extinguisher", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) discount_experiments = list(/datum/experiment/ordnance/gaseous/noblium = TECHWEB_TIER_4_POINTS) /datum/techweb_node/rcd_upgrade id = TECHWEB_NODE_RCD_UPGRADE - display_name = "Rapid Device Upgrade Designs" + display_name = "Rapid Construction Device Upgrades" description = "New designs and enhancements for RCD and RPD." prereq_ids = list(TECHWEB_NODE_EXP_TOOLS, TECHWEB_NODE_PARTS_BLUESPACE) design_ids = list( diff --git a/code/modules/research/techweb/nodes/bepis_nodes.dm b/code/modules/research/techweb/nodes/bepis_nodes.dm index ad5bb4c62bb1b..baefd8c11d048 100644 --- a/code/modules/research/techweb/nodes/bepis_nodes.dm +++ b/code/modules/research/techweb/nodes/bepis_nodes.dm @@ -5,6 +5,7 @@ design_ids = list( "bright_helmet", "rld_mini", + "photon_cannon", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) hidden = TRUE diff --git a/code/modules/research/techweb/nodes/biology_nodes.dm b/code/modules/research/techweb/nodes/biology_nodes.dm index f8ee05c042c2e..3599dfb9fc5a1 100644 --- a/code/modules/research/techweb/nodes/biology_nodes.dm +++ b/code/modules/research/techweb/nodes/biology_nodes.dm @@ -23,6 +23,7 @@ design_ids = list( "limbgrower", "pandemic", + "vatgrower", "petri_dish", "swab", "biopsy_tool", @@ -43,7 +44,7 @@ "limbdesign_plasmaman", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - required_experiments = list(/datum/experiment/scanning/random/cytology) + required_experiments = list(/datum/experiment/scanning/cytology/slime) /datum/techweb_node/gene_engineering id = TECHWEB_NODE_GENE_ENGINEERING @@ -58,7 +59,45 @@ "mod_dna_lock", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) - discount_experiments = list( - /datum/experiment/scanning/random/plants/traits = TECHWEB_TIER_2_POINTS, - /datum/experiment/scanning/points/slime/hard = TECHWEB_TIER_2_POINTS, - ) + discount_experiments = list(/datum/experiment/scanning/people/mutant = TECHWEB_TIER_4_POINTS) + +// Botany root node +/datum/techweb_node/botany_equip + id = TECHWEB_NODE_BOTANY_EQUIP + starting_node = TRUE + display_name = "Botany Equipment" + description = "Essential tools for maintaining onboard gardens, supporting plant growth in the unique environment of the space station." + design_ids = list( + "seed_extractor", + "plant_analyzer", + "watering_can", + "spade", + "cultivator", + "secateurs", + "hatchet", + ) + +/datum/techweb_node/hydroponics + id = TECHWEB_NODE_HYDROPONICS + display_name = "Hydroponics" + description = "Research into advanced hydroponic systems for efficient and sustainable plant cultivation." + prereq_ids = list(TECHWEB_NODE_BOTANY_EQUIP, TECHWEB_NODE_CHEM_SYNTHESIS) + design_ids = list( + "biogenerator", + "hydro_tray", + "portaseeder", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) + +/datum/techweb_node/selection + id = TECHWEB_NODE_SELECTION + display_name = "Artificial Selection" + description = "Advancement in plant cultivation techniques through artificial selection, enabling precise manipulation of plant DNA." + prereq_ids = list(TECHWEB_NODE_HYDROPONICS) + design_ids = list( + "flora_gun", + "gene_shears", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + required_experiments = list(/datum/experiment/scanning/random/plants/wild) + discount_experiments = list(/datum/experiment/scanning/random/plants/traits = TECHWEB_TIER_3_POINTS) diff --git a/code/modules/research/techweb/nodes/cyborg_nodes.dm b/code/modules/research/techweb/nodes/cyborg_nodes.dm index da9f485f2bf1f..447ee2dc7f3b9 100644 --- a/code/modules/research/techweb/nodes/cyborg_nodes.dm +++ b/code/modules/research/techweb/nodes/cyborg_nodes.dm @@ -19,6 +19,9 @@ "cybernetic_liver", "cybernetic_heart", ) + experiments_to_unlock = list( + /datum/experiment/scanning/people/android, + ) /datum/techweb_node/cybernetics id = TECHWEB_NODE_CYBERNETICS @@ -213,7 +216,7 @@ "cybernetic_liver_tier3", "cybernetic_heart_tier3", ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/scanning/people/augmented_organs) /datum/techweb_node/cyber/cyber_organs_adv @@ -229,3 +232,4 @@ "ci-xray-moth", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) + discount_experiments = list(/datum/experiment/scanning/people/android = TECHWEB_TIER_5_POINTS) diff --git a/code/modules/research/techweb/nodes/engi_nodes.dm b/code/modules/research/techweb/nodes/engi_nodes.dm index cb487f41b8db1..626dd6981d0ce 100644 --- a/code/modules/research/techweb/nodes/engi_nodes.dm +++ b/code/modules/research/techweb/nodes/engi_nodes.dm @@ -88,6 +88,7 @@ "comm_monitor", "comm_server", "message_monitor", + "ntnet_relay", "s_hub", "s_messaging", "s_server", @@ -142,16 +143,6 @@ "wirecutters", "light_bulb", "light_tube", - "intercom_frame", - "newscaster_frame", - "status_display_frame", - "circuit", - "circuitgreen", - "circuitred", - "tram_floor_dark", - "tram_floor_light", - "tram_controller", - "tram_display", "crossing_signal", "guideway_sensor", ) diff --git a/code/modules/research/techweb/nodes/mech_nodes.dm b/code/modules/research/techweb/nodes/mech_nodes.dm index 5f3d302132333..6b7a9803ae495 100644 --- a/code/modules/research/techweb/nodes/mech_nodes.dm +++ b/code/modules/research/techweb/nodes/mech_nodes.dm @@ -112,7 +112,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) required_experiments = list(/datum/experiment/scanning/random/mecha_equipped_scan) - discount_experiments = list(/datum/experiment/scanning/random/mecha_damage_scan = TECHWEB_TIER_2_POINTS) /datum/techweb_node/mech_assault id = TECHWEB_NODE_MECH_ASSAULT @@ -194,6 +193,22 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) +/datum/techweb_node/justice + id = "mecha_justice" + display_name = "EXOSUIT: Justice" + description = "Justice exosuit designs" + design_ids = list( + "justice_armor", + "justice_chassis", + "justice_left_arm", + "justice_left_leg", + "justice_right_arm", + "justice_right_leg", + "justice_torso", + ) + hidden = TRUE + illegal_mech_node = TRUE + /datum/techweb_node/mech_energy_guns id = TECHWEB_NODE_MECH_ENERGY_GUNS display_name = "Mech Energy Guns" @@ -206,6 +221,7 @@ "mech_tesla", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + discount_experiments = list(/datum/experiment/scanning/random/mecha_damage_scan = TECHWEB_TIER_4_POINTS) /datum/techweb_node/mech_firearms id = TECHWEB_NODE_MECH_FIREARMS @@ -246,6 +262,5 @@ "mech_gravcatapult", "mech_teleporter", "mech_wormhole_gen", - "mech_rcd", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) diff --git a/code/modules/research/techweb/nodes/medbay_nodes.dm b/code/modules/research/techweb/nodes/medbay_nodes.dm index 3f2239ced22e9..7d6db08f584e7 100644 --- a/code/modules/research/techweb/nodes/medbay_nodes.dm +++ b/code/modules/research/techweb/nodes/medbay_nodes.dm @@ -23,6 +23,8 @@ "stethoscope", "beaker", "large_beaker", + "chem_pack", + "blood_pack", "syringe", "dropper", "pillbottle", @@ -31,6 +33,8 @@ /datum/experiment/autopsy/human, /datum/experiment/autopsy/nonhuman, /datum/experiment/autopsy/xenomorph, + /datum/experiment/scanning/reagent/haloperidol, + /datum/experiment/scanning/reagent/cryostylane, ) /datum/techweb_node/chem_synthesis @@ -40,8 +44,6 @@ prereq_ids = list(TECHWEB_NODE_MEDBAY_EQUIP) design_ids = list( "xlarge_beaker", - "blood_pack", - "chem_pack", "med_spray_bottle", "medigel", "medipen_refiller", @@ -62,7 +64,6 @@ design_ids = list( "plumbing_rcd", "plumbing_rcd_service", - "plumbing_rcd_sci", "plunger", "fluid_ducts", "meta_beaker", @@ -70,27 +71,13 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) -/datum/techweb_node/cryostasis - id = TECHWEB_NODE_CRYOSTASIS - display_name = "Cryostasis" - description = "The result of clown accidentally drinking a chemical, now repurposed for safely preserving crew members in suspended animation." - prereq_ids = list(TECHWEB_NODE_PLUMBING, TECHWEB_NODE_PLASMA_CONTROL) - design_ids = list( - "cryotube", - "mech_sleeper", - "stasis", - "cryo_grenade", - "splitbeaker", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - required_experiments = list(/datum/experiment/scanning/reagent/cryostylane) - /datum/techweb_node/medbay_equip_adv id = TECHWEB_NODE_MEDBAY_EQUIP_ADV display_name = "Advanced Medbay Equipment" description = "State-of-the-art medical gear for keeping the crew in one piece — mostly." - prereq_ids = list(TECHWEB_NODE_CRYOSTASIS) + prereq_ids = list(TECHWEB_NODE_PLUMBING) design_ids = list( + "smoke_machine", "chem_mass_spec", "healthanalyzer_advanced", "mod_health_analyzer", @@ -99,4 +86,20 @@ "defibmount", "medicalbed_emergency", ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) + required_experiments = list(/datum/experiment/scanning/reagent/haloperidol) + +/datum/techweb_node/cryostasis + id = TECHWEB_NODE_CRYOSTASIS + display_name = "Cryostasis" + description = "The result of clown accidentally drinking a chemical, now repurposed for safely preserving crew members in suspended animation." + prereq_ids = list(TECHWEB_NODE_FUSION) + design_ids = list( + "cryotube", + "mech_sleeper", + "stasis", + "cryo_grenade", + "splitbeaker", + ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + discount_experiments = list(/datum/experiment/scanning/reagent/cryostylane = TECHWEB_TIER_4_POINTS) diff --git a/code/modules/research/techweb/nodes/modsuit_nodes.dm b/code/modules/research/techweb/nodes/modsuit_nodes.dm index 2e74663eed419..d4e30e9cd5d8f 100644 --- a/code/modules/research/techweb/nodes/modsuit_nodes.dm +++ b/code/modules/research/techweb/nodes/modsuit_nodes.dm @@ -58,7 +58,7 @@ "mod_plating_medical", "mod_quick_carry", "mod_injector", - "mod_organ_thrower", + "mod_organizer", "mod_patienttransport", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) @@ -83,6 +83,7 @@ description = "Security suits for space crime handling." prereq_ids = list(TECHWEB_NODE_MOD_EQUIP) design_ids = list( + "mod_mirage_grenade", "mod_plating_security", "mod_stealth", "mod_mag_harness", diff --git a/code/modules/research/techweb/nodes/research_nodes.dm b/code/modules/research/techweb/nodes/research_nodes.dm index 82a64f8c82338..0a37fb19868a3 100644 --- a/code/modules/research/techweb/nodes/research_nodes.dm +++ b/code/modules/research/techweb/nodes/research_nodes.dm @@ -13,7 +13,6 @@ "destructive_analyzer", "destructive_scanner", "experi_scanner", - "ntnet_relay", "laptop", "portadrive_basic", "portadrive_advanced", @@ -92,4 +91,5 @@ "gravitygun", "polymorph_belt" ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_5_POINTS) + discount_experiments = list(/datum/experiment/scanning/points/anomalies = TECHWEB_TIER_5_POINTS) diff --git a/code/modules/research/techweb/nodes/security_nodes.dm b/code/modules/research/techweb/nodes/security_nodes.dm index b876b3ec677ea..2d3dd63864f25 100644 --- a/code/modules/research/techweb/nodes/security_nodes.dm +++ b/code/modules/research/techweb/nodes/security_nodes.dm @@ -4,6 +4,7 @@ display_name = "Basic Arms" description = "Ballistics can be unpredictable in space." design_ids = list( + "toy_armblade", "toygun", "c38_rubber", "sec_38", @@ -21,7 +22,6 @@ description = "All the essentials to subdue a mime." prereq_ids = list(TECHWEB_NODE_BASIC_ARMS) design_ids = list( - "camera_assembly", "secdata", "mining", "prisonmanage", @@ -30,12 +30,10 @@ "security_photobooth", "photobooth", "scanner_gate", - "turret_control", "pepperspray", "dragnet_beacon", "inspector", "evidencebag", - "handcuffs_s", "zipties", "seclite", "electropack", @@ -48,10 +46,12 @@ description = "When you are on the opposing side of a revolutionary movement." prereq_ids = list(TECHWEB_NODE_SEC_EQUIP) design_ids = list( + "clown_firing_pin", "pin_testing", "pin_loyalty", "tele_shield", "ballistic_shield", + "handcuffs_s", "bola_energy", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) @@ -68,7 +68,6 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) required_experiments = list(/datum/experiment/ordnance/explosive/lowyieldbomb) - discount_experiments = list(/datum/experiment/ordnance/explosive/highyieldbomb = TECHWEB_TIER_3_POINTS) /datum/techweb_node/exotic_ammo id = TECHWEB_NODE_EXOTIC_AMMO @@ -81,6 +80,7 @@ "techshotshell", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_4_POINTS) + discount_experiments = list(/datum/experiment/ordnance/explosive/highyieldbomb = TECHWEB_TIER_4_POINTS) /datum/techweb_node/electric_weapons id = TECHWEB_NODE_ELECTRIC_WEAPONS diff --git a/code/modules/research/techweb/nodes/service_nodes.dm b/code/modules/research/techweb/nodes/service_nodes.dm index da7c48f0878c7..1553f3a0c20d8 100644 --- a/code/modules/research/techweb/nodes/service_nodes.dm +++ b/code/modules/research/techweb/nodes/service_nodes.dm @@ -52,19 +52,6 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) discount_experiments = list(/datum/experiment/scanning/random/janitor_trash = TECHWEB_TIER_2_POINTS) -/datum/techweb_node/toys - id = TECHWEB_NODE_TOYS - display_name = "New Toys" - description = "For new pranks." - prereq_ids = list(TECHWEB_NODE_OFFICE_EQUIP) - design_ids = list( - "smoke_machine", - "toy_armblade", - "air_horn", - "clown_firing_pin", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) - /datum/techweb_node/consoles id = TECHWEB_NODE_CONSOLES display_name = "Civilian Consoles" @@ -96,7 +83,7 @@ id = TECHWEB_NODE_GAMING display_name = "Gaming" description = "For the slackers on the station." - prereq_ids = list(TECHWEB_NODE_TOYS, TECHWEB_NODE_CONSOLES) + prereq_ids = list(TECHWEB_NODE_CONSOLES) design_ids = list( "arcade_battle", "arcade_orion", @@ -195,44 +182,3 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) // only available if you've done the first fishing experiment (thus unlocking fishing tech), but not a strict requirement to get the tech discount_experiments = list(/datum/experiment/scanning/fish/second = TECHWEB_TIER_3_POINTS) - -// Botany root node -/datum/techweb_node/botany_equip - id = TECHWEB_NODE_BOTANY_EQUIP - starting_node = TRUE - display_name = "Botany Equipment" - description = "Essential tools for maintaining onboard gardens, supporting plant growth in the unique environment of the space station." - design_ids = list( - "seed_extractor", - "plant_analyzer", - "watering_can", - "spade", - "cultivator", - "secateurs", - "hatchet", - ) - -/datum/techweb_node/hydroponics - id = TECHWEB_NODE_HYDROPONICS - display_name = "Hydroponics" - description = "Research into advanced hydroponic systems for efficient and sustainable plant cultivation." - prereq_ids = list(TECHWEB_NODE_BOTANY_EQUIP, TECHWEB_NODE_CHEM_SYNTHESIS) - design_ids = list( - "biogenerator", - "hydro_tray", - "portaseeder", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_2_POINTS) - -/datum/techweb_node/selection - id = TECHWEB_NODE_SELECTION - display_name = "Artificial Selection" - description = "Advancement in plant cultivation techniques through artificial selection, enabling precise manipulation of plant DNA." - prereq_ids = list(TECHWEB_NODE_HYDROPONICS) - design_ids = list( - "flora_gun", - "gene_shears", - ) - research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - required_experiments = list(/datum/experiment/scanning/random/plants/wild) - discount_experiments = list(/datum/experiment/scanning/random/plants/traits = TECHWEB_TIER_3_POINTS) diff --git a/code/modules/research/techweb/nodes/surgery_nodes.dm b/code/modules/research/techweb/nodes/surgery_nodes.dm index 2bd1f6d5df6d0..0b8812191e2a9 100644 --- a/code/modules/research/techweb/nodes/surgery_nodes.dm +++ b/code/modules/research/techweb/nodes/surgery_nodes.dm @@ -56,7 +56,7 @@ "surgery_viral_bond", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_3_POINTS) - required_experiments = list(/datum/experiment/autopsy/nonhuman) + discount_experiments = list(/datum/experiment/autopsy/nonhuman = TECHWEB_TIER_3_POINTS) /datum/techweb_node/surgery_tools id = TECHWEB_NODE_SURGERY_TOOLS diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index c174856a62a31..9bd9e2d881b1c 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -38,8 +38,13 @@ Slimecrossing Armor icon = 'icons/obj/science/slimecrossing.dmi' icon_state = "prismglasses" actions_types = list(/datum/action/item_action/change_prism_colour, /datum/action/item_action/place_light_prism) + forced_glass_color = TRUE var/glasses_color = COLOR_WHITE +/obj/item/clothing/glasses/prism_glasses/Initialize(mapload) + . = ..() + AddElement(/datum/element/wearable_client_colour, /datum/client_colour/glass_colour, ITEM_SLOT_EYES, glasses_color, forced_glass_color) + /obj/item/clothing/glasses/prism_glasses/item_action_slot_check(slot) if(slot & ITEM_SLOT_EYES) return TRUE @@ -76,7 +81,9 @@ Slimecrossing Armor var/new_color = input(owner, "Choose the lens color:", "Color change",glasses.glasses_color) as color|null if(!new_color) return + RemoveElement(/datum/element/wearable_client_colour, /datum/client_colour/glass_colour, ITEM_SLOT_EYES, glasses.glasses_color, glasses.forced_glass_color) glasses.glasses_color = new_color + AddElement(/datum/element/wearable_client_colour, /datum/client_colour/glass_colour, ITEM_SLOT_EYES, new_color, glasses.forced_glass_color) /datum/action/item_action/place_light_prism name = "Fabricate Light Prism" diff --git a/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm b/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm index 8b0b007adee40..d04a7f852da3f 100644 --- a/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm +++ b/code/modules/research/xenobiology/vatgrowing/biopsy_tool.dm @@ -1,7 +1,7 @@ ///Tool capable of taking biological samples from mobs /obj/item/biopsy_tool name = "biopsy tool" - desc = "Don't worry, it won't sting." + desc = "Used to retrieve cell lines from organisms. Don't worry, it won't sting." icon = 'icons/obj/science/vatgrowing.dmi' icon_state = "biopsy" worn_icon_state = "biopsy" diff --git a/code/modules/research/xenobiology/vatgrowing/microscope.dm b/code/modules/research/xenobiology/vatgrowing/microscope.dm index df065698436a4..c3c7369981e19 100644 --- a/code/modules/research/xenobiology/vatgrowing/microscope.dm +++ b/code/modules/research/xenobiology/vatgrowing/microscope.dm @@ -128,7 +128,5 @@ reqs = list( /obj/item/stack/sheet/glass = 1, /obj/item/stack/sheet/plastic = 1, - /obj/item/stock_parts/scanning_module = 1, - /obj/item/flashlight = 1, ) category = CAT_CHEMISTRY diff --git a/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm b/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm index b8af4dd062c41..46d643aa532a7 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/_micro_organism.dm @@ -31,7 +31,7 @@ var/resulting_atom_count = 1 ///Handles growth of the micro_organism. This only runs if the micro organism is in the growing vat. Reagents is the growing vats reagents -/datum/micro_organism/cell_line/proc/handle_growth(obj/machinery/plumbing/growing_vat/vat) +/datum/micro_organism/cell_line/proc/handle_growth(obj/machinery/vatgrower/vat) if(!try_eat(vat.reagents)) return FALSE growth = max(growth, growth + calculate_growth(vat.reagents, vat.biological_sample)) //Prevent you from having minus growth. @@ -74,7 +74,7 @@ . -= virus_suspectibility ///Called once a cell line reaches 100 growth. Then we check if any cell_line is too far so we can perform an epic fail roll -/datum/micro_organism/cell_line/proc/finish_growing(obj/machinery/plumbing/growing_vat/vat) +/datum/micro_organism/cell_line/proc/finish_growing(obj/machinery/vatgrower/vat) var/risk = 0 //Penalty for failure, goes up based on how much growth the other cell_lines have for(var/datum/micro_organism/cell_line/cell_line in vat.biological_sample.micro_organisms) @@ -90,7 +90,7 @@ succeed_growing(vat) return TRUE -/datum/micro_organism/cell_line/proc/fuck_up_growing(obj/machinery/plumbing/growing_vat/vat) +/datum/micro_organism/cell_line/proc/fuck_up_growing(obj/machinery/vatgrower/vat) vat.visible_message(span_warning("The biological sample in [vat] seems to have dissipated!")) if(prob(50)) new /obj/effect/gibspawner/generic(get_turf(vat)) //Spawn some gibs. @@ -98,7 +98,7 @@ return QDEL_NULL(vat.biological_sample) -/datum/micro_organism/cell_line/proc/succeed_growing(obj/machinery/plumbing/growing_vat/vat) +/datum/micro_organism/cell_line/proc/succeed_growing(obj/machinery/vatgrower/vat) var/datum/effect_system/fluid_spread/smoke/smoke = new smoke.set_up(0, holder = vat, location = vat.loc) smoke.start() @@ -112,18 +112,18 @@ ///Overriden to show more info like needs, supplementary and supressive reagents and also growth. /datum/micro_organism/cell_line/get_details(show_details) - . += "[span_notice("[desc] - growth progress: [growth]%")]\n" + . += "[span_notice("[desc] - growth progress: [growth]%")]" if(show_details) - . += return_reagent_text("It requires:", required_reagents) - . += return_reagent_text("It likes:", supplementary_reagents) - . += return_reagent_text("It hates:", suppressive_reagents) + . += "\n- " + return_reagent_text("Requires:", required_reagents) + . += "\n- " + return_reagent_text("Likes:", supplementary_reagents) + . += "\n- " + return_reagent_text("Hates:", suppressive_reagents) ///Return a nice list of all the reagents in a specific category with a specific prefix. This needs to be reworked because the formatting sucks ass. /datum/micro_organism/cell_line/proc/return_reagent_text(prefix_text = "It requires:", list/reagentlist) if(!reagentlist.len) return - var/all_reagents_text + var/list/reagent_names = list() for(var/i in reagentlist) var/datum/reagent/reagent = i - all_reagents_text += " - [initial(reagent.name)]\n" - return span_notice("[prefix_text]\n[all_reagents_text]") + reagent_names += initial(reagent.name) + return span_notice("[prefix_text] [jointext(reagent_names, ", ")]") diff --git a/code/modules/research/xenobiology/vatgrowing/samples/_sample.dm b/code/modules/research/xenobiology/vatgrowing/samples/_sample.dm index eda9d2771ebf0..7838977bd4d48 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/_sample.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/_sample.dm @@ -31,7 +31,7 @@ return TRUE ///Call handle_growth on all our microorganisms. -/datum/biological_sample/proc/handle_growth(obj/machinery/plumbing/growing_vat/vat) +/datum/biological_sample/proc/handle_growth(obj/machinery/vatgrower/vat) for(var/datum/micro_organism/cell_line/organism in micro_organisms) //Types because we don't grow viruses. organism.handle_growth(vat) 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 8dd4594d47d65..571440f84427f 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm @@ -450,7 +450,7 @@ virus_suspectibility = 0.5 resulting_atom = /mob/living/simple_animal/hostile/vatbeast -/datum/micro_organism/cell_line/vat_beast/succeed_growing(obj/machinery/plumbing/growing_vat/vat) +/datum/micro_organism/cell_line/vat_beast/succeed_growing(obj/machinery/vatgrower/vat) . = ..() qdel(vat) @@ -476,11 +476,11 @@ virus_suspectibility = 0 -/datum/micro_organism/cell_line/netherworld/succeed_growing(obj/machinery/plumbing/growing_vat/vat) +/datum/micro_organism/cell_line/netherworld/succeed_growing(obj/machinery/vatgrower/vat) resulting_atom = pick(/mob/living/basic/creature, /mob/living/basic/migo, /mob/living/basic/blankbody) //i looked myself, pretty much all of them are reasonably strong and somewhat on the same level. except migo is the jackpot and the blank body is whiff. return ..() -/datum/micro_organism/cell_line/clown/fuck_up_growing(obj/machinery/plumbing/growing_vat/vat) +/datum/micro_organism/cell_line/clown/fuck_up_growing(obj/machinery/vatgrower/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/basic/clown/mutant/slow, /mob/living/basic/clown/fleshclown)) @@ -656,7 +656,7 @@ virus_suspectibility = 0 resulting_atom = /obj/item/queen_bee/bought -/datum/micro_organism/cell_line/queen_bee/fuck_up_growing(obj/machinery/plumbing/growing_vat/vat) //we love job hazards +/datum/micro_organism/cell_line/queen_bee/fuck_up_growing(obj/machinery/vatgrower/vat) //we love job hazards vat.visible_message(span_warning("You hear angry buzzing coming from the inside of the vat!")) for(var/i in 1 to 5) new /mob/living/basic/bee(get_turf(vat)) diff --git a/code/modules/plumbing/plumbers/vatgrower.dm b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm similarity index 56% rename from code/modules/plumbing/plumbers/vatgrower.dm rename to code/modules/research/xenobiology/vatgrowing/vatgrower.dm index 1dcfb08e0cce0..5b35bd10edf5e 100644 --- a/code/modules/plumbing/plumbers/vatgrower.dm +++ b/code/modules/research/xenobiology/vatgrowing/vatgrower.dm @@ -1,33 +1,52 @@ ///Used to make mobs from microbiological samples. Grow grow grow. -/obj/machinery/plumbing/growing_vat +/obj/machinery/vatgrower name = "growing vat" desc = "Tastes just like the chef's soup." + icon = 'icons/obj/science/vatgrowing.dmi' icon_state = "growing_vat" - buffer = 300 - + density = TRUE + pass_flags_self = PASSMACHINE | LETPASSTHROW + circuit = /obj/item/circuitboard/machine/vatgrower + use_power = NO_POWER_USE + ///Soup container reagents + var/reagent_volume = 300 + var/reagent_flags = OPENCONTAINER | DUNKABLE ///List of all microbiological samples in this soup. var/datum/biological_sample/biological_sample ///If the vat will restart the sample upon completion var/resampler_active = FALSE -///Add that sexy demnand component -/obj/machinery/plumbing/growing_vat/Initialize(mapload, bolt, layer) +/obj/machinery/vatgrower/Initialize(mapload, bolt, layer) . = ..() - AddComponent(/datum/component/plumbing/simple_demand, bolt, layer) - -/obj/machinery/plumbing/growing_vat/create_reagents(max_vol, flags) + create_reagents(reagent_volume, reagent_flags) + + AddComponent(/datum/component/simple_rotation) + AddComponent(/datum/component/plumbing/simple_demand) + + var/static/list/hovering_item_typechecks = list( + /obj/item/petri_dish = list( + SCREENTIP_CONTEXT_LMB = "Add Sample", + ), + /obj/item/reagent_containers = list( + SCREENTIP_CONTEXT_LMB = "Pour Reagents", + ), + ) + AddElement(/datum/element/contextual_screentip_item_typechecks, hovering_item_typechecks) + AddElement(/datum/element/contextual_screentip_bare_hands, lmb_text = "Toggle Resampler", rmb_text = "Flush Soup") + +/obj/machinery/vatgrower/create_reagents(max_vol, flags) . = ..() RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_change)) RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) /// Handles properly detaching signal hooks. -/obj/machinery/plumbing/growing_vat/proc/on_reagents_del(datum/reagents/reagents) +/obj/machinery/vatgrower/proc/on_reagents_del(datum/reagents/reagents) SIGNAL_HANDLER UnregisterSignal(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_REM_REAGENT, COMSIG_QDELETING)) return NONE ///When we process, we make use of our reagents to try and feed the samples we have. -/obj/machinery/plumbing/growing_vat/process(seconds_per_tick) +/obj/machinery/vatgrower/process(seconds_per_tick) if(!is_operational) return if(!biological_sample) @@ -39,35 +58,71 @@ audible_message(pick(list(span_notice("[src] grumbles!"), span_notice("[src] makes a splashing noise!"), span_notice("[src] sloshes!")))) use_energy(active_power_usage * seconds_per_tick) -///Handles the petri dish depositing into the vat. -/obj/machinery/plumbing/growing_vat/attacked_by(obj/item/I, mob/living/user) - if(!istype(I, /obj/item/petri_dish)) - return ..() +/obj/machinery/vatgrower/item_interaction(mob/living/user, obj/item/tool, list/modifiers) + . = ..() + if(istype(tool, /obj/item/petri_dish)) + return deposit_sample(user, tool) - var/obj/item/petri_dish/petri = I +/obj/machinery/vatgrower/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(default_deconstruction_screwdriver(user, icon_state, icon_state, tool)) + return ITEM_INTERACT_SUCCESS - if(!petri.sample) - return ..() +/obj/machinery/vatgrower/crowbar_act(mob/living/user, obj/item/tool) + . = ..() + if(default_deconstruction_crowbar(tool)) + return ITEM_INTERACT_SUCCESS - if(biological_sample) - to_chat(user, span_warning("There is already a sample in the vat!")) +/obj/machinery/vatgrower/wrench_act(mob/living/user, obj/item/tool) + . = ..() + if(default_unfasten_wrench(user, tool)) + return ITEM_INTERACT_SUCCESS + +/obj/machinery/vatgrower/attack_hand(mob/living/user, list/modifiers) + . = ..() + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + if(obj_flags & EMAGGED) return - deposit_sample(user, petri) + resampler_active = !resampler_active + balloon_alert(user, "resampler [resampler_active ? "activated" : "deactivated"]") + update_appearance() + +/obj/machinery/vatgrower/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + if(!anchored) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + var/warning = tgui_alert(user, "Are you sure you want to empty the soup container?","Flush soup container?", list("Flush", "Cancel")) + if(warning == "Flush" && user.can_perform_action(src)) + reagents.clear_reagents() + if(biological_sample) + QDEL_NULL(biological_sample) + balloon_alert(user, "container empty") + update_appearance() + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN ///Creates a clone of the supplied sample and puts it in the vat -/obj/machinery/plumbing/growing_vat/proc/deposit_sample(mob/user, obj/item/petri_dish/petri) +/obj/machinery/vatgrower/proc/deposit_sample(mob/user, obj/item/petri_dish/petri) + if(!petri.sample) + balloon_alert(user, "dish empty") + return ITEM_INTERACT_FAILURE + if(biological_sample) + balloon_alert(user, "already has a sample") + return ITEM_INTERACT_FAILURE biological_sample = new for(var/datum/micro_organism/m in petri.sample.micro_organisms) biological_sample.micro_organisms += new m.type() biological_sample.sample_layers = petri.sample.sample_layers biological_sample.sample_color = petri.sample.sample_color - to_chat(user, span_warning("You put some of the sample in the vat!")) + balloon_alert(user, "added sample") playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) update_appearance() RegisterSignal(biological_sample, COMSIG_SAMPLE_GROWTH_COMPLETED, PROC_REF(on_sample_growth_completed)) + return ITEM_INTERACT_SUCCESS ///Adds text for when there is a sample in the vat -/obj/machinery/plumbing/growing_vat/examine_more(mob/user) +/obj/machinery/vatgrower/examine(mob/user) . = ..() if(!biological_sample) return @@ -76,18 +131,14 @@ var/datum/micro_organism/MO = i . += MO.get_details(HAS_TRAIT(user, TRAIT_RESEARCH_SCANNER)) -/obj/machinery/plumbing/growing_vat/plunger_act(obj/item/plunger/P, mob/living/user, reinforced) - . = ..() - QDEL_NULL(biological_sample) - /// Call update icon when reagents change to update the reagent content icons. Eats signal args. -/obj/machinery/plumbing/growing_vat/proc/on_reagent_change(datum/reagents/holder, ...) +/obj/machinery/vatgrower/proc/on_reagent_change(datum/reagents/holder, ...) SIGNAL_HANDLER update_appearance() return NONE ///Adds overlays to show the reagent contents -/obj/machinery/plumbing/growing_vat/update_overlays() +/obj/machinery/vatgrower/update_overlays() . = ..() var/static/image/on_overlay var/static/image/off_overlay @@ -113,16 +164,7 @@ var/mutable_appearance/bubbles_overlay = mutable_appearance(icon, "vat_bubbles") . += bubbles_overlay -/obj/machinery/plumbing/growing_vat/attack_hand(mob/living/user, list/modifiers) - . = ..() - playsound(src, 'sound/machines/click.ogg', 30, TRUE) - if(obj_flags & EMAGGED) - return - resampler_active = !resampler_active - balloon_alert_to_viewers("resampler [resampler_active ? "activated" : "deactivated"]") - update_appearance() - -/obj/machinery/plumbing/growing_vat/emag_act(mob/user, obj/item/card/emag/emag_card) +/obj/machinery/vatgrower/emag_act(mob/user, obj/item/card/emag/emag_card) if(obj_flags & EMAGGED) return FALSE obj_flags |= EMAGGED @@ -131,7 +173,7 @@ flick("growing_vat_emagged", src) return TRUE -/obj/machinery/plumbing/growing_vat/proc/on_sample_growth_completed() +/obj/machinery/vatgrower/proc/on_sample_growth_completed() SIGNAL_HANDLER if(resampler_active) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(playsound), get_turf(src), 'sound/effects/servostep.ogg', 100, 1), 1.5 SECONDS) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 34d7f4d507a46..9f22520d6ab10 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -10,7 +10,7 @@ throwforce = 0 throw_speed = 3 throw_range = 6 - grind_results = list() + grind_results = list(/datum/reagent/toxin/slimejelly = 20) ///uses before it goes inert var/extract_uses = 1 ///deletion timer, for delayed reactions @@ -44,11 +44,6 @@ . = ..() create_reagents(100, INJECTABLE | DRAWABLE) -/obj/item/slime_extract/on_grind() - . = ..() - if(extract_uses) - grind_results[/datum/reagent/toxin/slimejelly] = 20 - /** * Effect when activated by a Luminescent. * diff --git a/code/modules/shuttle/shuttle_rotate.dm b/code/modules/shuttle/shuttle_rotate.dm index 734e2337df518..cb7cad65b6ba1 100644 --- a/code/modules/shuttle/shuttle_rotate.dm +++ b/code/modules/shuttle/shuttle_rotate.dm @@ -12,7 +12,7 @@ If ever any of these procs are useful for non-shuttles, rename it to proc/rotate setDir(angle2dir(rotation+dir2angle(dir))) //resmooth if need be. - if(params & ROTATE_SMOOTH && smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) + if(params & ROTATE_SMOOTH && smoothing_flags & USES_SMOOTHING) QUEUE_SMOOTH(src) //rotate the pixel offsets too. diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index e5b4b0eb02439..484fa32ac8777 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -403,7 +403,6 @@ desc = "Communism powerful force." icon = 'icons/effects/96x96.dmi' icon_state = "communist" - layer = ABOVE_OPEN_TURF_LAYER pixel_x = -32 pixel_y = -32 diff --git a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm index 60a5d013217f9..08c1f5a831f7b 100644 --- a/code/modules/spells/spell_types/jaunt/bloodcrawl.dm +++ b/code/modules/spells/spell_types/jaunt/bloodcrawl.dm @@ -164,6 +164,10 @@ var/consume_sound = 'sound/magic/demon_consume.ogg' /// consume count (statistics and stuff) var/consume_count = 0 + /// Apply damage every 20 seconds if we bloodcrawling + var/jaunt_damage_timer + /// When demon first appears, it does not take damage while in Jaunt. He also doesn't take damage while he's eating someone. + var/resist_jaunt_damage = TRUE /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/try_enter_jaunt(obj/effect/decal/cleanable/blood, mob/living/jaunter) // Save this before the actual jaunt @@ -174,12 +178,14 @@ if(!.) return + jaunt_damage_timer = addtimer(CALLBACK(src, PROC_REF(damage_for_lazy_demon), jaunter), 20 SECONDS, TIMER_STOPPABLE) + var/turf/jaunt_turf = get_turf(jaunter) // if we're not pulling anyone, or we can't what we're pulling - if(!isliving(coming_with)) + if(!ishuman(coming_with)) return - var/mob/living/victim = coming_with + var/mob/living/carbon/human/victim = coming_with if(victim.stat == CONSCIOUS) jaunt_turf.visible_message( @@ -204,6 +210,28 @@ return TRUE +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/on_jaunt_exited(obj/effect/dummy/phased_mob/jaunt, mob/living/unjaunter) + deltimer(jaunt_damage_timer) + resist_jaunt_damage = FALSE + return ..() + +/** + * Apply damage to demon when he using bloodcrawl. + * Every 20 SECONDS check if demon still crawling and update timer. + */ +/datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/proc/damage_for_lazy_demon(mob/living/lazy_demon) + if(QDELETED(lazy_demon)) + return + if(resist_jaunt_damage) + return + if(isturf(lazy_demon.loc)) + return + if(isnull(jaunt_damage_timer)) + return + lazy_demon.apply_damage(lazy_demon.maxHealth * 0.05, BRUTE) + jaunt_damage_timer = addtimer(CALLBACK(src, PROC_REF(damage_for_lazy_demon), lazy_demon), 20 SECONDS, TIMER_STOPPABLE) + to_chat(lazy_demon, span_warning("You feel your flesh dissolving into the sea of blood. You shouldn't stay in Blood Crawl for too long!")) + /** * Consumes the [victim] from the [jaunter], fully healing them * and calling [proc/on_victim_consumed] if successful.) @@ -236,12 +264,18 @@ * Called when a victim starts to be consumed. */ /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/proc/on_victim_start_consume(mob/living/victim, mob/living/jaunter) + if(!iscarbon(jaunter)) + resist_jaunt_damage = TRUE + deltimer(jaunt_damage_timer) to_chat(jaunter, span_danger("You begin to feast on [victim]... You can not move while you are doing this.")) /** * Called when a victim is successfully consumed. */ /datum/action/cooldown/spell/jaunt/bloodcrawl/slaughter_demon/proc/on_victim_consumed(mob/living/victim, mob/living/jaunter) + if(!iscarbon(jaunter)) + resist_jaunt_damage = FALSE + jaunt_damage_timer = addtimer(CALLBACK(src, PROC_REF(damage_for_lazy_demon), jaunter), 20 SECONDS, TIMER_STOPPABLE) to_chat(jaunter, span_danger("You devour [victim]. Your health is fully restored.")) qdel(victim) diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm index c83f710d1df1d..e2feaa2bc26ed 100644 --- a/code/modules/station_goals/bsa.dm +++ b/code/modules/station_goals/bsa.dm @@ -50,13 +50,10 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) . = ..() AddComponent(/datum/component/simple_rotation) -/obj/machinery/bsa/back/multitool_act(mob/living/user, obj/item/I) - if(!multitool_check_buffer(user, I)) //make sure it has a data buffer - return - var/obj/item/multitool/M = I +/obj/machinery/bsa/back/multitool_act(mob/living/user, obj/item/multitool/M) M.set_buffer(src) balloon_alert(user, "saved to multitool buffer") - return TRUE + return ITEM_INTERACT_SUCCESS /obj/machinery/bsa/front name = "Bluespace Artillery Bore" @@ -67,13 +64,10 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) . = ..() AddComponent(/datum/component/simple_rotation) -/obj/machinery/bsa/front/multitool_act(mob/living/user, obj/item/I) - if(!multitool_check_buffer(user, I)) //make sure it has a data buffer - return - var/obj/item/multitool/M = I +/obj/machinery/bsa/front/multitool_act(mob/living/user, obj/item/multitool/M) M.set_buffer(src) balloon_alert(user, "saved to multitool buffer") - return TRUE + return ITEM_INTERACT_SUCCESS /obj/machinery/bsa/middle name = "Bluespace Artillery Fusor" @@ -86,22 +80,19 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) . = ..() AddComponent(/datum/component/simple_rotation) -/obj/machinery/bsa/middle/multitool_act(mob/living/user, obj/item/I) - if(!multitool_check_buffer(user, I)) - return - var/obj/item/multitool/M = I - if(M.buffer) - if(istype(M.buffer, /obj/machinery/bsa/back)) - back_ref = WEAKREF(M.buffer) - to_chat(user, span_notice("You link [src] with [M.buffer].")) - M.set_buffer(null) - else if(istype(M.buffer, /obj/machinery/bsa/front)) - front_ref = WEAKREF(M.buffer) - to_chat(user, span_notice("You link [src] with [M.buffer].")) - M.set_buffer(null) - else - to_chat(user, span_warning("[I]'s data buffer is empty!")) - return TRUE +/obj/machinery/bsa/middle/multitool_act(mob/living/user, obj/item/multitool/tool) + . = NONE + + if(istype(tool.buffer, /obj/machinery/bsa/back)) + back_ref = WEAKREF(tool.buffer) + to_chat(user, span_notice("You link [src] with [tool.buffer].")) + tool.set_buffer(null) + return ITEM_INTERACT_SUCCESS + else if(istype(tool.buffer, /obj/machinery/bsa/front)) + front_ref = WEAKREF(tool.buffer) + to_chat(user, span_notice("You link [src] with [tool.buffer].")) + tool.set_buffer(null) + return ITEM_INTERACT_SUCCESS /obj/machinery/bsa/middle/proc/check_completion() var/obj/machinery/bsa/front/front = front_ref?.resolve() diff --git a/code/modules/surgery/blood_filter.dm b/code/modules/surgery/blood_filter.dm index ae5b438492fbc..ca395ae45ab53 100644 --- a/code/modules/surgery/blood_filter.dm +++ b/code/modules/surgery/blood_filter.dm @@ -40,7 +40,7 @@ */ /datum/surgery_step/filter_blood/proc/has_filterable_chems(mob/living/carbon/target, obj/item/blood_filter/bloodfilter) if(!length(target.reagents?.reagent_list)) - bloodfilter.audible_message(span_notice("The [bloodfilter] pings as it reports no chemicals detected in [target]'s blood.")) + bloodfilter.audible_message(span_notice("[bloodfilter] pings as it reports no chemicals detected in [target]'s blood.")) playsound(get_turf(target), 'sound/machines/ping.ogg', 75, TRUE, falloff_exponent = 12, falloff_distance = 1) return FALSE @@ -58,7 +58,7 @@ implements = list(/obj/item/blood_filter = 95) repeatable = TRUE time = 2.5 SECONDS - success_sound = 'sound/machines/fan_loop.ogg' + success_sound = 'sound/machines/card_slide.ogg' /datum/surgery_step/filter_blood/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) display_pain(target, "Ты чувствуешь ужасную боль в груди!") @@ -68,7 +68,7 @@ if(target.reagents?.total_volume) for(var/datum/reagent/chem as anything in target.reagents.reagent_list) if(!length(bloodfilter.whitelist) || (chem.type in bloodfilter.whitelist)) - target.reagents.remove_reagent(chem.type, min(chem.volume * 0.22, 10)) + target.reagents.remove_reagent(chem.type, clamp(round(chem.volume * 0.22, 0.2), 0.4, 10)) display_results( user, target, diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index c03a930395ab9..06599c2fb4809 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -351,7 +351,7 @@ check_list += "\t [span_boldwarning("Your [name] is suffering [wound.a_or_from] [LOWER_TEXT(wound.name)]!!!")]" for(var/obj/item/embedded_thing in embedded_objects) - var/stuck_word = embedded_thing.isEmbedHarmless() ? "stuck" : "embedded" + var/stuck_word = embedded_thing.is_embed_harmless() ? "stuck" : "embedded" check_list += "\t There is \a [embedded_thing] [stuck_word] in your [name]!" /obj/item/bodypart/blob_act() @@ -1096,15 +1096,15 @@ if(embed in embedded_objects) // go away return // We don't need to do anything with projectile embedding, because it will never reach this point - RegisterSignal(embed, COMSIG_ITEM_EMBEDDING_UPDATE, PROC_REF(embedded_object_changed)) embedded_objects += embed + RegisterSignal(embed, COMSIG_ITEM_EMBEDDING_UPDATE, PROC_REF(embedded_object_changed)) refresh_bleed_rate() /// INTERNAL PROC, DO NOT USE /// Cleans up any attachment we have to the embedded object, removes it from our list /obj/item/bodypart/proc/_unembed_object(obj/item/unembed) - UnregisterSignal(unembed, COMSIG_ITEM_EMBEDDING_UPDATE) embedded_objects -= unembed + UnregisterSignal(unembed, COMSIG_ITEM_EMBEDDING_UPDATE) refresh_bleed_rate() /obj/item/bodypart/proc/embedded_object_changed(obj/item/embedded_source) @@ -1157,7 +1157,7 @@ cached_bleed_rate += 0.5 for(var/obj/item/embeddies in embedded_objects) - if(!embeddies.isEmbedHarmless()) + if(!embeddies.is_embed_harmless()) cached_bleed_rate += 0.25 for(var/datum/wound/iter_wound as anything in wounds) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index a8c482754116f..50a79aaa319b2 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -141,7 +141,7 @@ if (!can_dismember) return FALSE - if(owner.stat < HARD_CRIT) + if(!HAS_TRAIT(owner, TRAIT_CURSED) && owner.stat < HARD_CRIT) return FALSE return ..() diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm index 863cdd9cb61c2..a0955af4e46c8 100644 --- a/code/modules/surgery/bodyparts/helpers.dm +++ b/code/modules/surgery/bodyparts/helpers.dm @@ -139,7 +139,7 @@ /mob/living/carbon/proc/has_embedded_objects(include_harmless=FALSE) for(var/obj/item/bodypart/bodypart as anything in bodyparts) for(var/obj/item/embedded in bodypart.embedded_objects) - if(!include_harmless && embedded.isEmbedHarmless()) + if(!include_harmless && embedded.is_embed_harmless()) continue return TRUE diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 14ccfb9d93f00..072673d23d345 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -48,7 +48,7 @@ old_owner.gib(DROP_ALL_REMAINS) /obj/item/bodypart/chest/can_dismember(obj/item/item) - if(owner.stat < HARD_CRIT || !contents.len) + if((!HAS_TRAIT(owner, TRAIT_CURSED) && owner.stat < HARD_CRIT) || !contents.len) return FALSE return ..() diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm index ecdfab30b544c..93bacb6792d62 100644 --- a/code/modules/surgery/experimental_dissection.dm +++ b/code/modules/surgery/experimental_dissection.dm @@ -1,5 +1,5 @@ ///How many research points you gain from dissecting a Human. -#define BASE_HUMAN_REWARD 500 +#define BASE_HUMAN_REWARD 10 /datum/surgery/advanced/experimental_dissection name = "Экспериментальное препарирование" diff --git a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm index 89c6f9c96a411..a50912416ef87 100644 --- a/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm +++ b/code/modules/surgery/organs/internal/cyberimp/augments_internal.dm @@ -119,12 +119,12 @@ /obj/item/organ/internal/cyberimp/brain/anti_stun/on_mob_remove(mob/living/carbon/implant_owner) . = ..() UnregisterSignal(implant_owner, signalCache) - UnregisterSignal(implant_owner, COMSIG_CARBON_ENTER_STAMCRIT) + UnregisterSignal(implant_owner, COMSIG_LIVING_ENTER_STAMCRIT) /obj/item/organ/internal/cyberimp/brain/anti_stun/on_mob_insert(mob/living/carbon/receiver) . = ..() RegisterSignals(receiver, signalCache, PROC_REF(on_signal)) - RegisterSignal(receiver, COMSIG_CARBON_ENTER_STAMCRIT, PROC_REF(on_stamcrit)) + RegisterSignal(receiver, COMSIG_LIVING_ENTER_STAMCRIT, PROC_REF(on_stamcrit)) /obj/item/organ/internal/cyberimp/brain/anti_stun/proc/on_signal(datum/source, amount) SIGNAL_HANDLER @@ -139,23 +139,23 @@ /obj/item/organ/internal/cyberimp/brain/anti_stun/proc/clear_stuns() if(isnull(owner) || (organ_flags & ORGAN_FAILING) || !COOLDOWN_FINISHED(src, implant_cooldown)) return - + owner.SetStun(0) owner.SetKnockdown(0) owner.SetImmobilized(0) owner.SetParalyzed(0) owner.setStaminaLoss(0) addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob/living, setStaminaLoss), 0), stun_resistance_time) - + var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread sparks.set_up(5, 1, src) sparks.start() owner.add_traits(list(TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_BATON_RESISTANCE, TRAIT_STUNIMMUNE), REF(src)) - addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_IGNOREDAMAGESLOWDOWN, REF(src)), stun_resistance_time) + addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_IGNOREDAMAGESLOWDOWN, REF(src)), stun_resistance_time) addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_BATON_RESISTANCE, REF(src)), stun_resistance_time) addtimer(TRAIT_CALLBACK_REMOVE(owner, TRAIT_STUNIMMUNE, REF(src)), stun_resistance_time) - + COOLDOWN_START(src, implant_cooldown, 60 SECONDS) addtimer(CALLBACK(src, PROC_REF(implant_ready)),60 SECONDS) @@ -171,7 +171,7 @@ addtimer(CALLBACK(src, PROC_REF(reboot)), 90 / severity) /obj/item/organ/internal/cyberimp/brain/anti_stun/proc/reboot() - organ_flags &= ~ORGAN_FAILING + organ_flags &= ~ORGAN_FAILING implant_ready() //[[[[MOUTH]]]] diff --git a/code/modules/surgery/organs/internal/tongue/_tongue.dm b/code/modules/surgery/organs/internal/tongue/_tongue.dm index 87dfb124a61a4..cbced0939aad4 100644 --- a/code/modules/surgery/organs/internal/tongue/_tongue.dm +++ b/code/modules/surgery/organs/internal/tongue/_tongue.dm @@ -184,23 +184,11 @@ liked_foodtypes = GORE | MEAT | SEAFOOD | NUTS | BUGS disliked_foodtypes = GRAIN | DAIRY | CLOTH | GROSS voice_filter = @{"[0:a] asplit [out0][out2]; [out0] asetrate=%SAMPLE_RATE%*0.9,aresample=%SAMPLE_RATE%,atempo=1/0.9,aformat=channel_layouts=mono,volume=0.2 [p0]; [out2] asetrate=%SAMPLE_RATE%*1.1,aresample=%SAMPLE_RATE%,atempo=1/1.1,aformat=channel_layouts=mono,volume=0.2[p2]; [p0][0][p2] amix=inputs=3"} + var/static/list/speech_replacements = list(new /regex("s+", "g") = "sss", new /regex("S+", "g") = "SSS", new /regex(@"(\w)x", "g") = "$1kss", new /regex(@"(\w)X", "g") = "$1KSSS", new /regex(@"\bx([\-|r|R]|\b)", "g") = "ecks$1", new /regex(@"\bX([\-|r|R]|\b)", "g") = "ECKS$1") -/obj/item/organ/internal/tongue/lizard/modify_speech(datum/source, list/speech_args) - var/static/regex/lizard_hiss = new("s+", "g") - var/static/regex/lizard_hiSS = new("S+", "g") - var/static/regex/lizard_kss = new(@"(\w)x", "g") - var/static/regex/lizard_kSS = new(@"(\w)X", "g") - var/static/regex/lizard_ecks = new(@"\bx([\-|r|R]|\b)", "g") - var/static/regex/lizard_eckS = new(@"\bX([\-|r|R]|\b)", "g") - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - message = lizard_hiss.Replace(message, "sss") - message = lizard_hiSS.Replace(message, "SSS") - message = lizard_kss.Replace(message, "$1kss") - message = lizard_kSS.Replace(message, "$1KSS") - message = lizard_ecks.Replace(message, "ecks$1") - message = lizard_eckS.Replace(message, "ECKS$1") - speech_args[SPEECH_MESSAGE] = message +/obj/item/organ/internal/tongue/lizard/New(class, timer, datum/mutation/human/copymut) + . = ..() + AddComponent(/datum/component/speechmod, replacements = speech_replacements) /obj/item/organ/internal/tongue/lizard/silver name = "silver tongue" diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 073208d633510..b3bab097f6cae 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -124,10 +124,6 @@ if(isnull(step)) return FALSE var/obj/item/tool = user.get_active_held_item() - if(istype(tool, /obj/item/borg/cyborg_omnitool)) //catches borg surgeries - var/obj/item/borg/cyborg_omnitool/toolarm = tool - if(toolarm.selected) - tool = toolarm.selected if(step.try_op(user, target, user.zone_selected, tool, src, try_to_fail)) return TRUE if(tool && tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 6c3ee9c014713..2bd8f485887f8 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -286,8 +286,8 @@ //saws are very accurate and fast at butchering var/static/list/slapcraft_recipe_list = list(/datum/crafting_recipe/chainsaw) - AddComponent( - /datum/component/slapcrafting,\ + AddElement( + /datum/element/slapcrafting,\ slapcraft_recipes = slapcraft_recipe_list,\ ) @@ -316,6 +316,7 @@ attack_verb_continuous = list("slaps") attack_verb_simple = list("slap") interaction_flags_atom = parent_type::interaction_flags_atom | INTERACT_ATOM_IGNORE_MOBILITY + tool_behaviour = TOOL_DRAPES /obj/item/surgical_drapes/Initialize(mapload) . = ..() diff --git a/code/modules/transport/tram/tram_floors.dm b/code/modules/transport/tram/tram_floors.dm index 9f0b6907fe9c1..f267ccf5cdc84 100644 --- a/code/modules/transport/tram/tram_floors.dm +++ b/code/modules/transport/tram/tram_floors.dm @@ -183,7 +183,7 @@ integrity_failure = 0.75 armor_type = /datum/armor/tram_floor layer = TRAM_FLOOR_LAYER - plane = FLOOR_PLANE + plane = GAME_PLANE obj_flags = BLOCK_Z_OUT_DOWN | BLOCK_Z_OUT_UP appearance_flags = PIXEL_SCALE|KEEP_TOGETHER var/secured = TRUE diff --git a/code/modules/transport/tram/tram_signals.dm b/code/modules/transport/tram/tram_signals.dm index db8aa17ddcb3e..faf4a46e11e28 100644 --- a/code/modules/transport/tram/tram_signals.dm +++ b/code/modules/transport/tram/tram_signals.dm @@ -473,6 +473,7 @@ icon_state = "sensor-base" desc = "Uses an infrared beam to detect passing trams. Works when paired with a sensor on the other side of the track." layer = TRAM_RAIL_LAYER + plane = FLOOR_PLANE use_power = NO_POWER_USE circuit = /obj/item/circuitboard/machine/guideway_sensor /// Sensors work in a married pair diff --git a/code/modules/transport/transport_module.dm b/code/modules/transport/transport_module.dm index 268452743e7b2..104601f2f6ca3 100644 --- a/code/modules/transport/transport_module.dm +++ b/code/modules/transport/transport_module.dm @@ -14,7 +14,7 @@ armor_type = /datum/armor/transport_module max_integrity = 50 layer = TRAM_FLOOR_LAYER - plane = FLOOR_PLANE + plane = GAME_PLANE smoothing_flags = SMOOTH_BITMASK smoothing_groups = SMOOTH_GROUP_INDUSTRIAL_LIFT canSmoothWith = SMOOTH_GROUP_INDUSTRIAL_LIFT diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 593b949e2b22f..8fafe30ac7b93 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -180,6 +180,7 @@ #include "map_landmarks.dm" #include "mapload_space_verification.dm" #include "mapping.dm" +#include "mapping_nearstation_test.dm" #include "mecha_damage.dm" #include "medical_wounds.dm" #include "merge_type.dm" @@ -213,6 +214,7 @@ #include "pills.dm" #include "plane_double_transform.dm" #include "plane_dupe_detector.dm" +#include "plane_sanity.dm" #include "plantgrowth_tests.dm" #include "preference_species.dm" #include "preferences.dm" diff --git a/code/modules/unit_tests/cyborg_tool.dm b/code/modules/unit_tests/cyborg_tool.dm index 711f0948aee0f..39aed619ec50d 100644 --- a/code/modules/unit_tests/cyborg_tool.dm +++ b/code/modules/unit_tests/cyborg_tool.dm @@ -5,7 +5,7 @@ /datum/unit_test/cyborg_tool/Run() var/mob/living/carbon/human/consistent/not_a_borg = allocate(__IMPLIED_TYPE__) var/obj/item/borg/cyborg_omnitool/engineering/tool = allocate(__IMPLIED_TYPE__) - tool.selected = allocate(/obj/item/wrench/cyborg) + tool.tool_behaviour = TOOL_WRENCH not_a_borg.put_in_active_hand(tool) diff --git a/code/modules/unit_tests/focus_only_tests.dm b/code/modules/unit_tests/focus_only_tests.dm index 15d04ee885233..31f34d9f2fb94 100644 --- a/code/modules/unit_tests/focus_only_tests.dm +++ b/code/modules/unit_tests/focus_only_tests.dm @@ -47,3 +47,6 @@ /// Checks that maploaded mobs with either the `atmos_requirements` or `body_temp_sensitive` /datum/unit_test/focus_only/atmos_and_temp_requirements + +/// Ensures only whitelisted planes can have TOPDOWN_LAYERing, and vis versa +/datum/unit_test/focus_only/topdown_filtering diff --git a/code/modules/unit_tests/lootpanel.dm b/code/modules/unit_tests/lootpanel.dm index 1903c22d54652..41374a1950c02 100644 --- a/code/modules/unit_tests/lootpanel.dm +++ b/code/modules/unit_tests/lootpanel.dm @@ -2,8 +2,8 @@ abstract_type = /datum/unit_test/lootpanel /datum/unit_test/lootpanel/contents/Run() - var/datum/client_interface/mock_client = new() - var/datum/lootpanel/panel = new(mock_client) + var/datum/client_interface/mock_client = allocate(/datum/client_interface) + var/datum/lootpanel/panel = allocate(/datum/lootpanel, mock_client) var/mob/living/carbon/human/labrat = allocate(/mob/living/carbon/human/consistent) mock_client.mob = labrat var/turf/one_over = locate(run_loc_floor_bottom_left.x + 1, run_loc_floor_bottom_left.y, run_loc_floor_bottom_left.z) @@ -32,4 +32,3 @@ TEST_ASSERT_EQUAL(length(panel.contents), 2, "Panel shouldnt dupe searchables if reopened") mock_client.mob = null - diff --git a/code/modules/unit_tests/mapload_space_verification.dm b/code/modules/unit_tests/mapload_space_verification.dm index 35556c85fb482..843de4f8fdde2 100644 --- a/code/modules/unit_tests/mapload_space_verification.dm +++ b/code/modules/unit_tests/mapload_space_verification.dm @@ -32,6 +32,8 @@ var/area/turf_area = get_area(iterated_turf) if(!isspaceturf(iterated_turf) || is_type_in_typecache(turf_area, excluded_area_typecache)) continue // Alright, so let's assume we have intended behavior. If something yorks, we'll get a bare `/area` (maploader?) or a mapper is doing something they shouldn't be doing. + if(HAS_TRAIT(iterated_turf, TRAIT_HYPERSPACE_STOPPED)) + continue // This means that a shuttle with a noop template turf is just temporarily parked ontop of us and that we're not actually a part of it. We don't have to care about it as it will leave us alone when it flies away. // We need turf_area.type for the error message because we have fifteen million ruin areas named "Unexplored Location" and it's completely unhelpful here. TEST_FAIL("Space turf [iterated_turf.type] found in non-allowed area ([turf_area.type]) at [AREACOORD(iterated_turf)]! Please ensure that all space turfs are in an /area/space!") diff --git a/code/modules/unit_tests/mapping_nearstation_test.dm b/code/modules/unit_tests/mapping_nearstation_test.dm new file mode 100644 index 0000000000000..d428b826634b5 --- /dev/null +++ b/code/modules/unit_tests/mapping_nearstation_test.dm @@ -0,0 +1,40 @@ +///Detects movables that may have been accidentally placed in space, as well as movables which do not have the proper nearspace area (meaning they aren't lit properly.) +/datum/unit_test/mapping_nearstation_test + priority = TEST_PRE + +/datum/unit_test/mapping_nearstation_test/Run() + if(SSmapping.is_planetary()) + return //No need to test for orphaned spaced atoms on this map. + + var/list/safe_atoms = typecacheof(list( + /atom/movable/mirage_holder, + /obj/docking_port, + /obj/effect/landmark, + /obj/effect/abstract, + /obj/effect/mapping_error, + )) //Mapping stuff that we don't actually have to be concerned about. + var/list/safe_areas = typecacheof(list( + /area/misc/testroom, + /area/station/holodeck, + )) + + for(var/station_z in SSmapping.levels_by_trait(ZTRAIT_STATION)) + var/list/turfs_to_check = Z_TURFS(station_z) + for(var/turf/station_turf as anything in turfs_to_check) + var/area/turf_area = station_turf.loc + if(turf_area.static_lighting || is_type_in_typecache(turf_area, safe_areas)) //Only care about turfs that don't have lighting enabled. + continue + var/has_thing = FALSE + for(var/atom/movable/thing_on_the_turf as anything in station_turf.contents) //Find an item on the turf, this can help the mapper identify the turf more easily when combined with the exact coords. + if(is_type_in_typecache(thing_on_the_turf, safe_atoms)) + continue + TEST_FAIL("[station_turf.x], [station_turf.y], [station_turf.z]: [thing_on_the_turf.type] with area of type [turf_area.type]") + has_thing = TRUE + break + if(!has_thing && !isspaceturf(station_turf) && !istype(station_turf, /turf/open/openspace)) //In case it's just a turf without an area + if(istype(station_turf, /turf/open/floor/engine/hull/ceiling)) + TEST_FAIL("[station_turf.x], [station_turf.y], [station_turf.z]: [station_turf.type] with area of type [turf_area.type]. The turf on the z-level below is a shuttle dock and generated me! An error landmark has been generated on the map for easier debugging!") + else + TEST_FAIL("[station_turf.x], [station_turf.y], [station_turf.z]: [station_turf.type] with area of type [turf_area.type]") + if(!succeeded) + TEST_FAIL("Movable Atom located without a proper area. Please verify they are supposed to be there. If they are correct, change the area to /area/space/nearstation (or the correct surrounding type).") diff --git a/code/modules/unit_tests/plane_sanity.dm b/code/modules/unit_tests/plane_sanity.dm new file mode 100644 index 0000000000000..890a0531908a4 --- /dev/null +++ b/code/modules/unit_tests/plane_sanity.dm @@ -0,0 +1,10 @@ +/// Ensures we have no invalid plane/layer combos post init +/datum/unit_test/plane_layer_sanity + priority = TEST_LONGER + +/datum/unit_test/plane_layer_sanity/Run() + // This fucker's gonna be slow, I'm sorry + for(var/mutable_appearance/appearance) + check_topdown_validity(appearance) + for(var/atom/thing) + check_topdown_validity(thing) diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png index 0a9a5ef08e4ee..4c9212509d2ea 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicateinfiltrator.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png index 0a9a5ef08e4ee..4c9212509d2ea 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_syndicatesleeperagent.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png b/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png index 0a9a5ef08e4ee..4c9212509d2ea 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png and b/code/modules/unit_tests/screenshots/screenshot_antag_icons_traitor.png differ diff --git a/code/modules/unit_tests/screenshots/screenshot_dynamic_human_icons_syndicate_commando.png b/code/modules/unit_tests/screenshots/screenshot_dynamic_human_icons_syndicate_commando.png index c29a1e742f1f4..adc462ace50d1 100644 Binary files a/code/modules/unit_tests/screenshots/screenshot_dynamic_human_icons_syndicate_commando.png and b/code/modules/unit_tests/screenshots/screenshot_dynamic_human_icons_syndicate_commando.png differ diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm index afce8392d5828..ed2510b829434 100644 --- a/code/modules/unit_tests/unit_test.dm +++ b/code/modules/unit_tests/unit_test.dm @@ -286,6 +286,10 @@ GLOBAL_VAR_INIT(focused_tests, focused_tests()) returnable_list += typesof(/obj/effect/anomaly/grav/high) //See above returnable_list += typesof(/obj/effect/timestop) + //Sparks can ignite a number of things, causing a fire to burn the floor away. Only you can prevent CI fires + returnable_list += typesof(/obj/effect/particle_effect/sparks) + //See above - These are one of those things. + returnable_list += typesof(/obj/effect/decal/cleanable/fuel_pool) //Invoke async in init, skippppp returnable_list += typesof(/mob/living/silicon/robot/model) //This lad also sleeps diff --git a/code/modules/uplink/uplink_devices.dm b/code/modules/uplink/uplink_devices.dm index 4d539be433de2..596ea9e1ffad4 100644 --- a/code/modules/uplink/uplink_devices.dm +++ b/code/modules/uplink/uplink_devices.dm @@ -48,11 +48,11 @@ hidden_uplink.uplink_handler.debug_mode = TRUE /obj/item/uplink/nuclear - uplink_flag = UPLINK_NUKE_OPS + uplink_flag = UPLINK_ALL_SYNDIE_OPS /obj/item/uplink/nuclear/debug name = "debug nuclear uplink" - uplink_flag = UPLINK_NUKE_OPS + uplink_flag = UPLINK_ALL_SYNDIE_OPS /obj/item/uplink/nuclear/debug/Initialize(mapload, owner, tc_amount = 9000, datum/uplink_handler/uplink_handler_override = null) . = ..() @@ -68,6 +68,10 @@ var/datum/component/uplink/hidden_uplink = GetComponent(/datum/component/uplink) hidden_uplink.allow_restricted = FALSE +///A subtype used for lone ops, with some of the stuff they shouldn't/can't access removed from purchase. +/obj/item/uplink/loneop + uplink_flag = UPLINK_LONE_OP + /obj/item/uplink/clownop uplink_flag = UPLINK_CLOWN_OPS diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm index 5326880d31be6..705204f98a15b 100644 --- a/code/modules/uplink/uplink_items/ammunition.dm +++ b/code/modules/uplink/uplink_items/ammunition.dm @@ -13,14 +13,14 @@ cost = 2 surplus = 0 illegal_tech = FALSE - purchasable_from = ~UPLINK_NUKE_OPS + purchasable_from = ~UPLINK_SERIOUS_OPS /datum/uplink_item/ammo/pistol name = "9mm Handgun Magazine" desc = "An additional 8-round 9mm magazine, compatible with the Makarov pistol." item = /obj/item/ammo_box/magazine/m9mm cost = 1 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS illegal_tech = FALSE /datum/uplink_item/ammo/pistolap @@ -29,7 +29,7 @@ These rounds are less effective at injuring the target but penetrate protective gear." item = /obj/item/ammo_box/magazine/m9mm/ap cost = 2 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/ammo/pistolhp name = "9mm Hollow Point Magazine" @@ -37,7 +37,7 @@ These rounds are more damaging but ineffective against armour." item = /obj/item/ammo_box/magazine/m9mm/hp cost = 3 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/ammo/pistolfire name = "9mm Incendiary Magazine" @@ -45,7 +45,7 @@ Loaded with incendiary rounds which inflict little damage, but ignite the target." item = /obj/item/ammo_box/magazine/m9mm/fire cost = 2 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/ammo/revolver name = ".357 Speed Loader" @@ -53,5 +53,5 @@ For when you really need a lot of things dead." item = /obj/item/ammo_box/a357 cost = 4 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) //nukies get their own version + purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) //nukies get their own version illegal_tech = FALSE diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm index b708af62b69c9..f92435f379532 100644 --- a/code/modules/uplink/uplink_items/bundle.dm +++ b/code/modules/uplink/uplink_items/bundle.dm @@ -62,7 +62,7 @@ item = /obj/item/storage/box/syndicate/bundle_a cost = 20 stock_key = UPLINK_SHARED_STOCK_KITS - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) + purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) /datum/uplink_item/bundles_tc/bundle_b name = "Syndi-kit Special" @@ -73,7 +73,7 @@ item = /obj/item/storage/box/syndicate/bundle_b cost = 20 stock_key = UPLINK_SHARED_STOCK_KITS - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) + purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) /datum/uplink_item/bundles_tc/surplus name = "Syndicate Surplus Crate" @@ -82,7 +82,7 @@ Contents are sorted to always be worth 30 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 | UPLINK_SPY) + purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) stock_key = UPLINK_SHARED_STOCK_SURPLUS /// Value of items inside the crate in TC var/crate_tc_value = 30 @@ -171,5 +171,5 @@ The Syndicate will only provide one surplus item per agent." cost = 20 item = /obj/item/syndicrate_key - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) + purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) stock_key = UPLINK_SHARED_STOCK_SURPLUS diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm index 970741876bb7a..11cca6c442661 100644 --- a/code/modules/uplink/uplink_items/dangerous.dm +++ b/code/modules/uplink/uplink_items/dangerous.dm @@ -13,7 +13,7 @@ item = /obj/item/gun/ballistic/automatic/pistol/toy/riot cost = 2 surplus = 10 - purchasable_from = ~UPLINK_NUKE_OPS + purchasable_from = ~UPLINK_SERIOUS_OPS /datum/uplink_item/dangerous/pistol name = "Makarov Pistol" @@ -21,7 +21,7 @@ with suppressors." item = /obj/item/gun/ballistic/automatic/pistol cost = 7 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/dangerous/throwingweapons name = "Box of Throwing Weapons" @@ -49,7 +49,7 @@ progression_minimum = 20 MINUTES item = /obj/item/melee/powerfist cost = 6 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/dangerous/rapid name = "Gloves of the North Star" @@ -66,7 +66,7 @@ item = /obj/item/dualsaber cost = 13 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //nukies get their own version + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS //nukies get their own version /datum/uplink_item/dangerous/doublesword/get_discount_value(discount_type) switch(discount_type) @@ -85,7 +85,7 @@ item = /obj/item/guardian_creator/tech cost = 18 surplus = 0 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS restricted = TRUE refundable = TRUE @@ -95,7 +95,7 @@ item = /obj/item/gun/ballistic/revolver/syndicate cost = 13 surplus = 50 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //nukies get their own version + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS //nukies get their own version /datum/uplink_item/dangerous/cat name = "Feral cat grenade" diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index 7f87d93464e48..c1b0f8b2e0215 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -89,7 +89,7 @@ item = /obj/item/computer_disk/syndicate/camera_app cost = 1 surplus = 90 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/device_tools/military_belt name = "Chest Rig" @@ -122,7 +122,7 @@ item = /obj/item/computer_disk/virus/frame cost = 4 restricted = TRUE - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/device_tools/frame/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) . = ..() @@ -138,7 +138,7 @@ cost = 1 surplus = 0 restricted = TRUE - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/device_tools/failsafe/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) var/datum/component/uplink/uplink = source.GetComponent(/datum/component/uplink) @@ -173,7 +173,7 @@ and wavelength, which controls the delay before the effect kicks in." item = /obj/item/healthanalyzer/rad_laser cost = 3 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/device_tools/suspiciousphone name = "Protocol CRAB-17 Phone" @@ -246,7 +246,7 @@ item = /obj/item/sbeacondrop cost = 10 surplus = 0 // not while there isnt one on any station - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/device_tools/powersink name = "Power Sink" diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index 98378a9422a03..b010755d67e9e 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -4,7 +4,7 @@ /datum/uplink_item/role_restricted category = /datum/uplink_category/role_restricted - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/role_restricted/haunted_magic_eightball name = "Haunted Magic Eightball" @@ -390,3 +390,4 @@ restricted = TRUE refundable = FALSE purchasable_from = parent_type::purchasable_from & ~UPLINK_SPY + diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index eff0fb933eaca..4f50994bc40ec 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -7,7 +7,7 @@ /datum/uplink_item/weapon_kits category = /datum/uplink_category/weapon_kits surplus = 40 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS // ~~ Ammunition Categories ~~ @@ -18,7 +18,7 @@ /datum/uplink_item/ammo_nuclear category = /datum/uplink_category/ammo_nuclear surplus = 40 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS // Basic: Run of the mill ammunition for various firearms /datum/uplink_item/ammo_nuclear/basic @@ -55,14 +55,14 @@ cost = 22 //freedom 5, doormag 3, c-4 1, stimpack 5, shield modsuit module 8 limited_stock = 1 cant_discount = TRUE - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS //Low-cost firearms: Around 8 TC each. Meant for easy squad weapon purchases /datum/uplink_item/weapon_kits/low_cost cost = 8 surplus = 40 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS // ~~ Bulldog Shotgun ~~ @@ -139,7 +139,7 @@ /datum/uplink_item/weapon_kits/medium_cost cost = 14 surplus = 20 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS // ~~ C-20r Submachine Gun ~~ @@ -172,7 +172,7 @@ Loaded with incendiary rounds which inflict little damage, but ignite the target." item = /obj/item/ammo_box/magazine/smgm45/incen cost = 4 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS // ~~ Energy Sword and Shield & CQC ~~ @@ -186,7 +186,7 @@ name = "CQC Equipment Case (Very Hard)" desc = "Contains a manual that instructs you in the ways of CQC, or Close Quarters Combat. Comes with a stealth implant, a pack of smokes and a snazzy bandana (use it with the hat stabilizers in your MODsuit)." item = /obj/item/storage/toolbox/guncase/cqc - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_ALL_SYNDIE_OPS surplus = 0 // ~~ Syndicate Revolver ~~ @@ -247,7 +247,7 @@ /datum/uplink_item/weapon_kits/high_cost cost = 18 surplus = 10 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS // ~~ L6 SAW Machine Gun ~~ @@ -377,14 +377,14 @@ desc = "A horribly outdated automatic weapon. Why would you want to use this? Comes with...rations." item = /obj/item/gun/ballistic/automatic/plastikov cost = 2 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS /datum/uplink_item/ammo_nuclear/surplus_smg name = "Surplus SMG Magazine (Surplus)" desc = "A cylindrical magazine designed for the PP-95 SMG." item = /obj/item/ammo_box/magazine/plastikov9mm cost = 1 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS illegal_tech = FALSE // Explosives and Grenades @@ -393,8 +393,7 @@ /datum/uplink_item/explosives/grenades cost = 15 surplus = 35 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS - + purchasable_from = UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/explosives/grenades/buzzkill name = "Buzzkill Grenade Box" desc = "A box with three grenades that release a swarm of angry bees upon activation. These bees indiscriminately attack friend or foe \ @@ -421,7 +420,7 @@ name = "Grenadier's Belt and Grenade Launcher Kit (Hard)" desc = "A belt containing 26 lethally dangerous and destructive grenades, along with a grenade launcher to fire them. Comes with an extra multitool and screwdriver." item = /obj/item/storage/box/syndie_kit/demoman - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS // ~~ Detonator: In case you lose the old one ~~ @@ -433,7 +432,7 @@ the blast radius before using the detonator." item = /obj/item/syndicatedetonator cost = 1 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_ALL_SYNDIE_OPS // Support (Borgs and Reinforcements) @@ -445,7 +444,7 @@ category = /datum/uplink_category/reinforcements surplus = 0 cost = 35 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS restricted = TRUE refundable = TRUE @@ -482,6 +481,7 @@ If you're a meathead who's just here to kill people and don't care about strategising or intel, you'll still have someone to bear witness to your murder-spree!" item = /obj/item/antag_spawner/nuke_ops/overwatch cost = 12 + purchasable_from = UPLINK_FIREBASE_OPS // ~~ Disposable Sentry Gun ~~ // Technically not a spawn but it is a kind of reinforcement...I guess. @@ -501,7 +501,7 @@ desc = "A box containing x-ray eyes, a CNS Rebooter and Reviver implant. Comes with an autosurgeon for each." item = /obj/item/storage/box/cyber_implants cost = 20 //worth 24 TC - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS /datum/uplink_item/bundles_tc/medical name = "Medical bundle" @@ -509,7 +509,7 @@ a Donksoft LMG, a box of riot darts and a magboot MODsuit module to rescue your friends in no-gravity environments." item = /obj/item/storage/backpack/duffelbag/syndie/med/medicalbundle cost = 25 // normally 31 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS /datum/uplink_item/bundles_tc/firestarter name = "Spetsnaz Pyro bundle" @@ -518,7 +518,7 @@ Order NOW and comrade Boris will throw in an extra tracksuit." item = /obj/item/storage/backpack/duffelbag/syndie/firestarter cost = 30 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS /datum/uplink_item/bundles_tc/induction_kit name = "Syndicate Induction Kit" @@ -538,7 +538,7 @@ A lighter is also included, though you must supply your own smokes." item = /obj/item/storage/box/syndie_kit/cowboy cost = 18 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS // Mech related gear @@ -549,7 +549,7 @@ /datum/uplink_item/mech category = /datum/uplink_category/mech surplus = 0 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS restricted = TRUE // ~~ Mechs ~~ @@ -575,21 +575,21 @@ desc = "A duffel bag containing ammo for four full reloads of the scattershotm which is equipped on standard Dark Gygax and Mauler exosuits. Also comes with some support equipment for maintaining the mech, including tools and an inducer." item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mech cost = 4 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS /datum/uplink_item/mech/support_bag/mauler name = "Mauler Ammo Bag" desc = "A duffel bag containing ammo for three full reloads of the LMG, scattershot carbine, and SRM-8 missile laucher that are equipped on a standard Mauler exosuit." item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler cost = 6 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS // Stealthy Tools /datum/uplink_item/stealthy_tools/syndigaloshes/nuke item = /obj/item/clothing/shoes/chameleon/noslip cost = 4 - purchasable_from = UPLINK_NUKE_OPS + purchasable_from = UPLINK_SERIOUS_OPS /datum/uplink_item/stealthy_weapons/romerol_kit name = "Romerol" @@ -598,7 +598,7 @@ along with slurred speech, aggression, and the ability to infect others with this agent." item = /obj/item/storage/box/syndie_kit/romerol cost = 25 - purchasable_from = UPLINK_CLOWN_OPS|UPLINK_NUKE_OPS + purchasable_from = UPLINK_ALL_SYNDIE_OPS cant_discount = TRUE // Modsuits @@ -608,7 +608,7 @@ desc = "An upgraded, elite version of the Syndicate MODsuit. It features fireproofing, and also \ provides the user with superior armor and mobility compared to the standard Syndicate MODsuit." item = /obj/item/mod/control/pre_equipped/elite - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY + purchasable_from = (UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) /datum/uplink_item/suits/energy_shield name = "MODsuit Energy Shield Module" @@ -616,28 +616,28 @@ before needing to recharge. Used wisely, this module will keep you alive for a lot longer." item = /obj/item/mod/module/energy_shield cost = 8 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY + purchasable_from = (UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) /datum/uplink_item/suits/emp_shield name = "MODsuit Advanced EMP Shield Module" desc = "An advanced EMP shield module for a MODsuit. It protects your entire body from electromagnetic pulses." item = /obj/item/mod/module/emp_shield/advanced cost = 5 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY + purchasable_from = (UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) /datum/uplink_item/suits/injector name = "MODsuit Injector Module" desc = "An injector module for a MODsuit. It is an extendable piercing injector with 30u capacity." item = /obj/item/mod/module/injector cost = 2 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY + purchasable_from = (UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) /datum/uplink_item/suits/holster name = "MODsuit Holster Module" desc = "A holster module for a MODsuit. It can stealthily store any not too heavy gun inside it." item = /obj/item/mod/module/holster cost = 2 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY + purchasable_from = (UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) /datum/uplink_item/device_tools/medgun_mod name = "Medbeam Gun Module" @@ -645,7 +645,7 @@ operatives in the fight, even while under fire. Don't cross the streams!" item = /obj/item/mod/module/medbeam cost = 15 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/suits/syndi_intellicard name = "Pre-Loaded Syndicate Intellicard" @@ -653,7 +653,7 @@ However, due to failsafes activated during the extraction process, the AI is unable to interact with electronics from anywhere but direct proximity..." item = /obj/item/aicard/syndie/loaded cost = 12 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_ALL_SYNDIE_OPS refundable = TRUE /datum/uplink_item/suits/synd_ai_upgrade @@ -661,7 +661,7 @@ desc = "...unless you buy the Syndicate Upgrade! This data chip allows the captured AI to increase its interaction range by two tiles per application. The Syndicate recommends three or four purchases at most, for a total of seven or infinite meters of range." item = /obj/item/computer_disk/syndie_ai_upgrade cost = 4 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_ALL_SYNDIE_OPS cant_discount = TRUE refundable = TRUE @@ -675,6 +675,7 @@ surplus = 0 purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS restricted = TRUE + purchasable_from = UPLINK_FIREBASE_OPS /datum/uplink_item/device_tools/syndie_jaws_of_life name = "Syndicate Jaws of Life" @@ -682,7 +683,7 @@ In its crowbar configuration, it can be used to force open airlocks. Very useful for entering the station or its departments." item = /obj/item/crowbar/power/syndicate cost = 4 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY + purchasable_from = UPLINK_SERIOUS_OPS | UPLINK_SPY /datum/uplink_item/device_tools/medkit name = "Syndicate Combat Medic Kit" @@ -691,7 +692,7 @@ for faster healing on the field. Also comes with basic medical tools and sterlizer." item = /obj/item/storage/medkit/tactical cost = 4 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_SERIOUS_OPS /datum/uplink_item/device_tools/medkit/premium name = "Syndicate Combat Medical Suite" @@ -701,7 +702,7 @@ and some helpful MODsuit modules for for field medical use and operative physiopharmaceutical augmentation." item = /obj/item/storage/medkit/tactical/premium cost = 15 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_SERIOUS_OPS /datum/uplink_item/device_tools/potion name = "Syndicate Sentience Potion" @@ -709,7 +710,7 @@ desc = "A potion recovered at great risk by undercover Syndicate operatives and then subsequently modified with Syndicate technology. \ Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors." cost = 4 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY + purchasable_from = UPLINK_SERIOUS_OPS | UPLINK_SPY restricted = TRUE // Implants @@ -734,7 +735,7 @@ This will permanently destroy your body, however." item = /obj/item/storage/box/syndie_kit/imp_microbomb cost = 2 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_SPY + purchasable_from = UPLINK_SERIOUS_OPS | UPLINK_SPY /datum/uplink_item/implants/nuclear/macrobomb name = "Macrobomb Implant" @@ -750,7 +751,7 @@ Prevents collapsing from critical condition, but explodes after a while." item = /obj/item/storage/box/syndie_kit/imp_deniability cost = 6 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_SPY + purchasable_from = UPLINK_SERIOUS_OPS | UPLINK_SPY /datum/uplink_item/implants/nuclear/reviver name = "Reviver Implant" @@ -780,7 +781,7 @@ /datum/uplink_item/badass/costumes surplus = 0 - purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + purchasable_from = UPLINK_SERIOUS_OPS cost = 4 cant_discount = TRUE @@ -803,7 +804,6 @@ you can blow those corpo suits away with your very own home-made explosive devices. Made in your local firebase's \ very own Ordnance Laboratory! *The Syndicate is not responsible for injuries or deaths sustained while utilizing the lab." item = /obj/item/keycard/syndicate_bomb - purchasable_from = UPLINK_NUKE_OPS /datum/uplink_item/base_keys/bio_key name = "Syndicate Bio-Weapon Laboratory Access Card" @@ -840,4 +840,4 @@ desc = "Hat crate! Contains hats! HATS!!!" item = /obj/structure/closet/crate/large/hats cost = 5 - purchasable_from = UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS + purchasable_from = UPLINK_ALL_SYNDIE_OPS diff --git a/code/modules/uplink/uplink_items/species.dm b/code/modules/uplink/uplink_items/species.dm index 5eb4bbdcb1776..5b76b745f9b52 100644 --- a/code/modules/uplink/uplink_items/species.dm +++ b/code/modules/uplink/uplink_items/species.dm @@ -4,7 +4,7 @@ /datum/uplink_item/species_restricted category = /datum/uplink_category/species - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) + purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS | UPLINK_SPY) /datum/uplink_item/species_restricted/moth_lantern name = "Extra-Bright Lantern" diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm index fb450fb68df93..898b82d1b6ad2 100644 --- a/code/modules/uplink/uplink_items/stealthy.dm +++ b/code/modules/uplink/uplink_items/stealthy.dm @@ -13,7 +13,7 @@ item = /obj/item/gun/syringe/syndicate cost = 4 surplus = 50 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/stealthy_weapons/dehy_carp name = "Dehydrated Space Carp" @@ -67,7 +67,7 @@ item = /obj/item/storage/box/syndie_kit/origami_bundle cost = 4 surplus = 0 - purchasable_from = ~UPLINK_NUKE_OPS //clown ops intentionally left in, because that seems like some s-tier shenanigans. + purchasable_from = ~UPLINK_SERIOUS_OPS //clown ops intentionally left in, because that seems like some s-tier shenanigans. /datum/uplink_item/stealthy_weapons/martialarts @@ -78,7 +78,7 @@ progression_minimum = 30 MINUTES cost = 17 surplus = 0 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/stealthy_weapons/crossbow name = "Miniature Energy Crossbow" @@ -91,7 +91,7 @@ item = /obj/item/gun/energy/recharge/ebow cost = 10 surplus = 50 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/stealthy_weapons/contrabaton name = "Contractor Baton" diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm index 59b8f6fca77e6..a225d04d6674e 100644 --- a/code/modules/uplink/uplink_items/stealthy_tools.dm +++ b/code/modules/uplink/uplink_items/stealthy_tools.dm @@ -30,7 +30,7 @@ Due to budget cuts, the shoes don't provide protection against slipping and skillchips are sold separately." item = /obj/item/storage/box/syndie_kit/chameleon cost = 2 - purchasable_from = ~UPLINK_NUKE_OPS //clown ops are allowed to buy this kit, since it's basically a costume + purchasable_from = ~UPLINK_NUKE_OPS //clown ops are allowed to buy this kit, since it's basically a costume, loneops can purchase it to blend in. /datum/uplink_item/stealthy_tools/syndigaloshes name = "No-Slip Chameleon Shoes" @@ -38,7 +38,7 @@ They do not work on heavily lubricated surfaces." item = /obj/item/clothing/shoes/chameleon/noslip cost = 2 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS) /datum/uplink_item/stealthy_tools/chameleon_proj name = "Chameleon Projector" @@ -75,7 +75,7 @@ item = /obj/item/reagent_containers/syringe/mulligan cost = 4 surplus = 30 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_ALL_SYNDIE_OPS) /datum/uplink_item/stealthy_tools/jammer name = "Radio Jammer" @@ -108,7 +108,7 @@ limited_stock = 1 cost = 4 restricted = TRUE - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //Can still be purchased by loneops to give them an edge. /datum/uplink_item/stealthy_tools/telecomm_blackout/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) force_event(/datum/round_event_control/communications_blackout, "a syndicate virus") @@ -123,7 +123,7 @@ limited_stock = 1 cost = 6 restricted = TRUE - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //Can still be purchased by loneops to give them an edge. /datum/uplink_item/stealthy_tools/blackout/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) force_event(/datum/round_event_control/grid_check, "a syndicate virus") diff --git a/code/modules/uplink/uplink_items/suits.dm b/code/modules/uplink/uplink_items/suits.dm index 5d89f80506178..d940d4eb06769 100644 --- a/code/modules/uplink/uplink_items/suits.dm +++ b/code/modules/uplink/uplink_items/suits.dm @@ -17,7 +17,7 @@ as well as causing significant demoralization amongst Nanotrasen crew." item = /obj/item/mod/control/pre_equipped/infiltrator cost = 6 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS /datum/uplink_item/suits/space_suit name = "Syndicate Space Suit" @@ -32,7 +32,7 @@ desc = "The feared MODsuit of a Syndicate agent. Features armoring and a set of inbuilt modules." item = /obj/item/mod/control/pre_equipped/traitor cost = 8 - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //you can't buy it in nuke, because the elite modsuit costs the same while being better + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS //you can't buy it in nuke, because the elite modsuit costs the same while being better /datum/uplink_item/suits/thermal name = "MODsuit Thermal Visor Module" @@ -76,6 +76,6 @@ provides the user with superior armor and mobility compared to the standard Syndicate MODsuit." item = /obj/item/mod/control/pre_equipped/traitor_elite // This one costs more than the nuke op counterpart - purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS | UPLINK_SPY) + purchasable_from = ~UPLINK_ALL_SYNDIE_OPS progression_minimum = 90 MINUTES cost = 16 diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index faf95e8cd73c7..7da8fc0314b10 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -30,7 +30,7 @@ var/canmove = TRUE var/list/autogrant_actions_passenger //plain list of typepaths var/list/autogrant_actions_controller //assoc list "[bitflag]" = list(typepaths) - var/list/mob/occupant_actions //assoc list mob = list(type = action datum assigned to mob) + var/list/list/datum/action/occupant_actions //assoc list mob = list(type = action datum assigned to mob) ///This vehicle will follow us when we move (like atrailer duh) var/obj/vehicle/trailer var/are_legs_exposed = FALSE diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index f36beee83cd77..d35df3126636e 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -16,6 +16,7 @@ * Clicks are wither translated into mech_melee_attack (see mech_melee_attack.dm) * Or are used to call action() on equipped gear * Cooldown for gear is on the mech because exploits + * Cooldown for melee is on mech_melee_attack also because exploits */ /obj/vehicle/sealed/mecha name = "exosuit" @@ -28,7 +29,6 @@ movedelay = 1 SECONDS move_force = MOVE_FORCE_VERY_STRONG move_resist = MOVE_FORCE_EXTREMELY_STRONG - COOLDOWN_DECLARE(mecha_bump_smash) light_system = OVERLAY_LIGHT_DIRECTIONAL light_on = FALSE light_range = 6 @@ -137,9 +137,18 @@ var/stepsound = 'sound/mecha/mechstep.ogg' ///Sound played when the mech walks var/turnsound = 'sound/mecha/mechturn.ogg' + ///Sounds for types of melee attack + var/brute_attack_sound = 'sound/weapons/punch4.ogg' + var/burn_attack_sound = 'sound/items/welder.ogg' + var/tox_attack_sound = 'sound/effects/spray2.ogg' + ///Sound on wall destroying + var/destroy_wall_sound = 'sound/effects/meteorimpact.ogg' + + ///Melee attack verb + var/list/attack_verbs = list("hit", "hits", "hitting") ///Cooldown duration between melee punches - var/melee_cooldown = 10 + var/melee_cooldown = CLICK_CD_SLOW ///TIme taken to leave the mech var/exit_delay = 2 SECONDS @@ -151,6 +160,8 @@ var/is_currently_ejecting = FALSE ///Safety for weapons. Won't fire if enabled, and toggled by middle click. var/weapons_safety = FALSE + ///Don't play standard sound when set safety if TRUE. + var/safety_sound_custom = FALSE var/datum/effect_system/fluid_spread/smoke/smoke_system @@ -194,9 +205,6 @@ ///Wether we are strafing var/strafe = FALSE - ///Cooldown length between bumpsmashes - var/smashcooldown = 3 - ///Bool for whether this mech can only be used on lavaland var/lavaland_only = FALSE @@ -368,7 +376,8 @@ */ /obj/vehicle/sealed/mecha/proc/set_safety(mob/user) weapons_safety = !weapons_safety - SEND_SOUND(user, sound('sound/machines/beep.ogg', volume = 25)) + if(!safety_sound_custom) + SEND_SOUND(user, sound('sound/machines/beep.ogg', volume = 25)) balloon_alert(user, "equipment [weapons_safety ? "safe" : "ready"]") set_mouse_pointer() SEND_SIGNAL(src, COMSIG_MECH_SAFETIES_TOGGLE, user, weapons_safety) @@ -703,10 +712,9 @@ return use_energy(melee_energy_drain) - SEND_SIGNAL(user, COMSIG_MOB_USED_MECH_MELEE, src) - target.mech_melee_attack(src, user) - TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, melee_cooldown) - + SEND_SIGNAL(user, COMSIG_MOB_USED_CLICK_MECH_MELEE, src) + if(target.mech_melee_attack(src, user)) + TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, melee_cooldown) /// Driver alt clicks anything while in mech /obj/vehicle/sealed/mecha/proc/on_click_alt(mob/user, atom/target, params) @@ -909,3 +917,9 @@ act.button_icon_state = "mech_lights_off" balloon_alert(occupant, "lights [mecha_flags & LIGHTS_ON ? "on":"off"]") act.build_all_button_icons() + +/obj/vehicle/sealed/mecha/proc/melee_attack_effect(mob/living/victim, heavy) + if(heavy) + victim.Unconscious(2 SECONDS) + else + victim.Knockdown(4 SECONDS) diff --git a/code/modules/vehicles/mecha/combat/justice.dm b/code/modules/vehicles/mecha/combat/justice.dm new file mode 100644 index 0000000000000..babdb8af17b99 --- /dev/null +++ b/code/modules/vehicles/mecha/combat/justice.dm @@ -0,0 +1,535 @@ +#define DISMEMBER_CHANCE_HIGH 50 +#define DISMEMBER_CHANCE_LOW 25 + +#define MOVEDELAY_ANGRY 4.5 +#define MOVEDELAY_SAFETY 2.5 + +/obj/vehicle/sealed/mecha/justice + name = "\improper Justice" + desc = "Black and red syndicate mech designed for execution orders. \ + For safety reasons, the syndicate advises against standing too close." + icon_state = "justice" + base_icon_state = "justice" + movedelay = MOVEDELAY_SAFETY // fast + max_integrity = 200 // but weak + accesses = list(ACCESS_SYNDICATE) + armor_type = /datum/armor/mecha_justice + max_temperature = 40000 + force = 60 // dangerous in melee + damtype = BRUTE + destruction_sleep_duration = 10 + exit_delay = 10 + wreckage = /obj/structure/mecha_wreckage/justice + mech_type = EXOSUIT_MODULE_JUSTICE + resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + mecha_flags = ID_LOCK_ON | QUIET_STEPS | QUIET_TURNS | CAN_STRAFE | HAS_LIGHTS | MMI_COMPATIBLE | IS_ENCLOSED + destroy_wall_sound = 'sound/mecha/mech_blade_break_wall.ogg' + brute_attack_sound = 'sound/mecha/mech_blade_attack.ogg' + attack_verbs = list("cut", "cuts", "cutting") + weapons_safety = TRUE + safety_sound_custom = TRUE + max_equip_by_category = list( + MECHA_L_ARM = null, + MECHA_R_ARM = null, + MECHA_UTILITY = 3, + MECHA_POWER = 1, + MECHA_ARMOR = 2, + ) + step_energy_drain = 2 + +/datum/armor/mecha_justice + melee = 30 + bullet = 20 + laser = 20 + energy = 30 + fire = 100 + acid = 100 + +/obj/vehicle/sealed/mecha/justice/Initialize(mapload, built_manually) + . = ..() + RegisterSignal(src, COMSIG_MECHA_MELEE_CLICK, PROC_REF(justice_fatality)) //We do not hit those who are in crit or stun. We are finishing them. + transform = transform.Scale(1.04, 1.04) + +/obj/vehicle/sealed/mecha/justice/generate_actions() + . = ..() + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/invisibility) + initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/charge_attack) + +/obj/vehicle/sealed/mecha/justice/update_icon_state() + . = ..() + if(LAZYLEN(occupants)) + icon_state = weapons_safety ? "[base_icon_state]" : "[base_icon_state]-angry" + if(!has_gravity()) + icon_state = "[icon_state]-fly" + +/obj/vehicle/sealed/mecha/justice/set_safety(mob/user) + . = ..() + if(weapons_safety) + movedelay = MOVEDELAY_SAFETY + else + movedelay = MOVEDELAY_ANGRY + + playsound(src, 'sound/mecha/mech_blade_safty.ogg', 75, FALSE) //everyone need to hear this sound + + update_appearance(UPDATE_ICON_STATE) + +/obj/vehicle/sealed/mecha/justice/Move(newloc, dir) + if(HAS_TRAIT(src, TRAIT_IMMOBILIZED)) + return + . = ..() + update_appearance(UPDATE_ICON_STATE) + +/// Says 1 of 3 epic phrases before attacking and make a finishing blow to targets in stun or crit after 1 SECOND. +/obj/vehicle/sealed/mecha/justice/proc/justice_fatality(datum/source, mob/living/pilot, atom/target, on_cooldown, is_adjacent) + SIGNAL_HANDLER + + if(!ishuman(target)) + return FALSE + var/mob/living/carbon/human/live_or_dead = target + if(live_or_dead.stat < UNCONSCIOUS && live_or_dead.getStaminaLoss() < 100) + return FALSE + var/obj/item/bodypart/check_head = live_or_dead.get_bodypart(BODY_ZONE_HEAD) + if(!check_head) + return FALSE + INVOKE_ASYNC(src, PROC_REF(finish_him), src, pilot, live_or_dead) + return TRUE + +/** + * ## finish_him + * + * Target's head is cut off (if it has one) + * Attack from invisibility and charged attack have higher priority. + * Arguments: + * * finisher - Mech pilot who makes an attack. + * * him - Target at which the mech makes an attack. + */ +/obj/vehicle/sealed/mecha/justice/proc/finish_him(obj/vehicle/sealed/mecha/my_mech, mob/finisher, mob/living/him) + say(pick("Take my Justice-Slash!", "A falling leaf...", "Justice is quite a lonely path"), forced = "Justice Mech") + playsound(src, 'sound/mecha/mech_stealth_pre_attack.ogg', 75, FALSE) + if(!do_after(finisher, 1 SECONDS, him)) + return + if(QDELETED(finisher)) + return + if(QDELETED(him)) + return + if(QDELETED(my_mech)) + return + if(!LAZYLEN(my_mech.occupants)) + return + var/turf/finish_turf = get_step(him, get_dir(my_mech, him)) + var/turf/for_line_turf = get_turf(my_mech) + var/obj/item/bodypart/in_your_head = him.get_bodypart(BODY_ZONE_HEAD) + in_your_head?.dismember(BRUTE) + playsound(src, brute_attack_sound, 75, FALSE) + for_line_turf.Beam(src, icon_state = "mech_charge", time = 8) + forceMove(finish_turf) + +/obj/vehicle/sealed/mecha/justice/melee_attack_effect(mob/living/victim, heavy) + if(!heavy) + victim.Knockdown(4 SECONDS) + return + if(!prob(DISMEMBER_CHANCE_HIGH)) + return + var/obj/item/bodypart/cut_bodypart = victim.get_bodypart(pick(BODY_ZONE_R_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG)) + cut_bodypart?.dismember(BRUTE) + + +/obj/vehicle/sealed/mecha/justice/mob_exit(mob/M, silent, randomstep, forced) + . = ..() + if(alpha == 255) + return + animate(src, alpha = 255, time = 0.5 SECONDS) + playsound(src, 'sound/mecha/mech_stealth_effect.ogg' , 75, FALSE) + +/obj/vehicle/sealed/mecha/justice/take_damage(damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) + if(LAZYLEN(occupants)) + if(prob(60)) + new /obj/effect/temp_visual/mech_sparks(get_turf(src)) + playsound(src, 'sound/mecha/mech_stealth_effect.ogg' , 75, FALSE) + return + return ..() + +/datum/action/vehicle/sealed/mecha/invisibility + name = "Invisibility" + button_icon_state = "mech_stealth_off" + /// Is invisibility activated. + var/on = FALSE + /// Recharge check. + var/charge = TRUE + /// Varset for invisibility timer + var/invisibility_timer + /// Energy cost to become invisibile + var/energy_cost = 200 + /// Aoe pre attack sound. + var/stealth_pre_attack_sound = 'sound/mecha/mech_stealth_pre_attack.ogg' + /// Aoe attack sound. + var/stealth_attack_sound = 'sound/mecha/mech_stealth_attack.ogg' + +/datum/action/vehicle/sealed/mecha/invisibility/set_chassis(passed_chassis) + . = ..() + RegisterSignal(chassis, COMSIG_MECH_SAFETIES_TOGGLE, PROC_REF(on_toggle_safety)) + +/// update button icon when toggle safety. +/datum/action/vehicle/sealed/mecha/invisibility/proc/on_toggle_safety() + SIGNAL_HANDLER + + build_all_button_icons(UPDATE_BUTTON_STATUS) + +/datum/action/vehicle/sealed/mecha/invisibility/Trigger(trigger_flags) + . = ..() + if(!.) + return + on = !on + if(on) + invisibility_on() + else + invisibility_off() + +/datum/action/vehicle/sealed/mecha/invisibility/IsAvailable(feedback) + . = ..() + if(!.) + return FALSE + if(!chassis.has_charge(energy_cost)) + if(feedback) + owner.balloon_alert(owner, "not enough energy!") + return FALSE + if(chassis.weapons_safety) + if(feedback) + owner.balloon_alert(owner, "safety is on!") + return FALSE + if(!charge) + if(feedback) + owner.balloon_alert(owner, "recharging!") + return FALSE + + return TRUE + +///Called when invisibility activated. +/datum/action/vehicle/sealed/mecha/invisibility/proc/invisibility_on() + new /obj/effect/temp_visual/mech_sparks(get_turf(chassis)) + playsound(chassis, 'sound/mecha/mech_stealth_effect.ogg' , 75, FALSE) + check_charge_attack() + animate(chassis, alpha = 0, time = 0.5 SECONDS) + button_icon_state = "mech_stealth_on" + invisibility_timer = addtimer(CALLBACK(src, PROC_REF(end_stealth)), 20 SECONDS) + RegisterSignal(chassis, COMSIG_MECHA_MELEE_CLICK, PROC_REF(stealth_attack_aoe)) + RegisterSignal(chassis, COMSIG_MOVABLE_BUMP, PROC_REF(bumb_on)) + RegisterSignal(chassis, COMSIG_ATOM_BUMPED, PROC_REF(bumbed_on)) + RegisterSignal(chassis, COMSIG_ATOM_TAKE_DAMAGE, PROC_REF(take_damage)) + chassis.use_energy(energy_cost) + build_all_button_icons() + +///Called when invisibility deactivated. +/datum/action/vehicle/sealed/mecha/invisibility/proc/invisibility_off() + new /obj/effect/temp_visual/mech_sparks(get_turf(chassis)) + playsound(chassis, 'sound/mecha/mech_stealth_effect.ogg' , 75, FALSE) + invisibility_timer = null + charge = FALSE + addtimer(CALLBACK(src, PROC_REF(charge)), 5 SECONDS) + button_icon_state = "mech_stealth_cooldown" + animate(chassis, alpha = 255, time = 0.5 SECONDS) + UnregisterSignal(chassis, list( + COMSIG_MECHA_MELEE_CLICK, + COMSIG_MOVABLE_BUMP, + COMSIG_ATOM_BUMPED, + COMSIG_ATOM_TAKE_DAMAGE + )) + build_all_button_icons() + +///Check if mech use charge attack and deactivate it when we activate invisibility. +/datum/action/vehicle/sealed/mecha/invisibility/proc/check_charge_attack() + for(var/mob/living/occupant in chassis.occupants) + var/datum/action/vehicle/sealed/mecha/charge_attack/charge_action = LAZYACCESSASSOC(chassis.occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/charge_attack) + if(charge_action?.on) + charge_action.on = !on + charge_action.charge_attack_off() +/** + * ## end_stealth + * + * Called when mech runs out of invisibility time. + */ +/datum/action/vehicle/sealed/mecha/invisibility/proc/end_stealth() + make_visible() + +/** + * ## bumb_on + * + * Called when mech bumb on somthing. If is living somthing shutdown mech invisibility. + */ +/datum/action/vehicle/sealed/mecha/invisibility/proc/bumb_on(obj/vehicle/sealed/mecha/our_mech, atom/obstacle) + SIGNAL_HANDLER + + if(!isliving(obstacle)) + return + make_visible() + +/** + * ## bumbed_on + * + * Called when somthing bumbed on mech. If is living somthing shutdown mech invisibility. + */ +/datum/action/vehicle/sealed/mecha/invisibility/proc/bumbed_on(obj/vehicle/sealed/mecha/our_mech, atom/movable/bumped_atom) + SIGNAL_HANDLER + + if(!isliving(bumped_atom)) + return + make_visible() + +/** + * ## take_damage + * + * Called when mech take damage. Shutdown mech invisibility. + */ +/datum/action/vehicle/sealed/mecha/invisibility/proc/take_damage(obj/vehicle/sealed/mecha/our_mech) + SIGNAL_HANDLER + + make_visible() + +/** + * ## make_visible + * + * Called when somthing force invisibility shutdown. + */ +/datum/action/vehicle/sealed/mecha/invisibility/proc/make_visible() + if(!on) + return + on = !on + invisibility_off() + +/** + * Proc makes an AOE attack after 1 SECOND. + * Called by the mech pilot when he is in stealth mode and wants to attack. + * During this, mech cannot move. +*/ +/datum/action/vehicle/sealed/mecha/invisibility/proc/stealth_attack_aoe(datum/source, mob/living/pilot, atom/target, on_cooldown, is_adjacent) + SIGNAL_HANDLER + + if(!charge) + return FALSE + if(chassis.alpha != 0) + UnregisterSignal(chassis, COMSIG_MECHA_MELEE_CLICK) + return FALSE + UnregisterSignal(chassis, COMSIG_MECHA_MELEE_CLICK) + new /obj/effect/temp_visual/mech_attack_aoe_charge(get_turf(chassis)) + ADD_TRAIT(chassis, TRAIT_IMMOBILIZED, REF(src)) + playsound(chassis, stealth_pre_attack_sound, 75, FALSE) + addtimer(CALLBACK(src, PROC_REF(attack_in_aoe), pilot), 1 SECONDS) + return TRUE + +/** + * ## attack_in_aoe + * + * Brings mech out of invisibility. + * Deal everyone in range 3x3 35 damage and 25 chanse to cut off limb. + * Arguments: + * * pilot - occupant inside mech. + */ +/datum/action/vehicle/sealed/mecha/invisibility/proc/attack_in_aoe(mob/living/pilot) + invisibility_off() + new /obj/effect/temp_visual/mech_attack_aoe_attack(get_turf(chassis)) + for(var/mob/living/something_living in range(1, get_turf(chassis))) + if(something_living.stat >= UNCONSCIOUS) + continue + if(something_living.getStaminaLoss() >= 100) + continue + if(something_living == pilot) + continue + if(prob(DISMEMBER_CHANCE_LOW)) + var/obj/item/bodypart/cut_bodypart = something_living.get_bodypart(pick(BODY_ZONE_R_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG)) + cut_bodypart?.dismember(BRUTE) + something_living.apply_damage(35, BRUTE) + playsound(chassis, stealth_attack_sound, 75, FALSE) + REMOVE_TRAIT(chassis, TRAIT_IMMOBILIZED, REF(src)) + on = !on + charge = FALSE + button_icon_state = "mech_stealth_cooldown" + build_all_button_icons() + addtimer(CALLBACK(src, PROC_REF(charge)), 5 SECONDS) + +/** + * ## charge + * + * Recharge invisibility action after 5 SECONDS. + */ +/datum/action/vehicle/sealed/mecha/invisibility/proc/charge() + button_icon_state = "mech_stealth_off" + charge = TRUE + build_all_button_icons() + +/datum/action/vehicle/sealed/mecha/charge_attack + name = "Charge Attack" + button_icon_state = "mech_charge_off" + /// Is charge attack activated. + var/on = FALSE + /// Recharge check. + var/charge = TRUE + /// Energy cost to perform charge attack + var/energy_cost = 400 + /// Maximum range of charge attack. + var/max_charge_range = 7 + /// Sound when mech do charge attack. + var/charge_attack_sound = 'sound/mecha/mech_charge_attack.ogg' + +/datum/action/vehicle/sealed/mecha/charge_attack/set_chassis(passed_chassis) + . = ..() + RegisterSignal(chassis, COMSIG_MECH_SAFETIES_TOGGLE, PROC_REF(on_toggle_safety)) + +/// update button icon when toggle safety. +/datum/action/vehicle/sealed/mecha/charge_attack/proc/on_toggle_safety() + SIGNAL_HANDLER + + build_all_button_icons(UPDATE_BUTTON_STATUS) + +/datum/action/vehicle/sealed/mecha/charge_attack/Trigger(trigger_flags) + . = ..() + if(!.) + return + on = !on + if(on) + charge_attack_on() + else + charge_attack_off() + +/datum/action/vehicle/sealed/mecha/charge_attack/IsAvailable(feedback) + . = ..() + if(!.) + return FALSE + if(!chassis.has_charge(energy_cost)) + if(feedback) + owner.balloon_alert(owner, "not enough energy!") + return FALSE + if(chassis.weapons_safety) + if(feedback) + owner.balloon_alert(owner, "safety is on!") + return FALSE + if(!charge) + if(feedback) + owner.balloon_alert(owner, "recharging!") + return FALSE + + return TRUE + +///Called when charge attack activated +/datum/action/vehicle/sealed/mecha/charge_attack/proc/charge_attack_on() + check_visability() + button_icon_state = "mech_charge_on" + RegisterSignal(chassis, COMSIG_MECHA_MELEE_CLICK, PROC_REF(click_try_charge)) + build_all_button_icons() + +///Called when charge attack deactivated +/datum/action/vehicle/sealed/mecha/charge_attack/proc/charge_attack_off() + button_icon_state = "mech_charge_off" + UnregisterSignal(chassis, COMSIG_MECHA_MELEE_CLICK) + build_all_button_icons() + +///Check if mech use invisibility and deactivate it when we activate charge attack. +/datum/action/vehicle/sealed/mecha/charge_attack/proc/check_visability() + for(var/who_inside in chassis.occupants) + var/mob/living/occupant = who_inside + var/datum/action/vehicle/sealed/mecha/invisibility/stealth_action = LAZYACCESSASSOC(chassis.occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/invisibility) + if(stealth_action?.on) + stealth_action.make_visible() + +///Called when mech attacks with charge attack enabled. +/datum/action/vehicle/sealed/mecha/charge_attack/proc/click_try_charge(datum/source, mob/living/pilot, atom/target, on_cooldown, is_adjacent) + SIGNAL_HANDLER + + var/turf = get_turf(target) + if(!on) + UnregisterSignal(chassis, COMSIG_MECHA_MELEE_CLICK) + return FALSE + if(isnull(turf)) + pilot.balloon_alert(pilot, "invalid direction!") + return FALSE + if(!charge) + pilot.balloon_alert(pilot, "recharging!") + return FALSE + else + if(charge_attack(pilot, turf)) + return TRUE + return FALSE + +/** + * ## charge_attack + * + * Deal everyone in line for mech location to mouse location 35 damage and 25 chanse to cut off limb. + * Teleport mech to the end of line. + * Arguments: + * * charger - occupant inside mech. + * * target - occupant inside mech. + */ +/datum/action/vehicle/sealed/mecha/charge_attack/proc/charge_attack(mob/living/charger, turf/target) + var/turf/start_charge_here = get_turf(charger) + var/charge_range = min(get_dist_euclidean(start_charge_here, target), max_charge_range) + var/turf/but_we_gonna_here = get_ranged_target_turf(start_charge_here, get_dir(start_charge_here, target), floor(charge_range)) + var/turf/here_we_go = start_charge_here + for(var/turf/line_turf in get_line(get_step(start_charge_here, get_dir(start_charge_here, target)), but_we_gonna_here)) + if(get_turf(charger) == get_turf(line_turf)) + continue + if(isclosedturf(line_turf)) + break + var/obj/machinery/power/supermatter_crystal/funny_crystal = locate() in line_turf + if(funny_crystal) + funny_crystal.Bumped(chassis) + break + var/obj/machinery/door/airlock/like_a_wall = locate() in line_turf + if(like_a_wall?.density) + break + if(locate(/obj/structure/window) in line_turf) + break + for(var/mob/living/something_living in line_turf.contents) + if(something_living.stat >= UNCONSCIOUS || something_living.getStaminaLoss() >= 100 || something_living == charger) + continue + if(prob(DISMEMBER_CHANCE_LOW)) + var/obj/item/bodypart/cut_bodypart = something_living.get_bodypart(pick(BODY_ZONE_R_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_HEAD)) + cut_bodypart?.dismember(BRUTE) + something_living.apply_damage(35, BRUTE) + here_we_go = line_turf + + // If the mech didn't move, it didn't charge + if(here_we_go == start_charge_here) + charger.balloon_alert(charger, "invalid direction!") + return FALSE + chassis.forceMove(here_we_go) + start_charge_here.Beam(chassis, icon_state = "mech_charge", time = 8) + playsound(chassis, charge_attack_sound, 75, FALSE) + on = !on + chassis.use_energy(energy_cost) + UnregisterSignal(chassis, COMSIG_MECHA_MELEE_CLICK) + charge = FALSE + button_icon_state = "mech_charge_cooldown" + build_all_button_icons() + addtimer(CALLBACK(src, PROC_REF(charge)), 5 SECONDS) + return TRUE + +/** + * ## charge + * + * Recharge charge attack action after 5 SECONDS. + */ +/datum/action/vehicle/sealed/mecha/charge_attack/proc/charge() + charge = TRUE + button_icon_state = "mech_charge_off" + build_all_button_icons() + +/obj/vehicle/sealed/mecha/justice/loaded + equip_by_category = list( + MECHA_L_ARM = null, + MECHA_R_ARM = null, + MECHA_UTILITY = list(/obj/item/mecha_parts/mecha_equipment/radio, /obj/item/mecha_parts/mecha_equipment/air_tank/full, /obj/item/mecha_parts/mecha_equipment/thrusters/ion), + MECHA_POWER = list(), + MECHA_ARMOR = list(), + ) + +/obj/vehicle/sealed/mecha/justice/loaded/populate_parts() + cell = new /obj/item/stock_parts/power_store/cell/bluespace(src) + scanmod = new /obj/item/stock_parts/scanning_module/triphasic(src) + capacitor = new /obj/item/stock_parts/capacitor/quadratic(src) + servo = new /obj/item/stock_parts/servo/femto(src) + update_part_values() + +#undef DISMEMBER_CHANCE_HIGH +#undef DISMEMBER_CHANCE_LOW + +#undef MOVEDELAY_ANGRY +#undef MOVEDELAY_SAFETY diff --git a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm index d13b90e5659f7..0bb691160b373 100644 --- a/code/modules/vehicles/mecha/equipment/weapons/weapons.dm +++ b/code/modules/vehicles/mecha/equipment/weapons/weapons.dm @@ -4,14 +4,22 @@ equipment_slot = MECHA_WEAPON destroy_sound = 'sound/mecha/weapdestr.ogg' mech_flags = EXOSUIT_MODULE_COMBAT + /// The type of bullet generated by the mecha weapon. var/projectile + /// The sound of the mecha weapon firing. var/fire_sound + /// How many shots are fired per action. var/projectiles_per_shot = 1 + /// The degrees by which each individual bullet fans out from a central point. A predictable spray of bullets. var/variance = 0 - var/randomspread = FALSE //use random spread for machineguns, instead of shotgun scatter + /// Whether our bullets go off trajectory while firing randomly. Used to replicate recoil and not a structured, predictable spray. + var/randomspread = FALSE + /// The amount in deciseconds that the weapon sleeps between shots to simulate a 'burst fire'. The delay stops another bullet from being fired while sleeping. var/projectile_delay = 0 - var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect //the visual effect appearing when the weapon is fired. - var/kickback = TRUE //Will using this weapon in no grav push mecha back. + //the visual effect appearing when the weapon is fired. + var/firing_effect_type = /obj/effect/temp_visual/dir_setting/firing_effect + /// Will using this weapon in no grav push mecha back. + var/kickback = TRUE /obj/item/mecha_parts/mecha_equipment/weapon/special_attaching_interaction(attach_right = FALSE, obj/vehicle/sealed/mecha/mech, mob/user, checkonly = FALSE) var/obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay/bay @@ -43,23 +51,25 @@ /obj/item/mecha_parts/mecha_equipment/weapon/action(mob/source, atom/target, list/modifiers) if(!action_checks(target)) return FALSE + + /// Find our mecha, find the opposite direction. Used for kickback while the mecha is drifting in zero-g to launch us in this direction. var/newtonian_target = REVERSE_DIR(chassis.dir) . = ..()//start the cooldown early because of sleeps - for(var/i in 1 to projectiles_per_shot) + for(var/projectiles_to_shoot in 1 to projectiles_per_shot) if(energy_drain && !chassis.has_charge(energy_drain))//in case we run out of energy mid-burst, such as emp break var/spread = 0 if(variance) if(randomspread) - spread = round((rand() - 0.5) * variance) + spread = round((rand(0 , 1) - 0.5) * variance, 1) else - spread = round((i / projectiles_per_shot - 0.5) * variance) + spread = round((projectiles_to_shoot / projectiles_per_shot - 0.5) * variance, 1) var/obj/projectile/projectile_obj = new projectile(get_turf(src)) projectile_obj.log_override = TRUE //we log being fired ourselves a little further down. projectile_obj.firer = chassis projectile_obj.preparePixelProjectile(target, source, modifiers, spread) - if(source.client && isliving(source)) //dont want it to happen from syndie mecha npc mobs, they do direct fire anyways + if(isliving(source) && source.client) //dont want it to happen from syndie mecha npc mobs, they do direct fire anyways var/mob/living/shooter = source projectile_obj.hit_prone_targets = shooter.combat_mode projectile_obj.fire() diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index 33edb9e47c777..c2d37ee6e8348 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -52,10 +52,14 @@ //looping sound for printing items var/datum/looping_sound/lathe_print/print_sound + /// Local designs that only this mechfab have(using when mechfab emaged so it's illegal designs). + var/list/datum/design/illegal_local_designs + /obj/machinery/mecha_part_fabricator/Initialize(mapload) print_sound = new(src, FALSE) rmat = AddComponent(/datum/component/remote_materials, mapload && link_on_init) cached_designs = list() + illegal_local_designs = list() RefreshParts() //Recalculating local material sizes if the fab isn't linked return ..() @@ -142,6 +146,26 @@ balloon_alert(user, "rotated to [dir2text(dir)].") return CLICK_ACTION_SUCCESS +/obj/machinery/mecha_part_fabricator/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + if(user.job != JOB_ROBOTICIST) + to_chat(user, span_warning("You clicking and typing but don’t understand what to do with it")) + return FALSE + obj_flags |= EMAGGED + for(var/found_illegal_mech_nods in SSresearch.techweb_nodes) + var/datum/techweb_node/illegal_mech_node = SSresearch.techweb_nodes[found_illegal_mech_nods] + if(!illegal_mech_node?.illegal_mech_node) + continue + for(var/id in illegal_mech_node.design_ids) + var/datum/design/illegal_mech_design = SSresearch.techweb_design_by_id(id) + illegal_local_designs |= illegal_mech_design + cached_designs |= illegal_mech_design + say("R$c!i&ed ERROR de#i$ns. C@n%ec$%ng to ~NULL~ se%ve$s.") + playsound(src, 'sound/machines/uplinkerror.ogg', 50, TRUE) + update_static_data_for_all_viewers() + return TRUE + /** * Updates the `final_sets` and `buildable_parts` for the current mecha fabricator. */ @@ -351,7 +375,7 @@ for(var/datum/design/design in cached_designs) var/cost = list() - var/list/materials = design["materials"] + var/list/materials = design.materials for(var/datum/material/mat in materials) cost[mat.name] = OPTIMAL_COST(materials[mat] * component_coeff) @@ -418,7 +442,7 @@ if(!istext(design_id)) continue - if(!stored_research.researched_designs.Find(design_id)) + if(!(stored_research.researched_designs.Find(design_id) || is_type_in_list(SSresearch.techweb_design_by_id(design_id), illegal_local_designs))) continue var/datum/design/design = SSresearch.techweb_design_by_id(design_id) diff --git a/code/modules/vehicles/mecha/mech_melee_attack.dm b/code/modules/vehicles/mecha/mech_melee_attack.dm index 08669ebdd0ca8..655a2f3533936 100644 --- a/code/modules/vehicles/mecha/mech_melee_attack.dm +++ b/code/modules/vehicles/mecha/mech_melee_attack.dm @@ -2,7 +2,7 @@ * ## Mech melee attack * Called when a mech melees a target with fists * Handles damaging the target & associated effects - * return value is number of damage dealt + * return value is number of damage dealt. returning a value puts our mech onto attack cooldown. * Arguments: * * mecha_attacker: Mech attacking this target * * user: mob that initiated the attack from inside the mech as a controller @@ -10,28 +10,35 @@ /atom/proc/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_MECH, mecha_attacker, user) - log_combat(user, src, "attacked", mecha_attacker, "(COMBAT MODE: [uppertext(user.combat_mode)] (DAMTYPE: [uppertext(mecha_attacker.damtype)])") + if(!isnull(user)) + log_combat(user, src, "attacked", mecha_attacker, "(COMBAT MODE: [uppertext(user?.combat_mode)] (DAMTYPE: [uppertext(mecha_attacker.damtype)])") return 0 /turf/closed/wall/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) + if(!user.combat_mode) + return 0 + mecha_attacker.do_attack_animation(src) switch(mecha_attacker.damtype) if(BRUTE) - playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) + playsound(src, mecha_attacker.brute_attack_sound, 50, TRUE) if(BURN) - playsound(src, 'sound/items/welder.ogg', 50, TRUE) + playsound(src, mecha_attacker.burn_attack_sound, 50, TRUE) else return 0 mecha_attacker.visible_message(span_danger("[mecha_attacker] hits [src]!"), span_danger("You hit [src]!"), null, COMBAT_MESSAGE_RANGE) if(prob(hardness + mecha_attacker.force) && mecha_attacker.force > 20) dismantle_wall(1) - playsound(src, 'sound/effects/meteorimpact.ogg', 100, TRUE) + playsound(src, mecha_attacker.destroy_wall_sound, 100, TRUE) else add_dent(WALL_DENT_HIT) ..() return 100 //this is an arbitrary "damage" number since the actual damage is rng dismantle -/obj/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) +/obj/structure/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) + if(!user.combat_mode) + return 0 + mecha_attacker.do_attack_animation(src) switch(mecha_attacker.damtype) if(BRUTE) @@ -44,13 +51,29 @@ ..() return take_damage(mecha_attacker.force * 3, mecha_attacker.damtype, "melee", FALSE, get_dir(src, mecha_attacker)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. +/obj/machinery/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) + if(!user.combat_mode) + return 0 + + mecha_attacker.do_attack_animation(src) + switch(mecha_attacker.damtype) + if(BRUTE) + playsound(src, mecha_attacker.brute_attack_sound, 50, TRUE) + if(BURN) + playsound(src, mecha_attacker.burn_attack_sound, 50, TRUE) + else + return 0 + mecha_attacker.visible_message(span_danger("[mecha_attacker] hits [src]!"), span_danger("You hit [src]!"), null, COMBAT_MESSAGE_RANGE) + ..() + return take_damage(mecha_attacker.force * 3, mecha_attacker.damtype, "melee", FALSE, get_dir(src, mecha_attacker)) // multiplied by 3 so we can hit objs hard but not be overpowered against mobs. + /obj/structure/window/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) if(!can_be_reached()) return 0 return ..() /mob/living/mech_melee_attack(obj/vehicle/sealed/mecha/mecha_attacker, mob/living/user) - if(!user.combat_mode) + if(istype(user) && !user.combat_mode) step_away(src, mecha_attacker) log_combat(user, src, "pushed", mecha_attacker) visible_message(span_warning("[mecha_attacker] pushes [src] out of the way."), \ @@ -58,36 +81,41 @@ to_chat(mecha_attacker, span_danger("You push [src] out of the way.")) return 0 - if(HAS_TRAIT(user, TRAIT_PACIFISM)) + if(!isnull(user) && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm other living beings!")) return 0 mecha_attacker.do_attack_animation(src) if(mecha_attacker.damtype == BRUTE) step_away(src, mecha_attacker, 15) var/obj/item/bodypart/selected_zone = get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_CHEST, BODY_ZONE_HEAD)) - if(selected_zone) - var/dmg = rand(mecha_attacker.force * 0.5, mecha_attacker.force) - switch(mecha_attacker.damtype) - if(BRUTE) - if(mecha_attacker.force > 35) // durand and other heavy mechas - Unconscious(20) - else if(mecha_attacker.force > 20 && !IsKnockdown()) // lightweight mechas like gygax - Knockdown(40) + var/dmg = rand(mecha_attacker.force * 0.5, mecha_attacker.force) + switch(mecha_attacker.damtype) + if(BRUTE) + if(mecha_attacker.force > 35) // durand and other heavy mechas + mecha_attacker.melee_attack_effect(src, heavy = TRUE) + else if(mecha_attacker.force > 20 && !IsKnockdown()) // lightweight mechas like gygax + mecha_attacker.melee_attack_effect(src, heavy = FALSE) + if(selected_zone) selected_zone.receive_damage(dmg, 0, updating_health = TRUE) - playsound(src, 'sound/weapons/punch4.ogg', 50, TRUE) - if(FIRE) + else + apply_damage(dmg, BRUTE) + playsound(src, mecha_attacker.brute_attack_sound, 50, TRUE) + if(FIRE) + if(selected_zone) selected_zone.receive_damage(0, dmg, updating_health = TRUE) - playsound(src, 'sound/items/welder.ogg', 50, TRUE) - if(TOX) - playsound(src, 'sound/effects/spray2.ogg', 50, TRUE) - if((reagents.get_reagent_amount(/datum/reagent/cryptobiolin) + mecha_attacker.force) < mecha_attacker.force*2) - reagents.add_reagent(/datum/reagent/cryptobiolin, mecha_attacker.force/2) - if((reagents.get_reagent_amount(/datum/reagent/toxin) + mecha_attacker.force) < mecha_attacker.force*2) - reagents.add_reagent(/datum/reagent/toxin, mecha_attacker.force/2.5) else - return 0 - . = dmg - visible_message(span_danger("[mecha_attacker.name] hits [src]!"), \ - span_userdanger("[mecha_attacker.name] hits you!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, list(mecha_attacker)) - to_chat(mecha_attacker, span_danger("You hit [src]!")) + apply_damage(dmg, BURN) + playsound(src, mecha_attacker.burn_attack_sound, 50, TRUE) + if(TOX) + playsound(src, mecha_attacker.tox_attack_sound, 50, TRUE) + if((reagents.get_reagent_amount(/datum/reagent/cryptobiolin) + mecha_attacker.force) < mecha_attacker.force*2) + reagents.add_reagent(/datum/reagent/cryptobiolin, mecha_attacker.force/2) + if((reagents.get_reagent_amount(/datum/reagent/toxin) + mecha_attacker.force) < mecha_attacker.force*2) + reagents.add_reagent(/datum/reagent/toxin, mecha_attacker.force/2.5) + else + return 0 + . = dmg + visible_message(span_danger("[mecha_attacker.name] [mecha_attacker.attack_verbs[1]] [src]!"), \ + span_userdanger("[mecha_attacker.name] [mecha_attacker.attack_verbs[2]] you!"), span_hear("You hear a sickening sound of flesh [mecha_attacker.attack_verbs[3]] flesh!"), COMBAT_MESSAGE_RANGE, list(mecha_attacker)) + to_chat(mecha_attacker, span_danger("You [mecha_attacker.attack_verbs[1]] [src]!")) ..() diff --git a/code/modules/vehicles/mecha/mecha_construction_paths.dm b/code/modules/vehicles/mecha/mecha_construction_paths.dm index f4b1a679596b9..0a305a5db66ae 100644 --- a/code/modules/vehicles/mecha/mecha_construction_paths.dm +++ b/code/modules/vehicles/mecha/mecha_construction_paths.dm @@ -819,3 +819,39 @@ outer_plating = /obj/item/stack/sheet/plasteel outer_plating_amount = 5 + +//Justice +/datum/component/construction/unordered/mecha_chassis/justice + result = /datum/component/construction/mecha/justice + steps = list( + /obj/item/mecha_parts/part/justice_torso, + /obj/item/mecha_parts/part/justice_left_arm, + /obj/item/mecha_parts/part/justice_right_arm, + /obj/item/mecha_parts/part/justice_left_leg, + /obj/item/mecha_parts/part/justice_right_leg + ) + +/datum/component/construction/mecha/justice + result = /obj/vehicle/sealed/mecha/justice + base_icon = "justice" + + inner_plating = /obj/item/stack/telecrystal + inner_plating_amount = 8 + + outer_plating = /obj/item/mecha_parts/part/justice_armor + outer_plating_amount = 1 + +/datum/component/construction/mecha/justice/get_circuit_steps() + return list() + +/datum/component/construction/mecha/justice/get_inner_plating_steps() + return list( + list( + "key" = inner_plating, + "amount" = inner_plating_amount, + "back_key" = TOOL_SCREWDRIVER, + "desc" = "The power cell is secured, and [inner_plating_amount] telecrystals can be added.", + "forward_message" = "added telecrystal", + "backward_message" = "unsecured power cell" + ) + ) diff --git a/code/modules/vehicles/mecha/mecha_movement.dm b/code/modules/vehicles/mecha/mecha_movement.dm index 53e61690aba7f..3c743bd7fb357 100644 --- a/code/modules/vehicles/mecha/mecha_movement.dm +++ b/code/modules/vehicles/mecha/mecha_movement.dm @@ -154,13 +154,17 @@ return if(.) //mech was thrown/door/whatever return - if(bumpsmash) //Need a pilot to push the PUNCH button. - if(COOLDOWN_FINISHED(src, mecha_bump_smash)) - var/list/mob/mobster = return_drivers() - obstacle.mech_melee_attack(src, mobster[1]) - COOLDOWN_START(src, mecha_bump_smash, smashcooldown) - if(!obstacle || obstacle.CanPass(src, get_dir(obstacle, src) || dir)) // The else is in case the obstacle is in the same turf. - step(src,dir) + + // Whether or not we're on our mecha melee cooldown + var/on_cooldown = TIMER_COOLDOWN_RUNNING(src, COOLDOWN_MECHA_MELEE_ATTACK) + + if(bumpsmash && !on_cooldown) + // Our pilot for this evening + var/list/mob/mobster = return_drivers() + if(obstacle.mech_melee_attack(src, mobster[1])) + TIMER_COOLDOWN_START(src, COOLDOWN_MECHA_MELEE_ATTACK, melee_cooldown * 0.3) + if(!obstacle || obstacle.CanPass(src, get_dir(obstacle, src) || dir)) // The else is in case the obstacle is in the same turf. + step(src,dir) if(isobj(obstacle)) var/obj/obj_obstacle = obstacle if(!obj_obstacle.anchored && obj_obstacle.move_resist <= move_force) diff --git a/code/modules/vehicles/mecha/mecha_parts.dm b/code/modules/vehicles/mecha/mecha_parts.dm index 7fcee2092590c..474716568eb5b 100644 --- a/code/modules/vehicles/mecha/mecha_parts.dm +++ b/code/modules/vehicles/mecha/mecha_parts.dm @@ -332,6 +332,42 @@ desc="Savannah-Ivanov armor plates. They are uniquely shaped and reinforced to deal with the stresses of two pilots, grandiose leaps, and missiles." icon_state = "savannah_ivanov_armor" +// Justice + +/obj/item/mecha_parts/chassis/justice + name = "\improper Justice chassis" + construct_type = /datum/component/construction/unordered/mecha_chassis/justice + +/obj/item/mecha_parts/part/justice_torso + name="\improper Justice torso" + desc="A Justice torso part." + icon_state = "justice_torso" + +/obj/item/mecha_parts/part/justice_left_arm + name="\improper Justice left arm" + desc="A Justice left arm." + icon_state = "justice_l_arm" + +/obj/item/mecha_parts/part/justice_right_arm + name="\improper Justice right arm" + desc="A Justice left arm." + icon_state = "justice_r_arm" + +/obj/item/mecha_parts/part/justice_left_leg + name="\improper Justice left leg" + desc="A Justice left leg." + icon_state = "justice_l_leg" + +/obj/item/mecha_parts/part/justice_right_leg + name="\improper Justice right leg" + desc="A Justice left leg." + icon_state = "justice_r_leg" + +/obj/item/mecha_parts/part/justice_armor + name="Justice armor" + desc="Justice armor plates." + icon_state = "justice_armor" + ///////// Circuitboards /obj/item/circuitboard/mecha diff --git a/code/modules/vehicles/mecha/mecha_ui.dm b/code/modules/vehicles/mecha/mecha_ui.dm index 712d5f0d712bf..1113a85381361 100644 --- a/code/modules/vehicles/mecha/mecha_ui.dm +++ b/code/modules/vehicles/mecha/mecha_ui.dm @@ -111,16 +111,17 @@ var/module_index = 0 for(var/category in max_equip_by_category) var/max_per_category = max_equip_by_category[category] - for(var/i = 1 to max_per_category) - var/equipment = equip_by_category[category] - var/is_slot_free = islist(equipment) ? i > length(equipment) : isnull(equipment) - if(is_slot_free) - data += list(list( - "slot" = category - )) - if(ui_selected_module_index == module_index) - ui_selected_module_index = null - else + if(max_per_category) + for(var/i = 1 to max_per_category) + var/equipment = equip_by_category[category] + var/is_slot_free = islist(equipment) ? i > length(equipment) : isnull(equipment) + if(is_slot_free) + data += list(list( + "slot" = category + )) + if(ui_selected_module_index == module_index) + ui_selected_module_index = null + continue var/obj/item/mecha_parts/mecha_equipment/module = islist(equipment) ? equipment[i] : equipment data += list(list( "slot" = category, @@ -140,7 +141,7 @@ )) if(isnull(ui_selected_module_index)) ui_selected_module_index = module_index - module_index++ + module_index++ return data /obj/vehicle/sealed/mecha/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm index dc0414e86063a..8f972ef47815c 100644 --- a/code/modules/vehicles/mecha/mecha_wreckage.dm +++ b/code/modules/vehicles/mecha/mecha_wreckage.dm @@ -245,3 +245,8 @@ /obj/item/mecha_parts/part/odysseus_right_arm, /obj/item/mecha_parts/part/odysseus_left_leg, /obj/item/mecha_parts/part/odysseus_right_leg) + +/obj/structure/mecha_wreckage/justice + name = "\improper Justice wreckage" + icon_state = "justice-broken" + welder_salvage = list(/obj/item/stack/sheet/iron, /obj/item/stack/rods) diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 0b842b8ed9cbe..08edbf7886799 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -206,6 +206,21 @@ to_chat(rider, span_warning("[src] [p_are()] not powerful enough to fly upwards.")) return FALSE +/obj/vehicle/ridden/scooter/skateboard/hoverboard/holyboarded + name = "holy skateboard" + desc = "A board blessed by the gods with the power to grind for our sins. Has the initials 'J.C.' on the underside." + board_item_type = /obj/item/melee/skateboard/holyboard + instability = 3 + icon_state = "hoverboard_holy" +/obj/vehicle/ridden/scooter/skateboard/hoverboard/holyboarded/post_buckle_mob(mob/living/M) + M.AddComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY) + return ..() + +/obj/vehicle/ridden/scooter/skateboard/hoverboard/holyboarded/post_unbuckle_mob(mob/living/M) + if(!has_buckled_mobs()) + qdel (M.GetComponent(/datum/component/anti_magic, MAGIC_RESISTANCE|MAGIC_RESISTANCE_HOLY)) + return ..() + /obj/vehicle/ridden/scooter/skateboard/hoverboard/admin name = "\improper Board Of Directors" desc = "The engineering complexity of a spaceship concentrated inside of a board. Just as expensive, too." diff --git a/code/modules/vehicles/vehicle_key.dm b/code/modules/vehicles/vehicle_key.dm index f8db861449f7a..5f57895d8ac81 100644 --- a/code/modules/vehicles/vehicle_key.dm +++ b/code/modules/vehicles/vehicle_key.dm @@ -33,10 +33,15 @@ attack_verb_continuous = list("stubs", "pokes") attack_verb_simple = list("stub", "poke") sharpness = SHARP_EDGED - embedding = list("pain_mult" = 1, "embed_chance" = 30, "fall_chance" = 70) + embed_type = /datum/embed_data/janicart_key wound_bonus = -1 bare_wound_bonus = 2 +/datum/embed_data/janicart_key + pain_mult = 1 + embed_chance = 30 + fall_chance = 70 + /obj/item/key/janitor/suicide_act(mob/living/carbon/user) switch(user.mind?.get_skill_level(/datum/skill/cleaning)) if(SKILL_LEVEL_NONE to SKILL_LEVEL_NOVICE) //Their mind is too weak to ascend as a janny diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index 9ca0d41d85367..737a2993d9bef 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -1074,11 +1074,9 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock) 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() + shard.set_embed(/datum/embed_data/glass_candy) carbon_target.hitby(shard, skipcatch = TRUE, hitpush = FALSE) - shard.embedding = list() - shard.updateEmbedding() + shard.set_embed(initial(shard.embed_type)) return TRUE if (VENDOR_CRUSH_CRIT_PIN) // pin them beneath the machine until someone untilts it if (!isliving(atom_target)) diff --git a/code/modules/vending/subtype.dm b/code/modules/vending/subtype.dm new file mode 100644 index 0000000000000..9b4f212224ea7 --- /dev/null +++ b/code/modules/vending/subtype.dm @@ -0,0 +1,51 @@ + +/obj/machinery/vending/subtype_vendor + name = "\improper subtype vendor" + desc = "A vending machine that vends all subtypes of a specific type." + color = COLOR_ADMIN_PINK + verb_say = "codes" + verb_ask = "queries" + verb_exclaim = "compiles" + armor_type = /datum/armor/machinery_vending + circuit = null + product_slogans = "Spawn \" too annoying? Too lazy to open game panel? This one's for you!;Subtype vendor, for all your debugging woes!" + default_price = 0 + /// Spawns coders by default + var/type_to_vend = /obj/item/food/grown/citrus + +/obj/machinery/vending/subtype_vendor/Initialize(mapload, type_to_vend) + . = ..() + if(type_to_vend) + src.type_to_vend = type_to_vend + load_subtypes() + +/obj/machinery/vending/subtype_vendor/proc/load_subtypes() + products = list() + product_records = list() + + for(var/type in typesof(type_to_vend)) + LAZYADDASSOC(products, type, 50) + + build_inventories() + +/obj/machinery/vending/subtype_vendor/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + + if(!can_interact(user) || !user.can_perform_action(src, ALLOW_SILICON_REACH|FORBID_TELEKINESIS_REACH)) + return + + if(!user.client?.holder?.check_for_rights(R_SERVER|R_DEBUG)) + speak("Hey! You can't use this! Get outta here!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + var/type_to_vend_now = tgui_input_text(user, "What type to set it to?", "Set type to vend", "/obj/item/toy/plush") + type_to_vend_now = text2path(type_to_vend_now) + if(!ispath(type_to_vend_now)) + speak("That's not a real path, dumbass! Try again!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + type_to_vend = type_to_vend_now + load_subtypes() + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/code/modules/wiremod/core/marker.dm b/code/modules/wiremod/core/marker.dm index 31821c6d8c3a7..65ed029213e30 100644 --- a/code/modules/wiremod/core/marker.dm +++ b/code/modules/wiremod/core/marker.dm @@ -3,6 +3,7 @@ desc = "A circuit multitool. Used to mark entities which can then be uploaded to components by pressing the upload button on a port. \ Acts as a normal multitool otherwise. Use in hand to clear marked entity so that you can mark another entity." icon_state = "multitool_circuit" + apc_scanner = FALSE // would conflict with mark clearing /// The marked atom of this multitool var/atom/marked_atom diff --git a/config/game_options.txt b/config/game_options.txt index e89cbdb7d2b70..28a50266ff814 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -540,3 +540,8 @@ NEGATIVE_STATION_TRAITS 3 1 # If set to 0, then players won't be able to select any positive quirks. # If commented-out or undefined, the maximum default is 6. MAX_POSITIVE_QUIRKS 6 + +# A config that skews with the random spawners weights +# If the value is lower than 1, it'll tend to even out the odds +# If higher than 1, it'll lean toward common spawns even more. +RANDOM_LOOT_WEIGHT_MODIFIER 1 \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84011.yml b/html/changelogs/AutoChangeLog-pr-84011.yml deleted file mode 100644 index 12b730fefdcdf..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84011.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Pickle-Coding" -delete-after: True -changes: - - code_imp: "Supermatter zap power generation takes perspective of the machines subsystem." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84230.yml b/html/changelogs/AutoChangeLog-pr-84230.yml deleted file mode 100644 index 165b6de5e2c7a..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84230.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SmArtKar" -delete-after: True -changes: - - bugfix: "Vent-born wendigos no longer create one-way portals" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84374.yml b/html/changelogs/AutoChangeLog-pr-84374.yml deleted file mode 100644 index 5b4a368896c57..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84374.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "The power for all science burn chambers across all maps now works properly." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84439.yml b/html/changelogs/AutoChangeLog-pr-84439.yml deleted file mode 100644 index fd4591d8f8792..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84439.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Melbert" -delete-after: True -changes: - - rscadd: "Humanizing a monkey removes undergarments such as socks" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84448.yml b/html/changelogs/AutoChangeLog-pr-84448.yml deleted file mode 100644 index b579cc85ac2e3..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-84448.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "thegrb93" -delete-after: True -changes: - - bugfix: "Game not refocusing after closing a TGUI" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84667.yml b/html/changelogs/AutoChangeLog-pr-84667.yml new file mode 100644 index 0000000000000..56ec74adf6c7f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84667.yml @@ -0,0 +1,6 @@ +author: "aaaa1023" +delete-after: True +changes: + - rscdel: "Removed the shuttle manipulator entries for the following shuttles: Northstar ferry, Omegastation arrivals shuttle, and Donutstation cargo ferry. (These shuttles didn't actually exist but they still had entries in the manipulator.)" + - bugfix: "Fixed the following shuttles flying in unexpected directions: Basic CC Ferry, Meat Ferry, Lighthouse Ferry, ERT bounty shuttle, Kilo cargo shuttle, Pubby cargo shuttle, and Delta cargo shuttle." + - bugfix: "Fixed the ERT bounty shuttle having incorrect offsets in the shuttle navigation console." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84675.yml b/html/changelogs/AutoChangeLog-pr-84675.yml new file mode 100644 index 0000000000000..8f342cfa69513 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84675.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - refactor: "Refactored a lot of speech modifiers to use a component instead of copied over code." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84736.yml b/html/changelogs/AutoChangeLog-pr-84736.yml new file mode 100644 index 0000000000000..8f71ff39204f8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84736.yml @@ -0,0 +1,4 @@ +author: "grungussuss" +delete-after: True +changes: + - sound: "Zippos, Lighters and cigarettes now have sound" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84749.yml b/html/changelogs/AutoChangeLog-pr-84749.yml new file mode 100644 index 0000000000000..0e3b49a139446 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84749.yml @@ -0,0 +1,5 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Living limbs can no longer make you touch ghosts or abstract concepts of start, landmark, influence or job" + - spellcheck: "Fixed improper word usage and improved grammar for living limbs" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84776.yml b/html/changelogs/AutoChangeLog-pr-84776.yml new file mode 100644 index 0000000000000..b56c51cc767e3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84776.yml @@ -0,0 +1,4 @@ +author: "SmArtKar" +delete-after: True +changes: + - bugfix: "Exosuit Stress Failure experiment now works" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-84781.yml b/html/changelogs/AutoChangeLog-pr-84781.yml new file mode 100644 index 0000000000000..b59fcad5de6bf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-84781.yml @@ -0,0 +1,4 @@ +author: "zoomachina" +delete-after: True +changes: + - bugfix: "fixed dubious chem dispenser feedback when the beaker is full" \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml new file mode 100644 index 0000000000000..d64be8b671a22 --- /dev/null +++ b/html/changelogs/archive/2024-07.yml @@ -0,0 +1,581 @@ +2024-07-01: + Ben10Omintrix: + - balance: raptors will now knock off their rider and disable them if hit by any + energy projectiles or if they recieve any stamina damage + Chestlet: + - bugfix: Nanotrasen sent us a batch of faulty canisters. They've been recalled + and replaced with less faulty canisters. + - bugfix: Zauker SM interaction works correctly now. + DaCoolBoss: + - image: Relics ("strange objects") now have unique sprites. + Iajret: + - bugfix: fixed blood loss knocking you down at somewhat safe (~80%) blood levels + LemonInTheDark: + - rscadd: Shield generators and shield gen walls now glow a light blue. Pretty! + MTandi: + - qol: Made light tiles available in the crafting menu + - qol: Circuit tile variants can be cycled in-hand + - rscadd: Moved loose tiles and wall frames from lathe designs to other tiles and + frames in the crafting menu + Melbert: + - rscadd: Humanizing a monkey removes undergarments such as socks + - qol: Handheld Genetic Scanners fit in Geneticist equipment suit storage + Pickle-Coding: + - code_imp: Supermatter zap power generation takes perspective of the machines subsystem. + Rhials: + - rscadd: Bounty Hunter teams now have personalized announcements for when they + are spawned in. + ShizCalev: + - bugfix: The power for all science burn chambers across all maps now works properly. + SmArtKar: + - image: Captain's spare safe received a new texture + - bugfix: Vent-born wendigos no longer create one-way portals + - image: Decluttered card textures + - bugfix: You can grind slime extracts in reagent grinders once more. + - bugfix: Pyrokinesis bolts no longer have infinite range and create trails of fiery + doom. + - qol: RD's labcoat is now classified as an actual labcoat instead of a glorified + jacket, allowing them to put science-related stuffs into it + - image: You can now toggle RD's labcoat + ViktorKoL: + - rscadd: Added a new UI for heretic research. + Wallem: + - rscadd: The detective now starts with the DET.ekt Skillchip, which allows them + to identify chemicals and bloodtypes by taste. + YesterdaysPromise: + - image: updated halloween metoer sprites. + aaaa1023: + - qol: 'Increased the viewrange in the navigation camera console on the following + shuttles: Silverscale pirate shuttle, the Flying Dutchman pirate shuttle, the + IRS pirate shuttle, and the Greytide pirate shuttle.' + - bugfix: Fixed the Battlecruiser corvette, Silverscale pirate shuttle, and the + Greytide pirate shuttle flying in incorrect directions in hyperspace. + - bugfix: Fixed the Navigation console camera eye on various pirate ships being + off centre. + carlarctg: + - spellcheck: Heretic spell invocations now use one dead language per path. Altered + a few invocation types. + grungussuss: + - qol: Windoors now stay open for 8 seconds instead of 5 + - qol: Secure windoors now stay open for 5 seconds instead of 2 + mc-oofert: + - bugfix: brig cell timer ui works properly now + - bugfix: wawastation arrivals has firealarms so you may now leave + necromanceranne: + - bugfix: Mecha weaponry is capable, for the first time ever, of experiencing recoil. + This was an intended mechanic, I promise. The code just literally never worked. + - bugfix: Mecha bump melee attacks and click melee attacks are now on the same cooldown, + but have varying cooldown timers. You will always bump attack faster than you + will click. + - bugfix: You must be in combat mode to punch objects and to bumpsmash into objects. + - bugfix: Stops mecha being able to punch literally any object and damage them. + - code_imp: Tidies up some of the autodoc comments for mech weapons. + spockye: + - bugfix: fixed Wawastation areas + - bugfix: fixed wawastation disposals + thegrb93: + - bugfix: Game not refocusing after closing a TGUI + xXPawnStarrXx: + - rscdel: Removed cordons on deathmatch maps, since they're autoadded now. +2024-07-02: + 00-Steven: + - code_imp: Moved bedsheet bin interactions to the item interaction code. Please + report any issues. + - qol: Made bedsheet bin tool interactions right click, such that left click is + consistently for putting in items. + - qol: Added usage screentips to bedsheet bins. + - qol: Added more feedback to failing to hide items in bedsheet bins. + - sound: Made putting items in bedsheet bins not silent (If the items have associated + pickup/drop sounds). + - code_imp: Deconstructing light switches now uses the proper tool action and tool + usage code, please report any issues. + - bugfix: Attempting to deconstruct a light switch by unscrewing it no longer makes + you hit it even on a success. + - sound: Deconstructing a light switch actually plays tool usage and deconstruction + sounds. + - qol: Deconstructing light switches is now a left click with a screwdriver parallel + to other unscrewing actions. + - bugfix: Screentips for deconstructing a light switch no longer show up on every + item EXCEPT screwdrivers. + - qol: Added an examine hint denoting light switches are screwed to the wall. + - qol: Added visible messages for someone deconstructing a light switch parallel + to deconstructing intercoms. + Bisar: + - qol: Loot panels should update more predictably and informatively now. + - code_imp: Lootpanels have more consistent logic on when they automatically update. + Jolly: + - code_imp: Behind the scenes, maps had a little bit of tweaking. If you see things + rendering in weird ways, or they don't look like how they used to/supposed to, + please report them on GitHub! + Kapu (ported by StrangeWeirdKitten): + - bugfix: Ambience buzz will now respect ship ambience prefrences for observers. + - sound: Ambience buzz requires APC enviorment power to function + Kocma-san: + - qol: you can now swap pens in pdas + LemonInTheDark: + - bugfix: Some varieties of snow now visually melt properly again when burned + ShizCalev: + - bugfix: Fixed a number of shuttles having parts (such as lattices) completely + disappearing. + - bugfix: Fixed the ceilings above shuttles on station maps being full-bright. + - bugfix: Fixed lattices sometimes appearing at random locations in space on station + maps. + - bugfix: Cleaned up a number of accidentally placed objects in space across all + station maps. + - bugfix: Fixed a false positive with the mapload_space_verification unit test failing + on turfs that weren't actually part of shuttles. + - code_imp: Added a unit test that automatically finds all base space turfs with + objects on them, as well as non-space turfs that are set to space areas (meaning + that these squares weren't lit properly.) + SmArtKar: + - bugfix: You no longer get dusted upon trying to store your supermatter sliver. + - bugfix: Fulton animation is no longer sideways. + - bugfix: Hand of Midas now works point-blank. + TheBoondock: + - sound: added pickup and drop sound for beakers + carlarctg: + - bugfix: Fix /datum/weakref appearing when linking airlock heretic portals + hyperjll: + - bugfix: 'Hostile plant monsters (EX: Killer Tomatoes) no longer act hostile toward + Seedlings.' + jlsnow301: + - bugfix: Fixed some UI bugs in the power monitor screen. + lorwp: + - bugfix: extinguishers now can be filled with subtypes of water again (Namely, + holy water) + mc-oofert: + - balance: Facehuggers dont make people go to sleep but muffles speech + - code_imp: Very very minor xenomorph code cleanup + - refactor: Muzzles are now an element + - balance: portable air scrubbers scrub in a 3x3 square + hold as much gas as a + canister + nikothedude: + - rscadd: Being cursed now enables disembowlements/cranial fissures outside of hardcrit +2024-07-03: + 00-Steven: + - bugfix: Fixed telekinesis letting you grab people at a distance, and teleport + them to you by strangling them. + DaCoolBoss: + - bugfix: Removed three traitor posters from Cargo Warehouse's walls. (Metastation) + - balance: Added one traitor poster each to the QM's Office, Vault and Evidence + Storage to compensate. (Metastation) + - rscadd: Ghost role food truck merchants may occasionally turn up at the station. + - rscadd: Adds a new fugitive hunter type, MI13 secret agents. + DrDiasyl aka DrTuxedo: + - sound: Shoves now produce more meaty sound! + GremlinSeeker: + - bugfix: fixed Birdshot bar and surrounding areas not properly connected to the + power grid. + LT3: + - qol: Crew monitor defaults to sort by vitals + MTandi: + - image: New linen bin / basket sprites + - qol: It is easier to do some required techweb experiments on Charlie station now + - bugfix: Fixed experimental dissection surgeries giving too many points + - balance: 'Techweb: Moved NTNet relay back to tcomms node' + - balance: 'Techweb: Moved blood pack and chem pack to the starting node' + MrDas: + - bugfix: Bolas now slowdown properly. + - bugfix: Cult bolas no longer leave in-hand sprite when they ensnare to non-cult + user. + OrbisAnima: + - bugfix: Fixed the basic Sandwich recipe and tags, now it matches the description + and original intent. + - bugfix: Brought the fishing rewards experiments to normal values. + - bugfix: Bio Emergency crates now bring Bio Suits and Hoods compatible with the + Security Hoods and Suits Schematics. + Rhials: + - balance: All cameras in bathrooms and showers have been removed. + SmArtKar: + - bugfix: Dark matteors no longer claim that they have missed when they actually + impacted the station + - image: Fixed shading on some metal ingots. + Sosmaster9000: + - balance: 'Xenobiologists now have a BZ-filled containment pen. Don''t breathe + that! + + balance:Some items which either cannot be printed elsewhere or are part of game + progression (e.g. teleporter endpoints and, of course, Nanners) have been moved. + Alien Spawnpoints are in the same spot.' + bob-b-b: + - rscadd: Added flatpacker & multitool to all R&D labs + carlarctg: + - rscdel: Removed Trichromatic Larynx per @mothblocks decision that it looks uggo. + - rscdel: Replaced heckacious laryncks' color and size changes with random bolding, + italics, and underlining. + - rscadd: Stoner has been un-locked and replaces TL in the above's recipe. + - bugfix: Fixed elastic arms users being unable to use abstract items like mending + touch or shock touch. + - bugfix: Fixed mending touch being bad + mc-oofert: + - bugfix: portascrubbers also scrub the tile theyre on +2024-07-04: + 00-Steven: + - code_imp: Moved bedsheet interactions to the item interaction code. Please report + any issues. + - bugfix: Bedsheets adjust their offset to match that of the living they're tucking + in. + - sound: Bedsheets use the cloth drop/pickup sounds instead of being silent. + - qol: You can tuck someone in telekinetically. + ArcaneDefence: + - rscadd: You can now microwave station pets that you can pick up, with predictable + outcomes + Ben10Omintrix: + - bugfix: fixes mansus grasp not clearing runes + - bugfix: fixes not being able to clean microwaves + Bisar: + - bugfix: Dastardly clowns will no longer be able to get counted for three times + the steps by moving diagonally. + Ghommie: + - bugfix: Fixed toggleable screen colors for glasses. + - code_imp: De-hardcoded, refactored the above, now-fixed feature. + - rscadd: Pumpkin hardhats and the hood of the flash suit now affect the color of + your screen. + - rscadd: Prism glasses, obtainable through xenobiology crossbreeding, now also + affect the color of your screen. + - qol: You no longer need to reach the very edge of the game screen to reach the + maximum zoom range when scoped. + LT3: + - sound: Changed blood filter cycle sound + MTandi: + - image: Fixed the cargo crate having wrong stripe width in open state + - rscadd: Added Pipe Scrubber portable atmos machine + Melbert: + - rscadd: Humonkeys and random corpse spawns now look more... human. + Paxilmaniac: + - image: The sprites for the projectile dampener field have been updated + Profakos: + - bugfix: Instruments enhanced with portable tuning can perform the rites that have + been granted + SmArtKar: + - image: Some gloves have received new sprites + - bugfix: Mending touch no longer damages non-humans + - rscdel: You can no longer get turned into a dullahan by a genetic meltdown + - refactor: Refactored genetic meltdown code into datums, making it more extendable. + - image: Updated diamond stacks to fit its "unstacked" version. + - refactor: Bayonet attachment is now a component. + SyncIt21: + - bugfix: omni crowbar tool interaction for replacing tiles has been fixed + - bugfix: techfab screentip does not runtime when you hover over it with an omnitool + multitool + - bugfix: medi borgs can do brain surgery again + - code_imp: improved multitool & general tool code for some machines + - bugfix: you can hold your wound while resting via ctrl click + - bugfix: material container won't consume the contents of an item if that item + itself is rejected for any reason + - qol: you can use any storage medium & not just bags/boxes to dump stuff into material + containers + - code_imp: improved mouse drag & drop code + - code_imp: Improves cpu performance of transferring & removing reagents + - bugfix: plumbing machinery should have consistent volumes throughout the course + of its operations + - bugfix: plumbing iv drop now only accepts reagents from ducts but won't put reagents + back into it i.e. it only has a input pipe + Thunder12345: + - bugfix: Birdshot's AI core no longer has windoors concealed under open shutters. + ViktorKoL: + - rscadd: the Feast of Owls now leaves more dramatic messages in your chat + - sound: the Feast of Owls now has a little theme + carlarctg: + - qol: Transhumanist and prosthetic limb no longer conflict. If you pick the same + limb for both it uses the weaker prosthetic (dumbass) + - code_imp: Made the name for prosthetic limb global list more intelligible + jlsnow301: + - bugfix: Reverts the fully interactive lootpanel, please just refresh it if you + want to see new contents + - rscadd: 'Added a bitrunning deathmatch map: Island Brawl. Both ghosts and runners + get many more spawns than normal.' + - bugfix: Lowered the static vision time in domain load in. + - bugfix: Bitrunning hacker aliases are now much more permissive + mc-oofert: + - rscadd: 254 new vox lines + - balance: removed tasers, the unfirable turret gun, death wand, polymorph wands + and the enchanted modsuit from lootbox loot tables + - bugfix: lootbox guns should now mostly not have syndicate firing pins so you can + actually use them + - bugfix: deathmatch OSHA Violator map has actually functioning field gens now + - bugfix: being polymorphed in deathmatch does not count you dead + - bugfix: deathmatch cyborgs may not talk in binary + - qol: deathmatch map names are sorted alphabetically + - spellcheck: deathmatch final destination clown and chef loadouts have been renamed + to avoid confusion + - rscadd: mecha wire that shoots you or anyone nearby if pulsed or cut + - bugfix: mecha shock wire shocks you +2024-07-05: + Absolucy: + - qol: Linked speech now prevents messages from highlighting if its a message you + sent, or if you are the owner of said link.. + - qol: Linked speech messages are now marked as radio messages, for chat tab purposes. + ArcaneMusic: + - rscadd: The Illumination Applications technode now includes a gunkit for a new + gun, the Photon Cannon. + DATA_, with sounds made by Beebblie: + - sound: You will now be able to hear your muffled breathing while using internals. + This can be turned off in the game settings. + Ghommie: + - rscadd: A station trait that fills maintenance with glowsticks. + Iamgoofball: + - rscadd: You can now craft a singularity hammer using all nine anomaly cores and + the supermatter. + LemonInTheDark: + - bugfix: Grass turfs will render properly now. Reworked how floors render, please + report any bugs! + - bugfix: Cameras now properly capture lighting + - bugfix: The layering seen in photos should better match the actual game + MTandi: + - bugfix: 'Techweb: Moved upgraded cyber organs to tier 3 from tier 4' + - qol: 'Techweb: Added fully augmented android scan discount experiment for Advanced + Cybernetic Organs techweb node' + - qol: Data disks are now printed in lathes instead of circuit imprinter + - balance: 'Techweb: High yield explosive is now a discount experiment for Exotic + Ammo node, giving more free points' + - balance: 'Techweb: Replaced the botany/xenobio discount experiments with a new + mutant scan experiment for the Gene Engineering node' + - balance: 'Techweb: Damaged mech scan is a discount experiment for tier 4 Mech + Energy Guns node, giving twice more free points' + - balance: 'Techweb: Added a new anomaly scan experiment that gives full discount + for the Advanced Anomaly Shells, also moving the node to tier 5' + - balance: 'Techweb: Moved mech RCD to the Experimental Tools node' + - balance: 'Techweb: Moved handcuffs to T2 security node, leaving only zipties in + T1' + - balance: 'Techweb: Non-human Autopsy is a discount experiment instead of a required + one now' + - balance: 'Techweb: Parts scan experiments require 6 machines instead of 4' + - rscdel: 'Techweb: Removed the New Toys node moving contents to sec and medbay + trees' + - qol: Made air horn craftable from a spraycan and a bikehorn + - qol: 'Techweb: Better wording on the slime scan experiment' + - refactor: Vat grower is a normal machine now that doesn't need plumbing + - qol: Cytology petri dish smartfridge starts with 3 random samples + - rscadd: Added protein powder condiment bottle, available in the cytology supplies + locker and the cargo pack + - rscdel: Removed science variant of plumbing RCD + - bugfix: Fixed a bug when machines without stock parts didn't spawn frames on deconstruction + - bugfix: Fixed vat grower not growing + - qol: portable scubber, pump and pipe scrubber are buildable as any other machines + OrionTheFox: + - rscadd: updated Icebox's lavaland ruin. The incursion grows... + Rhials: + - admin: Quiet-announce random events still announce to admins and can therefore + be rerolled. + Xackii: + - rscadd: 'New traitor mech: Justice. Emag fabricator to get it.' + Zergspower: + - bugfix: fixes borgs ability to climb + aaaa1023: + - qol: Increased view_range on the Psyker Bounty Hunters' Shuttle navigation console. + - bugfix: 'Fixed the shuttle navigation console camera eye being incorrectly offset + on: the SpacePol van, the Russian bounty hunters, the default bounty hunters, + the Psyker bounty hunters, and the MI13 Foodtruck.' + - bugfix: Fixed the SpacePol van, Russian bounty hunters, default bounty hunters, + and Psyker bounty hunters' shuttles all flying in incorrect directions. + - bugfix: 'Fixed the following shuttles flying in unexpected directions: Pubby escape + pod, Humpback emergency shuttle, Pubby monastery shuttle, Birdboat emergency + shuttle, Birdshot emergency shuttle' +2024-07-06: + 00-Steven: + - image: Goody case locked/unlocked sprites have been swapped again, having a gap + for unlocked and no gap for locked. + ArcaneMusic: + - qol: Examining a windoor will now provide the construction steps, like other standard + buildable objects. + DaCoolBoss: + - code_imp: Cleaned up relic code. + - image: Added necrotech themed relics. + GoblinBackwards: + - bugfix: Firefighting backpack tank nozzle can be used to hit objects and destroy + atmos resin again. + MTandi: + - bugfix: Binary devices no longer ignore the volume of the output pipe network + - bugfix: Fixed the augmented organs experiment + OrionTheFox: + - image: fixed and touched up the icons for the Doorjack and Cryptographic Sequencer + (EMAG) + Seven: + - balance: Bloody footprint trails go a longer distance now. + SyncIt21: + - bugfix: Autolathe won't eat the borg omni tool + carlarctg: + - bugfix: Fixed temp n space adaptations not conflicting + - rscadd: Projectile Dampener field now reduces stuns and stamina damage from incoming + projectiles + hyperjll: + - bugfix: Reagent containers are no longer mysteriously fireproof. + mc-oofert: + - qol: CE and Engineer start with their hardhat as the respective welding hard hat + variant + necromanceranne: + - balance: Settlers are a bit slower on their steeds. +2024-07-07: + Holoo-1: + - bugfix: fixed ninja's adrenaline boost module not being rechargable + SyncIt21: + - bugfix: you can craft the singulo hammer with either a supermatter engine/shard + again +2024-07-08: + 00-Steven: + - bugfix: Fixes hacker alias name preference not working. + Ben10Omintrix: + - bugfix: raptors don't easily stress out in lavaland environments + Ghommie: + - rscadd: Night vision goggles now subtly tint your screen. + - rscadd: You can turn your night vision goggles off. Doing so removes the tint + and the eye protection malus. + - bugfix: Hoverboards properly dysfunction in space without any kind of support + underneath them. + - qol: Mood more promptly reacts to the beauty of an area as it changes, and not + just when changing areas. + - rscadd: Coroners (and potentially other mobs with the morbid trait), now like + degradated-looking rooms. + - rscadd: Aquariums now influence the beauty score of an area based on their contents. + - rscadd: Morbid people now get a positive moodlet when admiring an aquarium full + of dead fish, and a negative one when fish are alive. + - admin: Added a config that regulares random spawners weights. + - rscadd: 12% chance of a ouija board spawning in the chaplain office. Wawastation + always has one. + GremlinSeeker: + - bugfix: ' Birdshot botany is resized. bar is also smaller.' + - bugfix: Birdshot public shrine now uses the correct dirt. (Goodbye chasms) + LT3: + - balance: Advanced Medbay Equipment research node lowered to tier 3 + - balance: Advanced Medbay Equipment now requires haloperidol scan experiment + - balance: Haloperidol and cryostylane experiments can be performed roundstart + - balance: Cryostasis research node raised to tier 4 + - balance: Cryostasis now has Fusion instead of Controlled Plasma as a prerequisite + - balance: Cryostasis cryostylane scan is now a discount experiment + - balance: Crystallizer moved from Controlled Plasma to Fusion + Loafin34: + - rscadd: There's a previously undiscovered variant of a nullrod, recently revealed + from the depths of the skating rink.. + Melbert: + - qol: Vending Machines have a search bar + - qol: Random player characters now look less like rainbow vomit and more like some + of the most average people you know. + SmArtKar: + - bugfix: Added a forgotten firelock on second floor of wawa + - bugfix: Fixed glass shards generated from falling vending machines or tackling + windows not being able to embed into anyone. + - refactor: Refactored embedding code to use datums instead of bespoke elements + and ugly associated lists. + - bugfix: You require breathing once more. + Toastgoats: + - rscadd: Added the designer EVA suit, a unique pirate hardsuit for Silverscales. + - balance: Increased the equipment available to Silverscales + - image: Sprites for the designer EVA suit + carlarctg: + - spellcheck: Renamed the organ thrower module to the 'organizer' + - spellcheck: Made its description more accurate. Did you know it instantly replaces + up to 5 organs in active surgery? + homexp13: + - bugfix: ' Examining a fishing spot twice with sufficiently high fishing skill + (or the skillchip) will get you a list of fishes that can ACTUALLY be caught' + jlsnow301: + - bugfix: Fixed the bluescreen while setting a custom font in tgui panel + - bugfix: Fixed the orbit icons scrolling sometimes + lorwp: + - rscadd: using 'skibidi' as a chaplain deity now gives you brain damage + mc-oofert: + - bugfix: defibrillator no longer has an abstract cell + - code_imp: defibrillator attackby replaced with item_interaction + - balance: All jetpacks are now modsuit jetpack speed + - rscdel: Adv. Ion Jetpack module has been removed + - bugfix: you may now use a legion core on an elite tumor + necromanceranne: + - balance: You can only stun someone with a shove if they have been shoved into + objects or people, or have been hit by telescopic batons, contractor batons + or the Mansus Grasp. + - balance: If someone is knocked to the floor, however, you can still disarm them + of any object with a shove. + - bugfix: Knight helmets no longer burn as though made of cloth. + - rscadd: Fletching starter kit! Make your own bow, shoot your friends in an unfortunate + workplace accident. Replace all those holy arrows you lost. + - bugfix: Bows now properly undraw once they have fired an arrow. + - code_imp: Bows now utilize overlays in order to display loaded arrows. Unique + overlays per arrow. +2024-07-09: + 00-Steven: + - qol: You can now copy blast door controller IDs directly onto shutters/blast doors, + avoiding the need to open a menu for each one. Additionally, this lets you fix + sets of roundstart shutters without needing to change the IDs on all of the + ones in that set. + ArcaneMusic: + - bugfix: Ore vents that are caught in the cross-fire of a lavaland tendril collapsing + will now spare the ore vent and it's associated turf. + Astrogem2: + - sound: Added audible zipping to winter coats. + DGamerL: + - refactor: refactored `GetExactComponent` to be 1641 compatible + Derpguy3: + - bugfix: Missing janitor access restrictions have been added to Birdshot's custodial + closet doors. + EnterTheJake: + - balance: Jetpacks are now briefly disabled by EMP. + - balance: Mirage module has been removed from Sec modsuits. + - balance: Security modsuits now spawn with a better cell and the jetpack module + preinstalled. + FernandoJ8: + - bugfix: humanoid species featured are randomized correctly once again + Ghommie: + - balance: Bait quality now influences the probabilities of getting a rarer fish + compared to the most common one(s) + GoblinBackwards: + - bugfix: Fixed missing wires leading to the port hallway APC on Birdshot. + Inari-Whitebear: + - bugfix: Fixed space heater heating power and power consumption + JackEnoff: + - bugfix: Welding helmet and hardhat will now properly protect against pepperspray + while its down + JohnFulpWillard: + - qol: You can now use a spoon or ladle on an ice cream vat to spill a reagent, + ridding the machine of all reagent of that type. + Jolly: + - code_imp: Behind the scenes, atmos machines (freezers/mixers) in maps were tweaked + a bit. If you see them no longer connected to specific pipenets, please make + an issue report, this is not intended behavior!! + Kocma-san: + - qol: the disposal unit has been added to the cargo bay and miner's office. + - bugfix: missed disposal pipe returned at QM's office + LemonInTheDark: + - rscadd: Most door animations now better line up with when they are/are not passable. + Rhials: + - admin: Narrate verbs will now allow you to pick what text formatting span you + want to use before you send them, if any. + - bugfix: Certain items can no longer be purchased or be offered with a discount + on a loneop uplink. This is stuff like base cards (functionally useless) or + Overwatch Intel Agents (which break the role). + - balance: Loneops may now purchase chameleon noslips, station blackout triggers, + and station comms failure triggers. + SmArtKar: + - bugfix: Blood filters should filter out reagents completely now instead of leaving + a small amount no matter what. + - image: You can now flip your security helmet's visor up with alt-click! However, + doing so will (obviously) expose your eyes. + - bugfix: Embedding now properly changes its values. + - bugfix: Bloody footprints no longer bloody your shoes even more when walked over. + SyncIt21: + - bugfix: paintings can be sponsored again + - bugfix: hydroponic trays take in all reagents "proportionally" from plumbing ducts + without leaving any behind + - bugfix: plumbing bottler pumps out all reagents "proportionally" into output beakers + Xackii: + - balance: 'Demon: bloodcrawl now deal damage when you using it.' + - balance: 'Demon: demon can eat only carbon human beings.' + Xander3359: + - bugfix: fixed CNS rebooter/Changeling adrenaline not preventing/fixing stamina + crit + carlarctg: + - qol: Using a multitool inhand tells you where the area APC is + - code_imp: Added the subtype vendor which lets admins and coders vend subtypes + of a path + - code_imp: Added the vendor and both varieties of omnitool to runtime station + grungussuss: + - sound: pen click now has a proper sound + - sound: scalpel cutting sound now has a clean sound. + - bugfix: fixed an unrestricted airlock in metastation brig maints + grungussuss, ported from Beestation: + - sound: abductee, hypnotized and brainwashed now have sound when becoming one. + mc-oofert: + - qol: blood bros get a hud to see eachother + - code_imp: teambased antagonists may not see the HUDs of other teams + rageguy505: + - bugfix: no more xenobio active turfs diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi index 31f26c3e6e11e..38921a6e48402 100644 Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ diff --git a/icons/effects/beam.dmi b/icons/effects/beam.dmi index fd7bee8ed6075..ae668b0495a56 100644 Binary files a/icons/effects/beam.dmi and b/icons/effects/beam.dmi differ diff --git a/icons/effects/bitrunning.dmi b/icons/effects/bitrunning.dmi index 8efa429389c3a..9a2e9c0228a57 100644 Binary files a/icons/effects/bitrunning.dmi and b/icons/effects/bitrunning.dmi differ diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 67b8ea51c1850..1b6e8d68e3682 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/effects/fields.dmi b/icons/effects/fields.dmi index f87e1f3975e86..1e42870787674 100644 Binary files a/icons/effects/fields.dmi and b/icons/effects/fields.dmi differ diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index ad09351e787f6..47684f4664e89 100644 Binary files a/icons/effects/mapping_helpers.dmi and b/icons/effects/mapping_helpers.dmi differ diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi index ed6c0c8702e45..4e5608330030b 100644 Binary files a/icons/effects/random_spawners.dmi and b/icons/effects/random_spawners.dmi differ diff --git a/icons/mob/actions/actions_mecha.dmi b/icons/mob/actions/actions_mecha.dmi index 7c659ca3b573c..60df1b5ed1ae5 100644 Binary files a/icons/mob/actions/actions_mecha.dmi and b/icons/mob/actions/actions_mecha.dmi differ diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index eb3f87d9c71f0..be83d83d4228c 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi index 20bf4d18381fd..92b155f62d547 100644 Binary files a/icons/mob/clothing/eyes.dmi and b/icons/mob/clothing/eyes.dmi differ diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi index a670c33b7dcf6..ded01542e31b6 100644 Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ diff --git a/icons/mob/clothing/head/helmet.dmi b/icons/mob/clothing/head/helmet.dmi index 8b29c935f5ea7..116f0256a6276 100644 Binary files a/icons/mob/clothing/head/helmet.dmi and b/icons/mob/clothing/head/helmet.dmi differ diff --git a/icons/mob/clothing/head/spacehelm.dmi b/icons/mob/clothing/head/spacehelm.dmi index 0b9f3d4a36eb4..d9a634a63c771 100644 Binary files a/icons/mob/clothing/head/spacehelm.dmi and b/icons/mob/clothing/head/spacehelm.dmi differ diff --git a/icons/mob/clothing/suits/jacket.dmi b/icons/mob/clothing/suits/jacket.dmi index fa93a85c7c6f1..869966528b2e9 100644 Binary files a/icons/mob/clothing/suits/jacket.dmi and b/icons/mob/clothing/suits/jacket.dmi differ diff --git a/icons/mob/clothing/suits/labcoat.dmi b/icons/mob/clothing/suits/labcoat.dmi index 37cb0e8696bdb..7edbf91840518 100644 Binary files a/icons/mob/clothing/suits/labcoat.dmi and b/icons/mob/clothing/suits/labcoat.dmi differ diff --git a/icons/mob/clothing/suits/spacesuit.dmi b/icons/mob/clothing/suits/spacesuit.dmi index 0067c4bf36a8c..1f691729a3031 100644 Binary files a/icons/mob/clothing/suits/spacesuit.dmi and b/icons/mob/clothing/suits/spacesuit.dmi differ diff --git a/icons/mob/inhands/clothing/gloves_lefthand.dmi b/icons/mob/inhands/clothing/gloves_lefthand.dmi index 6277d146ffc3d..4d191e42939b7 100644 Binary files a/icons/mob/inhands/clothing/gloves_lefthand.dmi and b/icons/mob/inhands/clothing/gloves_lefthand.dmi differ diff --git a/icons/mob/inhands/clothing/gloves_righthand.dmi b/icons/mob/inhands/clothing/gloves_righthand.dmi index 7479dd8c505cc..f8ce306cc9850 100644 Binary files a/icons/mob/inhands/clothing/gloves_righthand.dmi and b/icons/mob/inhands/clothing/gloves_righthand.dmi differ diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi index 5515ad69c3486..86bd5020f4f32 100644 Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi index fdad955fd9a6f..a6de8b974644c 100644 Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ diff --git a/icons/mob/rideables/mech_construct.dmi b/icons/mob/rideables/mech_construct.dmi index c25eb971f2e36..656322b8187a7 100644 Binary files a/icons/mob/rideables/mech_construct.dmi and b/icons/mob/rideables/mech_construct.dmi differ diff --git a/icons/mob/rideables/mech_construction.dmi b/icons/mob/rideables/mech_construction.dmi index f26dbe17fd036..6e1cdbc3a2d4a 100644 Binary files a/icons/mob/rideables/mech_construction.dmi and b/icons/mob/rideables/mech_construction.dmi differ diff --git a/icons/mob/rideables/mecha.dmi b/icons/mob/rideables/mecha.dmi index 0c0f62de4d26e..5960d05413781 100644 Binary files a/icons/mob/rideables/mecha.dmi and b/icons/mob/rideables/mecha.dmi differ diff --git a/icons/mob/rideables/vehicles.dmi b/icons/mob/rideables/vehicles.dmi index 7e2b8a05f204c..08923668d2663 100644 Binary files a/icons/mob/rideables/vehicles.dmi and b/icons/mob/rideables/vehicles.dmi differ diff --git a/icons/obj/antags/eldritch.dmi b/icons/obj/antags/eldritch.dmi index 7f6af6bfe2e65..664311e5c7c47 100644 Binary files a/icons/obj/antags/eldritch.dmi and b/icons/obj/antags/eldritch.dmi differ diff --git a/icons/obj/canisters.dmi b/icons/obj/canisters.dmi index 436467648880b..1555cf0a4782e 100644 Binary files a/icons/obj/canisters.dmi and b/icons/obj/canisters.dmi differ diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index 95453cb46edc8..e26731f384667 100644 Binary files a/icons/obj/card.dmi and b/icons/obj/card.dmi differ diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index fd898d3105fd8..97f692551f9e3 100644 Binary files a/icons/obj/clothing/glasses.dmi and b/icons/obj/clothing/glasses.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index d5099c64e7f65..465340870dd48 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/head/helmet.dmi b/icons/obj/clothing/head/helmet.dmi index 4d43b542051fc..fe52d505e439d 100644 Binary files a/icons/obj/clothing/head/helmet.dmi and b/icons/obj/clothing/head/helmet.dmi differ diff --git a/icons/obj/clothing/head/spacehelm.dmi b/icons/obj/clothing/head/spacehelm.dmi index c2830a9d9335f..980d2a07a50be 100644 Binary files a/icons/obj/clothing/head/spacehelm.dmi and b/icons/obj/clothing/head/spacehelm.dmi differ diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index 8b4b549eda2ae..6ec143a849e1c 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/jacket.dmi b/icons/obj/clothing/suits/jacket.dmi index 30e1a99d9eed4..b867e7da3a710 100644 Binary files a/icons/obj/clothing/suits/jacket.dmi and b/icons/obj/clothing/suits/jacket.dmi differ diff --git a/icons/obj/clothing/suits/labcoat.dmi b/icons/obj/clothing/suits/labcoat.dmi index 430d11d5f96ab..4d5796a12b856 100644 Binary files a/icons/obj/clothing/suits/labcoat.dmi and b/icons/obj/clothing/suits/labcoat.dmi differ diff --git a/icons/obj/clothing/suits/spacesuit.dmi b/icons/obj/clothing/suits/spacesuit.dmi index 922ad05c35e7a..7fe01246352d6 100644 Binary files a/icons/obj/clothing/suits/spacesuit.dmi and b/icons/obj/clothing/suits/spacesuit.dmi differ diff --git a/icons/obj/devices/artefacts.dmi b/icons/obj/devices/artefacts.dmi new file mode 100644 index 0000000000000..75a6f754fbbed Binary files /dev/null and b/icons/obj/devices/artefacts.dmi differ diff --git a/icons/obj/doors/blastdoor.dmi b/icons/obj/doors/blastdoor.dmi index 9457690cda365..9c7bec103cefa 100644 Binary files a/icons/obj/doors/blastdoor.dmi and b/icons/obj/doors/blastdoor.dmi differ diff --git a/icons/obj/doors/doorfireglass.dmi b/icons/obj/doors/doorfireglass.dmi index 250b5ca833a89..83156ae4351e1 100644 Binary files a/icons/obj/doors/doorfireglass.dmi and b/icons/obj/doors/doorfireglass.dmi differ diff --git a/icons/obj/doors/doormorgue.dmi b/icons/obj/doors/doormorgue.dmi index c0ed1147325ce..381e5c3385ef3 100644 Binary files a/icons/obj/doors/doormorgue.dmi and b/icons/obj/doors/doormorgue.dmi differ diff --git a/icons/obj/doors/puzzledoor/danger.dmi b/icons/obj/doors/puzzledoor/danger.dmi index 89d19131cc189..ed78272037e37 100644 Binary files a/icons/obj/doors/puzzledoor/danger.dmi and b/icons/obj/doors/puzzledoor/danger.dmi differ diff --git a/icons/obj/doors/puzzledoor/default.dmi b/icons/obj/doors/puzzledoor/default.dmi index 49a9206139580..685fc448bdee0 100644 Binary files a/icons/obj/doors/puzzledoor/default.dmi and b/icons/obj/doors/puzzledoor/default.dmi differ diff --git a/icons/obj/doors/puzzledoor/wood.dmi b/icons/obj/doors/puzzledoor/wood.dmi index f2b53e857393b..58717aacf1e65 100644 Binary files a/icons/obj/doors/puzzledoor/wood.dmi and b/icons/obj/doors/puzzledoor/wood.dmi differ diff --git a/icons/obj/doors/shutters.dmi b/icons/obj/doors/shutters.dmi index 1cc727cdbf7a4..5fd2b2a8213d5 100644 Binary files a/icons/obj/doors/shutters.dmi and b/icons/obj/doors/shutters.dmi differ diff --git a/icons/obj/doors/shutters_radiation.dmi b/icons/obj/doors/shutters_radiation.dmi index 2e70b24a4aa2a..37b8cf72cbca0 100644 Binary files a/icons/obj/doors/shutters_radiation.dmi and b/icons/obj/doors/shutters_radiation.dmi differ diff --git a/icons/obj/doors/shutters_window.dmi b/icons/obj/doors/shutters_window.dmi index fcf8af5b94fd7..b86fe675366c1 100644 Binary files a/icons/obj/doors/shutters_window.dmi and b/icons/obj/doors/shutters_window.dmi differ diff --git a/icons/obj/doors/windoor.dmi b/icons/obj/doors/windoor.dmi index 86893eb9c453c..117cd78e1348b 100644 Binary files a/icons/obj/doors/windoor.dmi and b/icons/obj/doors/windoor.dmi differ diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi index 6c2eda1986633..f20b54d9c31f0 100644 Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ diff --git a/icons/obj/meteor.dmi b/icons/obj/meteor.dmi index 9fde3f3ef68ea..6b47fe485c34b 100644 Binary files a/icons/obj/meteor.dmi and b/icons/obj/meteor.dmi differ diff --git a/icons/obj/meteor_spooky.dmi b/icons/obj/meteor_spooky.dmi deleted file mode 100644 index 287d5b47bd0f7..0000000000000 Binary files a/icons/obj/meteor_spooky.dmi and /dev/null differ diff --git a/icons/obj/pipes_n_cables/atmos.dmi b/icons/obj/pipes_n_cables/atmos.dmi index 91badbf3ccf9b..fc67ff54158f9 100644 Binary files a/icons/obj/pipes_n_cables/atmos.dmi and b/icons/obj/pipes_n_cables/atmos.dmi differ diff --git a/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi b/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi index 555b6c6328b02..2f10725a0a8f3 100644 Binary files a/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi and b/icons/obj/pipes_n_cables/hydrochem/plumbers.dmi differ diff --git a/icons/obj/science/vatgrowing.dmi b/icons/obj/science/vatgrowing.dmi index 646aad055cc3c..ec8b5dcb6acd9 100644 Binary files a/icons/obj/science/vatgrowing.dmi and b/icons/obj/science/vatgrowing.dmi differ diff --git a/icons/obj/signs.dmi b/icons/obj/signs.dmi index a2069ba5d9d3b..050a609470421 100644 Binary files a/icons/obj/signs.dmi and b/icons/obj/signs.dmi differ diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index b4617915e86ed..f13b10bdf4a8a 100644 Binary files a/icons/obj/stack_objects.dmi and b/icons/obj/stack_objects.dmi differ diff --git a/icons/obj/storage/case.dmi b/icons/obj/storage/case.dmi index a47c86eea9fb3..a29fd3a6f37c0 100644 Binary files a/icons/obj/storage/case.dmi and b/icons/obj/storage/case.dmi differ diff --git a/icons/obj/storage/crates.dmi b/icons/obj/storage/crates.dmi index 0a8640860eced..34d5db6f3e898 100644 Binary files a/icons/obj/storage/crates.dmi and b/icons/obj/storage/crates.dmi differ diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index c7b38cb6d1aab..becab20e591de 100644 Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ diff --git a/icons/obj/weapons/bows/arrows.dmi b/icons/obj/weapons/bows/arrows.dmi index 4453d4ca5f247..956a82dd9bf1f 100644 Binary files a/icons/obj/weapons/bows/arrows.dmi and b/icons/obj/weapons/bows/arrows.dmi differ diff --git a/icons/obj/weapons/bows/bows.dmi b/icons/obj/weapons/bows/bows.dmi index 81b2fc4822058..4de9d4fca35ab 100644 Binary files a/icons/obj/weapons/bows/bows.dmi and b/icons/obj/weapons/bows/bows.dmi differ diff --git a/icons/obj/weapons/guns/energy.dmi b/icons/obj/weapons/guns/energy.dmi index 5d607026f0133..6e8e5c60f684a 100644 Binary files a/icons/obj/weapons/guns/energy.dmi and b/icons/obj/weapons/guns/energy.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index a13ebcc636009..3be26b2c43fad 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/icons/ui_icons/antags/heretic/knowledge.dmi b/icons/ui_icons/antags/heretic/knowledge.dmi new file mode 100644 index 0000000000000..d24de1a5f0e81 Binary files /dev/null and b/icons/ui_icons/antags/heretic/knowledge.dmi differ diff --git a/modular_bandastation/translations/code/moustache.dm b/modular_bandastation/translations/code/moustache.dm index b18ca9708971d..d6b52a275885f 100644 --- a/modular_bandastation/translations/code/moustache.dm +++ b/modular_bandastation/translations/code/moustache.dm @@ -6,32 +6,12 @@ name = "итальянские усы" desc = "Изготовлен из настоящих итальянских волосков для усов. Дает владельцу непреодолимое желание дико жестикулировать." -/obj/item/clothing/mask/fakemoustache/italian/handle_speech(datum/source, list/speech_args) - var/message = speech_args[SPEECH_MESSAGE] - if(message[1] != "*") - var/static/regex/words = new(@"(? + + + {THEMES.map((THEME) => ( + + ))} + + + + {!freeFont ? ( + { + setFreeFont(!freeFont); + }} + > + Custom font + + } + > + {FONTS.map((FONT) => ( + + ))} + + ) : ( + + + dispatch( + updateSettings({ + fontFamily: value, + }), + ) + } + /> + + + )} + + + + toFixed(value)} + onChange={(value) => + dispatch( + updateSettings({ + fontSize: value, + }), + ) + } + /> + + + toFixed(value, 2)} + onDrag={(value) => + dispatch( + updateSettings({ + lineHeight: value, + }), + ) + } + /> + + + + + + + + + dispatch(clearChat())} + > + Clear chat + + + + + ); +} diff --git a/tgui/packages/tgui-panel/settings/SettingsPanel.jsx b/tgui/packages/tgui-panel/settings/SettingsPanel.jsx deleted file mode 100644 index e5691037bba68..0000000000000 --- a/tgui/packages/tgui-panel/settings/SettingsPanel.jsx +++ /dev/null @@ -1,371 +0,0 @@ -/** - * @file - * @copyright 2020 Aleksej Komarov - * @license MIT - */ - -import { toFixed } from 'common/math'; -import { capitalize } from 'common/string'; -import { useLocalState } from 'tgui/backend'; -import { useDispatch, useSelector } from 'tgui/backend'; -import { - Box, - Button, - Collapsible, - ColorBox, - Divider, - Input, - LabeledList, - NumberInput, - Section, - Stack, - Tabs, - TextArea, -} from 'tgui/components'; - -import { ChatPageSettings } from '../chat'; -import { clearChat, rebuildChat, saveChatToDisk } from '../chat/actions'; -import { THEMES } from '../themes'; -import { - addHighlightSetting, - changeSettingsTab, - removeHighlightSetting, - updateHighlightSetting, - updateSettings, -} from './actions'; -import { FONTS, MAX_HIGHLIGHT_SETTINGS, SETTINGS_TABS } from './constants'; -import { - selectActiveTab, - selectHighlightSettingById, - selectHighlightSettings, - selectSettings, -} from './selectors'; - -export const SettingsPanel = (props) => { - const activeTab = useSelector(selectActiveTab); - const dispatch = useDispatch(); - return ( - - -
    - - {SETTINGS_TABS.map((tab) => ( - - dispatch( - changeSettingsTab({ - tabId: tab.id, - }), - ) - } - > - {tab.name} - - ))} - -
    -
    - - {activeTab === 'general' && } - {activeTab === 'chatPage' && } - {activeTab === 'textHighlight' && } - -
    - ); -}; - -export const SettingsGeneral = (props) => { - const { theme, fontFamily, fontSize, lineHeight } = - useSelector(selectSettings); - const dispatch = useDispatch(); - const [freeFont, setFreeFont] = useLocalState('freeFont', false); - return ( -
    - - - {THEMES.map((THEME) => ( -
    - ); -}; - -const TextHighlightSettings = (props) => { - const highlightSettings = useSelector(selectHighlightSettings); - const dispatch = useDispatch(); - return ( -
    - - {highlightSettings.map((id, i) => ( - - ))} - {highlightSettings.length < MAX_HIGHLIGHT_SETTINGS && ( - - - - Can freeze the chat for a while. - - -
    - ); -}; - -const TextHighlightSetting = (props) => { - const { id, ...rest } = props; - const highlightSettingById = useSelector(selectHighlightSettingById); - const dispatch = useDispatch(); - const { - highlightColor, - highlightText, - highlightWholeMessage, - matchWord, - matchCase, - } = highlightSettingById[id]; - return ( - - - -