diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 7e095329af..6129d263fd 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2108,10 +2108,6 @@ }, /turf/closed/indestructible/riveted, /area/space) -"fy" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/tdome/arena_source) "fz" = ( /turf/open/floor/plasteel, /area/tdome/arena_source) @@ -4830,7 +4826,7 @@ pixel_x = 25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "mb" = ( /obj/structure/table/reinforced, @@ -6429,7 +6425,7 @@ /obj/machinery/light{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "oX" = ( /obj/structure/bookcase/random, @@ -6800,7 +6796,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "pH" = ( /obj/structure/table/wood, @@ -7316,7 +7312,7 @@ color = "#596479"; dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "qQ" = ( /obj/machinery/door/airlock/centcom{ @@ -8702,7 +8698,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "tX" = ( /obj/machinery/door/airlock{ @@ -8717,7 +8713,7 @@ /area/centcom/supplypod) "tZ" = ( /obj/structure/chair/wood/normal, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "uc" = ( /obj/effect/turf_decal/tile/green{ @@ -9330,7 +9326,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "vt" = ( /obj/structure/rack, @@ -9338,7 +9334,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "vu" = ( /obj/structure/chair/stool, @@ -10363,7 +10359,7 @@ /obj/machinery/light{ dir = 8 }, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "yg" = ( /obj/structure/chair, @@ -10611,7 +10607,7 @@ /obj/structure/table/wood/bar, /obj/structure/safe/floor, /obj/item/seeds/cherry/bomb, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "yN" = ( /obj/structure/table/reinforced, @@ -11058,6 +11054,9 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) +"zT" = ( +/turf/open/indestructible/boss/air, +/area/centcom/holding) "zU" = ( /obj/structure/closet/crate/freezer, /turf/open/floor/plasteel/cafeteria, @@ -11342,7 +11341,7 @@ pixel_y = 25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "AD" = ( /obj/machinery/door/airlock/centcom{ @@ -11583,12 +11582,12 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Bs" = ( /obj/structure/table/wood, /obj/machinery/computer/libraryconsole/bookmanagement, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Bu" = ( /obj/structure/table/wood, @@ -12465,11 +12464,11 @@ /obj/machinery/vr_sleeper{ dir = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "CV" = ( /obj/structure/chair/stool, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "CX" = ( /obj/structure/closet/secure_closet/security, @@ -12663,12 +12662,16 @@ /obj/machinery/vr_sleeper{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Dk" = ( /obj/structure/table, /turf/open/floor/plasteel/cafeteria, /area/syndicate_mothership) +"Dl" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Do" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -13475,21 +13478,21 @@ /obj/structure/table/wood, /obj/item/instrument/piano_synth, /obj/item/instrument/guitar, -/turf/open/floor/carpet/black, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fb" = ( /obj/structure/piano, /obj/machinery/light{ dir = 8 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fc" = ( /obj/structure/sign/barsign{ pixel_y = 32 }, /obj/structure/chair/stool, -/turf/open/floor/carpet/black, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fg" = ( /obj/structure/flora/grass/brown, @@ -13506,11 +13509,11 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fj" = ( /obj/machinery/vending/cigarette, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fm" = ( /obj/machinery/shower{ @@ -13798,7 +13801,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "FX" = ( /turf/open/floor/plasteel/stairs, @@ -13972,7 +13975,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Gu" = ( /obj/machinery/door/airlock/silver{ @@ -14345,7 +14348,7 @@ /obj/structure/chair/wood/wings{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Ha" = ( /obj/effect/turf_decal/tile/brown{ @@ -14431,7 +14434,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Hn" = ( /obj/structure/sink{ @@ -14653,7 +14656,7 @@ /area/space) "HH" = ( /obj/machinery/light, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "HI" = ( /obj/structure/sink{ @@ -14777,7 +14780,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "HR" = ( /obj/structure/sink{ @@ -15117,10 +15120,6 @@ }, /turf/open/floor/plasteel, /area/tdome/tdomeobserve) -"Is" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/tdome/arena) "It" = ( /turf/open/floor/plasteel, /area/tdome/arena) @@ -16220,7 +16219,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "KU" = ( /obj/structure/closet/emcloset, @@ -16577,7 +16576,7 @@ /obj/effect/mob_spawn/human/ghostcafe{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Mt" = ( /obj/structure/window/reinforced{ @@ -16586,7 +16585,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Mu" = ( /obj/machinery/light{ @@ -16602,7 +16601,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Mv" = ( /obj/structure/table/reinforced, @@ -16618,7 +16617,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "My" = ( /obj/docking_port/stationary{ @@ -16687,11 +16686,11 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "MM" = ( /obj/structure/window/reinforced, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "MP" = ( /obj/machinery/light{ @@ -16703,7 +16702,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "MS" = ( /obj/structure/table, @@ -16750,7 +16749,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Nk" = ( /obj/machinery/door/airlock/centcom{ @@ -16772,7 +16771,7 @@ /obj/item/storage/fancy/candle_box, /obj/item/storage/fancy/candle_box, /obj/item/storage/box/lights/mixed, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Nn" = ( /obj/structure/closet/secure_closet/hydroponics{ @@ -16788,7 +16787,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Nu" = ( /turf/open/floor/wood, @@ -16806,7 +16805,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Nz" = ( /obj/effect/turf_decal/tile/brown{ @@ -16826,7 +16825,7 @@ /obj/item/reagent_containers/medspray/synthflesh, /obj/item/reagent_containers/medspray/synthflesh, /obj/item/reagent_containers/medspray/synthflesh, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "NF" = ( /obj/structure/ladder/unbreakable/binary, @@ -16858,13 +16857,13 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "NT" = ( /obj/structure/window/paperframe{ CanAtmosPass = 0 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "NU" = ( /obj/machinery/door/airlock/centcom{ @@ -16934,7 +16933,7 @@ /area/centcom/control) "Ol" = ( /obj/structure/table/wood/fancy, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Om" = ( /obj/effect/turf_decal/tile/brown, @@ -17003,7 +17002,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "OH" = ( /obj/effect/spawner/structure/window/reinforced, @@ -17013,7 +17012,7 @@ /obj/structure/mineral_door/paperframe{ name = "Dojo" }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "OM" = ( /obj/machinery/light{ @@ -17036,7 +17035,7 @@ /obj/item/clothing/under/kilt, /obj/structure/closet, /obj/item/clothing/under/roman, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "OV" = ( /obj/machinery/light{ @@ -17060,14 +17059,14 @@ /area/centcom/supplypod) "Ph" = ( /obj/structure/closet/crate/bin, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Pl" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Pn" = ( /turf/closed/indestructible/fakedoor{ @@ -17078,7 +17077,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Pq" = ( /obj/structure/urinal{ @@ -17119,7 +17118,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "PD" = ( /turf/open/floor/plasteel/cafeteria, @@ -17131,7 +17130,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PG" = ( /obj/structure/table/reinforced, @@ -17150,7 +17149,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PJ" = ( /obj/effect/turf_decal/stripes/line{ @@ -17160,7 +17159,7 @@ /area/syndicate_mothership) "PL" = ( /obj/machinery/autolathe, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PM" = ( /obj/machinery/vending/clothing{ @@ -17180,7 +17179,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PP" = ( /obj/machinery/door/airlock/external{ @@ -17214,7 +17213,7 @@ /area/holodeck/rec_center/firingrange) "PX" = ( /obj/machinery/computer/arcade/battle, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PY" = ( /obj/effect/turf_decal/tile/green{ @@ -17227,7 +17226,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PZ" = ( /obj/effect/turf_decal/delivery, @@ -17256,7 +17255,7 @@ /obj/structure/flora/ausbushes/ppflowers, /obj/structure/flora/ausbushes/palebush, /obj/structure/window/reinforced/fulltile, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Qm" = ( /obj/singularity/wizard/mapped, @@ -17311,7 +17310,7 @@ pixel_y = -25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "QH" = ( /obj/machinery/chem_master/condimaster{ @@ -17329,7 +17328,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "QI" = ( /obj/structure/toilet{ @@ -17346,7 +17345,7 @@ /obj/structure/flora/ausbushes/ppflowers, /obj/structure/flora/ausbushes/palebush, /obj/structure/window/reinforced/fulltile, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "QN" = ( /obj/machinery/light{ @@ -17401,7 +17400,7 @@ /area/holodeck/rec_center/basketball) "Ra" = ( /obj/machinery/door/window/eastright, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Rb" = ( /obj/effect/turf_decal/stripes/corner{ @@ -17421,7 +17420,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Re" = ( /obj/structure/mineral_door/paperframe, @@ -17441,7 +17440,7 @@ /obj/structure/chair/wood/normal{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Rj" = ( /obj/machinery/vending/hydroseeds, @@ -17455,7 +17454,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Rl" = ( /obj/structure/mirror{ @@ -17469,7 +17468,7 @@ /obj/structure/chair/wood/wings{ dir = 3 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Ro" = ( /obj/structure/closet{ @@ -17488,14 +17487,14 @@ /obj/item/tank/internals/plasmaman/belt/full, /obj/item/tank/internals/plasmaman/belt/full, /obj/item/tank/internals/plasmaman/belt/full, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Rq" = ( /obj/machinery/light{ dir = 1; light_color = "#cee5d2" }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Ru" = ( /obj/structure/fireplace, @@ -17542,7 +17541,7 @@ pixel_x = -3; pixel_y = 3 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "RR" = ( /turf/open/floor/plasteel, @@ -17556,13 +17555,13 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "RX" = ( /obj/structure/chair/comfy/brown{ color = "#596479" }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "RZ" = ( /obj/effect/turf_decal/tile/bar, @@ -17582,7 +17581,7 @@ /turf/open/floor/plasteel/dark, /area/syndicate_mothership) "Sd" = ( -/turf/open/floor/carpet/black, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Sf" = ( /obj/structure/chair{ @@ -17616,7 +17615,7 @@ /obj/machinery/defibrillator_mount/loaded{ pixel_y = 28 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Sw" = ( /obj/machinery/hydroponics/constructable, @@ -17633,7 +17632,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Sy" = ( /obj/effect/turf_decal/tile/brown{ @@ -17715,7 +17714,7 @@ /obj/item/wallframe/newscaster, /obj/item/paper_bin, /obj/item/pen/fountain, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "SV" = ( /obj/effect/turf_decal/tile/bar, @@ -17737,11 +17736,11 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "SY" = ( /obj/structure/table/wood, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "SZ" = ( /obj/machinery/door/airlock/wood{ @@ -17752,7 +17751,7 @@ /area/centcom/holding) "Tb" = ( /obj/structure/closet/crate/freezer/blood, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Tc" = ( /obj/machinery/button/door{ @@ -17762,7 +17761,7 @@ pixel_y = -25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Tj" = ( /obj/effect/turf_decal/tile/bar, @@ -17777,7 +17776,7 @@ /obj/item/candle/infinite{ pixel_y = 6 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "To" = ( /turf/open/indestructible/airblock, @@ -17788,7 +17787,7 @@ /obj/item/stack/sheet/metal/fifty, /obj/item/storage/toolbox/mechanical, /obj/item/multitool, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Tr" = ( /obj/structure/closet/chefcloset, @@ -17800,7 +17799,7 @@ /obj/structure/flora/ausbushes/ppflowers, /obj/structure/flora/ausbushes/palebush, /obj/structure/window/reinforced/fulltile, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Tw" = ( /obj/structure/closet{ @@ -17817,7 +17816,7 @@ /obj/item/clothing/head/helmet/space/plasmaman, /obj/item/clothing/head/helmet/space/plasmaman, /obj/item/clothing/head/helmet/space/plasmaman, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Tz" = ( /obj/effect/light_emitter, @@ -17847,7 +17846,7 @@ /obj/structure/mirror{ pixel_y = 28 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "TM" = ( /mob/living/simple_animal/bot/medbot{ @@ -17856,7 +17855,7 @@ radio_key = null; stationary_mode = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "TO" = ( /obj/effect/turf_decal/tile/bar, @@ -17876,11 +17875,11 @@ /area/syndicate_mothership) "Ud" = ( /obj/effect/landmark/holding_facility, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Uf" = ( /obj/structure/closet/secure_closet, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Ug" = ( /obj/machinery/door/poddoor/shuttledock{ @@ -17899,7 +17898,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Uj" = ( /obj/machinery/door/airlock/centcom{ @@ -17934,7 +17933,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Un" = ( /obj/machinery/door/airlock/centcom{ @@ -17978,11 +17977,11 @@ desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; name = "Personal ID-Locked Closet" }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "UE" = ( /obj/structure/chair/stool/bar, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "UG" = ( /obj/structure/flora/tree/pine, @@ -18027,11 +18026,11 @@ /obj/structure/chair/wood/wings{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "UV" = ( /obj/machinery/computer/arcade, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "UW" = ( /obj/effect/turf_decal/tile/brown{ @@ -18115,7 +18114,7 @@ /obj/structure/flora/ausbushes/palebush, /obj/structure/window/reinforced/fulltile, /obj/machinery/light, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Vv" = ( /obj/structure/table, @@ -18165,7 +18164,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "VO" = ( /turf/closed/indestructible/riveted, @@ -18201,7 +18200,7 @@ /area/space) "Wb" = ( /obj/machinery/door/window/westleft, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Wc" = ( /obj/machinery/door/airlock/centcom{ @@ -18233,6 +18232,10 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) +"Wl" = ( +/obj/machinery/door/airlock/wood, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Wr" = ( /turf/open/floor/plasteel/dark, /area/centcom/supplypod) @@ -18243,6 +18246,12 @@ }, /turf/open/floor/wood, /area/centcom/holding) +"Ww" = ( +/obj/structure/bodycontainer/crematorium{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "WC" = ( /obj/structure/table/reinforced, /obj/item/pen, @@ -18283,7 +18292,7 @@ /obj/structure/extinguisher_cabinet{ pixel_y = 32 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "WN" = ( /obj/machinery/button/door{ @@ -18293,7 +18302,7 @@ pixel_y = 25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "WO" = ( /obj/effect/turf_decal/tile/brown, @@ -18337,11 +18346,11 @@ /obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/palebush, /obj/structure/window/reinforced/fulltile, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Xe" = ( /obj/machinery/vending/autodrobe, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Xg" = ( /obj/effect/turf_decal/tile/red{ @@ -18355,9 +18364,6 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/basketball) -"Xk" = ( -/turf/open/floor/wood, -/area/centcom/holding) "Xl" = ( /obj/structure/closet/syndicate/personal, /obj/effect/turf_decal/stripes/line{ @@ -18368,7 +18374,7 @@ "Xn" = ( /obj/structure/bed, /obj/item/bedsheet/random, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Xo" = ( /obj/machinery/vending/dinnerware, @@ -18393,7 +18399,7 @@ /area/centcom/supplypod/loading/four) "Xs" = ( /obj/structure/chair/comfy/brown, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Xt" = ( /obj/machinery/door/airlock/centcom{ @@ -18416,13 +18422,7 @@ /area/holodeck/rec_center/firingrange) "Xw" = ( /obj/structure/table/wood/fancy/royalblue, -/turf/open/floor/wood, -/area/centcom/holding) -"Xx" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Xy" = ( /obj/machinery/door/airlock/external{ @@ -18444,7 +18444,7 @@ pixel_y = 25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "XE" = ( /obj/machinery/door/airlock/centcom{ @@ -18461,12 +18461,12 @@ /obj/structure/chair/wood/wings{ dir = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "XT" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/sashimi, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "XU" = ( /obj/machinery/computer/secure_data{ @@ -18477,7 +18477,7 @@ "XX" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/bottle/sake, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "XY" = ( /obj/machinery/door/poddoor/shutters{ @@ -18494,7 +18494,7 @@ pixel_y = -25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Yc" = ( /obj/effect/turf_decal/stripes/line, @@ -18512,12 +18512,12 @@ /obj/machinery/defibrillator_mount/loaded{ pixel_y = 28 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Yf" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/chawanmushi, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Yg" = ( /obj/effect/turf_decal/stripes/corner{ @@ -18529,7 +18529,7 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Yi" = ( /obj/structure/dresser, @@ -18537,13 +18537,13 @@ /area/syndicate_mothership) "Ym" = ( /obj/machinery/computer/arcade/orion_trail, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Yo" = ( /obj/machinery/light{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Ys" = ( /obj/structure/table/reinforced, @@ -18585,7 +18585,7 @@ /area/centcom/holding) "YL" = ( /obj/machinery/vending/clothing, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "YN" = ( /obj/structure/window/reinforced{ @@ -18598,7 +18598,7 @@ /obj/structure/chair/comfy/brown{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "YQ" = ( /obj/structure/table, @@ -18609,7 +18609,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "YV" = ( /obj/machinery/light{ @@ -18620,10 +18620,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, -/area/centcom/holding) -"YW" = ( -/turf/open/floor/plating, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Za" = ( /obj/machinery/door/airlock/wood{ @@ -18638,7 +18635,7 @@ /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-10" }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Zi" = ( /turf/open/floor/plasteel, @@ -18677,7 +18674,7 @@ radio_key = null; stationary_mode = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Zz" = ( /obj/effect/landmark/start/nukeop_leader, @@ -18749,7 +18746,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "ZV" = ( /obj/effect/turf_decal/tile/brown, @@ -43132,13 +43129,13 @@ Rm Tn UT yd -Xk -Xk +Sd +Sd XM NT UV CV -Xk +Sd NT CT oV @@ -43148,15 +43145,15 @@ CT oV CT Nd -Xk -Xk -Xk +Sd +Ww +Sd Nd aa Nd Uf -Xk -Xk +Sd +Sd Nd aa aa @@ -43385,35 +43382,35 @@ Pq ZW ZW Za -Xk -Xk -Xk +Sd +Sd +Sd Tu -Xk -Xk +Sd +Sd Tn NT RQ -Xk -Xk +Sd +Sd NT -Xk -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd +Sd Nd Gs -Xk +Sd HH Nd aa Nd MJ -Xk -YW +Sd +Sd Nd aa aa @@ -43642,35 +43639,35 @@ Pa ZW ZW Nd -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd GY NT UV CV -Xk +Sd NT Dj PF Dj -Xk +Sd Dj PF Dj Nd -Xk -Xk -Xk +Sd +Sd +Sd Nd aa Nd ma -YW -Xk +Sd +Sd Nd aa aa @@ -43899,17 +43896,17 @@ SB ZW Nw Nd -Xk -Xk -Xk +Sd +Sd +Sd Ph -Xk +Sd Tu Vu Nd Gs -Xk -Xk +Sd +Sd Nd Nd Nd @@ -44156,34 +44153,34 @@ Nd Nd Nd Nd -Xk -Xk +Sd +Sd XM QL -Xk -Xk +Sd +Sd XM NT PX CV -Xk +Sd NT -Xk +Sd Yo -Xk -Xk -Xk +Sd +Sd +Sd Yo -Xk +Sd Nd -Xk -Xk +Sd +Sd Yo -Xk -Xk +Sd +Sd Yo -Xk -Xk +Sd +Sd WE Nd aa @@ -44409,38 +44406,38 @@ Nd Nd py Nd -Xk +Sd Yo -Xk -XL -Xk -Xk +Sd +Wl +Sd +Sd Tn Tu -Xk -Xk +Sd +Sd Tn NT Zh -Xk -Xk -Re -Xk -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Dl +Sd +Sd +Sd +Sd +Sd +Sd +Sd Qu -Xk -Xk -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd +Sd +Sd Zu Nd aa @@ -44659,45 +44656,45 @@ aa aa Nd PL -Xk +Sd Yo -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd Yh -Xk +Sd Nd Nd Nd Gs -Xk +Sd GY Tu -Xk -Xk +Sd +Sd GY NT Ym CV -Xk +Sd NT -Xk -Xx -Xk -Xk -Xk -Xx -Xk +Sd +MR +Sd +Sd +Sd +MR +Sd Nd -Xk -Xk -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd +Sd +Sd PM Nd aa @@ -44916,7 +44913,7 @@ aa aa Nd Tq -Xk +Sd MG YN Nd @@ -44927,17 +44924,17 @@ Nd Nd Fa KT -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd HH Nd -Xk -Xk -Xk +Sd +Sd +Sd Nd Nd Nd @@ -45172,8 +45169,8 @@ aa aa aa Nd -Xk -Xk +Sd +Sd Rh Mm Nd @@ -45184,17 +45181,17 @@ Nd Fb Sd KT -Xk -Xk +Sd +Sd Sd Sd Sd Sd Sd Re -Xk -Xk -Xk +Sd +Sd +Sd NT vt YV @@ -45207,8 +45204,8 @@ UD tZ SY Nd -Xk -Xk +Sd +Sd Nd SY Ri @@ -45429,8 +45426,8 @@ aa aa aa Nd -Xk -Xk +Sd +Sd Rh ZT Nd @@ -45441,8 +45438,8 @@ Nd Fc Sd KT -Xk -Xk +Sd +Sd Sd Sd Sd @@ -45451,24 +45448,24 @@ Sd Nd Gs Zx -Xk +Sd OL -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd Nd Gs -Xk -Xk +Sd +Sd lS -Xk -Xk +Sd +Sd RP -Xk -Xk +Sd +Sd HH Nd aa @@ -45698,34 +45695,34 @@ Nd MR Sd FW -Xk -Xk +Sd +Sd Sd Sd Sd Sd Sd Re -Xk -Xk -Xk +Sd +Sd +Sd NT So XM -Xk +Sd XM XM -Xk +Sd Nd Xn -Xk +Sd Ya Nd -Xk -Xk +Sd +Sd Nd XD -Xk +Sd Xn Nd aa @@ -45944,9 +45941,9 @@ aa aa Nd yM -Xk +Sd Yo -Xk +Sd Nd SG Fh @@ -45955,12 +45952,12 @@ Nd Nd Sd FX -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd HH Nd WM @@ -45972,14 +45969,14 @@ Po Wb Po ZU -Xk +Sd Nd Nd Nd Nd Nd -Xk -Xk +Sd +Sd Nd Nd Nd @@ -46201,9 +46198,9 @@ aa aa Nd OG -Xk -Xk -Xk +Sd +Sd +Sd Nd zX Fh @@ -46213,30 +46210,30 @@ Nd Nd Nd Gs -Xk +Sd XM Tu -Xk -Xk +Sd +Sd XM NT -Xk +Sd Ud Ud NT YU -Sd -Sd -Sd +zT +zT +zT MM -Xk +Sd Nd UD tZ SY Nd -Xk -Xk +Sd +Sd Nd SY Ri @@ -46458,9 +46455,9 @@ aa aa Nd TK -Xk -Xk -Xk +Sd +Sd +Sd Nd QA Fh @@ -46469,12 +46466,12 @@ ED Yo Yf UE -Xk -Xk +Sd +Sd Tn Xd -Xk -Xk +Sd +Sd Tn NT Ro @@ -46482,21 +46479,21 @@ Ud Ud NT YU -Sd -Sd -Sd +zT +zT +zT MM TM Nd Gs -Xk -Xk +Sd +Sd uh -Xk -Xk +Sd +Sd zW -Xk -Xk +Sd +Sd HH Nd aa @@ -46715,23 +46712,23 @@ aa aa Nd YL -Xk -Xk -Xk +Sd +Sd +Sd Nd Xo Fh Fh py -Xk +Sd SY UE -Xk -Xk +Sd +Sd GY Tu -Xk -Xk +Sd +Sd GY NT Tw @@ -46739,21 +46736,21 @@ Ud Ud NT YU -Sd -Sd -Sd +zT +zT +zT MM -Xk +Sd Nd Xn -Xk +Sd Tc Nd -Xk -Xk +Sd +Sd Nd AC -Xk +Sd Xn Nd aa @@ -46972,22 +46969,22 @@ aa aa Nd Xe -Xk -Xk -Xk +Sd +Sd +Sd Nd TB Fh Fh BV -Xk +Sd XT UE -Xk -Xk -Xk +Sd +Sd +Sd Ph -Xk +Sd Qk Vu Nd @@ -47000,7 +46997,7 @@ PA Ra PA Pl -Xk +Sd Nd Nd Nd @@ -47229,42 +47226,42 @@ aa aa Nd Ny -Xk -Xk -Xk +Sd +Sd +Sd Nd Vz Fh YJ QT -Xk +Sd SY UE -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd XM NT -Xk -Xk -Xk +Sd +Sd +Sd NT Ye GY -Xk +Sd GY GY -Xk +Sd Nd Xs Ol YO Nd -Xk -Xk +Sd +Sd Nd RX Xw @@ -47487,44 +47484,44 @@ aa Nd Bs Ri -Xk -Xk +Sd +Sd XL Fh Fh Fh XL -Xk +Sd XX UE -Xk -Xk -Xk +Sd +Sd +Sd Tu -Xk -Xk +Sd +Sd Tn NT -Xk -Xk -Xk +Sd +Sd +Sd OL -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd Nd Gs -Xk -Xk +Sd +Sd SZ -Xk -Xk +Sd +Sd Ws -Xk -Xk +Sd +Sd HH Nd aa @@ -47743,8 +47740,8 @@ aa aa Nd SU -Xk -Xx +Sd +MR Nm Nd SN @@ -47758,13 +47755,13 @@ Fi Tn UT Hm -Xk -Xk +Sd +Sd GY NT -Xk +Sd Ms -Xk +Sd NT vt Mx @@ -47777,8 +47774,8 @@ Ru Of QF Nd -Xk -Xk +Sd +Sd Nd WN Ur @@ -48032,12 +48029,12 @@ Nd Nd Kf WV -Xk +Sd Nd Nd Nd Nd -Xk +Sd zY Rv Nd @@ -60356,14 +60353,14 @@ GM HW HW Il -Is +IF IE IX Jh Jh Js IE -Is +IF JI JP JZ @@ -63954,14 +63951,14 @@ GM HW HW Il -Is +IF IJ IY Jk Jk Jt IJ -Is +IF JI JP Kc @@ -78178,14 +78175,14 @@ fa fn fr fx -fy +fF fE fL fN fN fS fE -fy +fF ab aa aa @@ -81776,14 +81773,14 @@ dA dA dA fx -fy +fF fJ fM fQ fQ fT fJ -fy +fF ab aa aa diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 222002f512..65c7145d8f 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -444,12 +444,8 @@ candidates -= M /proc/pollGhostCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE) - var/list/candidates = list() - - for(var/mob/dead/observer/G in GLOB.player_list) - if(G.can_reenter_round(TRUE)) - candidates += G - + var/datum/element/ghost_role_eligibility/eligibility = SSdcs.GetElement(/datum/element/ghost_role_eligibility) + var/list/candidates = eligibility.get_all_ghost_role_eligible() return pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category, flashwindow, candidates) /proc/pollCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE, list/group = null) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index af31e2b5a5..ec3593ee9d 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -23,6 +23,8 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) //BSA unlocked by head ID swipes GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details +GLOBAL_LIST_EMPTY(clientless_round_timeouts) // ckey -> time that ckey can rejoin round + // All religion stuff GLOBAL_VAR(religion) GLOBAL_VAR(deity) diff --git a/code/datums/action.dm b/code/datums/action.dm index 77aa729eb1..cb56c26b91 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -141,6 +141,17 @@ current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state)) current_button.button_icon_state = button_icon_state +/datum/action/ghost + icon_icon = 'icons/mob/mob.dmi' + button_icon_state = "ghost" + name = "Ghostize" + desc = "Turn into a ghost and freely come back to your body." + +/datum/action/ghost/Trigger() + if(!..()) + return 0 + var/mob/M = target + M.ghostize(1) //Presets for item actions /datum/action/item_action diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index 8f9b97db22..17e2b12232 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -11,7 +11,7 @@ if(type == /datum/element) return ELEMENT_INCOMPATIBLE if(element_flags & ELEMENT_DETACH) - RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/Detach) + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/Detach, override = TRUE) /datum/element/proc/Detach(datum/source, force) UnregisterSignal(source, COMSIG_PARENT_QDELETING) @@ -36,4 +36,4 @@ */ /datum/proc/RemoveElement(eletype, ...) var/datum/element/ele = SSdcs.GetElement(arglist(args)) - ele.Detach(src) \ No newline at end of file + ele.Detach(src) diff --git a/code/datums/elements/ghost_role_eligibility.dm b/code/datums/elements/ghost_role_eligibility.dm new file mode 100644 index 0000000000..8ecb579bc8 --- /dev/null +++ b/code/datums/elements/ghost_role_eligibility.dm @@ -0,0 +1,54 @@ +/datum/element/ghost_role_eligibility + element_flags = ELEMENT_DETACH + var/list/timeouts = list() + var/list/mob/eligible_mobs = list() + +/datum/element/ghost_role_eligibility/Attach(datum/target,penalize = FALSE) + . = ..() + if(!ismob(target)) + return ELEMENT_INCOMPATIBLE + var/mob/M = target + if(!(M in eligible_mobs)) + eligible_mobs += M + if(penalize) //penalizing them from making a ghost role / midround antag comeback right away. + var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES + var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES + if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed. + penalty += roundstart_quit_limit - world.time + if(penalty) + penalty += world.realtime + if(penalty - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) + penalty = CANT_REENTER_ROUND + if(!(M.ckey in timeouts)) + timeouts += M.ckey + timeouts[M.ckey] = 0 + timeouts[M.ckey] = max(timeouts[M.ckey],penalty) + +/datum/element/ghost_role_eligibility/Detach(mob/M) + . = ..() + if(M in eligible_mobs) + eligible_mobs -= M + +/datum/element/ghost_role_eligibility/proc/get_all_ghost_role_eligible(silent = FALSE) + var/list/candidates = list() + for(var/m in eligible_mobs) + var/mob/M = m + if(M.can_reenter_round(TRUE)) + candidates += M + return candidates + +/mob/proc/can_reenter_round(silent = FALSE) + var/datum/element/ghost_role_eligibility/eli = SSdcs.GetElement(/datum/element/ghost_role_eligibility) + return eli.can_reenter_round(src,silent) + +/datum/element/ghost_role_eligibility/proc/can_reenter_round(var/mob/M,silent = FALSE) + if(!(M in eligible_mobs)) + return FALSE + if(!(M.ckey in timeouts)) + return TRUE + var/timeout = timeouts[M.ckey] + if(timeout != CANT_REENTER_ROUND && timeout <= world.realtime) + return TRUE + if(!silent && M.client) + to_chat(M, "You are unable to reenter the round[timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(timeout - world.realtime)]" : ""].") + return FALSE diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index c89562c9f9..92a02f5920 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -17,10 +17,10 @@ var/list/living_antags = list() var/list/dead_players = list() var/list/list_observers = list() + var/list/ghost_eligible = list() /datum/dynamic_ruleset/midround/from_ghosts weight = 0 - required_type = /mob/dead/observer /// Whether the ruleset should call generate_ruleset_body or not. var/makeBody = TRUE @@ -34,6 +34,8 @@ living_players = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS]) living_antags = trim_list(mode.current_players[CURRENT_LIVING_ANTAGS]) list_observers = trim_list(mode.current_players[CURRENT_OBSERVERS]) + var/datum/element/ghost_role_eligibility/eligibility = SSdcs.GetElement(/datum/element/ghost_role_eligibility) + ghost_eligible = trim_list(eligibility.get_all_ghost_role_eligible()) /datum/dynamic_ruleset/midround/proc/trim_list(list/L = list()) var/list/trimmed_list = L.Copy() @@ -70,6 +72,25 @@ continue return trimmed_list +/datum/dynamic_ruleset/midround/from_ghosts/trim_list(list/L = list()) + var/list/trimmed_list = L.Copy() + for(var/mob/M in trimmed_list) + if (!M.client) // Are they connected? + trimmed_list.Remove(M) + continue + if(!mode.check_age(M.client, minimum_required_age)) + trimmed_list.Remove(M) + continue + if(antag_flag_override) + if(!(antag_flag_override in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag_override)) + trimmed_list.Remove(M) + continue + else + if(!(antag_flag in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag)) + trimmed_list.Remove(M) + continue + return trimmed_list + // You can then for example prompt dead players in execute() to join as strike teams or whatever // Or autotator someone @@ -91,11 +112,15 @@ return FALSE return TRUE +/datum/dynamic_ruleset/midround/from_ghosts/ready(forced = FALSE) + if (required_candidates > ghost_eligible.len) + SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") + return FALSE + return ..() + + /datum/dynamic_ruleset/midround/from_ghosts/execute() - var/list/possible_candidates = list() - possible_candidates.Add(dead_players) - possible_candidates.Add(list_observers) - var/application_successful = send_applications(possible_candidates) + var/application_successful = send_applications(ghost_eligible) return assigned.len > 0 && application_successful /// This sends a poll to ghosts if they want to be a ghost spawn from a ruleset. @@ -303,9 +328,6 @@ var/datum/mind/wizard /datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE if(GLOB.wizardstart.len == 0) log_admin("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.") message_admins("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.") @@ -366,12 +388,6 @@ required_candidates = operative_cap[indice_pop] return ..() -/datum/dynamic_ruleset/midround/from_ghosts/nuclear/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE - return ..() - /datum/dynamic_ruleset/midround/from_ghosts/nuclear/finish_setup(mob/new_character, index) new_character.mind.special_role = "Nuclear Operative" new_character.mind.assigned_role = "Nuclear Operative" @@ -404,12 +420,6 @@ repeatable = TRUE property_weights = list("story_potential" = -1, "trust" = 2, "chaos" = 2, "extended" = -2, "valid" = 2) -/datum/dynamic_ruleset/midround/from_ghosts/blob/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE - return ..() - /datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant) var/body = applicant.become_overmind() return body @@ -437,12 +447,6 @@ property_weights = list("story_potential" = -1, "trust" = 1, "chaos" = 2, "extended" = -2, "valid" = 2) var/list/vents = list() -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE - return ..() - /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute() // 50% chance of being incremented by one required_candidates += prob(50) @@ -539,12 +543,6 @@ property_weights = list("story_potential" = 1, "extended" = 1, "valid" = -2) high_population_requirement = 5 -/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE - return ..() - /datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/generate_ruleset_body(mob/applicant) var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) applicant.transfer_ckey(virus, FALSE) @@ -583,9 +581,6 @@ return ..() /datum/dynamic_ruleset/midround/from_ghosts/revenant/ready(forced = FALSE) - if(required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE for(var/mob/living/L in GLOB.dead_mob_list) //look for any dead bodies var/turf/T = get_turf(L) if(T && is_station_level(T.z)) @@ -632,9 +627,6 @@ var/list/spawn_locs = list() /datum/dynamic_ruleset/midround/from_ghosts/slaughter_demon/ready(forced = FALSE) - if(required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) if(isturf(L.loc)) spawn_locs += L.loc @@ -685,9 +677,6 @@ repeatable = TRUE /datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE) - if(required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE team = new /datum/team/abductor_team if(team.team_number > ABDUCTOR_MAX_TEAMS) return FALSE @@ -726,9 +715,6 @@ var/spawn_loc /datum/dynamic_ruleset/midround/from_ghosts/ninja/ready(forced = FALSE) - if(required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE if(!spawn_loc) var/list/spawn_locs = list() for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 98dd91d3bd..e9d3006b06 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -491,4 +491,4 @@ //Attacks/effects. /obj/machinery/cryopod/blob_act() - return //Sorta gamey, but we don't really want these to be destroyed. \ No newline at end of file + return //Sorta gamey, but we don't really want these to be destroyed. diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 7a83893f8b..c6c5547e54 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -479,10 +479,10 @@ possessed = TRUE - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) + var/list/mob/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) var/mob/living/simple_animal/shade/S = new(src) S.real_name = name S.name = name diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index fd6030453c..705ca9a884 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -626,7 +626,13 @@ O.equip(new_spawn, FALSE, new_spawn.client) SSjob.equip_loadout(null, new_spawn, FALSE) SSquirks.AssignQuirks(new_spawn, new_spawn.client, TRUE, TRUE, null, FALSE, new_spawn) + new_spawn.AddElement(/datum/element/ghost_role_eligibility) + ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT) ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT) + to_chat(new_spawn,"You maybe sharing your cafe with some ninja-captured individuals, so make sure to only interact with the ghosts you hear as a ghost!") + to_chat(new_spawn,"You can turn yourself into a ghost and freely reenter your body with the ghost action.") + var/datum/action/ghost/G = new(new_spawn) + G.Grant(new_spawn) /datum/outfit/ghostcafe name = "ID, jumpsuit and shoes" diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 09a8f692d8..7675f858ee 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -137,9 +137,9 @@ /datum/admins/proc/makeWizard() - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", ROLE_WIZARD, null) + var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", ROLE_WIZARD, null) - var/mob/dead/observer/selected = pick_n_take(candidates) + var/mob/selected = pick_n_take(candidates) var/mob/living/carbon/human/new_character = makeBody(selected) new_character.mind.make_Wizard() @@ -214,9 +214,9 @@ /datum/admins/proc/makeNukeTeam() var/datum/game_mode/nuclear/temp = new - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for a nuke team being sent in?", ROLE_OPERATIVE, temp) - var/list/mob/dead/observer/chosen = list() - var/mob/dead/observer/theghost = null + var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for a nuke team being sent in?", ROLE_OPERATIVE, temp) + var/list/mob/chosen = list() + var/mob/theghost = null if(candidates.len) var/numagents = 5 @@ -378,7 +378,7 @@ ertemplate.enforce_human = prefs["enforce_human"]["value"] == "Yes" ? TRUE : FALSE ertemplate.opendoors = prefs["open_armory"]["value"] == "Yes" ? TRUE : FALSE - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null) + var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null) var/teamSpawned = FALSE if(candidates.len > 0) @@ -404,7 +404,7 @@ numagents-- continue // This guy's unlucky, not enough spawn points, we skip him. var/spawnloc = spawnpoints[numagents] - var/mob/dead/observer/chosen_candidate = pick(candidates) + var/mob/chosen_candidate = pick(candidates) candidates -= chosen_candidate if(!chosen_candidate.key) continue diff --git a/code/modules/antagonists/blob/blob/powers.dm b/code/modules/antagonists/blob/blob/powers.dm index 73c0776ad7..aeb1392432 100644 --- a/code/modules/antagonists/blob/blob/powers.dm +++ b/code/modules/antagonists/blob/blob/powers.dm @@ -166,7 +166,7 @@ if(!can_buy(40)) return - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as a [blob_reagent_datum.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly + var/list/mob/candidates = pollGhostCandidates("Do you want to play as a [blob_reagent_datum.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly if(LAZYLEN(candidates)) //if we got at least one candidate, they're a blobbernaut now. B.max_integrity = initial(B.max_integrity) * 0.25 //factories that produced a blobbernaut have much lower health B.obj_integrity = min(B.obj_integrity, B.max_integrity) @@ -181,7 +181,7 @@ blobber.update_icons() blobber.adjustHealth(blobber.maxHealth * 0.5) blob_mobs += blobber - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) C.transfer_ckey(blobber) SEND_SOUND(blobber, sound('sound/effects/blobattack.ogg')) SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg')) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index ae9932e96f..361b2a7517 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -80,7 +80,3 @@ var/next_keysend_reset = 0 var/next_keysend_trip_reset = 0 var/keysend_tripped = FALSE - - // stops players from coming back through ghost/midround roles after suicide/cryo - // for a duration set by CONFIG_GET(number/suicide_reenter_round_timer) and CONFIG_GET(number/roundstart_suicide_time_limit) - var/reenter_round_timeout = 0 diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index 65d96ad150..ea63ee611f 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -75,7 +75,7 @@ /datum/round_event/santa/start() var/list/candidates = pollGhostCandidates("Santa is coming to town! Do you want to be Santa?", poll_time=150) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) santa = new /mob/living/carbon/human(pick(GLOB.blobstart)) C.transfer_ckey(santa, FALSE) diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm index bf86a97574..1b328dbc69 100644 --- a/code/modules/mob/dead/observer/login.dm +++ b/code/modules/mob/dead/observer/login.dm @@ -18,6 +18,3 @@ update_icon(preferred_form) updateghostimages() - - client.reenter_round_timeout = max(client.reenter_round_timeout, clientless_round_timeout) - clientless_round_timeout = client.reenter_round_timeout diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 0846cf1ea1..f1c4316c65 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -19,7 +19,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) hud_type = /datum/hud/ghost movement_type = GROUND | FLYING var/can_reenter_corpse - var/clientless_round_timeout = 0 //mobs will lack a client as long as their player is disconnected. See client_defines.dm "reenter_round_timeout" var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 var/started_as_observer //This variable is set to 1 when you enter the game as an observer. @@ -135,7 +134,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) AA.onNewMob(src) . = ..() - + AddElement(/datum/element/ghost_role_eligibility) grant_all_languages() /mob/dead/observer/get_photo_description(obj/item/camera/camera) @@ -270,23 +269,12 @@ Works together with spawning an observer, noted above. var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc. SStgui.on_transfer(src, ghost) // Transfer NanoUIs. ghost.can_reenter_corpse = can_reenter_corpse - if(penalize) //penalizing them from making a ghost role / midround antag comeback right away. - var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES - var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES - if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed. - penalty += roundstart_quit_limit - world.time - if(penalty) - penalty += world.realtime - if(penalty - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) - penalty = CANT_REENTER_ROUND - if(client) - client.reenter_round_timeout = penalty - else //A disconnected player (quite likely for cryopods) - ghost.clientless_round_timeout = penalty if (client && client.prefs && client.prefs.auto_ooc) if (!(client.prefs.chat_toggles & CHAT_OOC)) client.prefs.chat_toggles ^= CHAT_OOC transfer_ckey(ghost, FALSE) + ghost.AddElement(/datum/element/ghost_role_eligibility,penalize) // technically already run earlier, but this adds the penalty + // needs to be done AFTER the ckey transfer, too return ghost /* @@ -343,15 +331,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return ghostize(0, penalize = TRUE) -/mob/dead/observer/proc/can_reenter_round(silent = FALSE) - var/timeout = clientless_round_timeout - if(client) - timeout = client.reenter_round_timeout - if(timeout != CANT_REENTER_ROUND && timeout <= world.realtime) - return TRUE - if(!silent && client) - to_chat(src, "You are unable to reenter the round[timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(timeout - world.realtime)]" : ""].") - return FALSE + /mob/dead/observer/Move(NewLoc, direct) if(updatedir) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 1bd434b233..62c8588ac8 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -424,9 +424,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/mob/living/simple_animal/hostile/guardian/G = input(src, "Pick the guardian you wish to reset", "Guardian Reset") as null|anything in guardians if(G) to_chat(src, "You attempt to reset [G.real_name]'s personality...") - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as [src.real_name]'s [G.real_name]?", ROLE_PAI, null, FALSE, 100) + var/list/mob/candidates = pollGhostCandidates("Do you want to play as [src.real_name]'s [G.real_name]?", ROLE_PAI, null, FALSE, 100) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) to_chat(G, "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.") to_chat(src, "Your [G.real_name] has been successfully reset.") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(G)])") @@ -498,10 +498,10 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians return used = TRUE to_chat(user, "[use_message]") - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_HOLOPARASITE) + var/list/mob/candidates = pollGhostCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_HOLOPARASITE) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) spawn_guardian(user, C.key) else to_chat(user, "[failure_message]") diff --git a/tgstation.dme b/tgstation.dme index 7e7d69d6f1..33a4251dd7 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -470,6 +470,7 @@ #include "code\datums\elements\_element.dm" #include "code\datums\elements\cleaning.dm" #include "code\datums\elements\earhealing.dm" +#include "code\datums\elements\ghost_role_eligibility.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\icon_snapshot.dm"