diff --git a/_maps/map_files/generic/centcomm.dmm b/_maps/map_files/generic/centcomm.dmm
index e3673b17e34..e14b1942e87 100644
--- a/_maps/map_files/generic/centcomm.dmm
+++ b/_maps/map_files/generic/centcomm.dmm
@@ -234,6 +234,10 @@
icon_state = "red"
},
/area/holodeck/source_emptycourt)
+"aT" = (
+/obj/structure/sign/poster/official/random,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"aU" = (
/obj/effect/decal/warning_stripes/northwest,
/turf/simulated/floor/plating/airless,
@@ -307,6 +311,12 @@
},
/turf/simulated/floor/plating/abductor,
/area/abductor_ship)
+"bi" = (
+/obj/machinery/economy/vending/autodrobe,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"bj" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
@@ -398,6 +408,13 @@
icon_state = "red"
},
/area/holodeck/source_knightarena)
+"bJ" = (
+/obj/structure/bookcase/random,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"bK" = (
/obj/structure/table/abductor,
/obj/item/storage/box/alienhandcuffs,
@@ -494,6 +511,14 @@
/obj/item/cautery/alien,
/turf/simulated/floor/plating/abductor,
/area/abductor_ship)
+"cg" = (
+/obj/structure/railing{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel/stairs/left{
+ dir = 1
+ },
+/area/ghost_bar)
"ch" = (
/turf/simulated/floor/holofloor/space,
/area/holodeck/source_space)
@@ -632,6 +657,12 @@
/obj/effect/landmark/spawner/ds,
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"cD" = (
+/obj/structure/shuttle/engine/propulsion{
+ dir = 4
+ },
+/turf/simulated/floor/plating/airless,
+/area/ghost_bar)
"cE" = (
/turf/simulated/floor/holofloor{
dir = 8;
@@ -707,6 +738,12 @@
icon_state = "red"
},
/area/holodeck/source_basketball)
+"cR" = (
+/obj/structure/chair/stool{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"cS" = (
/obj/effect/landmark/spawner/teleport_scroll,
/obj/structure/table/wood/fancy/black,
@@ -720,6 +757,12 @@
/obj/item/trash/tastybread,
/turf/simulated/floor/carpet/purple,
/area/wizard_station)
+"cX" = (
+/obj/structure/chair/comfy/black{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/green,
+/area/ghost_bar)
"cY" = (
/obj/structure/table,
/obj/machinery/kitchen_machine/microwave/upgraded,
@@ -922,6 +965,10 @@
icon_state = "green"
},
/area/holodeck/source_boxingcourt)
+"dR" = (
+/obj/structure/closet/wardrobe/mixed,
+/turf/simulated/floor/mineral/plastitanium/red,
+/area/ghost_bar)
"dS" = (
/obj/docking_port/stationary/transit{
dir = 4;
@@ -1059,9 +1106,25 @@
"eo" = (
/turf/simulated/floor/carpet/purple,
/area/wizard_station)
+"ep" = (
+/obj/structure/railing/corner,
+/obj/machinery/light/small,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
+"es" = (
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
"ev" = (
/turf/simulated/floor/beach/sand,
/area/holodeck/source_beach)
+"ew" = (
+/obj/machinery/computer/cryopod{
+ pixel_y = 32
+ },
+/turf/simulated/wall/indestructible/fakeglass,
+/area/ghost_bar)
"ex" = (
/obj/docking_port/stationary/transit{
dir = 8;
@@ -1094,6 +1157,12 @@
icon_state = "cafeteria"
},
/area/ninja/holding)
+"eA" = (
+/obj/structure/chair/stool{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"eB" = (
/turf/simulated/floor/holofloor{
dir = 10;
@@ -1298,6 +1367,11 @@
},
/turf/simulated/floor/plasteel,
/area/tdome/arena_source)
+"fq" = (
+/obj/structure/lattice,
+/obj/machinery/light/small,
+/turf/space,
+/area/space/nearstation)
"fr" = (
/obj/docking_port/stationary/transit{
dir = 4;
@@ -1371,6 +1445,36 @@
},
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/administration)
+"fF" = (
+/obj/structure/closet/secure_closet/freezer/meat/open,
+/obj/item/reagent_containers/food/snacks/raw_bacon,
+/obj/item/reagent_containers/food/snacks/raw_bacon,
+/obj/item/reagent_containers/food/snacks/raw_bacon,
+/obj/item/reagent_containers/food/snacks/raw_bacon,
+/obj/item/reagent_containers/food/snacks/sausage,
+/obj/item/reagent_containers/food/snacks/sausage,
+/obj/item/reagent_containers/food/snacks/rawcutlet,
+/obj/item/reagent_containers/food/snacks/rawcutlet,
+/obj/item/reagent_containers/food/snacks/rawcutlet,
+/obj/item/reagent_containers/food/snacks/catfishmeat,
+/obj/item/reagent_containers/food/snacks/catfishmeat,
+/obj/item/reagent_containers/food/snacks/catfishmeat,
+/obj/item/reagent_containers/food/snacks/catfishmeat,
+/obj/item/reagent_containers/food/snacks/rawcutlet,
+/obj/item/reagent_containers/food/snacks/rawcutlet,
+/obj/item/reagent_containers/food/snacks/rawcutlet,
+/obj/item/reagent_containers/food/snacks/spaghetti,
+/obj/item/reagent_containers/food/snacks/spaghetti,
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
+"fG" = (
+/obj/structure/table,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"fH" = (
/obj/docking_port/stationary/transit{
dir = 4;
@@ -1426,6 +1530,12 @@
/obj/item/melee/energy/sword/saber/red,
/turf/simulated/floor/plasteel,
/area/tdome/arena_source)
+"fP" = (
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_y = -32
+ },
+/turf/simulated/floor/plasteel/dark,
+/area/ghost_bar)
"fR" = (
/obj/structure/barricade/sandbags,
/obj/effect/turf_decal/bot,
@@ -1706,6 +1816,13 @@
/obj/structure/window/reinforced,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/syndicate_sit)
+"gS" = (
+/obj/machinery/light/small{
+ dir = 4;
+ pixel_y = 8
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"gT" = (
/obj/machinery/light/spot{
dir = 8
@@ -1882,6 +1999,13 @@
icon_state = "vault"
},
/area/tdome/tdomeadmin)
+"hp" = (
+/obj/effect/decal/warning_stripes/northeastcorner,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"hq" = (
/obj/machinery/door/airlock/external{
id_tag = "sit_away";
@@ -2095,6 +2219,11 @@
icon_state = "vault"
},
/area/tdome/tdomeadmin)
+"hU" = (
+/obj/structure/table/wood/fancy/royalblack,
+/obj/item/clothing/mask/cigarette/cigar,
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"hV" = (
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate/sit{
dir = 1
@@ -2216,6 +2345,15 @@
},
/turf/simulated/floor/plasteel/dark,
/area/syndicate_mothership)
+"io" = (
+/obj/structure/chair/office/dark,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
+"ip" = (
+/turf/simulated/floor/wood{
+ icon_state = "wood-broken3"
+ },
+/area/ghost_bar)
"iq" = (
/obj/machinery/door/poddoor/impassable{
id_tag = "sst_tele";
@@ -2238,6 +2376,14 @@
icon_state = "red"
},
/area/centcom/evac)
+"iu" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"iv" = (
/obj/structure/table,
/obj/item/reagent_containers/food/drinks/cans/tonic{
@@ -2568,6 +2714,11 @@
},
/turf/simulated/floor/plasteel/dark,
/area/syndicate_mothership)
+"jG" = (
+/obj/structure/table/reinforced,
+/obj/item/ashtray/glass,
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"jH" = (
/obj/docking_port/stationary/transit{
dir = 8;
@@ -3047,6 +3198,13 @@
},
/turf/simulated/floor/plasteel/dark,
/area/syndicate_mothership)
+"lj" = (
+/obj/machinery/light/small{
+ dir = 4;
+ pixel_y = 8
+ },
+/turf/simulated/floor/plasteel/dark,
+/area/ghost_bar)
"lm" = (
/obj/structure/chair/office/dark,
/turf/simulated/floor/plasteel/dark,
@@ -3535,6 +3693,14 @@
},
/turf/simulated/floor/plasteel,
/area/admin)
+"mz" = (
+/obj/machinery/economy/vending/boozeomat,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
+"mA" = (
+/obj/structure/sign/poster/official/fruit_bowl,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"mB" = (
/obj/structure/rack,
/obj/item/clothing/shoes/magboots/syndie{
@@ -3652,6 +3818,12 @@
/obj/structure/mopbucket,
/turf/simulated/floor/plasteel/freezer,
/area/syndicate_mothership)
+"mS" = (
+/obj/machinery/computer/arcade/orion_trail{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/arcade,
+/area/ghost_bar)
"mT" = (
/obj/machinery/door/airlock/centcom{
name = "Restroom";
@@ -3785,6 +3957,10 @@
},
/turf/simulated/floor/plasteel,
/area/admin)
+"nn" = (
+/obj/structure/sign/vacuum/external,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"no" = (
/obj/item/mop,
/obj/structure/mirror/magic/nuclear{
@@ -4111,6 +4287,12 @@
},
/turf/simulated/floor/plasteel,
/area/admin)
+"ol" = (
+/obj/structure/chair/comfy/black{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"om" = (
/obj/structure/table/wood,
/obj/item/reagent_containers/food/drinks/trophy/gold_cup,
@@ -4165,6 +4347,14 @@
/obj/structure/chair/stool,
/turf/simulated/floor/plasteel/freezer,
/area/admin)
+"oC" = (
+/obj/machinery/light/small{
+ dir = 4
+ },
+/turf/simulated/floor/plating{
+ icon_state = "asteroidplating"
+ },
+/area/ghost_bar)
"oD" = (
/obj/machinery/conveyor/east{
id = "QMLoad2"
@@ -4194,6 +4384,11 @@
icon_state = "bar"
},
/area/syndicate_mothership)
+"oH" = (
+/turf/simulated/floor/wood{
+ icon_state = "wood-broken"
+ },
+/area/ghost_bar)
"oI" = (
/obj/effect/spawner/lootdrop/trade_sol/civ,
/obj/structure/closet,
@@ -4332,6 +4527,12 @@
},
/turf/simulated/floor/mineral/titanium/blue,
/area/shuttle/trade/sol)
+"pl" = (
+/obj/structure/chair/stool/bar{
+ dir = 8
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"pm" = (
/obj/structure/table/wood/fancy/royalblack,
/obj/item/gavelblock{
@@ -4364,6 +4565,9 @@
},
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/administration)
+"ps" = (
+/turf/simulated/mineral/ancient/outer,
+/area/space/nearstation)
"pt" = (
/obj/machinery/door/airlock/hatch{
name = "Armory"
@@ -4557,6 +4761,16 @@
},
/turf/simulated/floor/transparent/glass,
/area/centcom/specops)
+"qe" = (
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_y = -32
+ },
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
+"qf" = (
+/obj/structure/sign/poster/official/space_cops,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"qg" = (
/obj/item/kirbyplants,
/obj/item/storage/secure/safe{
@@ -4581,6 +4795,11 @@
icon_state = "cmo"
},
/area/shuttle/escape)
+"qm" = (
+/obj/structure/table/wood/fancy/royalblack,
+/obj/item/storage/box/matches,
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"qn" = (
/turf/simulated/wall/mineral/titanium/nodiagonal,
/area/shuttle/trade/sol)
@@ -4672,6 +4891,9 @@
/obj/machinery/recharge_station/upgraded,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/syndicate)
+"qH" = (
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"qI" = (
/obj/structure/closet/syndicate/nuclear,
/turf/simulated/floor/mineral/plastitanium/red,
@@ -4717,6 +4939,11 @@
},
/turf/simulated/floor/plasteel,
/area/admin)
+"qN" = (
+/obj/structure/table/wood,
+/obj/item/deck/unum,
+/turf/simulated/floor/carpet/green,
+/area/ghost_bar)
"qO" = (
/obj/structure/chair/stool/bar,
/obj/effect/landmark/spawner/syndie,
@@ -4731,6 +4958,9 @@
},
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/assault_pod)
+"qR" = (
+/turf/simulated/wall/indestructible,
+/area/ghost_bar)
"qS" = (
/obj/item/kirbyplants,
/turf/simulated/floor/plasteel/dark,
@@ -4807,6 +5037,16 @@
icon_state = "bar"
},
/area/syndicate_mothership)
+"rd" = (
+/obj/structure/chair/stool/bar{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
+"rf" = (
+/obj/structure/coatrack,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"rh" = (
/obj/machinery/economy/vending/liberationstation,
/turf/simulated/floor/plasteel,
@@ -4841,6 +5081,12 @@
},
/turf/simulated/floor/plasteel,
/area/admin)
+"rk" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel/stairs/left,
+/area/ghost_bar)
"rl" = (
/obj/structure/railing,
/obj/item/kirbyplants,
@@ -4993,6 +5239,11 @@
icon_state = "green"
},
/area/centcom/evac)
+"rG" = (
+/obj/structure/table/wood/fancy/royalblack,
+/obj/item/ashtray/plastic,
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"rH" = (
/obj/structure/table,
/obj/item/assembly/signaler,
@@ -5074,12 +5325,20 @@
/obj/machinery/atmospherics/unary/tank/air,
/turf/simulated/wall/mineral/plastitanium,
/area/shuttle/syndicate)
+"rS" = (
+/obj/effect/mapping_helpers/airlock/autoname,
+/obj/machinery/door/airlock/external_no_weld,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"rT" = (
/obj/structure/table/wood/poker,
/obj/item/clothing/mask/cigarette/cigar/havana,
/obj/item/reagent_containers/food/drinks/bottle/cognac,
/turf/simulated/floor/transparent/glass,
/area/tdome/tdomeobserve)
+"rU" = (
+/turf/simulated/floor/plasteel/dark,
+/area/ghost_bar)
"rV" = (
/obj/machinery/door/airlock/external{
id_tag = "s_docking_airlock";
@@ -5110,6 +5369,10 @@
/obj/effect/landmark/spawner/syndie,
/turf/simulated/floor/wood,
/area/syndicate_mothership)
+"sd" = (
+/obj/structure/sign/barsign,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"se" = (
/obj/structure/chair/comfy/shuttle{
dir = 4
@@ -5210,6 +5473,14 @@
icon_state = "vault"
},
/area/centcom/specops)
+"sx" = (
+/obj/structure/chair/stool/bar{
+ dir = 8
+ },
+/turf/simulated/floor/plating{
+ icon_state = "asteroidplating"
+ },
+/area/ghost_bar)
"sy" = (
/obj/item/flag/syndi,
/turf/simulated/floor/wood,
@@ -5249,6 +5520,14 @@
icon_state = "bar"
},
/area/syndicate_mothership)
+"sF" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/food/drinks/shaker,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"sG" = (
/obj/effect/spawner/window/plastitanium,
/turf/simulated/floor/plating,
@@ -5264,6 +5543,10 @@
/obj/effect/decal/warning_stripes/red/hollow,
/turf/simulated/floor/plasteel/dark,
/area/syndicate_mothership)
+"sO" = (
+/obj/structure/sign/goldenplaque,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"sQ" = (
/obj/machinery/computer/mech_bay_power_console,
/turf/simulated/floor/plasteel/dark,
@@ -5286,6 +5569,12 @@
icon_state = "bar"
},
/area/tdome/tdomeobserve)
+"sU" = (
+/obj/structure/reagent_dispensers/watertank/high,
+/turf/simulated/floor/plating{
+ icon_state = "asteroidplating"
+ },
+/area/ghost_bar)
"sV" = (
/obj/structure/table/wood,
/obj/item/paper_bin,
@@ -5372,6 +5661,12 @@
/obj/machinery/floodlight,
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"tr" = (
+/turf/simulated/floor/wood{
+ broken = 1;
+ icon_state = "wood-broken"
+ },
+/area/ghost_bar)
"ts" = (
/obj/machinery/atmospherics/portable/canister/oxygen,
/turf/simulated/floor/mineral/plastitanium/red,
@@ -5431,6 +5726,11 @@
/obj/machinery/economy/vending/cola/free,
/turf/simulated/floor/wood,
/area/trader_station/sol)
+"tC" = (
+/turf/simulated/floor/plating{
+ icon_state = "asteroidplating"
+ },
+/area/ghost_bar)
"tD" = (
/obj/machinery/economy/vending/snack/free,
/turf/simulated/floor/wood,
@@ -5477,6 +5777,10 @@
icon_state = "darkred"
},
/area/centcom/specops)
+"tL" = (
+/obj/structure/lattice,
+/turf/space,
+/area/space/nearstation)
"tM" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
@@ -5863,6 +6167,9 @@
},
/turf/simulated/floor/mineral/titanium/blue,
/area/shuttle/trade/sol)
+"vd" = (
+/turf/simulated/floor/carpet/green,
+/area/ghost_bar)
"vf" = (
/obj/effect/landmark/spawner/soltrader,
/obj/structure/chair/comfy/brown,
@@ -6185,6 +6492,12 @@
/obj/structure/flora/ausbushes/brflowers,
/turf/simulated/floor/grass,
/area/trader_station/sol)
+"wh" = (
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"wi" = (
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/pointybush,
@@ -6306,6 +6619,19 @@
},
/turf/simulated/floor/plasteel,
/area/admin)
+"wF" = (
+/obj/structure/table/wood,
+/obj/item/pen/multi,
+/obj/item/pen/multi,
+/obj/item/pen/multi,
+/obj/item/pen/multi,
+/obj/item/pen/multi,
+/obj/item/pen/multi,
+/obj/item/pen/multi,
+/obj/item/pen/multi,
+/obj/item/pen/multi,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"wG" = (
/obj/structure/table/wood/poker,
/obj/item/deck/cards,
@@ -6324,9 +6650,46 @@
},
/turf/simulated/floor/plasteel,
/area/admin)
+"wI" = (
+/obj/structure/toilet{
+ dir = 8
+ },
+/obj/structure/window/reinforced/tinted,
+/obj/machinery/door/window{
+ dir = 8;
+ name = "Toilet";
+ opacity = 1
+ },
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
"wK" = (
/turf/simulated/wall/mineral/titanium,
/area/shuttle/supply)
+"wM" = (
+/obj/structure/closet/wardrobe/xenos,
+/turf/simulated/floor/mineral/plastitanium/red,
+/area/ghost_bar)
+"wN" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/food/condiment/saltshaker{
+ pixel_x = -8;
+ pixel_y = 5
+ },
+/obj/item/reagent_containers/food/condiment/peppermill{
+ pixel_x = -8
+ },
+/obj/item/kitchen/knife,
+/obj/item/reagent_containers/food/condiment/enzyme{
+ pixel_y = 5
+ },
+/obj/machinery/reagentgrinder{
+ desc = "Used to grind things up into raw materials and liquids.";
+ pixel_y = 5
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
"wR" = (
/obj/structure/rack,
/obj/item/gun/energy/kinetic_accelerator/crossbow,
@@ -6497,12 +6860,21 @@
/obj/machinery/recharge_station/upgraded,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/specops)
+"xt" = (
+/obj/structure/bookcase/random,
+/turf/simulated/floor/carpet/green,
+/area/ghost_bar)
"xv" = (
/obj/machinery/atmospherics/pipe/manifold/hidden,
/turf/simulated/floor/plasteel{
icon_state = "white"
},
/area/centcom/control)
+"xy" = (
+/obj/structure/bookcase/random,
+/obj/machinery/light/small,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"xz" = (
/obj/structure/flora/grass/jungle,
/obj/structure/flora/rock/pile/largejungle,
@@ -6519,6 +6891,12 @@
},
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/syndicate)
+"xD" = (
+/obj/machinery/economy/vending/tool/free,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"xF" = (
/obj/machinery/access_button{
autolink_id = "syndishuttle_btn_int";
@@ -6589,6 +6967,25 @@
icon_state = "whiteblue"
},
/area/centcom/control)
+"xU" = (
+/obj/structure/table/reinforced,
+/obj/machinery/kitchen_machine/microwave/upgraded,
+/obj/machinery/light/small,
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
+"xV" = (
+/obj/structure/railing,
+/turf/simulated/floor/plasteel/dark,
+/area/ghost_bar)
+"xY" = (
+/obj/machinery/economy/vending/cigarette,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"xZ" = (
/obj/machinery/computer/security/mining{
dir = 4
@@ -6598,12 +6995,36 @@
icon_state = "darkyellow"
},
/area/centcom/suppy)
+"ya" = (
+/obj/effect/mob_spawn/human/corpse/clown/corpse,
+/turf/simulated/floor/plating/asteroid/ancient/airless,
+/area/space/nearstation)
+"yc" = (
+/obj/structure/table/reinforced,
+/obj/item/lighter/zippo/contractor,
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
+"ye" = (
+/obj/structure/signpost,
+/turf/simulated/floor/plating/airless{
+ icon_state = "asteroidplating"
+ },
+/area/space/nearstation)
"yg" = (
/mob/living/silicon/decoy{
name = "A.L.I.C.E."
},
/turf/simulated/floor/wood,
/area/centcom/control)
+"yk" = (
+/obj/machinery/economy/vending/shoedispenser,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"yp" = (
/obj/item/radio/intercom/syndicate{
pixel_x = 28
@@ -6621,6 +7042,13 @@
/obj/effect/turf_decal/bot,
/turf/simulated/floor/wood,
/area/tdome/tdomeobserve)
+"yv" = (
+/obj/structure/dresser,
+/obj/machinery/light/small,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"yw" = (
/obj/machinery/atmospherics/unary/vent_pump/high_volume{
autolink_id = "syndishuttle_vent"
@@ -6637,10 +7065,36 @@
icon_state = "green"
},
/area/centcom/evac)
+"yI" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 11
+ },
+/obj/structure/mirror{
+ pixel_x = 32
+ },
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
+"yK" = (
+/turf/simulated/floor/plating/airless{
+ icon_state = "asteroidplating"
+ },
+/area/space/nearstation)
"yL" = (
/obj/machinery/computer/card,
/turf/simulated/floor/plasteel,
/area/admin)
+"yM" = (
+/obj/structure/table/wood,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
+"yO" = (
+/obj/structure/bookcase/random,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"yQ" = (
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/grassybush,
@@ -6664,6 +7118,9 @@
/obj/effect/landmark/spawner/ert,
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"zh" = (
+/turf/simulated/floor/plating,
+/area/ghost_bar)
"zi" = (
/obj/structure/table/holotable,
/obj/item/clothing/gloves/boxing/hologlove{
@@ -6675,6 +7132,45 @@
icon_state = "green"
},
/area/holodeck/source_boxingcourt)
+"zj" = (
+/obj/structure/closet/secure_closet/freezer/fridge/open,
+/obj/item/reagent_containers/food/snacks/grown/potato,
+/obj/item/reagent_containers/food/snacks/grown/potato,
+/obj/item/reagent_containers/food/snacks/grown/whitebeet,
+/obj/item/reagent_containers/food/snacks/grown/whitebeet,
+/obj/item/reagent_containers/food/snacks/grown/tomato,
+/obj/item/reagent_containers/food/snacks/grown/tomato,
+/obj/item/reagent_containers/food/snacks/grown/rice,
+/obj/item/reagent_containers/food/snacks/grown/rice,
+/obj/item/reagent_containers/food/snacks/grown/icepepper,
+/obj/item/reagent_containers/food/snacks/grown/icepepper,
+/obj/item/reagent_containers/food/snacks/grown/citrus/lemon,
+/obj/item/reagent_containers/food/snacks/grown/citrus/lime,
+/obj/item/reagent_containers/food/snacks/grown/citrus/orange,
+/obj/item/reagent_containers/food/snacks/grown/cherries,
+/obj/item/reagent_containers/food/snacks/grown/apple,
+/obj/item/reagent_containers/food/snacks/grown/ambrosia/deus,
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
+"zk" = (
+/obj/structure/railing,
+/turf/simulated/floor/plasteel/stairs/left{
+ dir = 8
+ },
+/area/ghost_bar)
+"zl" = (
+/obj/structure/table/reinforced,
+/obj/machinery/chem_dispenser/beer{
+ dir = 8
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
+"zn" = (
+/obj/structure/sign/bobross,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"zo" = (
/obj/machinery/computer/card/centcom,
/turf/simulated/floor/plasteel,
@@ -6696,6 +7192,16 @@
/obj/item/flag/wiz,
/turf/simulated/floor/wood,
/area/wizard_station)
+"zw" = (
+/obj/structure/sink{
+ dir = 4;
+ pixel_x = 11
+ },
+/obj/structure/mirror{
+ pixel_x = 32
+ },
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
"zy" = (
/obj/machinery/door/airlock/public/glass{
name = "Computer Hub"
@@ -6709,6 +7215,12 @@
},
/turf/simulated/floor/plasteel,
/area/admin)
+"zz" = (
+/obj/machinery/economy/merch{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"zB" = (
/obj/machinery/kitchen_machine/oven/upgraded,
/turf/simulated/floor/plasteel{
@@ -6732,6 +7244,10 @@
/obj/effect/landmark/spawner/aroomwarp,
/turf/simulated/floor/plasteel,
/area/admin)
+"zL" = (
+/obj/machinery/economy/arcade/claw,
+/turf/simulated/floor/carpet/arcade,
+/area/ghost_bar)
"zM" = (
/obj/machinery/door/airlock/hatch{
desc = "For all your shady business needs";
@@ -6743,6 +7259,10 @@
/obj/machinery/computer/cryopod/robot,
/turf/simulated/wall/indestructible/riveted,
/area/centcom/specops)
+"zQ" = (
+/obj/machinery/light/small,
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
"zV" = (
/obj/structure/extinguisher_cabinet{
pixel_x = 24
@@ -6761,6 +7281,14 @@
},
/turf/simulated/floor/wood,
/area/syndicate_mothership)
+"zY" = (
+/obj/machinery/smartfridge/foodcart{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
"Aa" = (
/obj/machinery/iv_drip,
/turf/simulated/floor/plasteel/dark,
@@ -6780,6 +7308,16 @@
/obj/item/pen,
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"Ag" = (
+/obj/structure/chair/stool{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/arcade,
+/area/ghost_bar)
+"Ah" = (
+/obj/structure/table/wood,
+/turf/simulated/floor/carpet/green,
+/area/ghost_bar)
"Ai" = (
/obj/item/kirbyplants,
/obj/machinery/computer/cryopod{
@@ -6805,6 +7343,10 @@
},
/turf/simulated/floor/wood,
/area/wizard_station)
+"Al" = (
+/obj/structure/chair/stool,
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"Am" = (
/obj/machinery/door/window/classic/normal{
name = "cell door";
@@ -6891,6 +7433,12 @@
/obj/structure/chair/comfy/black,
/turf/simulated/floor/plasteel,
/area/admin)
+"AB" = (
+/obj/machinery/computer/arcade/battle{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/arcade,
+/area/ghost_bar)
"AE" = (
/obj/item/paper/monitorkey,
/obj/machinery/computer/message_monitor{
@@ -6977,6 +7525,11 @@
/obj/machinery/status_display,
/turf/simulated/wall/indestructible/riveted,
/area/centcom/gamma)
+"AZ" = (
+/obj/structure/table/wood,
+/obj/item/ashtray/bronze,
+/turf/simulated/floor/carpet/green,
+/area/ghost_bar)
"Ba" = (
/obj/structure/rack,
/obj/item/clothing/suit/wizrobe/marisa,
@@ -6990,6 +7543,12 @@
/obj/item/bikehorn/airhorn,
/turf/simulated/floor/plasteel/goonplaque/nosey,
/area/wizard_station)
+"Bc" = (
+/obj/structure/chair/office/dark{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Bd" = (
/obj/machinery/light/spot{
dir = 1
@@ -7028,6 +7587,14 @@
/obj/structure/table/wood,
/turf/simulated/floor/plasteel/dark,
/area/admin)
+"Bh" = (
+/obj/structure/table/wood,
+/turf/simulated/floor/plating/asteroid/ancient,
+/area/ghost_bar)
+"Bj" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"Bk" = (
/obj/machinery/door/window{
base_state = "right";
@@ -7156,6 +7723,10 @@
},
/turf/simulated/floor/plating/asteroid/snow/airless,
/area/syndicate_mothership)
+"BH" = (
+/obj/structure/musician/piano,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"BL" = (
/obj/machinery/light/spot{
dir = 8
@@ -7282,6 +7853,11 @@
},
/turf/simulated/floor/plasteel,
/area/centcom/evac)
+"Ck" = (
+/obj/machinery/door/airlock/multi_tile/glass,
+/obj/effect/mapping_helpers/airlock/autoname,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Cl" = (
/obj/effect/decal/warning_stripes/south,
/turf/simulated/floor/plating/airless,
@@ -7293,6 +7869,12 @@
icon_state = "red"
},
/area/holodeck/source_thunderdomecourt)
+"Cn" = (
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_x = 32
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Cp" = (
/obj/structure/sink{
dir = 4;
@@ -7362,6 +7944,10 @@
},
/turf/simulated/floor/engine,
/area/admin)
+"CA" = (
+/obj/machinery/light/small,
+/turf/simulated/floor/carpet/arcade,
+/area/ghost_bar)
"CB" = (
/obj/machinery/door_control/no_emag{
id = "thunderdome";
@@ -7430,6 +8016,12 @@
},
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"CI" = (
+/obj/structure/urinal{
+ pixel_y = 28
+ },
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
"CJ" = (
/obj/machinery/door_control/no_emag{
id = "CCcustoms2";
@@ -7496,6 +8088,9 @@
/obj/structure/window/reinforced,
/turf/simulated/floor/plasteel/dark,
/area/admin)
+"Da" = (
+/turf/simulated/floor/mineral/plastitanium/red,
+/area/ghost_bar)
"Db" = (
/obj/structure/marker_beacon/dock_marker,
/turf/space,
@@ -7522,6 +8117,19 @@
icon_state = "vault"
},
/area/tdome/tdomeadmin)
+"Dk" = (
+/obj/machinery/kitchen_machine/oven/upgraded,
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
+"Dm" = (
+/obj/structure/chair/office/dark{
+ dir = 1
+ },
+/obj/machinery/light/small,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Dn" = (
/obj/structure/table/wood,
/obj/machinery/door_control/no_emag{
@@ -7570,6 +8178,11 @@
/obj/item/clothing/head/helmet/space/space_ninja,
/turf/simulated/floor/engine,
/area/admin)
+"Dw" = (
+/obj/structure/table,
+/obj/machinery/computer/security/telescreen,
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"Dx" = (
/obj/structure/plasticflaps/mining,
/obj/machinery/conveyor/west{
@@ -7643,6 +8256,12 @@
icon_state = "darkyellow"
},
/area/centcom/suppy)
+"DG" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel/dark,
+/area/ghost_bar)
"DH" = (
/turf/simulated/wall/indestructible/syndicate,
/area/adminconstruction)
@@ -7719,6 +8338,21 @@
icon_state = "vault"
},
/area/centcom/specops)
+"DT" = (
+/obj/structure/window/reinforced/tinted,
+/obj/structure/window/reinforced/tinted{
+ dir = 1
+ },
+/obj/structure/toilet{
+ dir = 8
+ },
+/obj/machinery/door/window{
+ dir = 8;
+ name = "Toilet";
+ opacity = 1
+ },
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
"DV" = (
/obj/machinery/door/airlock/centcom{
name = "Administrative Office";
@@ -7915,6 +8549,10 @@
icon_state = "darkblue"
},
/area/shuttle/escape)
+"ED" = (
+/obj/machinery/prize_counter,
+/turf/simulated/floor/carpet/arcade,
+/area/ghost_bar)
"EE" = (
/obj/structure/table/reinforced,
/obj/item/storage/fancy/donut_box,
@@ -7936,6 +8574,16 @@
},
/turf/simulated/floor/plasteel/dark,
/area/admin)
+"EI" = (
+/obj/machinery/computer/camera_advanced{
+ dir = 4
+ },
+/turf/simulated/floor/mineral/plastitanium/red,
+/area/ghost_bar)
+"EJ" = (
+/obj/machinery/economy/slot_machine,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"EL" = (
/obj/machinery/door/airlock/hatch{
desc = "Uh oh. You'd better hope you aren't going in here!";
@@ -7947,6 +8595,18 @@
/obj/machinery/economy/vending/cola,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/administration)
+"EP" = (
+/obj/structure/chair/sofa/corp/corner{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
+"EQ" = (
+/obj/effect/decal/warning_stripes/white/partial,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"ET" = (
/obj/effect/decal/warning_stripes/northeast,
/turf/simulated/floor/plating/airless,
@@ -7964,6 +8624,11 @@
/obj/structure/chair/comfy/black,
/turf/simulated/floor/carpet,
/area/centcom/control)
+"EX" = (
+/turf/simulated/floor/wood{
+ icon_state = "wood-broken7"
+ },
+/area/ghost_bar)
"EZ" = (
/obj/machinery/computer/bsa_control/admin,
/turf/simulated/floor/carpet,
@@ -7974,6 +8639,15 @@
/obj/structure/flora/ausbushes/palebush,
/turf/simulated/floor/grass,
/area/centcom/control)
+"Fb" = (
+/obj/structure/table/reinforced,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
"Fc" = (
/obj/machinery/light/spot,
/turf/simulated/floor/mineral/titanium/blue,
@@ -8008,6 +8682,12 @@
icon_state = "whiteblue"
},
/area/centcom/control)
+"Fm" = (
+/obj/structure/chair/sofa/corp{
+ dir = 4
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Fn" = (
/obj/structure/table/reinforced,
/obj/machinery/recharger,
@@ -8036,6 +8716,12 @@
},
/turf/simulated/floor/plasteel/dark,
/area/shuttle/escape)
+"Fr" = (
+/obj/machinery/economy/vending/clothing,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"Fs" = (
/obj/machinery/door/airlock/centcom{
name = "Thunderdome Back Room"
@@ -8215,6 +8901,15 @@
/obj/effect/decal/warning_stripes/west,
/turf/simulated/floor/plating/airless,
/area/centcom/control)
+"Ga" = (
+/obj/structure/chair/stool{
+ dir = 8
+ },
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_y = 32
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Gc" = (
/obj/machinery/bsa/full/admin{
pixel_y = -22
@@ -8298,6 +8993,12 @@
/obj/item/gun/energy/bsg/prebuilt/admin,
/turf/simulated/floor/carpet/black,
/area/centcom/specops)
+"Gp" = (
+/obj/structure/chair/stool{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"Gq" = (
/obj/machinery/computer/arcade,
/turf/simulated/floor/plasteel{
@@ -8524,6 +9225,12 @@
/obj/structure/flora/tree/jungle,
/turf/simulated/floor/grass/jungle,
/area/centcom/evac)
+"Hc" = (
+/obj/machinery/economy/vending/suitdispenser,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"Hd" = (
/obj/machinery/conveyor/east{
id = "QMLoad2"
@@ -8629,6 +9336,10 @@
},
/turf/simulated/floor/plasteel/dark,
/area/admin)
+"Hz" = (
+/obj/structure/railing,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"HB" = (
/obj/structure/closet/secure_closet/guncabinet,
/obj/machinery/status_display{
@@ -8650,6 +9361,24 @@
/obj/machinery/chem_master,
/turf/simulated/floor/mineral/titanium,
/area/shuttle/administration)
+"HD" = (
+/obj/machinery/economy/vending/hatdispenser,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
+"HE" = (
+/obj/machinery/shower{
+ dir = 4;
+ pixel_y = -2
+ },
+/obj/structure/curtain/open/shower,
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
+"HH" = (
+/obj/effect/decal/warning_stripes/north,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"HI" = (
/obj/structure/closet/secure_closet/guncabinet,
/obj/item/ammo_box/magazine/smgm9mm,
@@ -8747,6 +9476,12 @@
/obj/machinery/economy/vending/cigarette,
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/administration)
+"HZ" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Port Asteroid Maintenance"
+ },
+/turf/simulated/floor/plasteel/dark,
+/area/ghost_bar)
"Ia" = (
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/reedbush,
@@ -8808,6 +9543,15 @@
/obj/structure/sink/puddle,
/turf/simulated/floor/grass/jungle,
/area/centcom/evac)
+"Im" = (
+/turf/simulated/wall/indestructible/syndicate,
+/area/ghost_bar)
+"In" = (
+/obj/machinery/light/small,
+/turf/simulated/floor/plating{
+ icon_state = "asteroidplating"
+ },
+/area/ghost_bar)
"Io" = (
/obj/machinery/door/airlock/command/glass{
name = "Escape Shuttle Cockpit"
@@ -8867,6 +9611,10 @@
/obj/structure/railing,
/turf/simulated/floor/grass,
/area/centcom/evac)
+"IB" = (
+/obj/structure/sign/poster/contraband/syndicate_pistol,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"IC" = (
/obj/machinery/door/airlock/centcom{
name = "Thunderdome Access"
@@ -9017,6 +9765,12 @@
/obj/structure/fans/tiny,
/turf/simulated/floor/plating,
/area/shuttle/specops)
+"Jd" = (
+/obj/structure/shuttle/engine/heater{
+ dir = 4
+ },
+/turf/simulated/wall/indestructible/syndicate,
+/area/ghost_bar)
"Je" = (
/obj/structure/closet/fireaxecabinet{
pixel_x = 32
@@ -9087,6 +9841,12 @@
icon_state = "cafeteria"
},
/area/tdome/tdomeobserve)
+"Jm" = (
+/obj/structure/chair/sofa/corp/corner{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Jn" = (
/turf/simulated/wall/indestructible/riveted,
/area/centcom/suppy)
@@ -9124,6 +9884,9 @@
/obj/structure/flora/ausbushes/brflowers,
/turf/simulated/floor/grass,
/area/centcom/specops)
+"Jy" = (
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Jz" = (
/obj/structure/chair/comfy/shuttle,
/turf/simulated/floor/plasteel{
@@ -9209,6 +9972,11 @@
icon_state = "darkred"
},
/area/centcom/gamma)
+"JI" = (
+/obj/effect/mapping_helpers/airlock/autoname,
+/obj/machinery/door/airlock/centcom,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"JJ" = (
/obj/machinery/door/airlock/centcom{
name = "Thunderdome"
@@ -9256,6 +10024,12 @@
icon_state = "cmo"
},
/area/shuttle/escape)
+"JP" = (
+/obj/structure/table/wood,
+/turf/simulated/floor/plating{
+ icon_state = "asteroidplating"
+ },
+/area/ghost_bar)
"JQ" = (
/obj/item/lighter{
pixel_x = 3;
@@ -9298,10 +10072,22 @@
},
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"JX" = (
+/obj/structure/chair/comfy/black{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/green,
+/area/ghost_bar)
"JY" = (
/obj/effect/spawner/window,
/turf/simulated/floor/plating,
/area/centcom/suppy)
+"Ka" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/floor/mineral/plastitanium/red,
+/area/ghost_bar)
"Kb" = (
/obj/effect/turf_decal/delivery,
/obj/machinery/door/poddoor/multi_tile/impassable/three_tile_hor{
@@ -9362,6 +10148,21 @@
icon_state = "darkred"
},
/area/centcom/specops)
+"Ko" = (
+/obj/structure/closet/wardrobe/black,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
+"Kp" = (
+/obj/machinery/washing_machine,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"Kq" = (
/obj/item/radio{
pixel_x = 5;
@@ -9540,6 +10341,20 @@
icon_state = "green"
},
/area/centcom/evac)
+"KU" = (
+/obj/structure/table/wood,
+/obj/item/folder/blue,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
+"KW" = (
+/obj/structure/mopbucket,
+/obj/item/soap/syndie,
+/obj/item/mop,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
"KX" = (
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/syndicate)
@@ -9594,6 +10409,13 @@
icon_state = "cafeteria"
},
/area/tdome/tdomeobserve)
+"Li" = (
+/obj/structure/bookcase/random,
+/obj/machinery/light/small{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/green,
+/area/ghost_bar)
"Lj" = (
/obj/machinery/door/poddoor/impassable{
id_tag = "SPECOPS";
@@ -9635,6 +10457,10 @@
},
/turf/simulated/floor/plasteel/dark,
/area/syndicate_mothership)
+"Lq" = (
+/obj/machinery/recharge_station,
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
"Ls" = (
/obj/machinery/door_control/no_emag{
id = "ASSAULT";
@@ -9686,6 +10512,11 @@
icon_state = "green"
},
/area/holodeck/source_thunderdomecourt)
+"LA" = (
+/turf/simulated/floor/plasteel/stairs/right{
+ dir = 8
+ },
+/area/ghost_bar)
"LC" = (
/obj/structure/chair/comfy/green{
dir = 1
@@ -9696,6 +10527,24 @@
icon_state = "vault"
},
/area/tdome/tdomeadmin)
+"LF" = (
+/obj/structure/table,
+/obj/structure/bedsheetbin{
+ pixel_x = -1;
+ pixel_y = 2
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
+"LG" = (
+/obj/structure/sink{
+ pixel_y = 24
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
"LH" = (
/obj/machinery/economy/vending/cigarette/free,
/turf/simulated/floor/plasteel{
@@ -9725,6 +10574,12 @@
icon_state = "red"
},
/area/holodeck/source_knightarena)
+"LM" = (
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"LN" = (
/turf/simulated/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
@@ -9789,6 +10644,13 @@
icon_state = "neutralcorner"
},
/area/shuttle/escape)
+"Ma" = (
+/obj/machinery/economy/slot_machine,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Mb" = (
/turf/simulated/floor/plasteel{
icon_state = "neutral"
@@ -9807,6 +10669,9 @@
/obj/structure/fans/tiny,
/turf/simulated/floor/plasteel,
/area/shuttle/escape)
+"Me" = (
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"Mf" = (
/obj/item/ashtray/glass,
/obj/structure/table,
@@ -9848,6 +10713,12 @@
icon_state = "vault"
},
/area/tdome/tdomeadmin)
+"Ml" = (
+/obj/structure/chair/comfy/black{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/green,
+/area/ghost_bar)
"Mm" = (
/obj/structure/table,
/obj/item/storage/box/chemimp{
@@ -9902,6 +10773,14 @@
icon_state = "cafeteria"
},
/area/tdome/tdomeobserve)
+"Mt" = (
+/obj/structure/ghost_bar_cryopod,
+/turf/simulated/floor/mineral/plastitanium/red,
+/area/ghost_bar)
+"Mu" = (
+/obj/item/coin/antagtoken,
+/turf/simulated/floor/plating/asteroid/ancient/airless,
+/area/space/nearstation)
"Mv" = (
/obj/machinery/recharge_station/upgraded,
/turf/simulated/floor/plasteel{
@@ -9909,6 +10788,11 @@
icon_state = "vault"
},
/area/centcom/specops)
+"Mx" = (
+/obj/item/flashlight/lamp,
+/obj/structure/table/wood,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"My" = (
/obj/structure/table/reinforced,
/obj/item/rcd_ammo/large,
@@ -10007,6 +10891,12 @@
},
/turf/simulated/floor/plasteel,
/area/tdome/arena)
+"MM" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor/plating/asteroid/ancient,
+/area/ghost_bar)
"MN" = (
/obj/machinery/cryopod/robot/offstation,
/turf/simulated/floor/plasteel{
@@ -10140,6 +11030,14 @@
},
/turf/simulated/floor/carpet/black,
/area/centcom/evac)
+"MZ" = (
+/obj/structure/closet/wardrobe/grey,
+/turf/simulated/floor/mineral/plastitanium/red,
+/area/ghost_bar)
+"Na" = (
+/obj/machinery/door/airlock/external_no_weld,
+/turf/simulated/floor/mineral/plastitanium/red,
+/area/ghost_bar)
"Nb" = (
/obj/structure/table/reinforced,
/obj/item/stack/sheet/glass/fifty,
@@ -10181,6 +11079,13 @@
"Ng" = (
/turf/simulated/floor/wood,
/area/centcom/evac)
+"Nh" = (
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_y = -32
+ },
+/obj/machinery/light/small,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Nj" = (
/obj/structure/curtain/black,
/turf/simulated/floor/wood,
@@ -10193,6 +11098,10 @@
/obj/machinery/status_display,
/turf/simulated/wall/indestructible/riveted,
/area/centcom/evac)
+"Nm" = (
+/obj/structure/railing/corner,
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"Nn" = (
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/ywflowers,
@@ -10204,6 +11113,10 @@
/obj/structure/barricade/sandbags,
/turf/simulated/floor/plasteel,
/area/tdome/arena)
+"Np" = (
+/obj/structure/chair/sofa/corp/left,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Nq" = (
/obj/structure/chair{
dir = 1
@@ -10212,6 +11125,9 @@
icon_state = "darkblue"
},
/area/centcom/control)
+"Nr" = (
+/turf/simulated/wall/indestructible/fakeglass,
+/area/ghost_bar)
"Ns" = (
/obj/structure/railing{
dir = 4
@@ -10285,6 +11201,11 @@
icon_state = "redcorner"
},
/area/shuttle/escape)
+"NH" = (
+/turf/simulated/floor/plasteel/stairs/left{
+ dir = 8
+ },
+/area/ghost_bar)
"NI" = (
/turf/simulated/floor/plasteel{
dir = 1;
@@ -10369,6 +11290,9 @@
},
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"NX" = (
+/turf/simulated/floor/plating/asteroid/ancient,
+/area/ghost_bar)
"NZ" = (
/obj/machinery/computer/security/telescreen/entertainment,
/turf/simulated/wall/indestructible/riveted,
@@ -10407,6 +11331,33 @@
/obj/structure/flora/ausbushes/fernybush,
/turf/simulated/floor/grass,
/area/centcom/control)
+"Oj" = (
+/obj/structure/closet/secure_closet/freezer/kitchen{
+ req_access = null
+ },
+/obj/item/reagent_containers/food/snacks/grown/banana,
+/obj/item/reagent_containers/food/snacks/grown/banana,
+/obj/item/reagent_containers/food/snacks/grown/wheat,
+/obj/item/reagent_containers/food/snacks/grown/wheat,
+/obj/item/reagent_containers/food/snacks/grown/vanillapod,
+/obj/item/reagent_containers/food/snacks/grown/vanillapod,
+/obj/item/reagent_containers/food/snacks/grown/sugarcane,
+/obj/item/reagent_containers/food/snacks/grown/sugarcane,
+/obj/item/reagent_containers/food/snacks/grown/oat,
+/obj/item/reagent_containers/food/snacks/grown/oat,
+/obj/item/reagent_containers/food/snacks/grown/grapes,
+/obj/item/reagent_containers/food/snacks/grown/grapes,
+/obj/item/reagent_containers/food/snacks/grown/corn,
+/obj/item/reagent_containers/food/snacks/grown/corn,
+/obj/item/reagent_containers/food/snacks/grown/chili,
+/obj/item/reagent_containers/food/snacks/grown/chili,
+/obj/item/reagent_containers/food/snacks/grown/carrot,
+/obj/item/reagent_containers/food/snacks/grown/apple,
+/obj/item/reagent_containers/food/snacks/grown/ambrosia/vulgaris,
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
"Ok" = (
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/ppflowers,
@@ -10424,6 +11375,12 @@
/obj/item/flag/cargo,
/turf/simulated/floor/plasteel/dark,
/area/centcom/control)
+"On" = (
+/obj/item/clothing/head/cone,
+/turf/simulated/floor/plating{
+ icon_state = "asteroidplating"
+ },
+/area/ghost_bar)
"Oo" = (
/obj/structure/bookcase/random,
/obj/item/book/granter/spell/summon_cheese,
@@ -10506,6 +11463,12 @@
/obj/item/grenade/chem_grenade/metalfoam,
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"OB" = (
+/obj/machinery/door/airlock/multi_tile/glass{
+ name = "Badmin's Bar"
+ },
+/turf/simulated/floor/carpet/arcade,
+/area/ghost_bar)
"OD" = (
/obj/machinery/atmospherics/unary/thermomachine/freezer/on,
/turf/simulated/floor/plasteel{
@@ -10560,6 +11523,9 @@
},
/turf/simulated/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
+"OK" = (
+/turf/simulated/floor/plating/asteroid/ancient/airless,
+/area/space/nearstation)
"OL" = (
/obj/structure/curtain/open/shower,
/obj/machinery/shower{
@@ -10626,6 +11592,11 @@
icon_state = "asteroid2"
},
/area/holodeck/source_desert)
+"OU" = (
+/obj/effect/mapping_helpers/airlock/autoname,
+/obj/machinery/door/airlock/centcom,
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
"OV" = (
/obj/item/kirbyplants,
/obj/machinery/door_control/no_emag{
@@ -10701,12 +11672,22 @@
icon_state = "bot"
},
/area/shuttle/escape)
+"Pf" = (
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"Pg" = (
/obj/structure/rack,
/obj/item/tank/jetpack/oxygen,
/obj/item/tank/jetpack/oxygen,
/turf/simulated/floor/plasteel,
/area/admin)
+"Pi" = (
+/turf/simulated/floor/plasteel/stairs/medium{
+ dir = 1
+ },
+/area/ghost_bar)
"Pk" = (
/obj/structure/chair/comfy/black{
dir = 1
@@ -10729,12 +11710,31 @@
/obj/item/clothing/head/helmet/space,
/turf/simulated/floor/plasteel,
/area/admin)
+"Pn" = (
+/obj/structure/curtain/black,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Po" = (
/obj/structure/chair/stool/bar{
dir = 1
},
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/administration)
+"Pp" = (
+/obj/machinery/door/window{
+ dir = 8;
+ opacity = 1
+ },
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
+"Pq" = (
+/obj/structure/railing{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel/stairs/right{
+ dir = 1
+ },
+/area/ghost_bar)
"Ps" = (
/obj/machinery/computer/communications{
dir = 1
@@ -10748,6 +11748,9 @@
icon_state = "wood-broken"
},
/area/centcom/evac)
+"Pu" = (
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
"Pv" = (
/obj/machinery/computer/emergency_shuttle{
dir = 1
@@ -10889,6 +11892,13 @@
/obj/effect/turf_decal/delivery,
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"PW" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/simulated/floor/mineral/plastitanium/red,
+/area/ghost_bar)
"PX" = (
/obj/structure/chair/sofa/corp/left,
/turf/simulated/floor/transparent/glass,
@@ -11002,6 +12012,12 @@
/obj/structure/flora/ausbushes/palebush,
/turf/simulated/floor/grass,
/area/centcom/evac)
+"Qv" = (
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"Qx" = (
/turf/simulated/floor/plasteel{
dir = 4;
@@ -11094,6 +12110,14 @@
"QL" = (
/turf/simulated/floor/plasteel,
/area/shuttle/escape)
+"QM" = (
+/obj/machinery/door/airlock/maintenance{
+ name = "Port Asteroid Maintenance"
+ },
+/turf/simulated/floor/plating{
+ icon_state = "asteroidplating"
+ },
+/area/ghost_bar)
"QN" = (
/obj/item/kirbyplants,
/turf/simulated/floor/plasteel{
@@ -11152,9 +12176,28 @@
/obj/item/flash,
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"QZ" = (
+/obj/structure/toilet{
+ dir = 8
+ },
+/obj/structure/window/reinforced/tinted{
+ dir = 1
+ },
+/obj/structure/window/reinforced/tinted,
+/obj/machinery/door/window{
+ dir = 8;
+ name = "Toilet";
+ opacity = 1
+ },
+/turf/simulated/floor/plasteel/freezer,
+/area/ghost_bar)
"Ra" = (
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"Rb" = (
+/obj/effect/mob_spawn/human/alive/ghost_bar,
+/turf/simulated/floor/mineral/plastitanium/red,
+/area/ghost_bar)
"Rc" = (
/turf/simulated/floor/mech_bay_recharge_floor,
/area/shuttle/escape)
@@ -11229,6 +12272,9 @@
/obj/random/bomb_supply,
/turf/simulated/floor/plasteel,
/area/admin)
+"Ro" = (
+/turf/simulated/floor/plasteel/stairs/right,
+/area/ghost_bar)
"Rp" = (
/turf/simulated/wall/mineral/plastitanium,
/area/shuttle/specops)
@@ -11340,10 +12386,20 @@
/obj/item/storage/fancy/donut_box,
/turf/simulated/floor/wood,
/area/centcom/control)
+"RK" = (
+/turf/simulated/floor/carpet/arcade,
+/area/ghost_bar)
"RL" = (
/obj/machinery/pdapainter,
/turf/simulated/floor/wood,
/area/centcom/control)
+"RN" = (
+/obj/structure/table/reinforced,
+/obj/machinery/chem_dispenser/soda{
+ dir = 8
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"RO" = (
/obj/structure/table/reinforced,
/obj/item/paper_bin,
@@ -11396,6 +12452,12 @@
},
/turf/simulated/wall/indestructible/fakeglass,
/area/centcom/specops)
+"RX" = (
+/obj/structure/chair/comfy/black{
+ dir = 8
+ },
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"RZ" = (
/obj/effect/turf_decal/bot,
/turf/simulated/floor/plasteel{
@@ -11442,6 +12504,11 @@
},
/turf/simulated/floor/plasteel/dark,
/area/syndicate_mothership/jail)
+"Sh" = (
+/obj/structure/table/wood,
+/obj/item/storage/pill_bottle/dice,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Si" = (
/obj/structure/chair/sofa/corp/right,
/turf/simulated/floor/plasteel,
@@ -11527,6 +12594,10 @@
icon_state = "greencorner"
},
/area/centcom/evac)
+"SB" = (
+/obj/structure/sign/nosmoking_2,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"SD" = (
/obj/structure/table,
/obj/machinery/recharger{
@@ -11616,6 +12687,12 @@
icon_state = "bar"
},
/area/tdome/tdomeobserve)
+"Tj" = (
+/obj/structure/chair/stool{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/arcade,
+/area/ghost_bar)
"Tk" = (
/obj/structure/holowindow,
/turf/simulated/floor/holofloor,
@@ -11867,6 +12944,15 @@
/obj/structure/chair/comfy/shuttle,
/turf/simulated/floor/mineral/titanium,
/area/shuttle/transport)
+"Uh" = (
+/obj/structure/chair/sofa/corp{
+ dir = 4
+ },
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_x = -32
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Ui" = (
/turf/simulated/floor/plasteel{
dir = 8;
@@ -11880,6 +12966,13 @@
},
/turf/simulated/floor/wood,
/area/centcom/control)
+"Uk" = (
+/obj/effect/mapping_helpers/airlock/autoname,
+/obj/machinery/door/airlock/centcom,
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
"Ul" = (
/obj/effect/landmark/newplayer_start,
/turf/simulated/wall/indestructible/splashscreen,
@@ -11989,6 +13082,10 @@
icon_state = "whiteblue"
},
/area/shuttle/escape)
+"UH" = (
+/obj/structure/chair/comfy/black,
+/turf/simulated/floor/carpet/green,
+/area/ghost_bar)
"UI" = (
/turf/simulated/floor/holofloor{
dir = 8;
@@ -12016,6 +13113,13 @@
},
/turf/simulated/floor/plasteel/dark,
/area/syndicate_mothership/jail)
+"UQ" = (
+/obj/structure/table,
+/obj/item/storage/belt/utility,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"UT" = (
/obj/machinery/economy/vending/cola/free,
/turf/simulated/floor/plasteel{
@@ -12132,6 +13236,10 @@
},
/turf/simulated/floor/mineral/plastitanium/red,
/area/shuttle/syndicate)
+"Vr" = (
+/obj/structure/sign/poster/contraband/syndicate_recruitment,
+/turf/simulated/wall/indestructible/riveted,
+/area/ghost_bar)
"Vs" = (
/obj/structure/table,
/obj/item/reagent_containers/food/drinks/cans/badminbrew,
@@ -12324,6 +13432,11 @@
icon_state = "brown"
},
/area/shuttle/escape)
+"Wi" = (
+/obj/structure/table/wood/fancy/royalblack,
+/obj/item/deck/cards/black,
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"Wj" = (
/obj/structure/table,
/obj/item/toy/katana,
@@ -12429,6 +13542,18 @@
/obj/effect/decal/warning_stripes/yellow,
/turf/simulated/floor/plasteel,
/area/admin)
+"WA" = (
+/obj/machinery/computer/security/telescreen/entertainment{
+ pixel_y = 32
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
+"WB" = (
+/obj/structure/chair/stool/bar{
+ dir = 1
+ },
+/turf/simulated/floor/carpet/black,
+/area/ghost_bar)
"WC" = (
/obj/structure/table,
/obj/item/storage/toolbox/electrical,
@@ -12468,6 +13593,12 @@
/obj/item/melee/energy/sword/saber/red,
/turf/simulated/floor/plasteel,
/area/tdome/arena)
+"WF" = (
+/obj/structure/chair/sofa/corp/left{
+ dir = 1
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"WG" = (
/obj/structure/flora/ausbushes/fullgrass,
/obj/structure/flora/ausbushes/brflowers,
@@ -12500,6 +13631,43 @@
icon_state = "vault"
},
/area/tdome/tdomeadmin)
+"WK" = (
+/obj/structure/rack,
+/obj/item/tank/internals/plasmaman/belt/full,
+/obj/item/tank/internals/plasmaman/belt/full,
+/obj/item/tank/internals/plasmaman/belt/full,
+/obj/item/tank/internals/plasmaman/belt/full,
+/obj/item/tank/internals/plasmaman/belt/full,
+/obj/item/tank/internals/plasmaman/belt/full,
+/obj/item/tank/internals/plasmaman/belt/full,
+/obj/item/tank/internals/plasmaman/belt/full,
+/obj/item/tank/internals/plasmaman/belt/full,
+/obj/item/tank/internals/plasmaman/belt/full,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/under/plasmaman,
+/obj/item/clothing/head/helmet/space/plasmaman,
+/obj/item/clothing/head/helmet/space/plasmaman,
+/obj/item/clothing/head/helmet/space/plasmaman,
+/obj/item/clothing/head/helmet/space/plasmaman,
+/obj/item/clothing/head/helmet/space/plasmaman,
+/obj/item/clothing/head/helmet/space/plasmaman,
+/obj/item/clothing/head/helmet/space/plasmaman,
+/obj/item/clothing/head/helmet/space/plasmaman,
+/obj/item/clothing/head/helmet/space/plasmaman,
+/obj/item/clothing/head/helmet/space/plasmaman,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"WM" = (
/obj/structure/railing,
/obj/structure/table,
@@ -12550,6 +13718,32 @@
},
/turf/simulated/floor/plating,
/area/centcom/control)
+"WT" = (
+/obj/structure/rack,
+/obj/item/tank/internals/emergency_oxygen/double/vox,
+/obj/item/tank/internals/emergency_oxygen/double/vox,
+/obj/item/tank/internals/emergency_oxygen/double/vox,
+/obj/item/tank/internals/emergency_oxygen/double/vox,
+/obj/item/tank/internals/emergency_oxygen/double/vox,
+/obj/item/tank/internals/emergency_oxygen/double/vox,
+/obj/item/tank/internals/emergency_oxygen/double/vox,
+/obj/item/tank/internals/emergency_oxygen/double/vox,
+/obj/item/tank/internals/emergency_oxygen/double/vox,
+/obj/item/tank/internals/emergency_oxygen/double/vox,
+/obj/item/clothing/mask/breath/vox,
+/obj/item/clothing/mask/breath/vox,
+/obj/item/clothing/mask/breath/vox,
+/obj/item/clothing/mask/breath/vox,
+/obj/item/clothing/mask/breath/vox,
+/obj/item/clothing/mask/breath/vox,
+/obj/item/clothing/mask/breath/vox,
+/obj/item/clothing/mask/breath/vox,
+/obj/item/clothing/mask/breath/vox,
+/obj/item/clothing/mask/breath/vox,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"WU" = (
/obj/machinery/computer/med_data{
dir = 4
@@ -12575,6 +13769,12 @@
/obj/effect/landmark/spawner/commando_manual,
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"Xa" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Xb" = (
/turf/simulated/floor/plasteel/dark,
/area/tdome/tdomeobserve)
@@ -12681,6 +13881,12 @@
/obj/structure/chair/office/dark,
/turf/simulated/floor/wood,
/area/centcom/control)
+"Xs" = (
+/obj/structure/statue/sandstone/assistant,
+/turf/simulated/floor/plating/airless{
+ icon_state = "asteroidplating"
+ },
+/area/space/nearstation)
"Xt" = (
/obj/machinery/door/airlock/centcom{
name = "CentCom Customs"
@@ -12734,6 +13940,13 @@
icon_state = "greencorner"
},
/area/centcom/evac)
+"XD" = (
+/obj/structure/table,
+/obj/item/storage/fancy/crayons,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/ghost_bar)
"XE" = (
/obj/structure/railing{
dir = 8
@@ -12801,6 +14014,12 @@
},
/turf/simulated/floor/plating/airless,
/area/shuttle/specops)
+"XR" = (
+/obj/machinery/processor,
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria"
+ },
+/area/ghost_bar)
"XS" = (
/obj/item/toy/plushie/corgi,
/turf/simulated/floor/grass/jungle,
@@ -13022,6 +14241,10 @@
icon_state = "darkblue"
},
/area/centcom/control)
+"YI" = (
+/obj/effect/decal/remains/human,
+/turf/simulated/floor/plating/asteroid/ancient/airless,
+/area/space/nearstation)
"YJ" = (
/obj/machinery/door/window/classic/normal{
name = "Cell B";
@@ -13231,6 +14454,14 @@
/obj/structure/shuttle/engine/propulsion,
/turf/simulated/floor/plating/airless,
/area/shuttle/escape)
+"Zq" = (
+/obj/structure/table/wood,
+/obj/item/paper_bin{
+ pixel_x = -3;
+ pixel_y = 7
+ },
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"Zr" = (
/turf/simulated/wall/indestructible/riveted,
/area/centcom/specops)
@@ -13349,6 +14580,15 @@
icon_state = "darkred"
},
/area/centcom/specops)
+"ZK" = (
+/obj/structure/table/wood,
+/obj/machinery/light/small{
+ dir = 4;
+ pixel_y = 8
+ },
+/obj/item/deck/tarot,
+/turf/simulated/floor/wood,
+/area/ghost_bar)
"ZL" = (
/obj/structure/showcase,
/turf/simulated/floor/wood,
@@ -13424,6 +14664,12 @@
/obj/structure/table/wood,
/turf/simulated/floor/plasteel/dark,
/area/centcom/specops)
+"ZY" = (
+/obj/machinery/computer/arcade/recruiter{
+ dir = 4
+ },
+/turf/simulated/floor/carpet/arcade,
+/area/ghost_bar)
"ZZ" = (
/obj/structure/railing,
/obj/structure/railing{
@@ -66285,8 +67531,8 @@ aN
aN
aN
aN
-aN
-aN
+ps
+ps
aN
aN
aN
@@ -66532,6 +67778,9 @@ aN
aN
aN
aN
+OK
+OK
+OK
aN
aN
aN
@@ -66539,17 +67788,14 @@ aN
aN
aN
aN
+OK
+ps
+OK
+ps
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+OK
aN
aN
aN
@@ -66787,6 +68033,27 @@ aN
aN
aN
aN
+OK
+OK
+ps
+ps
+ps
+OK
+aN
+aN
+aN
+aN
+aN
+aN
+aN
+OK
+OK
+ps
+ps
+OK
+OK
+ps
+OK
aN
aN
aN
@@ -66798,29 +68065,8 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+ps
+ps
aN
aN
aN
@@ -67043,6 +68289,29 @@ aN
aN
aN
aN
+OK
+ps
+ps
+ps
+ps
+ps
+ps
+OK
+aN
+aN
+aN
+aN
+YI
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+ps
+OK
aN
aN
aN
@@ -67053,31 +68322,8 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+ya
+ps
aN
aN
aN
@@ -67299,31 +68545,31 @@ aN
aN
aN
aN
+OK
+OK
+ps
+ps
+ps
+ps
+ps
+ps
+OK
+OK
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+OK
+ps
+ps
+ps
+OK
+OK
+ps
+OK
+ps
+ps
+OK
aN
aN
aN
@@ -67556,31 +68802,31 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+OK
+OK
+ps
+ps
+ps
+ps
+ps
+ps
+OK
+OK
+OK
+OK
+OK
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+OK
aN
aN
aN
@@ -67814,42 +69060,42 @@ aN
aN
aN
aN
+OK
aN
aN
+tL
+ps
+ps
+ps
+Me
+Me
+Nr
+Nr
+Nr
+Nr
+Me
+Me
+Me
+Me
+Me
+ps
+ps
+ps
+ps
+ps
+OK
+OK
+OK
+OK
+OK
+OK
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+Mu
+OK
+OK
+OK
+OK
aN
aN
aN
@@ -68075,39 +69321,39 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+tL
+ps
+ps
+Me
+Kp
+Pf
+Pf
+Pf
+Pf
+iu
+OU
+Pu
+zQ
+Me
+Me
+Me
+Me
+Me
+ps
+OK
+OK
+ps
+ps
+ps
+ps
+OK
+OK
+ps
+ps
+ps
+ps
+OK
+OK
aN
aN
aN
@@ -68334,37 +69580,37 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+tL
+Me
+xD
+Pf
+UQ
+Ko
+Pf
+LF
+Me
+Pu
+qe
+Me
+KW
+HE
+HE
+Me
+ps
+ps
+ps
+ps
+ps
+ps
+Me
+Nr
+Nr
+Me
+Me
+ps
+ps
+ps
+OK
aN
aN
aN
@@ -68581,47 +69827,47 @@ aN
aN
aN
aN
+Db
+aN
+aN
+aN
+Db
aN
aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+tL
+Me
+HD
+Pf
+XD
+WT
+Pf
+bi
+Me
+CI
+Pu
+Me
+Pu
+Pu
+Pu
+Me
+ps
+ps
+ps
+ps
+ps
+Me
+Me
+JP
+Bh
+On
+Me
+ps
+ps
+ps
+OK
aN
aN
aN
@@ -68839,46 +70085,46 @@ aN
aN
aN
aN
+Im
+Im
+Im
aN
aN
aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+tL
+Me
+Hc
+Pf
+fG
+WK
+Pf
+Fr
+Me
+CI
+Pu
+Pu
+Pu
+Pu
+Pu
+Me
+Me
+Me
+Me
+Me
+Me
+IB
+MM
+sx
+sx
+NX
+Me
+ps
+ps
+ps
+OK
aN
aN
aN
@@ -69095,46 +70341,46 @@ wk
aN
aN
aN
+Im
+Im
+EI
+Im
+Im
+tL
+Db
aN
+tL
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+tL
+Me
+yk
+Pf
+Pf
+Pf
+Pf
+yv
+Me
+yI
+zw
+QZ
+DT
+wI
+Lq
+Vr
+NX
+tC
+tC
+tC
+tC
+tC
+tC
+tC
+tC
+tC
+Me
+ps
+ps
+OK
aN
aN
aN
@@ -69352,45 +70598,45 @@ wk
wk
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+Im
+Da
+Da
+Ka
+Im
+tL
+tL
+tL
+tL
+tL
+fq
+Me
+Nr
+Nr
+LA
+NH
+Nr
+Nr
+Me
+Me
+Me
+SB
+Me
+Me
+Me
+Me
+Me
+QM
+Me
+Me
+Me
+Me
+Me
+Me
+Me
+NX
+Me
+ps
+OK
aN
aN
aN
@@ -69609,45 +70855,45 @@ lH
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+Im
+Rb
+Da
+Ka
+Im
+Nr
+Nr
+Nr
+Nr
+Nr
+Nr
+nn
+hp
+Jy
+Jy
+Jy
+Jy
+Jy
+Ck
+rk
+rU
+xV
+Xa
+EP
+Uh
+Fm
+Jm
+Jy
+EJ
+Ma
+Nr
+mS
+ZY
+AB
+Me
+NX
+Me
+ps
+OK
aN
aN
aN
@@ -69866,45 +71112,45 @@ lH
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+Im
+PW
+Da
+Da
+Na
+EQ
+Pf
+zh
+zh
+Pf
+zh
+rS
+HH
+Jy
+Jy
+Jy
+Jy
+Jy
+Jy
+Ro
+rU
+xV
+Jy
+Np
+Wi
+rG
+WF
+Jy
+pl
+pl
+Nr
+Ag
+Ag
+Ag
+Me
+tC
+Me
+ps
+ps
aN
aN
aN
@@ -70123,45 +71369,45 @@ lH
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+Im
+Mt
+Da
+Da
+Na
+EQ
+zh
+zh
+Pf
+zh
+Pf
+rS
+HH
+Jy
+cX
+cX
+cX
+Jy
+Me
+sO
+LA
+zk
+Jy
+ip
+qH
+qH
+Jy
+Jy
+Jy
+Jy
+OB
+RK
+RK
+RK
+Me
+tC
+Me
+Me
+ps
aN
aN
aN
@@ -70380,46 +71626,46 @@ wk
wk
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+Im
+Da
+Da
+Da
+Im
+ew
+Nr
+Nr
+Nr
+Nr
+Nr
+Me
+bJ
+Jy
+qN
+AZ
+Ah
+Nh
+Me
+BH
+Jy
+LM
+Jy
+Jy
+Jy
+Jy
+Jy
+Jy
+Jy
+Jy
+RK
+RK
+RK
+CA
+Me
+NX
+Me
+Me
+ps
+OK
aN
aN
aN
@@ -70637,47 +71883,47 @@ wk
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+Im
+MZ
+wM
+dR
+Im
+tL
+tL
+tL
+tL
+tL
+fq
+zn
+yO
+Jy
+Ml
+Ml
+Ml
+Jy
+Me
+Ga
+Jy
+Jy
+Jy
+Jy
+Jy
+Jy
+Jy
+ol
+ol
+Jy
+Nr
+RK
+Tj
+Tj
+Me
+NX
+In
+Me
+ps
+ps
+OK
aN
aN
aN
@@ -70894,47 +72140,47 @@ aN
aN
aN
aN
+Im
+Jd
+Jd
+Jd
+Im
+tL
+Db
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+tL
+Nr
+Jy
+Jy
+vd
+vd
+vd
+Jy
+Me
+EX
+Jy
+Jy
+Jy
+oH
+Jy
+Jy
+Jy
+rG
+qm
+Jy
+Nr
+ED
+zL
+zL
+Me
+tC
+NX
+Me
+ps
+ps
+OK
aN
aN
aN
@@ -71152,46 +72398,46 @@ aN
aN
aN
aN
+cD
+cD
+cD
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+OK
+OK
+tL
+Nr
+Jy
+Jy
+vd
+cX
+vd
+rf
+Me
+wh
+rd
+rd
+rd
+rd
+rd
+qH
+Jy
+RX
+RX
+ep
+qR
+Nr
+Nr
+Nr
+Me
+tC
+NX
+Me
+ps
+ps
+ps
aN
aN
aN
@@ -71408,47 +72654,47 @@ aN
aN
aN
aN
+Db
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+Db
+OK
+yK
+OK
+yK
+OK
+OK
+Nr
+Jy
+Jy
+UH
+AZ
+JX
+yO
+qf
+Pp
+Bj
+Bj
+jG
+Bj
+yc
+WB
+Jy
+Jy
+Jy
+Hz
+DG
+qH
+cR
+qH
+Me
+tC
+NX
+Me
+ps
+ps
+ps
aN
aN
aN
@@ -71669,43 +72915,43 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+OK
+OK
+OK
+Xs
+yK
+OK
+Me
+Li
+Jy
+vd
+Ml
+vd
+xy
+sd
+Jy
+Jy
+Jy
+Jy
+Jy
+Bj
+WB
+Jy
+ip
+Jy
+Hz
+rU
+Al
+Dw
+eA
+Me
+tC
+sU
+Me
+ps
+ps
+ps
aN
aN
aN
@@ -71925,44 +73171,44 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+OK
+OK
+OK
+ye
+OK
+OK
+ps
+Me
+xt
+Jy
+vd
+vd
+vd
+yO
+Me
+Jy
+Jy
+Jy
+Jy
+Jy
+jG
+WB
+Jy
+Jy
+qH
+Qv
+Pq
+rU
+rU
+fP
+Me
+tC
+Me
+Me
+ps
+ps
+OK
aN
aN
aN
@@ -72181,44 +73427,44 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+OK
+OK
+OK
+OK
+OK
+yK
+ps
+ps
+Me
+Nr
+Pn
+Pn
+Pn
+Pn
+Nr
+Me
+WA
+Jy
+zl
+RN
+sF
+Bj
+WB
+Jy
+Jy
+qH
+qH
+Pi
+rU
+rU
+rU
+Me
+NX
+Me
+ps
+ps
+ps
aN
aN
aN
@@ -72438,44 +73684,44 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+ps
+OK
+OK
+OK
+OK
+OK
+ps
+ps
+Me
+yO
+Jy
+Jy
+Jy
+Jy
+Jy
+Me
+mz
+JI
+Me
+Me
+Me
+Me
+xY
+Jy
+Jy
+qH
+Nm
+cg
+rU
+rU
+rU
+HZ
+oC
+Me
+ps
+ps
+OK
aN
aN
aN
@@ -72696,43 +73942,43 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+ps
+ps
+ps
+OK
+OK
+ps
+ps
+ps
+Me
+bJ
+Jy
+io
+KU
+yM
+Dm
+Me
+Fb
+es
+Oj
+zj
+fF
+Me
+Jy
+Jy
+ip
+Jy
+Hz
+rU
+Al
+Dw
+eA
+Me
+Me
+Me
+ps
+ps
+OK
aN
aN
aN
@@ -72954,40 +74200,40 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+Me
+zz
+Jy
+io
+Zq
+wF
+Bc
+Me
+LG
+es
+es
+es
+es
+Uk
+Jy
+Jy
+ol
+ol
+Hz
+lj
+qH
+Gp
+qH
+Me
+ps
+ps
+ps
aN
aN
aN
@@ -73212,38 +74458,38 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+OK
+ps
+ps
+ps
+ps
+Me
+Mx
+Cn
+io
+ZK
+Sh
+Bc
+mA
+XR
+wN
+Dk
+zY
+xU
+Me
+tr
+Jy
+rG
+hU
+LM
+Me
+aT
+aT
+Me
+Me
+ps
+ps
aN
aN
aN
@@ -73471,35 +74717,35 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+ps
+ps
+ps
+Me
+Me
+Me
+Me
+Me
+Me
+Me
+Me
+Me
+Me
+Me
+Me
+Me
+aT
+Jy
+Jy
+RX
+RX
+Jy
+Me
+ps
+ps
+ps
+ps
+ps
aN
aN
aN
@@ -73729,33 +74975,33 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+OK
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+Me
+Jy
+gS
+Jy
+Me
+Me
+Me
+ps
+ps
+OK
+OK
aN
aN
aN
@@ -73988,30 +75234,30 @@ aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+ps
+ps
+ps
+ps
+ps
+ps
+OK
+OK
+ps
+ps
+ps
+ps
+ps
+Me
+Me
+Me
+Me
+Me
+ps
+ps
+ps
+OK
+OK
aN
aN
aN
@@ -74246,29 +75492,29 @@ aN
aN
aN
aN
+OK
+OK
+ps
+ps
+ps
+OK
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+OK
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+ps
+Me
+ps
+ps
+OK
+OK
+ps
aN
aN
aN
@@ -74505,27 +75751,27 @@ aN
aN
aN
aN
+OK
+ps
+ps
+OK
aN
aN
aN
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+ps
+OK
+OK
+ps
+ps
+ps
+ps
+Me
+ps
+OK
+OK
+ps
+ps
aN
aN
aN
@@ -74763,6 +76009,8 @@ aN
aN
aN
aN
+OK
+OK
aN
aN
aN
@@ -74770,15 +76018,13 @@ aN
aN
aN
aN
+OK
+OK
+OK
aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
-aN
+ps
+ps
+OK
aN
aN
aN
@@ -75036,7 +76282,7 @@ aN
aN
aN
aN
-aN
+ps
aN
aN
aN
diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm
index 6170e1aee69..36bbef6723b 100644
--- a/code/__HELPERS/trait_helpers.dm
+++ b/code/__HELPERS/trait_helpers.dm
@@ -135,6 +135,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
*/
//***** MOB TRAITS *****//
+#define TRAIT_RESPAWNABLE "can_respawn_as_ghost_roles"
#define TRAIT_BLIND "blind"
#define TRAIT_MUTE "mute"
#define TRAIT_DEAF "deaf"
@@ -263,6 +264,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define SLIME_TRAIT "slime"
#define BERSERK_TRAIT "berserk"
#define EYES_OF_GOD "eyes_of_god"
+#define GHOSTED "isghost"
+#define GHOST_ROLE "ghost_role"
// unique trait sources
#define STATUE_MUTE "statue"
diff --git a/code/_globalvars/lists/mob_lists.dm b/code/_globalvars/lists/mob_lists.dm
index 26c14069393..b4db2713228 100644
--- a/code/_globalvars/lists/mob_lists.dm
+++ b/code/_globalvars/lists/mob_lists.dm
@@ -23,7 +23,6 @@ GLOBAL_LIST_EMPTY(human_list) //all instances of /mob/living/carbon/human and
GLOBAL_LIST_EMPTY(spirits) //List of all the spirits, including Masks
GLOBAL_LIST_EMPTY(alive_mob_list) //List of all alive mobs, including clientless. Excludes /mob/new_player
GLOBAL_LIST_EMPTY(dead_mob_list) //List of all dead mobs, including clientless. Excludes /mob/new_player
-GLOBAL_LIST_EMPTY(respawnable_list) //List of all mobs, dead or in mindless creatures that still be respawned.
GLOBAL_LIST_EMPTY(non_respawnable_keys) //List of ckeys that are excluded from respawning for remainder of round.
GLOBAL_LIST_INIT(simple_animals, list(list(), list(), list(), list())) //One for each AI_* status define, List of all simple animals, including clientless
GLOBAL_LIST_EMPTY(bots_list) //List of all bots(beepsky, medibots,etc)
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 1d191ae2d87..1620d23bd20 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -612,8 +612,6 @@ so as to remain in compliance with the most up-to-date laws."
if(!usr || !usr.client)
return
var/mob/dead/observer/G = usr
- if(!istype(G))
- return
if(poll)
var/success
@@ -631,8 +629,16 @@ so as to remain in compliance with the most up-to-date laws."
if(NOTIFY_JUMP)
var/turf/T = get_turf(target)
if(T && isturf(T))
+ if(!istype(G))
+ var/mob/dead/observer/actual_ghost = G.ghostize(TRUE)
+ actual_ghost.forceMove(T)
+ return
G.forceMove(T)
if(NOTIFY_FOLLOW)
+ if(!istype(G))
+ var/mob/dead/observer/actual_ghost = G.ghostize(TRUE)
+ actual_ghost.ManualFollow(target)
+ return
G.ManualFollow(target)
/obj/screen/alert/notify_action/Topic(href, href_list)
diff --git a/code/controllers/subsystem/SSghost_spawns.dm b/code/controllers/subsystem/SSghost_spawns.dm
index d9fdd669a24..05cd2567f44 100644
--- a/code/controllers/subsystem/SSghost_spawns.dm
+++ b/code/controllers/subsystem/SSghost_spawns.dm
@@ -60,7 +60,7 @@ SUBSYSTEM_DEF(ghost_spawns)
var/category = "[P.hash]_notify_action"
var/notice_sound = sound('sound/misc/notice2.ogg')
- for(var/mob/dead/observer/M in (ignore_respawnability ? GLOB.player_list : GLOB.respawnable_list))
+ for(var/mob/M in (GLOB.player_list))
if(!is_eligible(M, role, antag_age_check, role, min_hours, check_antaghud))
continue
@@ -140,7 +140,14 @@ SUBSYSTEM_DEF(ghost_spawns)
// Sleep until the time is up
UNTIL(P.finished)
- return P.signed_up
+ if(!ignore_respawnability)
+ var/list/eligable_mobs = list()
+ for(var/mob/signed_up in P.signed_up)
+ if(HAS_TRAIT(signed_up, TRAIT_RESPAWNABLE))
+ eligable_mobs += signed_up
+ return eligable_mobs
+ else
+ return P.signed_up
/**
* Returns whether an observer is eligible to be an event mob
@@ -153,10 +160,12 @@ SUBSYSTEM_DEF(ghost_spawns)
* * min_hours - The amount of minimum hours the client needs before being eligible
* * check_antaghud - Whether to consider a client who enabled AntagHUD ineligible or not
*/
-/datum/controller/subsystem/ghost_spawns/proc/is_eligible(mob/M, role, antag_age_check, role_text, min_hours, check_antaghud)
+/datum/controller/subsystem/ghost_spawns/proc/is_eligible(mob/M, role, antag_age_check, role_text, min_hours, check_antaghud, ignore_respawnability)
. = FALSE
if(!M.key || !M.client)
return
+ if(!ignore_respawnability && !HAS_TRAIT(M, TRAIT_RESPAWNABLE))
+ return
if(role)
if(!(role in M.client.prefs.be_special))
return
@@ -213,7 +222,7 @@ SUBSYSTEM_DEF(ghost_spawns)
var/role // The role the poll is for
var/question // The question asked to observers
var/duration // The duration of the poll
- var/list/mob/dead/observer/signed_up // The players who signed up to this poll
+ var/list/signed_up // The players who signed up to this poll
var/time_started // The world.time at which the poll was created
var/finished = FALSE // Whether the polling is finished
var/hash // Used to categorize in the alerts system
@@ -236,9 +245,9 @@ SUBSYSTEM_DEF(ghost_spawns)
* * M - The (controlled) mob to sign up
* * silent - Whether no messages should appear or not. If not TRUE, signing up to this poll will also sign the mob up for identical polls
*/
-/datum/candidate_poll/proc/sign_up(mob/dead/observer/M, silent = FALSE)
+/datum/candidate_poll/proc/sign_up(mob/M, silent = FALSE)
. = FALSE
- if(!istype(M) || !M.key || !M.client)
+ if(!HAS_TRAIT(M, TRAIT_RESPAWNABLE) || !M.key || !M.client)
return
if(M in signed_up)
if(!silent)
@@ -269,9 +278,9 @@ SUBSYSTEM_DEF(ghost_spawns)
* * M - The mob to remove from the poll, if present.
* * silent - If TRUE, no messages will be sent to M about their removal.
*/
-/datum/candidate_poll/proc/remove_candidate(mob/dead/observer/M, silent = FALSE)
+/datum/candidate_poll/proc/remove_candidate(mob/M, silent = FALSE)
. = FALSE
- if(!istype(M) || !M.key || !M.client)
+ if(!HAS_TRAIT(M, TRAIT_RESPAWNABLE) || !M.key || !M.client)
return
if(!(M in signed_up))
if(!silent)
diff --git a/code/datums/spawners_menu.dm b/code/datums/spawners_menu.dm
index 5383d20d1b0..af4b272b4d1 100644
--- a/code/datums/spawners_menu.dm
+++ b/code/datums/spawners_menu.dm
@@ -16,6 +16,7 @@
var/list/data = list()
data["spawners"] = list()
for(var/spawner in GLOB.mob_spawners)
+ var/is_perm_spawner = FALSE
var/list/this = list()
this["name"] = spawner
this["desc"] = ""
@@ -30,10 +31,12 @@
this["desc"] = MS.description
this["important_info"] = MS.important_info
this["fluff"] = MS.flavour_text
+ if(MS.permanent)
+ is_perm_spawner = TRUE
else
var/obj/O = spawner_obj
this["desc"] = O.desc
- this["amount_left"] = LAZYLEN(GLOB.mob_spawners[spawner])
+ this["amount_left"] = is_perm_spawner ? "Infinite uses" : LAZYLEN(GLOB.mob_spawners[spawner])
data["spawners"] += list(this)
return data
diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm
index 48ddc8cf796..6cc0e82d554 100644
--- a/code/datums/spells/mind_transfer.dm
+++ b/code/datums/spells/mind_transfer.dm
@@ -67,7 +67,7 @@ Also, you never added distance checking after target is selected. I've went ahea
ghost.mind.transfer_to(caster)
if(ghost.key)
- GLOB.non_respawnable_keys -= ghost.ckey //ghostizing with an argument of 0 will make them unable to respawn forever, which is bad
+ GLOB.non_respawnable_keys -= ghost.ckey
caster.key = ghost.key //have to transfer the key since the mind was not active
qdel(ghost)
diff --git a/code/game/area/centcom_areas.dm b/code/game/area/centcom_areas.dm
index 4d890d0990c..ca23f1ace4f 100644
--- a/code/game/area/centcom_areas.dm
+++ b/code/game/area/centcom_areas.dm
@@ -136,3 +136,10 @@
/area/trader_station/sol
name = "Jupiter Station 6"
+
+/area/ghost_bar
+ name = "Ghost Bar"
+ icon_state = "observatory"
+ requires_power = FALSE
+ has_gravity = TRUE
+ hide_attacklogs = TRUE
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 3cd4c047183..70ca0a91107 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -666,6 +666,7 @@ structure_check() searches for nearby cultist structures required for the invoca
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(mob_to_revive)]) to replace an AFK player.")
mob_to_revive.ghostize(FALSE)
mob_to_revive.key = C.key
+ dust_if_respawnable(C)
else
fail_invoke()
return
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index a661a64262e..2a3e4434aad 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -416,6 +416,7 @@
message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)]) to replace a jobbanned player.")
M.ghostize()
M.key = theghost.key
+ dust_if_respawnable(theghost)
else
message_admins("[M] ([M.key] has been converted into [role_type] with an active antagonist jobban for said role since no ghost has volunteered to take [M.p_their()] place.")
to_chat(M, "You have been converted into [role_type] with an active jobban. Any further violations of the rules on your part are likely to result in a permanent ban.")
diff --git a/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm b/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm
index 875e88295fb..715c7505b3d 100644
--- a/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm
+++ b/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm
@@ -144,6 +144,7 @@
var/client/C = M.client
S.key = C.key
+ dust_if_respawnable(M)
S.mind.assigned_role = "Harbinger of the Slaughter"
S.mind.special_role = "Harbinger of the Slaughter"
to_chat(S, playstyle_string)
diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm
index c2bc44dbb26..bf2cc95482d 100644
--- a/code/game/gamemodes/miniantags/guardian/guardian.dm
+++ b/code/game/gamemodes/miniantags/guardian/guardian.dm
@@ -310,6 +310,7 @@
to_chat(user, "You already have a [mob_name]!")
used = FALSE
return
+ dust_if_respawnable(theghost)
spawn_guardian(user, theghost.key, guardian_type)
else
to_chat(user, "[failure_message]")
diff --git a/code/game/gamemodes/miniantags/guardian/host_actions.dm b/code/game/gamemodes/miniantags/guardian/host_actions.dm
index d0c3995517e..2872520747d 100644
--- a/code/game/gamemodes/miniantags/guardian/host_actions.dm
+++ b/code/game/gamemodes/miniantags/guardian/host_actions.dm
@@ -99,6 +99,7 @@
message_admins("[key_name_admin(new_stand)] has taken control of ([key_name_admin(guardian)])")
guardian.ghostize()
guardian.key = new_stand.key
+ dust_if_respawnable(new_stand)
qdel(src)
/**
diff --git a/code/game/gamemodes/miniantags/morph/morph_event.dm b/code/game/gamemodes/miniantags/morph/morph_event.dm
index 684442d4006..070f4a8bb1e 100644
--- a/code/game/gamemodes/miniantags/morph/morph_event.dm
+++ b/code/game/gamemodes/miniantags/morph/morph_event.dm
@@ -23,6 +23,7 @@
var/mob/living/simple_animal/hostile/morph/S = new /mob/living/simple_animal/hostile/morph(pick(GLOB.xeno_spawn))
player_mind.transfer_to(S)
S.make_morph_antag()
+ dust_if_respawnable(C)
message_admins("[key_of_morph] has been made into morph by an event.")
log_game("[key_of_morph] was spawned as a morph by an event.")
diff --git a/code/game/gamemodes/miniantags/morph/spells/reproduce.dm b/code/game/gamemodes/miniantags/morph/spells/reproduce.dm
index ca76a9e778e..7f3ec3b00c5 100644
--- a/code/game/gamemodes/miniantags/morph/spells/reproduce.dm
+++ b/code/game/gamemodes/miniantags/morph/spells/reproduce.dm
@@ -34,5 +34,6 @@
player_mind.active = TRUE
player_mind.transfer_to(new_morph)
new_morph.make_morph_antag()
+ dust_if_respawnable(C)
user.create_log(MISC_LOG, "Made a new morph using [src]", new_morph)
user.ventcrawler = initial(user.ventcrawler) // re enable the crawling
diff --git a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_event.dm b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_event.dm
index f27018a7841..876c223d9c3 100644
--- a/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_event.dm
+++ b/code/game/gamemodes/miniantags/pulsedemon/pulsedemon_event.dm
@@ -10,7 +10,8 @@
var/mob/C = pick(candidates)
key_of_pulsedemon = C.key
-
+ dust_if_respawnable(C)
+
if(!key_of_pulsedemon)
kill()
return
diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm
index 16cea4b2b29..7583ba4ff55 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant.dm
@@ -168,6 +168,7 @@
key = theghost.key
giveObjectivesandGoals()
giveSpells()
+ dust_if_respawnable(theghost)
else
message_admins("No ghost was willing to take control of a mindless revenant. Deleting...")
qdel(src)
@@ -397,7 +398,7 @@
else if(reforming)
. += "It is shifting and distorted. It would be wise to destroy this."
-/obj/item/ectoplasm/revenant/proc/reform()
+/obj/item/ectoplasm/revenant/proc/reform() // Unused proc, production doesn't have revenants revive
if(inert || !src)
return
var/key_of_revenant
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm
index b8ea8daa2a6..782831bd756 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm
@@ -37,6 +37,7 @@
return
var/mob/living/simple_animal/revenant/revvie = new /mob/living/simple_animal/revenant/(pick(spawn_locs))
player_mind.transfer_to(revvie)
+ dust_if_respawnable(C)
player_mind.assigned_role = SPECIAL_ROLE_REVENANT
player_mind.special_role = SPECIAL_ROLE_REVENANT
SSticker.mode.traitors |= player_mind
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index c442057007e..e90f0b02c6a 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -88,6 +88,7 @@
SSticker.mode.apprentices += M.mind
M.mind.special_role = SPECIAL_ROLE_WIZARD_APPRENTICE
SSticker.mode.update_wiz_icons_added(M.mind)
+ dust_if_respawnable(C)
M.faction = list("wizard")
SStgui.close_uis(src)
else
@@ -369,6 +370,7 @@ GLOBAL_LIST_EMPTY(multiverse)
var/mob/C = pick(candidates)
spawn_copy(C.client, get_turf(user.loc), user)
to_chat(user, "The sword flashes, and you find yourself face to face with...you!")
+ dust_if_respawnable(C)
else
to_chat(user, "You fail to summon any copies of yourself. Perhaps you should try again in a bit.")
diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm
index bc23c2791b4..75be3bf717e 100644
--- a/code/game/gamemodes/wizard/raginmages.dm
+++ b/code/game/gamemodes/wizard/raginmages.dm
@@ -120,6 +120,7 @@
var/mob/living/carbon/human/new_character= makeBody(harry)
new_character.mind.make_Wizard() // This puts them at the wizard spawn, worry not
mages_made++
+ dust_if_respawnable(harry)
return TRUE
else
. = FALSE
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index f77857fc3d2..b0e5e363140 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -505,5 +505,6 @@
if(length(contents)) //If they used the soulstone on someone else in the meantime
return FALSE
M.ckey = chosen_ghost.ckey
+ dust_if_respawnable(chosen_ghost)
init_shade(M, user)
return TRUE
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 8c98b3928b6..650a813078a 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -581,7 +581,7 @@
time_entered = world.time
if(findtext("[E.key]","@",1,2))
var/FT = replacetext(E.key, "@", "")
- for(var/mob/dead/observer/Gh in GLOB.respawnable_list) //this may not be foolproof but it seemed like a better option than 'in world'
+ for(var/mob/dead/observer/Gh in GLOB.player_list) //this may not be foolproof but it seemed like a better option than 'in world'
if(Gh.key == FT)
if(Gh.client && Gh.client.holder) //just in case someone has a byond name with @ at the start, which I don't think is even possible but whatever
to_chat(Gh, "Warning: Your body has entered cryostorage.")
diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm
index 3e01dc77bc8..4735a737b86 100644
--- a/code/game/machinery/doors/airlock_types.dm
+++ b/code/game/machinery/doors/airlock_types.dm
@@ -303,6 +303,18 @@
opacity = FALSE
glass = TRUE
+/obj/machinery/door/airlock/external_no_weld
+ name = "external airlock"
+ icon = 'icons/obj/doors/airlocks/external/external.dmi'
+ overlays_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
+ note_overlay_file = 'icons/obj/doors/airlocks/external/overlays.dmi'
+ assemblytype = /obj/structure/door_assembly/door_assembly_ext
+ doorOpen = 'sound/machines/airlock_ext_open.ogg'
+ doorClose = 'sound/machines/airlock_ext_close.ogg'
+
+/obj/machinery/door/airlock/external_no_weld/welder_act(mob/user, obj/item/I)
+ return
+
//////////////////////////////////
/*
CentCom Airlocks
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index e75e7e3b5de..c835f9c8945 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -113,6 +113,7 @@
return
var/mob/dead/observer/O = pick(candidates)
R.key = O.key
+ dust_if_respawnable(O)
/obj/machinery/transformer/mime
name = "Mimetech Greyscaler"
diff --git a/code/game/machinery/vendors/vending.dm b/code/game/machinery/vendors/vending.dm
index a874e08b313..146d9af28f8 100644
--- a/code/game/machinery/vendors/vending.dm
+++ b/code/game/machinery/vendors/vending.dm
@@ -1026,7 +1026,7 @@
* * crit - if true, some special damage effects might happen.
* * from_combat - If true, hold off on some of the additional damage and extra effects.
*/
-/obj/machinery/economy/vending/proc/tilt(atom/victim, crit = FALSE, from_combat = FALSE)
+/obj/machinery/economy/vending/proc/tilt(atom/victim, crit = FALSE, from_combat = FALSE, from_anywhere = FALSE)
if(QDELETED(src) || !has_gravity(src) || !tiltable || tilted)
return
@@ -1037,6 +1037,8 @@
. = FALSE
+ if(from_anywhere)
+ forceMove(get_turf(victim))
if(!victim || !in_range(victim, src))
tilt_over()
return
@@ -1118,7 +1120,10 @@
if(HAS_TRAIT(target, TRAIT_FLATTENED))
return
add_attack_logs(attacker, target, "shoved into a vending machine ([src])")
- tilt(target, from_combat = TRUE)
+ if(!HAS_TRAIT(attacker, TRAIT_PACIFISM))
+ tilt(target, from_combat = TRUE)
+ else
+ tilt(attacker, crit = TRUE, from_anywhere = TRUE) // get fucked
return TRUE
/obj/machinery/economy/vending/hit_by_thrown_carbon(mob/living/carbon/human/C, datum/thrownthing/throwingdatum, damage, mob_hurt, self_hurt)
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index b412dc8f93e..436de664a3d 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -361,6 +361,7 @@
var/mob/dead/observer/chosen = pick(candidates)
S.key = chosen.key
S.mind.special_role = SPECIAL_ROLE_PYROCLASTIC_SLIME
+ dust_if_respawnable(chosen)
log_game("[key_name(S.key)] was made into a slime by pyroclastic anomaly at [AREACOORD(T)].")
/////////////////////
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index e6077a13538..52724ae54c9 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -198,6 +198,7 @@
var/mob/C = pick(candidates)
if(C)
S.key = C.key
+ dust_if_respawnable(C)
if(S.master_commander)
to_chat(S, "You are a spider who is loyal to [S.master_commander], obey [S.master_commander]'s every order and assist [S.master_commander.p_them()] in completing [S.master_commander.p_their()] goals at any cost.")
qdel(src)
diff --git a/code/game/objects/items/devices/radio/radio_objects.dm b/code/game/objects/items/devices/radio/radio_objects.dm
index 47c7e4a7ca5..e41bd366e03 100644
--- a/code/game/objects/items/devices/radio/radio_objects.dm
+++ b/code/game/objects/items/devices/radio/radio_objects.dm
@@ -20,6 +20,8 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
num2text(MED_I_FREQ) = list(ACCESS_MEDICAL)
))
+GLOBAL_LIST_EMPTY(deadsay_radio_systems)
+
/obj/item/radio
icon = 'icons/obj/radio.dmi'
name = "station bounced radio"
@@ -795,3 +797,48 @@ GLOBAL_LIST_INIT(default_medbay_channels, list(
/obj/item/radio/phone/medbay/New()
..()
internal_channels = GLOB.default_medbay_channels.Copy()
+
+/obj/item/radio/proc/attempt_send_deadsay_message(mob/subject, message)
+ return
+
+/obj/item/radio/headset/deadsay
+ name = "spectral radio"
+ ks2type = /obj/item/encryptionkey/centcom
+
+/obj/item/radio/headset/deadsay/New()
+ ..()
+ GLOB.deadsay_radio_systems.Add(src)
+ make_syndie()
+
+/obj/item/radio/headset/deadsay/Destroy()
+ GLOB.deadsay_radio_systems.Remove(src)
+ return ..()
+
+/obj/item/radio/headset/deadsay/screwdriver_act(mob/user, obj/item/I)
+ return
+
+/obj/item/radio/headset/deadsay/attempt_send_deadsay_message(mob/subject, message)
+ if(!listening)
+ return
+ var/mob/hearer = loc // if people want dchat to shut up, they shouldn't need to deal with other people's headsets
+ if(!istype(hearer) || hearer.stat || !hearer.can_hear())
+ return
+
+ if(!hearer.get_preference(PREFTOGGLE_CHAT_DEAD))
+ return
+
+ var/speaker_name
+ if(!subject || subject.client.prefs.toggles2 & PREFTOGGLE_2_ANON)
+ subject ? (speaker_name = "Anon ([subject.mind.name])") : (speaker_name = "Anon")
+ else
+ speaker_name = "[subject.client.key] ([subject.mind.name])"
+
+ to_chat(hearer, "[speaker_name] ([ghost_follow_link(subject, hearer)]) [message]")
+
+/obj/item/radio/headset/deadsay/talk_into(mob/living/M, list/message_pieces, channel, verbage)
+ var/message = sanitize(copytext(multilingual_to_message(message_pieces), 1, MAX_MESSAGE_LEN))
+
+ if(!message)
+ return
+
+ return M.say_dead(message)
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index fa89ec69b95..0f07e61004e 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -385,6 +385,12 @@
name = "agent card"
initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_VOX, ACCESS_EXTERNAL_AIRLOCKS)
+/obj/item/card/id/syndicate/ghost_bar
+ name = "ghost bar identification card"
+ assignment = "Ghost Bar Occupant"
+ initial_access = list() // This is for show, they don't need actual accesses
+ icon_state = "assistant"
+
/obj/item/card/id/syndicate/command
initial_access = list(ACCESS_MAINT_TUNNELS, ACCESS_SYNDICATE, ACCESS_SYNDICATE_LEADER, ACCESS_SYNDICATE_COMMAND, ACCESS_EXTERNAL_AIRLOCKS)
icon_state = "commander"
diff --git a/code/game/objects/items/weapons/dice.dm b/code/game/objects/items/weapons/dice.dm
index 898eb9cbc09..7b3db4429a6 100644
--- a/code/game/objects/items/weapons/dice.dm
+++ b/code/game/objects/items/weapons/dice.dm
@@ -296,6 +296,7 @@
var/mob/dead/observer/C = pick(candidates)
message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant")
H.key = C.key
+ dust_if_respawnable(C)
to_chat(H, "You are a servant of [user.real_name]. You must do everything in your power to follow their orders.")
var/obj/effect/proc_holder/spell/summonmob/S = new
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index a8c6e0a3634..c45cb9fb02f 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -294,6 +294,7 @@
S.real_name = name
S.name = name
S.ckey = theghost.ckey
+ dust_if_respawnable(theghost)
var/input = stripped_input(S, "What are you named?", null, "", MAX_NAME_LEN)
if(src && input)
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 95725eb0c5a..2c42680c6a3 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -78,6 +78,9 @@
if(istype(I, /obj/item/grab))
user.changeNext_move(CLICK_CD_MELEE)
var/obj/item/grab/G = I
+ if(HAS_TRAIT(user, TRAIT_PACIFISM))
+ to_chat(user, "Swirling [G.affecting] might hurt them!")
+ return
if(!G.confirm())
return
if(isliving(G.affecting))
@@ -204,6 +207,9 @@
var/obj/item/grab/G = I
if(!G.confirm())
return
+ if(HAS_TRAIT(user, TRAIT_PACIFISM))
+ to_chat(user, "Slamming [G.affecting] into [src] might hurt them!")
+ return
if(isliving(G.affecting))
var/mob/living/GM = G.affecting
if(G.state >= GRAB_AGGRESSIVE)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 324eba31f54..26ca159ea94 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -2001,6 +2001,7 @@
var/mob/living/simple_animal/pet/P = new petchoice(H.loc)
theghost = pick(candidates)
P.key = theghost.key
+ dust_if_respawnable(theghost)
P.master_commander = H
P.universal_speak = TRUE
P.universal_understand = TRUE
@@ -3473,6 +3474,7 @@
hunter_mind.active = TRUE
var/mob/living/carbon/human/hunter_mob = new /mob/living/carbon/human(pick(GLOB.latejoin))
hunter_mind.transfer_to(hunter_mob)
+ dust_if_respawnable(C)
hunter_mob.equipOutfit(O, FALSE)
var/obj/item/pinpointer/advpinpointer/N = new /obj/item/pinpointer/advpinpointer(hunter_mob)
hunter_mob.equip_to_slot_or_del(N, SLOT_HUD_IN_BACKPACK)
diff --git a/code/modules/admin/verbs/deathsquad.dm b/code/modules/admin/verbs/deathsquad.dm
index d595a0efea0..92b35362b75 100644
--- a/code/modules/admin/verbs/deathsquad.dm
+++ b/code/modules/admin/verbs/deathsquad.dm
@@ -146,6 +146,7 @@ GLOBAL_VAR_INIT(deathsquad_sent, FALSE)
SSticker.minds += R.mind
SSticker.mode.traitors += R.mind
R.key = ghost_mob.key
+ dust_if_respawnable(ghost_mob)
if(nuke_code)
R.mind.store_memory("Nuke Code: [nuke_code].")
R.mind.store_memory("Mission: [mission].")
@@ -154,6 +155,7 @@ GLOBAL_VAR_INIT(deathsquad_sent, FALSE)
var/mob/living/carbon/human/new_commando = create_deathsquad_commando(L, is_leader)
new_commando.mind.key = ghost_mob.key
new_commando.key = ghost_mob.key
+ dust_if_respawnable(ghost_mob)
new_commando.update_action_buttons_icon()
if(nuke_code)
new_commando.mind.store_memory("Nuke Code: [nuke_code].")
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 90641bbc56e..5a98dc53f27 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -776,7 +776,11 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
if("Clients")
to_chat(usr, jointext(GLOB.clients, ","))
if("Respawnable Mobs")
- to_chat(usr, jointext(GLOB.respawnable_list, ","))
+ var/list/respawnable_mobs
+ for(var/mob/potential_respawnable in GLOB.player_list)
+ if(HAS_TRAIT(potential_respawnable, TRAIT_RESPAWNABLE))
+ respawnable_mobs += potential_respawnable
+ to_chat(usr, jointext(respawnable_mobs, ", "))
/client/proc/cmd_display_del_log()
set category = "Debug"
diff --git a/code/modules/admin/verbs/gimmick_team.dm b/code/modules/admin/verbs/gimmick_team.dm
index 8aabd0e3ef8..a3d853bffd2 100644
--- a/code/modules/admin/verbs/gimmick_team.dm
+++ b/code/modules/admin/verbs/gimmick_team.dm
@@ -75,6 +75,7 @@
H.mind.offstation_role = TRUE
H.key = thisplayer.key
+ dust_if_respawnable(thisplayer)
H.equipOutfit(O, FALSE)
diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm
index 59737e30048..300633da40b 100644
--- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm
+++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm
@@ -85,6 +85,7 @@ GLOBAL_VAR_INIT(sent_syndicate_infiltration_team, 0)
new_syndicate_infiltrator.key = theguy.key
new_syndicate_infiltrator.internal = new_syndicate_infiltrator.s_store
new_syndicate_infiltrator.update_action_buttons_icon()
+ dust_if_respawnable(theguy)
infiltrators -= theguy
to_chat(new_syndicate_infiltrator, "You are a [!syndicate_leader_selected?"Infiltrator":"Lead Infiltrator"] in the service of the Syndicate. \nYour current mission is: [input]")
to_chat(new_syndicate_infiltrator, "You are equipped with an uplink bio-chip to help you achieve your objectives. ((activate it via button in top left of screen))")
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 72eab7162a0..89ba5e45f27 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -148,6 +148,7 @@
var/mob/living/carbon/human/new_character = makeBody(selected)
new_character.mind.make_Wizard()
+ dust_if_respawnable(selected)
return 1
return 0
@@ -330,3 +331,4 @@
to_chat(new_thunderdome_member, "You are a member of the RED Thunderdome team! Gear up and help your team destroy the green team!")
new_thunderdome_member.mind.offstation_role = TRUE
team_to_assign_to = "Green"
+ dust_if_respawnable(candidate_to_spawn)
diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm
index 5e220387636..8ebbd271bb4 100644
--- a/code/modules/antagonists/_common/antag_datum.dm
+++ b/code/modules/antagonists/_common/antag_datum.dm
@@ -300,6 +300,7 @@ GLOBAL_LIST_EMPTY(antagonists)
message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(owner.current)]) to replace a jobbaned player.")
owner.current.ghostize(FALSE)
owner.current.key = C.key
+ dust_if_respawnable(C)
return TRUE
/**
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index f75c7535a3a..6a1034792d2 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -59,6 +59,7 @@
used = TRUE
var/mob/dead/observer/G = pick(nuke_candidates)
spawn_antag(G.client, get_turf(src), user.mind)
+ dust_if_respawnable(G)
do_sparks(4, TRUE, src)
qdel(src)
else
@@ -204,6 +205,7 @@
if(candidates.len > 0)
var/mob/C = pick(candidates)
spawn_antag(C, get_turf(src.loc), initial(demon_type.name), user)
+ dust_if_respawnable(C)
to_chat(user, "[shatter_msg]")
to_chat(user, "[veil_msg]")
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
@@ -291,6 +293,7 @@
if(candidates.len > 0)
var/mob/C = pick(candidates)
spawn_antag(C, get_turf(src.loc), initial(morph_type.name), user)
+ dust_if_respawnable(C)
to_chat(user, "[shatter_msg]")
to_chat(user, "[veil_msg]")
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
@@ -351,6 +354,7 @@
var/mob/C = pick(candidates)
spawn_antag(C, get_turf(src), initial(revenant.name), user)
+ dust_if_respawnable(C)
to_chat(user, "[shatter_msg]")
to_chat(user, "[veil_msg]")
playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, TRUE)
@@ -411,6 +415,7 @@
var/mob/C = pick(candidates)
spawn_antag(C, T, user)
+ dust_if_respawnable(C)
to_chat(user, shatter_msg)
to_chat(user, veil_msg)
playsound(T, 'sound/effects/glassbr1.ogg', 100, TRUE)
diff --git a/code/modules/antagonists/changeling/powers/swap_form.dm b/code/modules/antagonists/changeling/powers/swap_form.dm
index a2c4b902525..f181e3f0134 100644
--- a/code/modules/antagonists/changeling/powers/swap_form.dm
+++ b/code/modules/antagonists/changeling/powers/swap_form.dm
@@ -57,7 +57,7 @@
user.mind.transfer_to(target)
if(ghost && ghost.mind)
ghost.mind.transfer_to(user)
- GLOB.non_respawnable_keys -= ghost.ckey //they have a new body, let them be able to re-enter their corpse if they die
+ GLOB.non_respawnable_keys -= ghost.ckey // Better make sure they can re-enter their new body
user.key = ghost.key
qdel(ghost)
if(ghosted)
diff --git a/code/modules/awaymissions/mob_spawn.dm b/code/modules/awaymissions/mob_spawn.dm
index a4ed6d78648..9d23fccd7ed 100644
--- a/code/modules/awaymissions/mob_spawn.dm
+++ b/code/modules/awaymissions/mob_spawn.dm
@@ -36,29 +36,17 @@
var/death_cooldown = 0 // How long you have to wait after dying before using it again, in deciseconds. People that join as observers are not included.
/obj/effect/mob_spawn/attack_ghost(mob/user)
- if(SSticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable)
- return
- if(!uses)
- to_chat(user, "This spawner is out of charges!")
- return
- if(jobban_isbanned(user, banType) || jobban_isbanned(user, ROLE_SYNDICATE))
- to_chat(user, "You are jobanned!")
- return
- if(cannotPossess(user))
- to_chat(user, "Upon using the antagHUD you forfeited the ability to join the round.")
- return
- if(time_check(user))
+ if(!valid_to_spawn(user))
return
var/ghost_role = alert("Become [mob_name]? (Warning, You can no longer be cloned!)",,"Yes","No")
if(ghost_role == "No")
return
if(!species_prompt())
return
- if(!loc || !uses || QDELETED(src) || QDELETED(user))
+ if(!loc || !uses && !permanent || QDELETED(src) || QDELETED(user))
to_chat(user, "The [name] is no longer usable!")
return
- log_game("[user.ckey] became [mob_name]")
- create(ckey = user.ckey)
+ create(ckey = user.ckey, user = user)
/obj/effect/mob_spawn/Initialize(mapload)
. = ..()
@@ -85,6 +73,22 @@
/obj/effect/mob_spawn/proc/equip(mob/M)
return
+/obj/effect/mob_spawn/proc/valid_to_spawn(mob/user)
+ if(SSticker.current_state != GAME_STATE_PLAYING || !loc || !ghost_usable)
+ return FALSE
+ if(!uses && !permanent)
+ to_chat(user, "This spawner is out of charges!")
+ return FALSE
+ if(jobban_isbanned(user, banType) || jobban_isbanned(user, ROLE_SYNDICATE))
+ to_chat(user, "You are jobanned!")
+ return FALSE
+ if(cannotPossess(user))
+ to_chat(user, "Upon using the antagHUD you forfeited the ability to join the round.")
+ return FALSE
+ if(time_check(user))
+ return FALSE
+ return TRUE
+
/obj/effect/mob_spawn/proc/time_check(mob/user)
var/deathtime = world.time - user.timeofdeath
var/joinedasobserver = FALSE
@@ -109,7 +113,8 @@
return TRUE
return FALSE
-/obj/effect/mob_spawn/proc/create(ckey, flavour = TRUE, name)
+/obj/effect/mob_spawn/proc/create(ckey, flavour = TRUE, name, mob/user = usr)
+ log_game("[ckey] became [mob_name]")
var/mob/living/M = new mob_type(get_turf(src)) //living mobs only
if(!random)
M.real_name = mob_name ? mob_name : M.name
diff --git a/code/modules/events/abductor_event.dm b/code/modules/events/abductor_event.dm
index 505749ff8c8..0557f3f131f 100644
--- a/code/modules/events/abductor_event.dm
+++ b/code/modules/events/abductor_event.dm
@@ -21,9 +21,9 @@
else
temp = new
- var/agent_mind = pick(candidates)
+ var/mob/agent_mind = pick(candidates)
candidates -= agent_mind
- var/scientist_mind = pick(candidates)
+ var/mob/scientist_mind = pick(candidates)
var/mob/living/carbon/human/agent=makeBody(agent_mind)
var/mob/living/carbon/human/scientist=makeBody(scientist_mind)
@@ -41,6 +41,8 @@
temp.abductors |= list(agent_mind,scientist_mind)
temp.make_abductor_team(number,preset_scientist=scientist_mind,preset_agent=agent_mind)
temp.post_setup_team(number)
+ dust_if_respawnable(agent_mind)
+ dust_if_respawnable(scientist)
SSticker.mode.abductor_teams++
diff --git a/code/modules/events/alien_infestation.dm b/code/modules/events/alien_infestation.dm
index 16f275cb652..858f8ef45b0 100644
--- a/code/modules/events/alien_infestation.dm
+++ b/code/modules/events/alien_infestation.dm
@@ -30,10 +30,10 @@
var/obj/vent = pick_n_take(vents)
var/mob/C = pick_n_take(candidates)
if(C)
- C.remove_from_respawnable_list()
var/mob/living/carbon/alien/larva/new_xeno = new(vent.loc)
new_xeno.amount_grown += (0.75 * new_xeno.max_grown) //event spawned larva start off almost ready to evolve.
new_xeno.key = C.key
+ dust_if_respawnable(C)
new_xeno.forceMove(vent)
new_xeno.add_ventcrawl(vent)
if(SSticker && SSticker.mode)
diff --git a/code/modules/events/blob/blob_powers.dm b/code/modules/events/blob/blob_powers.dm
index f1a921ade14..915dee590b1 100644
--- a/code/modules/events/blob/blob_powers.dm
+++ b/code/modules/events/blob/blob_powers.dm
@@ -240,6 +240,7 @@
var/mob/C = pick(candidates)
if(C)
blobber.key = C.key
+ dust_if_respawnable(C)
to_chat(blobber, "You are a blobbernaut! You must assist all blob lifeforms in their mission to consume everything!")
to_chat(blobber, "You heal while standing on blob structures, however you will decay slowly if you are damaged outside of the blob.")
if(!blobber.ckey)
diff --git a/code/modules/events/blob/blob_structures/blob_core.dm b/code/modules/events/blob/blob_structures/blob_core.dm
index de7117334a5..d31be32c6c7 100644
--- a/code/modules/events/blob/blob_structures/blob_core.dm
+++ b/code/modules/events/blob/blob_structures/blob_core.dm
@@ -119,6 +119,7 @@
var/mob/camera/blob/B = new(loc)
B.is_offspring = is_offspring
B.key = C.key
+ dust_if_respawnable(C)
B.blob_core = src
overmind = B
color = overmind.blob_reagent_datum.color
diff --git a/code/modules/events/blob_spawn.dm b/code/modules/events/blob_spawn.dm
index 9fbff9dca07..4220569f120 100644
--- a/code/modules/events/blob_spawn.dm
+++ b/code/modules/events/blob_spawn.dm
@@ -25,6 +25,7 @@
var/mob/living/simple_animal/mouse/blobinfected/B = new(vent.loc)
var/mob/M = pick(candidates)
B.key = M.key
+ dust_if_respawnable(M)
B.mind.special_role = SPECIAL_ROLE_BLOB
B.forceMove(vent)
B.add_ventcrawl(vent)
diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm
index d2e4b05191b..454aa0f9a64 100644
--- a/code/modules/events/sentience.dm
+++ b/code/modules/events/sentience.dm
@@ -24,6 +24,7 @@
var/mob/SG = pick(candidates)
SA.key = SG.key
+ dust_if_respawnable(SG)
SA.universal_speak = TRUE
SA.sentience_act()
SA.can_collar = TRUE
diff --git a/code/modules/events/slaughterevent.dm b/code/modules/events/slaughterevent.dm
index 30332a91e39..851ec6aeb48 100644
--- a/code/modules/events/slaughterevent.dm
+++ b/code/modules/events/slaughterevent.dm
@@ -17,6 +17,7 @@
var/datum/mind/player_mind = new /datum/mind(key_of_slaughter)
player_mind.active = TRUE
+ dust_if_respawnable(C)
var/turf/spawn_loc = get_spawn_loc(player_mind.current)
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(spawn_loc)
var/mob/living/simple_animal/demon/S = new demon(holder)
diff --git a/code/modules/events/spider_terror.dm b/code/modules/events/spider_terror.dm
index c90115a7518..d5805c75a56 100644
--- a/code/modules/events/spider_terror.dm
+++ b/code/modules/events/spider_terror.dm
@@ -64,6 +64,7 @@
var/mob/living/simple_animal/hostile/poison/terror_spider/S = new spider_type(vent.loc)
var/mob/M = pick_n_take(candidates)
S.key = M.key
+ dust_if_respawnable(M)
if(infestation_type != PRINCE_SPIDER)
S.forceMove(vent)
S.add_ventcrawl(vent)
diff --git a/code/modules/events/traders.dm b/code/modules/events/traders.dm
index b787cf3247e..370d40e62fc 100644
--- a/code/modules/events/traders.dm
+++ b/code/modules/events/traders.dm
@@ -53,9 +53,9 @@ GLOBAL_LIST_INIT(unused_trade_stations, list("sol"))
var/mob/C = pick_n_take(candidates)
spawn_count--
if(C)
- C.remove_from_respawnable_list()
var/mob/living/carbon/human/M = new /mob/living/carbon/human(picked_loc)
M.ckey = C.ckey // must be before equipOutfit, or that will runtime due to lack of mind
+ dust_if_respawnable(C)
M.equipOutfit(/datum/outfit/admin/sol_trader)
M.dna.species.after_equip_job(null, M)
for(var/datum/objective/O in trader_objectives)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
index 071d0e79984..e6b9d5dadc0 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/cooker.dm
@@ -83,6 +83,9 @@
return FALSE
if(!istype(G))
return FALSE
+ if(HAS_TRAIT(user, TRAIT_PACIFISM))
+ to_chat(user, "Slamming [G.affecting] into [src] might hurt them!")
+ return FALSE
if(!iscarbon(G.affecting))
if(verbose)
to_chat(user, "You can't shove that in there!")
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index 03eb285916b..4466a0e88b2 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -117,6 +117,9 @@
return TRUE
else if(istype(O, /obj/item/grab))
var/obj/item/grab/G = O
+ if(HAS_TRAIT(user, TRAIT_PACIFISM))
+ to_chat(user, "Slamming [G.affecting] into [src] might hurt them!")
+ return
return special_attack_grab(G, user)
else
to_chat(user, "You have no idea what you can cook with [O].")
diff --git a/code/modules/mob/dead/observer/observer_base.dm b/code/modules/mob/dead/observer/observer_base.dm
index 1139f0dcde2..bdf9ca761b2 100644
--- a/code/modules/mob/dead/observer/observer_base.dm
+++ b/code/modules/mob/dead/observer/observer_base.dm
@@ -93,6 +93,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
..()
plane = GAME_PLANE
add_observer_verbs()
+ ADD_TRAIT(src, TRAIT_RESPAWNABLE, GHOSTED)
/mob/dead/observer/Destroy()
toggle_all_huds_off()
@@ -178,9 +179,8 @@ Works together with spawning an observer, noted above.
flags &= ~GHOST_CAN_REENTER
var/mob/dead/observer/ghost = new(src, flags) //Transfer safety to observer spawning proc.
ghost.timeofdeath = src.timeofdeath //BS12 EDIT
- remove_from_respawnable_list()
if(ghost.can_reenter_corpse)
- ghost.add_to_respawnable_list()
+ ADD_TRAIT(ghost, TRAIT_RESPAWNABLE, GHOSTED)
else
GLOB.non_respawnable_keys[ckey] = 1
ghost.key = key
@@ -203,6 +203,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
message_admins("[key_name_admin(src)] tried to ghost while admin frozen")
return
+ if(HAS_TRAIT(M, TRAIT_RESPAWNABLE))
+ ghostize(1)
+ return
if(P)
if(TOO_EARLY_TO_GHOST)
warningmsg = "It's too early in the shift to enter cryo"
@@ -280,7 +283,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
statpanel("Status")
if(client.statpanel == "Status")
show_stat_emergency_shuttle_eta()
- stat(null, "Respawnability: [(src in GLOB.respawnable_list) ? "Yes" : "No"]")
+ stat(null, "Respawnability: [HAS_TRAIT(src, TRAIT_RESPAWNABLE) ? "Yes" : "No"]")
/mob/dead/observer/verb/reenter_corpse()
set category = "Ghost"
diff --git a/code/modules/mob/dead/observer/observer_login.dm b/code/modules/mob/dead/observer/observer_login.dm
index 73e938e14fe..543441753a9 100644
--- a/code/modules/mob/dead/observer/observer_login.dm
+++ b/code/modules/mob/dead/observer/observer_login.dm
@@ -6,4 +6,4 @@
if(GLOB.non_respawnable_keys[ckey])
can_reenter_corpse = 0
- remove_from_respawnable_list()
+ REMOVE_TRAIT(src, TRAIT_RESPAWNABLE, GHOSTED)
diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
index 0e724583af1..b6d3568ca88 100644
--- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
+++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm
@@ -100,6 +100,7 @@
owner.cut_overlay(overlay)
var/mob/living/carbon/alien/larva/new_xeno = new(owner.drop_location())
new_xeno.key = C.key
+ dust_if_respawnable(C)
if(SSticker && SSticker.mode)
SSticker.mode.xenos += new_xeno.mind
new_xeno.mind.name = new_xeno.name
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 50d3990f7c7..52fcc5dc666 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -52,9 +52,9 @@
B.brainmob = null
brainmob.container = src
brainmob.forceMove(src)
+ REMOVE_TRAIT(brainmob, TRAIT_RESPAWNABLE, GHOSTED)
brainmob.set_stat(CONSCIOUS)
brainmob.see_invisible = initial(brainmob.see_invisible)
- brainmob.remove_from_respawnable_list()
GLOB.dead_mob_list -= brainmob//Update dem lists
GLOB.alive_mob_list += brainmob
@@ -159,7 +159,7 @@
brainmob.container = null//Reset brainmob mmi var.
brainmob.forceMove(held_brain) //Throw mob into brain.
- brainmob.add_to_respawnable_list()
+ ADD_TRAIT(brainmob, TRAIT_RESPAWNABLE, GHOSTED)
GLOB.alive_mob_list -= brainmob//Get outta here
held_brain.brainmob = brainmob//Set the brain to use the brainmob
held_brain.brainmob.cancel_camera()
diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm
index 4501bfb5af3..211b99e16a6 100644
--- a/code/modules/mob/living/death.dm
+++ b/code/modules/mob/living/death.dm
@@ -78,7 +78,7 @@
GLOB.dead_mob_list += src
if(mind)
mind.store_memory("Time of death: [station_time_timestamp("hh:mm:ss", timeofdeath)]", 0)
- add_to_respawnable_list()
+ ADD_TRAIT(src, TRAIT_RESPAWNABLE, GHOSTED)
if(mind.name && !isbrain(src)) // !isbrain() is to stop it from being called twice
var/turf/T = get_turf(src)
diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm
index d9ae97273c6..c0edae00b92 100644
--- a/code/modules/mob/living/silicon/pai/recruit.dm
+++ b/code/modules/mob/living/silicon/pai/recruit.dm
@@ -49,7 +49,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
var/mob/dead/observer/O = locate(href_list["signup"])
if(!O)
return
- if(!(O in GLOB.respawnable_list))
+ if(!HAS_TRAIT(O, TRAIT_RESPAWNABLE))
to_chat(O, "You've given up your ability to respawn!")
return
if(!check_recruit(O))
@@ -232,7 +232,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
var/list/available = list()
for(var/datum/pai_save/c in GLOB.paiController.pai_candidates)
var/found = 0
- for(var/mob/o in GLOB.respawnable_list)
+ for(var/mob/dead/observer/o in GLOB.player_list)
if(o.ckey == c.owner.ckey)
found = 1
if(found)
@@ -357,7 +357,7 @@ GLOBAL_DATUM_INIT(paiController, /datum/paiController, new) // Global handler fo
return 0
if(cannotPossess(O))
return 0
- if(!(O in GLOB.respawnable_list))
+ if(!HAS_TRAIT(O, TRAIT_RESPAWNABLE))
return 0
if(O.client)
return 1
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index 8c8c7e266eb..2323be439dd 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -63,7 +63,7 @@
ghost_can_reenter = 1
break
for(var/mob/living/simple_animal/S in GLOB.player_list)
- if(S in GLOB.respawnable_list)
+ if(HAS_TRAIT(S, TRAIT_RESPAWNABLE))
ghost_can_reenter = 1
break
if(!ghost_can_reenter)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm
index 78f5321413f..67446260ad6 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining/elites/elite.dm
@@ -234,6 +234,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
if(boosted)
mychild.key = elitemind.key
mychild.sentience_act()
+ dust_if_respawnable(elitemind)
notify_ghosts("\A [mychild] has been awakened in \the [get_area(src)]!", enter_link="(Click to help)", source = mychild, action = NOTIFY_FOLLOW)
icon_state = "tumor_popped"
RegisterSignal(mychild, COMSIG_PARENT_QDELETING, PROC_REF(onEliteLoss))
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_ghost_interaction.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_ghost_interaction.dm
index 35543131687..b7340a936e0 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_ghost_interaction.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_ghost_interaction.dm
@@ -1,9 +1,9 @@
/mob/living/simple_animal/hostile/poison/terror_spider/Topic(href, href_list)
if(href_list["activate"])
- var/mob/dead/observer/ghost = usr
- if(istype(ghost))
- humanize_spider(ghost)
+ var/mob/user = usr
+ if(HAS_TRAIT(user, TRAIT_RESPAWNABLE))
+ humanize_spider(user)
/mob/living/simple_animal/hostile/poison/terror_spider/attack_ghost(mob/user)
humanize_spider(user)
@@ -24,7 +24,7 @@
error_on_humanize = "Dying spiders are not player-controllable."
else if(stat == DEAD)
error_on_humanize = "Dead spiders are not player-controllable."
- else if(!(user in GLOB.respawnable_list))
+ else if(!HAS_TRAIT(user, TRAIT_RESPAWNABLE))
error_on_humanize = "You are not able to rejoin the round."
if(jobban_isbanned(user, ROLE_SYNDICATE) || jobban_isbanned(user, ROLE_TSPIDER))
to_chat(user, "You are jobbanned from role of syndicate and/or terror spider.")
diff --git a/code/modules/mob/living/stat_states.dm b/code/modules/mob/living/stat_states.dm
index 9b81310fa61..c55ba82fedd 100644
--- a/code/modules/mob/living/stat_states.dm
+++ b/code/modules/mob/living/stat_states.dm
@@ -62,9 +62,7 @@
GLOB.dead_mob_list -= src
GLOB.alive_mob_list |= src
-
- if(mind)
- remove_from_respawnable_list()
+ REMOVE_TRAIT(src, TRAIT_RESPAWNABLE, GHOSTED)
timeofdeath = null
if(updating)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 9cb51cd2f6a..6a43ca32ea1 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1148,14 +1148,6 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
/mob/proc/activate_hand(selhand)
return
-/mob/proc/add_to_respawnable_list()
- GLOB.respawnable_list += src
- RegisterSignal(src, COMSIG_PARENT_QDELETING, PROC_REF(remove_from_respawnable_list))
-
-/mob/proc/remove_from_respawnable_list()
- GLOB.respawnable_list -= src
- UnregisterSignal(src, COMSIG_PARENT_QDELETING)
-
/mob/dead/observer/verb/respawn()
set name = "Respawn as NPC"
set category = "Ghost"
@@ -1168,7 +1160,7 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
to_chat(src, "You can't respawn as an NPC before the game starts!")
return
- if((usr in GLOB.respawnable_list) && (stat == DEAD || isobserver(usr)))
+ if((HAS_TRAIT(usr, TRAIT_RESPAWNABLE)) && (stat == DEAD || isobserver(usr)))
var/list/creatures = list("Mouse")
for(var/mob/living/simple_animal/L in GLOB.alive_mob_list)
if(!(is_station_level(L.z) || is_admin_level(L.z))) // Prevents players from spawning in space
@@ -1178,12 +1170,10 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
var/picked = input("Please select an NPC to respawn as", "Respawn as NPC") as null|anything in creatures
switch(picked)
if("Mouse")
- if(become_mouse()) // Only remove respawnability if the player successfully becomes a mouse
- remove_from_respawnable_list()
+ become_mouse()
else
var/mob/living/NPC = picked
if(istype(NPC) && !NPC.key)
- remove_from_respawnable_list()
NPC.key = key
else
to_chat(usr, "You are not dead or you have given up your right to be respawned!")
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 0d90fa7294d..cac0964ad69 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -308,6 +308,8 @@
return
if(INTENT_HARM) //This checks that the user is on harm intent.
+ if(HAS_TRAIT(user, TRAIT_PACIFISM))
+ return
if(last_hit_zone == "head") //This checks the hitzone the user has selected. In this specific case, they have the head selected.
if(IS_HORIZONTAL(affecting))
return
diff --git a/code/modules/mob/mob_misc_procs.dm b/code/modules/mob/mob_misc_procs.dm
index 5425a2f2dd8..dae13da550a 100644
--- a/code/modules/mob/mob_misc_procs.dm
+++ b/code/modules/mob/mob_misc_procs.dm
@@ -184,6 +184,7 @@
message_admins("[key_name_admin(theghost)] has taken control of ([key_name_admin(M)])")
M.ghostize()
M.key = theghost.key
+ dust_if_respawnable(theghost)
else
to_chat(M, "There were no ghosts willing to take control.")
message_admins("No ghosts were willing to take control of [key_name_admin(M)])")
@@ -521,6 +522,9 @@ GLOBAL_LIST_INIT(intents, list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM
else
name = realname
+ for(var/obj/item/radio/deadsay_radio_system as anything in GLOB.deadsay_radio_systems)
+ deadsay_radio_system.attempt_send_deadsay_message(subject, message)
+
for(var/mob/M in GLOB.player_list)
if(M.client && ((!isnewplayer(M) && M.stat == DEAD) || check_rights(R_ADMIN|R_MOD,0,M)) && M.get_preference(PREFTOGGLE_CHAT_DEAD))
var/follow
@@ -547,8 +551,8 @@ GLOBAL_LIST_INIT(intents, list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM
to_chat(M, "[lname][follow][message]")
/proc/notify_ghosts(message, ghost_sound = null, enter_link = null, title = null, atom/source = null, image/alert_overlay = null, flashwindow = TRUE, action = NOTIFY_JUMP, role = null) //Easy notification of ghosts.
- for(var/mob/dead/observer/O in GLOB.player_list)
- if(O.client && (!role || (role in O.client.prefs.be_special)))
+ for(var/mob/O in GLOB.player_list)
+ if(O.client && HAS_TRAIT(O, TRAIT_RESPAWNABLE) && (!role || (role in O.client.prefs.be_special)))
to_chat(O, "[message][(enter_link) ? " [enter_link]" : ""]")
if(ghost_sound)
SEND_SOUND(O, sound(ghost_sound))
@@ -797,3 +801,6 @@ GLOBAL_LIST_INIT(intents, list(INTENT_HELP,INTENT_DISARM,INTENT_GRAB,INTENT_HARM
return "unconscious"
if(DEAD)
return "dead"
+
+/mob/proc/attempt_listen_to_deadsay()
+
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 8c09a9b895e..b22e65e7047 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -203,7 +203,7 @@
observer.real_name = client.prefs.active_character.real_name
observer.name = observer.real_name
observer.key = key
- observer.add_to_respawnable_list()
+ ADD_TRAIT(observer, TRAIT_RESPAWNABLE, GHOSTED)
qdel(src)
return TRUE
return FALSE
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 30a1513f3fe..b2d11efbd68 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -240,6 +240,7 @@
if(candidates.len)
var/mob/C = pick(candidates)
SM.key = C.key
+ dust_if_respawnable(C)
SM.universal_speak = TRUE
SM.faction = user.faction
SM.master_commander = user
diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm
index 5b1847a4302..55e6ab2a086 100644
--- a/code/modules/response_team/ert.dm
+++ b/code/modules/response_team/ert.dm
@@ -34,7 +34,7 @@ GLOBAL_LIST_EMPTY(ert_request_messages)
E.ui_interact(usr)
-/mob/dead/observer/proc/JoinResponseTeam()
+/mob/proc/JoinResponseTeam()
if(!GLOB.send_emergency_team)
to_chat(src, "No emergency response team is currently being sent.")
return FALSE
@@ -68,18 +68,18 @@ GLOBAL_LIST_EMPTY(ert_request_messages)
return
// Respawnable players get first dibs
- for(var/mob/dead/observer/M in ert_candidates)
+ for(var/mob/M in ert_candidates)
if(jobban_isbanned(M, ROLE_TRAITOR) || jobban_isbanned(M, "Security Officer") || jobban_isbanned(M, "Captain") || jobban_isbanned(M, "Cyborg"))
continue
- if((M in GLOB.respawnable_list) && M.JoinResponseTeam())
+ if((HAS_TRAIT(M, TRAIT_RESPAWNABLE)) && M.JoinResponseTeam())
GLOB.response_team_members |= M
- M.RegisterSignal(M, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/mob/dead/observer, remove_from_ert_list), TRUE)
+ M.RegisterSignal(M, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/mob, remove_from_ert_list), TRUE)
// If there's still open slots, non-respawnable players can fill them
- for(var/mob/dead/observer/M in (ert_candidates - GLOB.respawnable_list))
+ for(var/mob/M in (ert_candidates - GLOB.response_team_members))
if(M.JoinResponseTeam())
GLOB.response_team_members |= M
- M.RegisterSignal(M, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/mob/dead/observer, remove_from_ert_list), TRUE)
+ M.RegisterSignal(M, COMSIG_PARENT_QDELETING, TYPE_PROC_REF(/mob, remove_from_ert_list), TRUE)
if(!length(GLOB.response_team_members))
GLOB.active_team.cannot_send_team()
@@ -133,6 +133,7 @@ GLOBAL_LIST_EMPTY(ert_request_messages)
break
new_commando.mind.key = M.key
new_commando.key = M.key
+ dust_if_respawnable(M)
new_commando.update_icons()
break
GLOB.send_emergency_team = FALSE
@@ -220,10 +221,9 @@ GLOBAL_LIST_EMPTY(ert_request_messages)
return M
-/mob/dead/observer/proc/remove_from_ert_list(ghost)
+/mob/proc/remove_from_ert_list(ghost)
SIGNAL_HANDLER
GLOB.response_team_members -= src
- remove_from_respawnable_list()
/datum/response_team
var/list/slots = list(
diff --git a/code/modules/ruins/ghost_bar.dm b/code/modules/ruins/ghost_bar.dm
new file mode 100644
index 00000000000..9042475276b
--- /dev/null
+++ b/code/modules/ruins/ghost_bar.dm
@@ -0,0 +1,108 @@
+/obj/effect/mob_spawn/human/alive/ghost_bar
+ name = "ghastly rejuvenator"
+ mob_name = "ghost bar occupant"
+ permanent = TRUE
+ icon = 'icons/obj/closet.dmi'
+ icon_state = "coffin"
+ important_info = "Don't randomly attack people in the ghost bar, stay inside the ghost bar. You will still be able to roll for ghost roles."
+ description = "Relax, get a beer, watch the station destroy itself and burst into flames."
+ flavour_text = "You are a ghost bar occupant. You've gotten sick of being dead and decided to meet up with some of your fellow haunting brothers. Take a seat, grab a beer, and chat it out."
+ assignedrole = "Ghost Bar Occupant"
+ death_cooldown = 1 MINUTES
+
+/obj/effect/mob_spawn/human/alive/ghost_bar/create(ckey, flavour = TRUE, name, mob/user = usr) // So divorced from the normal proc it's just being overriden
+ var/datum/character_save/save_to_load
+ if(alert(user, "Would you like to use one of your saved characters in your character creator?",, "Yes", "No") == "Yes")
+ var/list/our_characters_names = list()
+ var/list/our_character_saves = list()
+ for(var/datum/character_save/saves in user.client.prefs.character_saves)
+ our_characters_names += saves.real_name
+ our_character_saves += list(saves.real_name = saves)
+
+ var/character_name = input("Select a character", "Character selection") as null|anything in our_characters_names
+ if(!character_name)
+ return
+ if(QDELETED(user))
+ return
+ save_to_load = our_character_saves[character_name]
+ else
+ if(QDELETED(user))
+ return
+ save_to_load = new
+ save_to_load.randomise()
+ var/mob/living/carbon/human/H = new(get_turf(src))
+
+ save_to_load.copy_to(H)
+ if(!H.back)
+ equip_item(H, /obj/item/storage/backpack, SLOT_HUD_BACK)
+ equip_item(H, /obj/item/radio/headset/deadsay, SLOT_HUD_LEFT_EAR)
+ H.dna.species.before_equip_job(/datum/job/assistant, H)
+ H.dna.species.remains_type = /obj/effect/decal/cleanable/ash
+ var/obj/item/implant/dust/I = new
+ I.implant(H, null)
+ for(var/gear in save_to_load.loadout_gear)
+ var/datum/gear/G = GLOB.gear_datums[text2path(gear) || gear]
+ if(G.allowed_roles) // Fix due to shitty HUD code
+ continue
+ if(G.slot)
+ if(H.equip_to_slot_or_del(G.spawn_item(H), G.slot, TRUE))
+ to_chat(H, "Equipping you with [G.display_name]!")
+ else
+ H.equip_or_collect(G.spawn_item(null, save_to_load.loadout_gear[G.display_name]))
+ if(!H.w_uniform)
+ equip_item(H, /obj/item/clothing/under/color/random, SLOT_HUD_JUMPSUIT)
+ if(!H.shoes)
+ equip_item(H, /obj/item/clothing/shoes/black, SLOT_HUD_SHOES)
+ equip_item(H, /obj/item/stack/spacecash/c100, SLOT_HUD_LEFT_STORE)
+
+ var/obj/item/card/id/syndicate/our_id = equip_item(H, /obj/item/card/id/syndicate/ghost_bar, SLOT_HUD_WEAR_ID)
+ our_id.assignment = assignedrole
+ our_id.registered_name = H.real_name
+ our_id.sex = capitalize(H.gender)
+ our_id.age = H.age
+ our_id.name = "[our_id.registered_name]'s ID Card ([our_id.assignment])"
+ our_id.photo = get_id_photo(H)
+ our_id.owner_uid = H.UID()
+ our_id.owner_ckey = H.ckey
+ H.job = assignedrole
+
+ H.dna.ready_dna(H)
+ H.mind_initialize()
+ H.mind.assigned_role = assignedrole
+ H.mind.special_role = assignedrole
+ H.mind.offstation_role = TRUE
+ ADD_TRAIT(H, TRAIT_PACIFISM, GHOST_ROLE)
+ ADD_TRAIT(H, TRAIT_RESPAWNABLE, GHOST_ROLE)
+
+ H.key = ckey
+ H.dna.species.after_equip_job(/datum/job/assistant, H)
+ if(isgrey(H))
+ var/obj/item/organ/internal/cyberimp/brain/speech_translator/implant = new
+ implant.insert(H)
+ log_game("[ckey] has entered the ghost bar")
+ playsound(src, 'sound/machines/wooden_closet_open.ogg', 50)
+
+/obj/effect/mob_spawn/human/alive/ghost_bar/proc/equip_item(mob/living/carbon/human/H, path, slot)
+ var/obj/item/I = new path(H)
+ H.equip_or_collect(I, slot, TRUE)
+ return I
+
+/obj/structure/ghost_bar_cryopod
+ name = "returning sarcophagus"
+ desc = "Returns you back to the world of the dead."
+ icon = 'icons/obj/closet.dmi'
+ icon_state = "coffin_open"
+
+/obj/structure/ghost_bar_cryopod/MouseDrop_T(mob/living/carbon/human/mob_to_delete, mob/living/user)
+ if(!istype(mob_to_delete) || !istype(user) || !Adjacent(user))
+ return
+ if(mob_to_delete.client)
+ if(alert(mob_to_delete , "Would you like to return to the realm of spirits? (This will delete your current character, but you can rejoin later)",, "Yes", "No") == "No")
+ return
+ mob_to_delete.visible_message("[mob_to_delete.name] climbs into [src]...")
+ playsound(src, 'sound/machines/wooden_closet_close.ogg', 50)
+ qdel(mob_to_delete)
+
+/proc/dust_if_respawnable(mob/M)
+ if(HAS_TRAIT_FROM(M, TRAIT_RESPAWNABLE, GHOST_ROLE))
+ M.dust()
diff --git a/code/modules/tgui/modules/ghost_hud_panel.dm b/code/modules/tgui/modules/ghost_hud_panel.dm
index 2fa63bd345b..54a52787f8b 100644
--- a/code/modules/tgui/modules/ghost_hud_panel.dm
+++ b/code/modules/tgui/modules/ghost_hud_panel.dm
@@ -69,7 +69,7 @@ GLOBAL_DATUM_INIT(ghost_hud_panel, /datum/ui_module/ghost_hud_panel, new)
ghost.has_enabled_antagHUD = TRUE
ghost.can_reenter_corpse = FALSE
- ghost.remove_from_respawnable_list()
+ REMOVE_TRAIT(ghost, TRAIT_RESPAWNABLE, GHOSTED)
ghost.antagHUD = TRUE
for(var/datum/atom_hud/antag/H in GLOB.huds)
diff --git a/paradise.dme b/paradise.dme
index 8a9f3b08384..8adcdde194e 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -2578,6 +2578,7 @@
#include "code\modules\research\xenobiology\xenobiology.dm"
#include "code\modules\response_team\ert.dm"
#include "code\modules\response_team\ert_outfits.dm"
+#include "code\modules\ruins\ghost_bar.dm"
#include "code\modules\ruins\ruin_areas.dm"
#include "code\modules\ruins\syndicate_space_base.dm"
#include "code\modules\ruins\lavalandruin_code\ash_walker_den.dm"