From 6df2c2e3d24820e2a6f9c6e427640164a30d43cb Mon Sep 17 00:00:00 2001 From: GDN <96800819+GDNgit@users.noreply.github.com> Date: Mon, 9 Oct 2023 13:47:17 -0500 Subject: [PATCH] Ghost bar (#22368) * Ghost bar initial changes * more changes * we ball again brothers * we are (once again) SO back * Update code/modules/admin/verbs/debug.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> * Update code/_onclick/hud/alert.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> * Update code/_onclick/hud/alert.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> * Update code/modules/ruins/ghost_bar.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Update code/modules/ruins/ghost_bar.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Update code/modules/ruins/ghost_bar.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Update code/modules/ruins/ghost_bar.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Update code/modules/ruins/ghost_bar.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Update code/game/objects/items/weapons/cards_ids.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * deck of cards and shittt * global placement * Update code/modules/ruins/ghost_bar.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * readded * hotfix * zamn * fixes * greyfix * last of the fixes * can't stop me baby * bam --------- Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> --- _maps/map_files/generic/centcomm.dmm | 3328 +++++++++++------ code/__HELPERS/trait_helpers.dm | 3 + code/_globalvars/lists/mob_lists.dm | 1 - code/_onclick/hud/alert.dm | 10 +- code/controllers/subsystem/SSghost_spawns.dm | 25 +- code/datums/spawners_menu.dm | 5 +- code/datums/spells/mind_transfer.dm | 2 +- code/game/area/centcom_areas.dm | 7 + code/game/gamemodes/cult/runes.dm | 1 + code/game/gamemodes/game_mode.dm | 1 + .../demons/slaughter demon/slaughter.dm | 1 + .../gamemodes/miniantags/guardian/guardian.dm | 1 + .../miniantags/guardian/host_actions.dm | 1 + .../gamemodes/miniantags/morph/morph_event.dm | 1 + .../miniantags/morph/spells/reproduce.dm | 1 + .../miniantags/pulsedemon/pulsedemon_event.dm | 3 +- .../gamemodes/miniantags/revenant/revenant.dm | 3 +- .../revenant/revenant_spawn_event.dm | 1 + code/game/gamemodes/wizard/artefact.dm | 2 + code/game/gamemodes/wizard/raginmages.dm | 1 + code/game/gamemodes/wizard/soulstone.dm | 1 + code/game/machinery/cryopod.dm | 2 +- code/game/machinery/doors/airlock_types.dm | 12 + code/game/machinery/transformer.dm | 1 + code/game/machinery/vendors/vending.dm | 9 +- code/game/objects/effects/anomalies.dm | 1 + code/game/objects/effects/spiders.dm | 1 + .../items/devices/radio/radio_objects.dm | 47 + code/game/objects/items/weapons/cards_ids.dm | 6 + code/game/objects/items/weapons/dice.dm | 1 + .../objects/items/weapons/holy_weapons.dm | 1 + code/game/objects/structures/watercloset.dm | 6 + code/modules/admin/topic.dm | 2 + code/modules/admin/verbs/deathsquad.dm | 2 + code/modules/admin/verbs/debug.dm | 6 +- code/modules/admin/verbs/gimmick_team.dm | 1 + .../admin/verbs/infiltratorteam_syndicate.dm | 1 + code/modules/admin/verbs/one_click_antag.dm | 2 + .../antagonists/_common/antag_datum.dm | 1 + .../antagonists/_common/antag_spawner.dm | 5 + .../changeling/powers/swap_form.dm | 2 +- code/modules/awaymissions/mob_spawn.dm | 37 +- code/modules/events/abductor_event.dm | 6 +- code/modules/events/alien_infestation.dm | 2 +- code/modules/events/blob/blob_powers.dm | 1 + .../events/blob/blob_structures/blob_core.dm | 1 + code/modules/events/blob_spawn.dm | 1 + code/modules/events/sentience.dm | 1 + code/modules/events/slaughterevent.dm | 1 + code/modules/events/spider_terror.dm | 1 + code/modules/events/traders.dm | 2 +- .../kitchen_machinery/cooker.dm | 3 + .../kitchen_machinery/kitchen_machine.dm | 3 + .../mob/dead/observer/observer_base.dm | 9 +- .../mob/dead/observer/observer_login.dm | 2 +- .../carbon/alien/special/alien_embryo.dm | 1 + code/modules/mob/living/carbon/brain/MMI.dm | 4 +- code/modules/mob/living/death.dm | 2 +- .../modules/mob/living/silicon/pai/recruit.dm | 6 +- .../simple_animal/friendly/spiderbot.dm | 2 +- .../hostile/mining/elites/elite.dm | 1 + .../terror_ghost_interaction.dm | 8 +- code/modules/mob/living/stat_states.dm | 4 +- code/modules/mob/mob.dm | 14 +- code/modules/mob/mob_grab.dm | 2 + code/modules/mob/mob_misc_procs.dm | 11 +- code/modules/mob/new_player/new_player.dm | 2 +- .../research/xenobiology/xenobiology.dm | 1 + code/modules/response_team/ert.dm | 16 +- code/modules/ruins/ghost_bar.dm | 108 + code/modules/tgui/modules/ghost_hud_panel.dm | 2 +- paradise.dme | 1 + 72 files changed, 2640 insertions(+), 1123 deletions(-) create mode 100644 code/modules/ruins/ghost_bar.dm 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"