diff --git a/_maps/virtual_domains/starfront_saloon.dmm b/_maps/virtual_domains/starfront_saloon.dmm
deleted file mode 100644
index 277382b6dbbf2..0000000000000
--- a/_maps/virtual_domains/starfront_saloon.dmm
+++ /dev/null
@@ -1,1834 +0,0 @@
-//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
-"ae" = (
-/obj/item/kirbyplants/random,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"cK" = (
-/obj/effect/landmark/bitrunning/mob_segment,
-/turf/template_noop,
-/area/virtual_domain)
-"cU" = (
-/turf/template_noop,
-/area/virtual_domain/safehouse)
-"df" = (
-/obj/effect/spawner/random/vending/snackvend,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"do" = (
-/obj/effect/spawner/random/trash/garbage,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"eU" = (
-/obj/effect/spawner/random/structure/crate,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"gh" = (
-/obj/effect/spawner/random/vending/colavend,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"hz" = (
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/item/clothing/head/cowboy,
-/obj/structure/closet,
-/turf/template_noop,
-/area/virtual_domain/safehouse)
-"il" = (
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"it" = (
-/obj/modular_map_root/generic{
- key = "station_medium"
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"iJ" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/spawner/random/entertainment/plushie,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"iO" = (
-/obj/effect/spawner/random/structure/crate,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"jt" = (
-/obj/item/gun/energy/marksman_revolver{
- pixel_x = 8;
- pixel_y = 4
- },
-/obj/item/gun/energy/marksman_revolver{
- pixel_x = 4
- },
-/obj/item/gun/energy/marksman_revolver{
- pixel_x = -4;
- pixel_y = -4
- },
-/obj/structure/table,
-/turf/template_noop,
-/area/virtual_domain/safehouse)
-"ma" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/spawner/random/decoration/generic,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"mq" = (
-/obj/effect/baseturf_helper/virtual_domain,
-/turf/closed/indestructible/binary,
-/area/virtual_domain)
-"mu" = (
-/turf/closed/wall,
-/area/virtual_domain)
-"on" = (
-/obj/structure/table/greyscale,
-/obj/machinery/recharger{
- pixel_x = 8;
- pixel_y = 4
- },
-/obj/machinery/recharger{
- pixel_x = -8;
- pixel_y = 4
- },
-/turf/template_noop,
-/area/virtual_domain/safehouse)
-"oR" = (
-/obj/effect/spawner/random/structure/chair_maintenance{
- dir = 8
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"po" = (
-/obj/effect/baseturf_helper/virtual_domain,
-/obj/modular_map_root/safehouse{
- key = "den"
- },
-/turf/template_noop,
-/area/virtual_domain/safehouse)
-"sX" = (
-/obj/effect/spawner/random/decoration/statue,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"uW" = (
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"ve" = (
-/obj/effect/spawner/random/trash/graffiti,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"wB" = (
-/obj/effect/spawner/random/engineering/tank,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"wK" = (
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"yF" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/spawner/random/food_or_drink/snack,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"zU" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/turf_decal/tile/dark_red/half,
-/obj/machinery/recharger{
- pixel_x = 8;
- pixel_y = 4
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Au" = (
-/obj/effect/spawner/random/trash/garbage,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"AF" = (
-/obj/effect/turf_decal/tile/dark_red/half,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Bi" = (
-/obj/effect/spawner/random/structure/chair_maintenance{
- dir = 4
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"BX" = (
-/obj/effect/spawner/random/trash/graffiti,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Ey" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/spawner/random/decoration/ornament,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"EK" = (
-/obj/effect/spawner/random/structure/chair_maintenance{
- dir = 4
- },
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Gz" = (
-/obj/effect/spawner/random/structure/crate,
-/obj/effect/turf_decal/tile/dark_red/half,
-/obj/effect/spawner/random/armory/shotgun,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"GY" = (
-/obj/effect/spawner/random/entertainment/arcade,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Ib" = (
-/obj/effect/spawner/random/trash/bin,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Il" = (
-/obj/effect/turf_decal/tile/dark_red/half,
-/obj/effect/decal/cleanable/dirt/dust,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Ix" = (
-/obj/structure/closet,
-/obj/effect/spawner/random/maintenance/three,
-/obj/effect/spawner/random/exotic/antag_gear,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"Ja" = (
-/turf/closed/indestructible/binary,
-/area/virtual_domain)
-"JA" = (
-/obj/effect/spawner/random/structure/crate,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"KD" = (
-/obj/effect/landmark/bitrunning/cache_spawn,
-/turf/template_noop,
-/area/virtual_domain)
-"KN" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/virtual_domain)
-"Lu" = (
-/obj/structure/table/greyscale,
-/obj/machinery/recharger{
- pixel_x = 8;
- pixel_y = 4
- },
-/obj/machinery/recharger{
- pixel_x = -8;
- pixel_y = 4
- },
-/obj/effect/turf_decal/tile/dark_red/half,
-/obj/machinery/light/directional/south,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"MG" = (
-/obj/effect/spawner/random/trash/graffiti,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"Oq" = (
-/obj/machinery/light/small/directional/south,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Ox" = (
-/obj/structure/closet,
-/obj/effect/spawner/random/maintenance/five,
-/obj/effect/spawner/random/armory/laser_gun,
-/obj/machinery/light/small/directional/north,
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"OX" = (
-/turf/open/floor/catwalk_floor,
-/area/virtual_domain)
-"OZ" = (
-/obj/effect/spawner/random/structure/billboard,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"PE" = (
-/turf/template_noop,
-/area/virtual_domain)
-"Qi" = (
-/obj/modular_map_root/generic{
- key = "station_small"
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"QM" = (
-/obj/modular_map_root/generic{
- key = "station_large"
- },
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"QO" = (
-/obj/machinery/light/directional/east,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Rk" = (
-/obj/effect/spawner/random/trash/graffiti,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Te" = (
-/obj/machinery/light/directional/south,
-/obj/effect/spawner/random/structure/table,
-/obj/effect/spawner/random/engineering/toolbox,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Tn" = (
-/turf/open/space/basic,
-/area/virtual_domain)
-"TM" = (
-/obj/machinery/light/directional/south,
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"VX" = (
-/obj/effect/decal/cleanable/dirt,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Wd" = (
-/obj/effect/turf_decal/tile/dark_red/half,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-"Wp" = (
-/obj/effect/landmark/bitrunning/mob_segment,
-/turf/open/floor/sepia,
-/area/virtual_domain)
-
-(1,1,1) = {"
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-mq
-"}
-(2,1,1) = {"
-Ja
-il
-il
-il
-il
-mu
-df
-il
-cU
-cU
-cU
-cU
-cU
-po
-il
-OX
-Ja
-"}
-(3,1,1) = {"
-Ja
-mu
-mu
-mu
-mu
-mu
-il
-il
-cU
-jt
-on
-hz
-cU
-cU
-il
-OX
-Ja
-"}
-(4,1,1) = {"
-Ja
-OX
-OX
-OX
-OX
-OX
-Qi
-il
-cU
-cU
-cU
-cU
-cU
-cU
-il
-OX
-Ja
-"}
-(5,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-gh
-il
-cU
-cU
-cU
-cU
-cU
-cU
-il
-OX
-Ja
-"}
-(6,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-il
-il
-cU
-cU
-cU
-cU
-cU
-cU
-il
-OX
-Ja
-"}
-(7,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-il
-il
-cU
-cU
-cU
-cU
-cU
-cU
-il
-OX
-Ja
-"}
-(8,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-il
-il
-cU
-cU
-cU
-cU
-cU
-cU
-il
-il
-Ja
-"}
-(9,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-il
-il
-il
-il
-il
-il
-Ja
-"}
-(10,1,1) = {"
-Ja
-Ix
-OX
-OX
-OX
-OX
-il
-il
-it
-il
-il
-il
-TM
-mu
-KN
-KN
-Ja
-"}
-(11,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-Ib
-il
-il
-il
-ae
-KN
-Tn
-Tn
-Ja
-"}
-(12,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(13,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Il
-KN
-Tn
-Tn
-Ja
-"}
-(14,1,1) = {"
-Ja
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(15,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(16,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-VX
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(17,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(18,1,1) = {"
-Ja
-Au
-OX
-OX
-OX
-OX
-il
-il
-it
-il
-sX
-il
-iO
-KN
-Tn
-Tn
-Ja
-"}
-(19,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Te
-mu
-Tn
-Tn
-Ja
-"}
-(20,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(21,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-AF
-KN
-Tn
-Tn
-Ja
-"}
-(22,1,1) = {"
-Ja
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(23,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-Wp
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(24,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(25,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-VX
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(26,1,1) = {"
-Ja
-wB
-OX
-OX
-OX
-OX
-il
-il
-it
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(27,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-Ib
-il
-il
-il
-iJ
-mu
-Tn
-Tn
-Ja
-"}
-(28,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-PE
-PE
-il
-uW
-il
-il
-ae
-KN
-Tn
-Tn
-Ja
-"}
-(29,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-oR
-oR
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(30,1,1) = {"
-Ja
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-Oq
-mu
-mu
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(31,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-Bi
-EK
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(32,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(33,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(34,1,1) = {"
-Ja
-wK
-ve
-OX
-OX
-OX
-VX
-il
-it
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(35,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-OZ
-il
-zU
-mu
-Tn
-Tn
-Ja
-"}
-(36,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(37,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-VX
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(38,1,1) = {"
-Ja
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(39,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(40,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(41,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-uW
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(42,1,1) = {"
-Ja
-Ox
-OX
-OX
-OX
-OX
-il
-il
-it
-uW
-il
-Wp
-Gz
-KN
-Tn
-Tn
-Ja
-"}
-(43,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-uW
-il
-il
-Lu
-mu
-Tn
-Tn
-Ja
-"}
-(44,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-do
-il
-il
-il
-ae
-KN
-Tn
-Tn
-Ja
-"}
-(45,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(46,1,1) = {"
-Ja
-PE
-KD
-PE
-cK
-PE
-PE
-PE
-il
-il
-il
-VX
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(47,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-KD
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(48,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(49,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-Ib
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(50,1,1) = {"
-Ja
-MG
-OX
-OX
-OX
-OX
-VX
-il
-il
-il
-QM
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(51,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-yF
-mu
-Tn
-Tn
-Ja
-"}
-(52,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(53,1,1) = {"
-Ja
-PE
-PE
-cK
-PE
-PE
-KD
-PE
-PE
-PE
-uW
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(54,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-uW
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(55,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(56,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(57,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-KD
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(58,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-GY
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(59,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(60,1,1) = {"
-Ja
-eU
-OX
-OX
-OX
-OX
-il
-il
-it
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(61,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-Ib
-il
-il
-il
-Ey
-mu
-Tn
-Tn
-Ja
-"}
-(62,1,1) = {"
-Ja
-PE
-PE
-KD
-PE
-PE
-PE
-PE
-do
-il
-il
-VX
-ae
-KN
-Tn
-Tn
-Ja
-"}
-(63,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(64,1,1) = {"
-Ja
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-Wp
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(65,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-KD
-PE
-PE
-il
-il
-sX
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(66,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(67,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-Rk
-il
-il
-uW
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(68,1,1) = {"
-Ja
-wB
-OX
-OX
-OX
-OX
-VX
-il
-il
-il
-QM
-uW
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(69,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-ma
-mu
-Tn
-Tn
-Ja
-"}
-(70,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(71,1,1) = {"
-Ja
-PE
-PE
-KD
-PE
-PE
-PE
-KD
-PE
-PE
-il
-uW
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(72,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(73,1,1) = {"
-Ja
-PE
-PE
-cK
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(74,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-cK
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(75,1,1) = {"
-Ja
-PE
-KD
-PE
-PE
-PE
-KD
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(76,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(77,1,1) = {"
-Ja
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-PE
-il
-VX
-BX
-KN
-Tn
-Tn
-Ja
-"}
-(78,1,1) = {"
-Ja
-eU
-JA
-OX
-OX
-OX
-OX
-OX
-OX
-il
-QO
-il
-Wd
-KN
-Tn
-Tn
-Ja
-"}
-(79,1,1) = {"
-Ja
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-mu
-Tn
-Tn
-Ja
-"}
-(80,1,1) = {"
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-Ja
-"}
diff --git a/_maps/virtual_domains/syndicate_assault.dmm b/_maps/virtual_domains/syndicate_assault.dmm
index 81bb35a257a75..3822d2cc1e076 100644
--- a/_maps/virtual_domains/syndicate_assault.dmm
+++ b/_maps/virtual_domains/syndicate_assault.dmm
@@ -65,6 +65,7 @@
req_access = list("syndicate");
secure = 1
},
+/obj/item/gun/ballistic/automatic/pistol,
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/space/has_grav/powered/virtual_domain)
"cw" = (
@@ -388,6 +389,11 @@
/obj/structure/sign/poster/contraband/syndicate_pistol,
/turf/closed/wall/r_wall/syndicate,
/area/ruin/space/has_grav/powered/virtual_domain)
+"og" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/cup/glass/trophy/silver_cup,
+/turf/open/floor/mineral/plastitanium/red,
+/area/ruin/space/has_grav/powered/virtual_domain)
"oM" = (
/obj/structure/cable,
/turf/open/floor/mineral/plastitanium,
@@ -498,10 +504,16 @@
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/space/has_grav/powered/virtual_domain)
"sH" = (
-/obj/structure/displaycase{
+/obj/structure/closet/syndicate{
+ anchored = 1;
+ desc = "A basic closet for all your villainous needs.";
+ locked = 1;
+ name = "Closet";
req_access = list("syndicate");
- start_showpiece_type = /obj/item/gun/ballistic/automatic/pistol/deagle/camo
+ secure = 1
},
+/obj/item/ammo_box/c9mm,
+/obj/item/gun/ballistic/automatic/pistol,
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/space/has_grav/powered/virtual_domain)
"sK" = (
@@ -600,6 +612,9 @@
/obj/item/ammo_box/c9mm,
/turf/open/floor/mineral/plastitanium/red,
/area/ruin/space/has_grav/powered/virtual_domain)
+"xS" = (
+/turf/closed/wall/r_wall/syndicate/nodiagonal,
+/area/ruin/space/has_grav/powered/virtual_domain)
"yl" = (
/obj/machinery/door/airlock/grunge{
name = "Captain's Room"
@@ -688,6 +703,7 @@
/obj/item/crowbar/red,
/obj/item/ammo_box/magazine/m9mm_aps,
/obj/item/ammo_box/magazine/m9mm_aps,
+/obj/item/gun/ballistic/automatic/pistol,
/turf/open/floor/carpet/royalblack,
/area/ruin/space/has_grav/powered/virtual_domain)
"Cn" = (
@@ -927,6 +943,7 @@
/obj/item/crowbar/red,
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
+/obj/item/gun/ballistic/automatic/pistol,
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/powered/virtual_domain)
"Mm" = (
@@ -1076,6 +1093,7 @@
/obj/item/ammo_box/magazine/m9mm,
/obj/item/ammo_box/magazine/m9mm,
/obj/machinery/light/small/directional/north,
+/obj/item/gun/ballistic/automatic/pistol,
/turf/open/floor/mineral/plastitanium,
/area/ruin/space/has_grav/powered/virtual_domain)
"Sq" = (
@@ -2206,7 +2224,7 @@ qx
qx
qx
ru
-vp
+og
Jg
ru
bh
@@ -2264,7 +2282,7 @@ qx
qx
qx
ru
-sH
+Kz
Kz
yl
bh
@@ -2743,7 +2761,7 @@ ru
ru
ru
ru
-Vk
+ru
qx
qx
qx
@@ -3091,7 +3109,7 @@ uP
ru
hD
ru
-Ig
+xS
qx
qx
qx
@@ -3203,7 +3221,7 @@ tI
Kz
Kz
ct
-xJ
+sH
ru
qx
qx
diff --git a/code/datums/components/temporary_body.dm b/code/datums/components/temporary_body.dm
index 3da289a6d3462..28a7000a4951d 100644
--- a/code/datums/components/temporary_body.dm
+++ b/code/datums/components/temporary_body.dm
@@ -10,17 +10,23 @@
var/datum/weakref/old_mind_ref
///The old body we will be put back into when parent is being deleted.
var/datum/weakref/old_body_ref
+ /// Returns the mind if the parent dies by any means
+ var/delete_on_death = FALSE
-/datum/component/temporary_body/Initialize(datum/mind/old_mind, mob/living/old_body)
+/datum/component/temporary_body/Initialize(datum/mind/old_mind, mob/living/old_body, delete_on_death = FALSE)
if(!isliving(parent) || !isliving(old_body))
return COMPONENT_INCOMPATIBLE
ADD_TRAIT(old_body, TRAIT_MIND_TEMPORARILY_GONE, REF(src))
src.old_mind_ref = WEAKREF(old_mind)
src.old_body_ref = WEAKREF(old_body)
+ src.delete_on_death = delete_on_death
/datum/component/temporary_body/RegisterWithParent()
RegisterSignal(parent, COMSIG_QDELETING, PROC_REF(on_parent_destroy))
+ if(delete_on_death)
+ RegisterSignal(parent, COMSIG_LIVING_DEATH, PROC_REF(on_parent_destroy))
+
/datum/component/temporary_body/UnregisterFromParent()
UnregisterSignal(parent, COMSIG_QDELETING)
diff --git a/code/modules/antagonists/heretic/items/eldritch_painting.dm b/code/modules/antagonists/heretic/items/eldritch_painting.dm
index 5302fc1c9c148..3332c4e31ba63 100644
--- a/code/modules/antagonists/heretic/items/eldritch_painting.dm
+++ b/code/modules/antagonists/heretic/items/eldritch_painting.dm
@@ -4,14 +4,14 @@
icon = 'icons/obj/signs.dmi'
resistance_flags = FLAMMABLE
flags_1 = NONE
- icon_state = "frame-empty"
+ icon_state = "eldritch_painting_debug"
result_path = /obj/structure/sign/painting/eldritch
pixel_shift = 30
/obj/structure/sign/painting/eldritch
name = "The debug and a coder who slept"
icon = 'icons/obj/signs.dmi'
- icon_state = "frame-empty"
+ icon_state = "eldritch_painting_debug"
custom_materials = list(/datum/material/wood =SHEET_MATERIAL_AMOUNT)
resistance_flags = FLAMMABLE
buildable_sign = FALSE
diff --git a/code/modules/bitrunning/components/virtual_entity.dm b/code/modules/bitrunning/components/virtual_entity.dm
index 12e5305ba9adc..db81f376a8094 100644
--- a/code/modules/bitrunning/components/virtual_entity.dm
+++ b/code/modules/bitrunning/components/virtual_entity.dm
@@ -31,6 +31,8 @@
/datum/component/virtual_entity/proc/jailbreak_mobs()
SIGNAL_HANDLER
- to_chat(parent, span_big("You shiver for a moment, then suddenly feel a sense of clarity you haven't felt before. \
- You can go anywhere, do anything! You could leave this simulation right now if you wanted!"))
+ to_chat(parent, span_boldannounce("You shiver for a moment with a sense of clarity you haven't felt before."))
+ to_chat(parent, span_notice("You could go anywhere, do anything! You could leave this simulation right now if you wanted!"))
+ to_chat(parent, span_danger("But be warned, quantum entanglement will interfere with any previous lives."))
+ to_chat(parent, span_notice("You'll have just one chance to go nova, and there's no turning back."))
qdel(src)
diff --git a/code/modules/bitrunning/event.dm b/code/modules/bitrunning/event.dm
index 4cc95f4f0578a..16190851f3720 100644
--- a/code/modules/bitrunning/event.dm
+++ b/code/modules/bitrunning/event.dm
@@ -89,6 +89,10 @@
if(!unlucky_server.validate_mutation_candidates())
return WAITING_FOR_SOMETHING
- spawned_mobs = unlucky_server.setup_glitch(forced_role)
+ var/mob/spawned = unlucky_server.setup_glitch(forced_role)
+ if(isnull(spawned))
+ return WAITING_FOR_SOMETHING
+
+ spawned_mobs += spawned
return SUCCESSFUL_SPAWN
diff --git a/code/modules/bitrunning/objects/hololadder.dm b/code/modules/bitrunning/objects/hololadder.dm
index e592f31382de9..3df41a403e735 100644
--- a/code/modules/bitrunning/objects/hololadder.dm
+++ b/code/modules/bitrunning/objects/hololadder.dm
@@ -8,11 +8,37 @@
obj_flags = BLOCK_Z_OUT_DOWN
/// Time req to disconnect properly
var/travel_time = 3 SECONDS
+ /// Uses this to teleport observers back to the origin server
+ var/datum/weakref/server_ref
-/obj/structure/hololadder/Initialize(mapload)
+
+/obj/structure/hololadder/Initialize(mapload, obj/machinery/quantum_server/origin)
. = ..()
RegisterSignal(loc, COMSIG_ATOM_ENTERED, PROC_REF(on_enter))
+ server_ref = WEAKREF(origin)
+ register_context()
+
+
+/obj/structure/hololadder/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ . = ..()
+
+ context[SCREENTIP_CONTEXT_LMB] = "Disconnect"
+
+
+/obj/structure/hololadder/examine(mob/user)
+ . = ..()
+
+ if(isnull(server_ref.resolve()))
+ . += span_infoplain("It's not connected to anything.")
+ return
+
+ if(isobserver(user))
+ . += span_notice("Left click to view the server that this ladder is connected to.")
+ return
+
+ . += span_infoplain("This ladder is connected to a server. You can click on it or walk over it to disconnect.")
+
/obj/structure/hololadder/attack_hand(mob/user, list/modifiers)
. = ..()
@@ -24,19 +50,29 @@
disconnect(user)
+
+/obj/structure/hololadder/attack_ghost(mob/dead/observer/ghostie)
+ var/our_server = server_ref?.resolve()
+ if(isnull(our_server))
+ return ..()
+
+ ghostie.abstract_move(get_turf(our_server))
+
+
/// If there's a pilot ref- send the disconnect signal
/obj/structure/hololadder/proc/disconnect(mob/user)
if(isnull(user.mind))
return
if(!HAS_TRAIT(user, TRAIT_TEMPORARY_BODY))
- balloon_alert(user, "no connection detected.")
+ balloon_alert(user, "no connection detected")
return
balloon_alert(user, "disconnecting...")
if(do_after(user, travel_time, src))
SEND_SIGNAL(user, COMSIG_BITRUNNER_LADDER_SEVER)
+
/// Helper for times when you dont have hands (gondola??)
/obj/structure/hololadder/proc/on_enter(datum/source, atom/movable/arrived, turf/old_loc)
SIGNAL_HANDLER
diff --git a/code/modules/bitrunning/objects/netpod.dm b/code/modules/bitrunning/objects/netpod.dm
index 98bc96231b30e..1d4e905d6e184 100644
--- a/code/modules/bitrunning/objects/netpod.dm
+++ b/code/modules/bitrunning/objects/netpod.dm
@@ -52,17 +52,25 @@
. += span_infoplain("Netpods must be built within 4 tiles of a server.")
return
- . += span_infoplain("Drag yourself into the pod to engage the link.")
- . += span_infoplain("It has limited resuscitation capabilities. Remaining in the pod can heal some injuries.")
- . += span_infoplain("It has a security system that will alert the occupant if it is tampered with.")
+ if(!isobserver(user))
+ . += span_infoplain("Drag yourself into the pod to engage the link.")
+ . += span_infoplain("It has limited resuscitation capabilities. Remaining in the pod can heal some injuries.")
+ . += span_infoplain("It has a security system that will alert the occupant if it is tampered with.")
if(isnull(occupant))
- . += span_notice("It is currently unoccupied.")
+ . += span_infoplain("It's currently unoccupied.")
+ return
+
+ . += span_infoplain("It's currently occupied by [occupant].")
+
+ if(isobserver(user))
+ . += span_notice("As an observer, you can click this netpod to jump to its avatar.")
return
- . += span_notice("It is currently occupied by [occupant].")
. += span_notice("It can be pried open with a crowbar, but its safety mechanisms will alert the occupant.")
+
+
/obj/machinery/netpod/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
@@ -74,7 +82,6 @@
context[SCREENTIP_CONTEXT_LMB] = "Pry Open"
return CONTEXTUAL_SCREENTIP_SET
- return CONTEXTUAL_SCREENTIP_SET
/obj/machinery/netpod/update_icon_state()
if(!is_operational)
diff --git a/code/modules/bitrunning/server/_parent.dm b/code/modules/bitrunning/server/_parent.dm
index 113ed6b212625..8a8d2eed913de 100644
--- a/code/modules/bitrunning/server/_parent.dm
+++ b/code/modules/bitrunning/server/_parent.dm
@@ -19,7 +19,7 @@
/// Prevents multiple user actions. Handled by loading domains and cooldowns
var/is_ready = TRUE
/// Chance multipled by threat to spawn a glitch
- var/glitch_chance = 0.05
+ var/glitch_chance = 0.2
/// Current plugged in users
var/list/datum/weakref/avatar_connection_refs = list()
/// Cached list of mutable mobs in zone for cybercops
@@ -37,11 +37,13 @@
/// Changes how much info is available on the domain
var/scanner_tier = 1
/// Length of time it takes for the server to cool down after resetting. Here to give runners downtime so their faces don't get stuck like that
- var/server_cooldown_time = 3 MINUTES
+ var/server_cooldown_time = 2 MINUTES
/// Applies bonuses to rewards etc
var/servo_bonus = 0
/// Determines the glitches available to spawn, builds with completion
var/threat = 0
+ /// Maximum rate at which a glitch can spawn
+ var/threat_prob_max = 15
/// The turfs we can place a hololadder on.
var/turf/exit_turfs = list()
/// Determines if we broadcast to entertainment monitors or not
@@ -76,15 +78,18 @@
. += span_infoplain("Can be resource intensive to run. Ensure adequate power supply.")
if(capacitor_coefficient < 1)
- . += span_infoplain("Its coolant capacity reduces cooldown time by [(1 - capacitor_coefficient) * 100]%.")
+ . += span_infoplain("- Its coolant capacity reduces cooldown time by [(1 - capacitor_coefficient) * 100]%.")
if(servo_bonus > 0.2)
- . += span_infoplain("Its manipulation potential is increasing rewards by [servo_bonus]x.")
- . += span_infoplain("Injury from unsafe ejection reduced [servo_bonus * 100]%.")
+ . += span_infoplain("- Its manipulation potential is increasing rewards by [servo_bonus]x.")
+ . += span_infoplain("- Injury from unsafe ejection reduced [servo_bonus * 100]%.")
if(!is_ready)
. += span_notice("It is currently cooling down. Give it a few moments.")
+ if(isobserver(user) && (obj_flags & EMAGGED))
+ . += span_notice("Ominous warning lights are blinking red. This server has been tampered with.")
+
/obj/machinery/quantum_server/emag_act(mob/user, obj/item/card/emag/emag_card)
. = ..()
@@ -92,7 +97,8 @@
return
obj_flags |= EMAGGED
- glitch_chance = 0.09
+ glitch_chance *= 2
+ threat_prob_max *= 2
add_overlay(mutable_appearance('icons/obj/machines/bitrunning.dmi', "emag_overlay"))
balloon_alert(user, "system jailbroken...")
@@ -116,11 +122,14 @@
/obj/machinery/quantum_server/attackby(obj/item/weapon, mob/user, params)
. = ..()
- if(istype(weapon, /obj/item/bitrunning_debug))
- obj_flags |= EMAGGED
- glitch_chance = 0.5
- capacitor_coefficient = 0.01
- points = 100
+
+ if(!istype(weapon, /obj/item/bitrunning_debug))
+ return
+
+ obj_flags |= EMAGGED
+ glitch_chance = 0.5
+ capacitor_coefficient = 0.1
+ points = 100
/obj/machinery/quantum_server/crowbar_act(mob/living/user, obj/item/crowbar)
. = ..()
diff --git a/code/modules/bitrunning/server/map_handling.dm b/code/modules/bitrunning/server/map_handling.dm
index a55de5dbf9ded..5bfa7813910b6 100644
--- a/code/modules/bitrunning/server/map_handling.dm
+++ b/code/modules/bitrunning/server/map_handling.dm
@@ -55,7 +55,8 @@
is_ready = TRUE
- if(prob(clamp((threat * glitch_chance), 1, 10)))
+ var/spawn_chance = clamp((threat * glitch_chance), 5, threat_prob_max)
+ if(prob(spawn_chance))
setup_glitch()
playsound(src, 'sound/machines/terminal_insert_disc.ogg', 30, vary = TRUE)
diff --git a/code/modules/bitrunning/server/obj_generation.dm b/code/modules/bitrunning/server/obj_generation.dm
index 641d906cc5989..e8dbd72228c1d 100644
--- a/code/modules/bitrunning/server/obj_generation.dm
+++ b/code/modules/bitrunning/server/obj_generation.dm
@@ -110,7 +110,7 @@
if(isnull(destination))
return
- var/obj/structure/hololadder/wayout = new(destination)
+ var/obj/structure/hololadder/wayout = new(destination, src)
if(isnull(wayout))
return
diff --git a/code/modules/bitrunning/server/threats.dm b/code/modules/bitrunning/server/threats.dm
index 66a96d9971fe4..25a891c03b24b 100644
--- a/code/modules/bitrunning/server/threats.dm
+++ b/code/modules/bitrunning/server/threats.dm
@@ -71,6 +71,8 @@
var/datum/antagonist/bitrunning_glitch/chosen_role = forced_role || get_antagonist_role()
var/role_name = initial(chosen_role.name)
var/mob/chosen_one = SSpolling.poll_ghosts_for_target(
+ question = "A temporary antagonist role is spawning in the virtual domain.\
+ \nYou will return to your previous body on conclusion.",
check_jobban = ROLE_GLITCH,
poll_time = 20 SECONDS,
checked_target = mutation_target,
@@ -92,26 +94,32 @@
return
var/role_name = initial(chosen_role.name)
- var/mob/living/antag_mob
+
+ var/mob/living/new_mob
switch(role_name)
if(ROLE_NETGUARDIAN)
- antag_mob = new /mob/living/basic/netguardian(mutation_target.loc)
+ new_mob = new /mob/living/basic/netguardian(mutation_target.loc)
else // any other humanoid mob
- antag_mob = new /mob/living/carbon/human(mutation_target.loc)
+ new_mob = new /mob/living/carbon/human(mutation_target.loc)
mutation_target.gib(DROP_ALL_REMAINS)
- antag_mob.key = ghost.key
- var/datum/mind/ghost_mind = antag_mob.mind
- ghost_mind.add_antag_datum(chosen_role)
- ghost_mind.special_role = ROLE_GLITCH
- ghost_mind.set_assigned_role(SSjob.GetJobType(/datum/job/bitrunning_glitch))
+ var/datum/mind/ghost_mind = ghost.mind
+ new_mob.key = ghost.key
+
+ if(ghost_mind?.current)
+ new_mob.AddComponent(/datum/component/temporary_body, ghost_mind, ghost_mind.current, TRUE)
- playsound(antag_mob, 'sound/magic/ethereal_exit.ogg', 50, vary = TRUE)
- message_admins("[ADMIN_LOOKUPFLW(antag_mob)] has been made into virtual antagonist by an event.")
- antag_mob.log_message("was spawned as a virtual antagonist by an event.", LOG_GAME)
+ var/datum/mind/antag_mind = new_mob.mind
+ antag_mind.add_antag_datum(chosen_role)
+ antag_mind.special_role = ROLE_GLITCH
+ antag_mind.set_assigned_role(SSjob.GetJobType(/datum/job/bitrunning_glitch))
- add_threats(antag_mob)
+ playsound(new_mob, 'sound/magic/ethereal_exit.ogg', 50, vary = TRUE)
+ message_admins("[ADMIN_LOOKUPFLW(new_mob)] has been made into virtual antagonist by an event.")
+ new_mob.log_message("was spawned as a virtual antagonist by an event.", LOG_GAME)
+
+ 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)
@@ -151,6 +159,10 @@
if(istype(antag_datum))
antag_datum.show_in_roundend = TRUE
+ var/datum/component/temp_body = antag.GetComponent(/datum/component/temporary_body)
+ if(temp_body)
+ qdel(temp_body)
+
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
diff --git a/code/modules/bitrunning/spawners.dm b/code/modules/bitrunning/spawners.dm
index 4f8aab322ffac..5fa889ac655fd 100644
--- a/code/modules/bitrunning/spawners.dm
+++ b/code/modules/bitrunning/spawners.dm
@@ -3,13 +3,19 @@
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."
+ 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
+ if(ghost_mind?.current) // Preserves any previous bodies before making the switch
+ spawned_mob.AddComponent(/datum/component/temporary_body, ghost_mind, ghost_mind.current, TRUE)
+
+ ..()
spawned_mob.mind.add_antag_datum(/datum/antagonist/domain_ghost_actor)
diff --git a/code/modules/bitrunning/virtual_domain/domains/starfront_saloon.dm b/code/modules/bitrunning/virtual_domain/domains/starfront_saloon.dm
deleted file mode 100644
index eae9dabc49e4d..0000000000000
--- a/code/modules/bitrunning/virtual_domain/domains/starfront_saloon.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/datum/lazy_template/virtual_domain/starfront_saloon
- name = "Starfront Saloon"
- cost = BITRUNNER_COST_MEDIUM
- desc = "Looks like you stepped onto the wrong street, partner. Hope you brought your gunslinging skills."
- difficulty = BITRUNNER_DIFFICULTY_HIGH
- help_text = "One of these rooms has the cache we're looking for. Find it and get out."
- is_modular = TRUE
- key = "starfront_saloon"
- map_name = "starfront_saloon"
- mob_modules = list(
- /datum/modular_mob_segment/syndicate_team,
- /datum/modular_mob_segment/syndicate_elite,
- )
- reward_points = BITRUNNER_REWARD_HIGH
diff --git a/code/modules/cargo/packs/imports.dm b/code/modules/cargo/packs/imports.dm
index 94849d61ef527..3f7645559ff7f 100644
--- a/code/modules/cargo/packs/imports.dm
+++ b/code/modules/cargo/packs/imports.dm
@@ -43,7 +43,7 @@
/datum/supply_pack/imports/duct_spider
name = "Duct Spider Crate"
desc = "Awww! Straight from the Australicus sector to your station's ventilation system!"
- cost = CARGO_CRATE_VALUE * 6
+ cost = CARGO_CRATE_VALUE * 4
contains = list(/mob/living/basic/spider/maintenance)
crate_name = "duct spider crate"
crate_type = /obj/structure/closet/crate/critter
@@ -52,7 +52,7 @@
/datum/supply_pack/imports/duct_spider/dangerous
name = "Duct Spider Crate?"
desc = "Wait, is this the right crate? It has a frowny face, what does that mean?"
- cost = CARGO_CRATE_VALUE * 6
+ cost = CARGO_CRATE_VALUE * 4
contains = list(/mob/living/basic/spider/giant/hunter)
contraband = TRUE
diff --git a/code/modules/cargo/packs/livestock.dm b/code/modules/cargo/packs/livestock.dm
index 899216ffb5bef..62008d8be48e0 100644
--- a/code/modules/cargo/packs/livestock.dm
+++ b/code/modules/cargo/packs/livestock.dm
@@ -5,7 +5,7 @@
/datum/supply_pack/critter/parrot
name = "Bird Crate"
desc = "Contains five expert telecommunication birds."
- cost = CARGO_CRATE_VALUE * 8
+ cost = CARGO_CRATE_VALUE * 4
contains = list(/mob/living/basic/parrot)
crate_name = "parrot crate"
@@ -30,7 +30,7 @@
/datum/supply_pack/critter/cat
name = "Cat Crate"
desc = "The cat goes meow! Comes with a collar and a nice cat toy! Cheeseburger not included."//i can't believe im making this reference
- cost = CARGO_CRATE_VALUE * 10 //Cats are worth as much as corgis.
+ cost = CARGO_CRATE_VALUE * 4 //Cats are worth as much as corgis.
contains = list(
/mob/living/basic/pet/cat,
/obj/item/clothing/neck/petcollar,
@@ -51,7 +51,7 @@
/datum/supply_pack/critter/chick
name = "Chicken Crate"
desc = "The chicken goes bwaak!"
- cost = CARGO_CRATE_VALUE * 4
+ cost = CARGO_CRATE_VALUE * 2
contains = list(/mob/living/basic/chick)
crate_name = "chicken crate"
@@ -59,7 +59,7 @@
name = "Corgi Crate"
desc = "Considered the optimal dog breed by thousands of research scientists, this Corgi is but \
one dog from the millions of Ian's noble bloodline. Comes with a cute collar!"
- cost = CARGO_CRATE_VALUE * 10
+ cost = CARGO_CRATE_VALUE * 4
contains = list(/mob/living/basic/pet/dog/corgi,
/obj/item/clothing/neck/petcollar,
)
@@ -76,28 +76,28 @@
/datum/supply_pack/critter/cow
name = "Cow Crate"
desc = "The cow goes moo! Contains one cow."
- cost = CARGO_CRATE_VALUE * 6
+ cost = CARGO_CRATE_VALUE * 3
contains = list(/mob/living/basic/cow)
crate_name = "cow crate"
/datum/supply_pack/critter/sheep
name = "Sheep Crate"
desc = "The sheep goes BAAAA! Contains one sheep."
- cost = CARGO_CRATE_VALUE * 6
+ cost = CARGO_CRATE_VALUE * 3
contains = list(/mob/living/basic/sheep)
crate_name = "sheep crate"
/datum/supply_pack/critter/pig
name = "Pig Crate"
desc = "The pig goes oink! Contains one pig."
- cost = CARGO_CRATE_VALUE * 6
+ cost = CARGO_CRATE_VALUE * 3
contains = list(/mob/living/basic/pig)
crate_name = "pig crate"
/datum/supply_pack/critter/pony
name = "Pony Crate"
desc = "Ponies, yay! (Just the one.)"
- cost = CARGO_CRATE_VALUE * 6
+ cost = CARGO_CRATE_VALUE * 5
contains = list(/mob/living/basic/pony)
crate_name = "pony crate"
@@ -124,7 +124,7 @@
name = "Exotic Corgi Crate"
desc = "Corgi fit for a king, this corgi comes in a unique color to signify their superiority. \
Comes with a cute collar!"
- cost = CARGO_CRATE_VALUE * 11
+ cost = CARGO_CRATE_VALUE * 7
contains = list(/mob/living/basic/pet/dog/corgi/exoticcorgi,
/obj/item/clothing/neck/petcollar,
)
@@ -133,7 +133,7 @@
/datum/supply_pack/critter/fox
name = "Fox Crate"
desc = "The fox goes...? Contains one fox. Comes with a collar!"//what does the fox say
- cost = CARGO_CRATE_VALUE * 10
+ cost = CARGO_CRATE_VALUE * 4
contains = list(
/mob/living/basic/pet/fox,
/obj/item/clothing/neck/petcollar,
@@ -143,14 +143,14 @@
/datum/supply_pack/critter/goat
name = "Goat Crate"
desc = "The goat goes baa! Contains one goat. Warranty void if used as a replacement for Pete."
- cost = CARGO_CRATE_VALUE * 5
+ cost = CARGO_CRATE_VALUE * 3
contains = list(/mob/living/basic/goat)
crate_name = "goat crate"
/datum/supply_pack/critter/rabbit
name = "Rabbit Crate"
desc = "What noise do rabbits even make? Contains one rabbit."
- cost = CARGO_CRATE_VALUE * 4
+ cost = CARGO_CRATE_VALUE * 2
contains = list(/mob/living/basic/rabbit)
crate_name = "rabbit crate"
@@ -158,7 +158,7 @@
name = "Mothroach Crate"
desc = "Put the mothroach on your head and find out what true cuteness looks like. \
Contains one mothroach."
- cost = CARGO_CRATE_VALUE * 4
+ cost = CARGO_CRATE_VALUE * 2
contains = list(/mob/living/basic/mothroach)
crate_name = "mothroach crate"
@@ -173,7 +173,7 @@
/datum/supply_pack/critter/pug
name = "Pug Crate"
desc = "Like a normal dog, but... squished. Contains one pug. Comes with a nice collar!"
- cost = CARGO_CRATE_VALUE * 10
+ cost = CARGO_CRATE_VALUE * 4
contains = list(/mob/living/basic/pet/dog/pug,
/obj/item/clothing/neck/petcollar,
)
@@ -183,7 +183,7 @@
name = "Bull Terrier Crate"
desc = "Like a normal dog, but with a head the shape of an egg. Contains one bull terrier. \
Comes with a nice collar!"
- cost = CARGO_CRATE_VALUE * 10
+ cost = CARGO_CRATE_VALUE * 4
contains = list(/mob/living/basic/pet/dog/bullterrier,
/obj/item/clothing/neck/petcollar,
)
@@ -193,7 +193,7 @@
name = "Snake Crate"
desc = "Tired of these MOTHER FUCKING snakes on this MOTHER FUCKING space station? \
Then this isn't the crate for you. Contains three venomous snakes."
- cost = CARGO_CRATE_VALUE * 6
+ cost = CARGO_CRATE_VALUE * 3
contains = list(/mob/living/basic/snake = 3)
crate_name = "snake crate"
@@ -201,7 +201,7 @@
name = "Amphibian Friends Crate"
desc = "Two disgustingly cute slimey friends. Cytologists love them! \
Contains one frog and one axolotl. Warning: Frog may have hallucinogenic properties."
- cost = CARGO_CRATE_VALUE * 4
+ cost = CARGO_CRATE_VALUE * 2
contains = list(
/mob/living/basic/axolotl,
/mob/living/basic/frog,
@@ -211,7 +211,7 @@
/datum/supply_pack/critter/lizard
name = "Lizard Crate"
desc = "Hisss! Containssss a friendly lizard. Not to be confusssed with a lizardperssson."
- cost = CARGO_CRATE_VALUE * 4
+ cost = CARGO_CRATE_VALUE * 2
contains = list(/mob/living/basic/lizard)
crate_name = "lizard crate"
@@ -219,7 +219,7 @@
name = "Garden Gnome Crate"
desc = "Collect them all for your garden. Comes with three!"
hidden = TRUE
- cost = CARGO_CRATE_VALUE * 20
+ cost = CARGO_CRATE_VALUE * 15
contains = list(/mob/living/basic/garden_gnome)
crate_name = "garden gnome crate"
discountable = SUPPLY_PACK_RARE_DISCOUNTABLE
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 37766aea223eb..66fde8c2f1a72 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -536,7 +536,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
if(!winexists(src, "asset_cache_browser")) // The client is using a custom skin, tell them.
to_chat(src, span_warning("Unable to access asset cache browser, if you are using a custom skin file, please allow DS to download the updated version, if you are not, then make a bug report. This is not a critical issue but can cause issues with resource downloading, as it is impossible to know when extra resources arrived to you."))
- update_ambience_pref()
+ update_ambience_pref(prefs.read_preference(/datum/preference/toggle/sound_ambience))
check_ip_intel()
//This is down here because of the browse() calls in tooltip/New()
@@ -1128,8 +1128,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
winset(src, "default.Shift", "is-disabled=true")
winset(src, "default.ShiftUp", "is-disabled=true")
-/client/proc/update_ambience_pref()
- if(prefs.read_preference(/datum/preference/toggle/sound_ambience))
+/client/proc/update_ambience_pref(value)
+ if(value)
if(SSambience.ambience_listening_clients[src] > world.time)
return // If already properly set we don't want to reset the timer.
SSambience.ambience_listening_clients[src] = world.time + 10 SECONDS //Just wait 10 seconds before the next one aight mate? cheers.
diff --git a/code/modules/client/preferences/sounds.dm b/code/modules/client/preferences/sounds.dm
index 3ace1b64326cc..ae3a700ec3996 100644
--- a/code/modules/client/preferences/sounds.dm
+++ b/code/modules/client/preferences/sounds.dm
@@ -5,7 +5,7 @@
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/toggle/sound_ambience/apply_to_client(client/client, value)
- client.update_ambience_pref()
+ client.update_ambience_pref(value)
/// Controls hearing announcement sounds
/datum/preference/toggle/sound_announcements
diff --git a/code/modules/mob_spawn/mob_spawn.dm b/code/modules/mob_spawn/mob_spawn.dm
index ad8c7e6a03ef0..c9130fb706e1b 100644
--- a/code/modules/mob_spawn/mob_spawn.dm
+++ b/code/modules/mob_spawn/mob_spawn.dm
@@ -139,6 +139,10 @@
/// Typepath indicating the kind of job datum this ghost role will have. PLEASE inherit this with a new job datum, it's not hard. jobs come with policy configs.
var/spawner_job_path = /datum/job/ghost_role
+ /// Whether this offers a temporary body or not. Essentially, you'll be able to reenter your body after using this spawner.
+ var/temp_body = FALSE
+
+
/obj/effect/mob_spawn/ghost_role/Initialize(mapload)
. = ..()
SSpoints_of_interest.make_point_of_interest(src)
@@ -165,7 +169,7 @@
if(prompt_ghost)
var/prompt = "Become [prompt_name]?"
- if(user.can_reenter_corpse && user.mind)
+ if(!temp_body && user.can_reenter_corpse && user.mind)
prompt += " (Warning, You can no longer be revived!)"
var/ghost_role = tgui_alert(usr, prompt, buttons = list("Yes", "No"), timeout = 10 SECONDS)
if(ghost_role != "Yes" || !loc || QDELETED(user))
@@ -213,7 +217,8 @@
user.log_message("became a [prompt_name].", LOG_GAME)
uses -= 1 // Remove a use before trying to spawn to prevent strangeness like the spawner trying to spawn more mobs than it should be able to
- user.mind = null // dissassociate mind, don't let it follow us to the next life
+ if(!temp_body)
+ user.mind = null // dissassociate mind, don't let it follow us to the next life
var/created = create(user)
LAZYREMOVE(ckeys_trying_to_spawn, user_ckey) // We do this AFTER the create() so that we're basically sure that the user won't be in their ghost body anymore, so they can't click on the spawner again.
diff --git a/html/changelogs/AutoChangeLog-pr-84060.yml b/html/changelogs/AutoChangeLog-pr-84060.yml
deleted file mode 100644
index 1b2f4ac222b39..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84060.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Thunder12345"
-delete-after: True
-changes:
- - rscdel: "Locker staffs have been removed from the Ragin' Mages deathmatch lootcrate pool."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84066.yml b/html/changelogs/AutoChangeLog-pr-84066.yml
deleted file mode 100644
index 0ea603f5e6b4a..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84066.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "AyIong"
-delete-after: True
-changes:
- - qol: "Fullscreen mode can now be toggled by pressing F11 or the button at the top right"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84091.yml b/html/changelogs/AutoChangeLog-pr-84091.yml
deleted file mode 100644
index 58059ae4af9d8..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84091.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "FlufflesTheDog"
-delete-after: True
-changes:
- - bugfix: "sanitization on citation pda alerts"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84125.yml b/html/changelogs/AutoChangeLog-pr-84125.yml
new file mode 100644
index 0000000000000..2109a86d39ef0
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84125.yml
@@ -0,0 +1,10 @@
+author: "jlsnow301"
+delete-after: True
+changes:
+ - bugfix: "Bitrunning made more illegal: Increased the rate at which antags spawn."
+ - bugfix: "\"Temporary\" bitrunning antagonists and spawners are made actually temporary. You will return to your original body after death, just like CTF."
+ - rscadd: "Added more examine text for ghosts to bitrunning equipment."
+ - balance: "Server cooldown reduced by 1 minute at base level."
+ - rscadd: "As an observer, you can now switch views between station and virtual domain by clicking the hololadder and netpod respectively."
+ - rscdel: "Removed the starfront saloon BR map."
+ - bugfix: "Syndicate assault map: Added pistols, reduced exploits."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84132.yml b/html/changelogs/AutoChangeLog-pr-84132.yml
new file mode 100644
index 0000000000000..5f7a33c4c3210
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-84132.yml
@@ -0,0 +1,4 @@
+author: "Donglesplonge"
+delete-after: True
+changes:
+ - balance: "most livestock crates, with some exception, have been made cheaper to facilitate healthier mental states in the crew, go build a farm!"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84147.yml b/html/changelogs/AutoChangeLog-pr-84147.yml
deleted file mode 100644
index d8500ff079b4d..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84147.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "mc-oofert"
-delete-after: True
-changes:
- - bugfix: "borg factory gives you your preference borg name"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84156.yml b/html/changelogs/AutoChangeLog-pr-84156.yml
deleted file mode 100644
index 95d9e31986fb6..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84156.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "JupiterJaeden"
-delete-after: True
-changes:
- - bugfix: "Conga lines of more than 2 no longer break when going up and down stairs."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84158.yml b/html/changelogs/AutoChangeLog-pr-84158.yml
deleted file mode 100644
index 90e914ceb5428..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84158.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Mothblocks"
-delete-after: True
-changes:
- - qol: "Dramatically improves delete character UI and UX."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-84163.yml b/html/changelogs/AutoChangeLog-pr-84163.yml
deleted file mode 100644
index 6dbfc565dcbd0..0000000000000
--- a/html/changelogs/AutoChangeLog-pr-84163.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Bisar"
-delete-after: True
-changes:
- - bugfix: "Felinids no longer remember losing their tail and regaining it roundstart; you need to do it during the round to get that mood event."
\ No newline at end of file
diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml
index b77aab2bd31f1..2b62716374ae9 100644
--- a/html/changelogs/archive/2024-06.yml
+++ b/html/changelogs/archive/2024-06.yml
@@ -974,3 +974,23 @@
r3dj4ck0424:
- bugfix: puts tiles under the wawa tool storage doors
- bugfix: allows you to access a door and a fire alarm on wawa's prison second floor
+2024-06-22:
+ AyIong:
+ - qol: Fullscreen mode can now be toggled by pressing F11 or the button at the top
+ right
+ Bisar:
+ - bugfix: Felinids no longer remember losing their tail and regaining it roundstart;
+ you need to do it during the round to get that mood event.
+ FlufflesTheDog:
+ - bugfix: sanitization on citation pda alerts
+ JupiterJaeden:
+ - bugfix: Conga lines of more than 2 no longer break when going up and down stairs.
+ MelokGleb:
+ - image: added sprite for debug heretic painting
+ Mothblocks:
+ - qol: Dramatically improves delete character UI and UX.
+ Thunder12345:
+ - rscdel: Locker staffs have been removed from the Ragin' Mages deathmatch lootcrate
+ pool.
+ mc-oofert:
+ - bugfix: borg factory gives you your preference borg name
diff --git a/icons/obj/signs.dmi b/icons/obj/signs.dmi
index 78cc96fabbc13..a2069ba5d9d3b 100644
Binary files a/icons/obj/signs.dmi and b/icons/obj/signs.dmi differ
diff --git a/strings/tips.txt b/strings/tips.txt
index 8cccfe6953bb0..7d5f9f82ccc2e 100644
--- a/strings/tips.txt
+++ b/strings/tips.txt
@@ -286,3 +286,6 @@ You'll quickly lose your interest in the game if you play to win and kill. If yo
Some areas of the station use simple nautical directions to indicate their respective locations, like Fore (Front of the ship), Aft (Back), Port (Left side), Starboard (Right), Quarter and Bow (Either sides of Aft and Fore, respectively). You can review these terms on the Notepad App of your PDA.
Modular computers are compatible with integrated circuits, but most of the program-dependent circuits require them to be open/backgrounded to work. To install circuits on stationary consoles, you need to toggle interaction with the frame with right-click first.
You don't need to destroy a Spacecoin machine to make your funds stop draining. Swiping your ID on it will stop the withdrawal.
+As a Bitrunner, upgrading your quantum server will increase rewards and reduce downtime.
+As a Bitrunner, your avatar has a domain info ability which will give you clues to help complete virtual domains.
+Bitrunning is a crime.
diff --git a/tgstation.dme b/tgstation.dme
index 94efbba308232..ce40a5948a3a4 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3535,7 +3535,6 @@
#include "code\modules\bitrunning\virtual_domain\domains\psyker_shuffle.dm"
#include "code\modules\bitrunning\virtual_domain\domains\psyker_zombies.dm"
#include "code\modules\bitrunning\virtual_domain\domains\stairs_and_cliffs.dm"
-#include "code\modules\bitrunning\virtual_domain\domains\starfront_saloon.dm"
#include "code\modules\bitrunning\virtual_domain\domains\syndicate_assault.dm"
#include "code\modules\bitrunning\virtual_domain\domains\test_only.dm"
#include "code\modules\bitrunning\virtual_domain\domains\vaporwave.dm"