diff --git a/_maps/map_files/generic/Lavaland.dmm b/_maps/map_files/generic/Lavaland.dmm
index e44b9f52458..86ec920c658 100644
--- a/_maps/map_files/generic/Lavaland.dmm
+++ b/_maps/map_files/generic/Lavaland.dmm
@@ -681,7 +681,7 @@
req_access_txt = "2"
},
/obj/structure/cable{
- icon_state = "1-10"
+ icon_state = "1-2"
},
/turf/simulated/floor/plating,
/area/mine/laborcamp)
@@ -858,18 +858,11 @@
/turf/simulated/floor/plasteel,
/area/mine/laborcamp/security)
"ce" = (
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/machinery/power/smes{
+ charge = 5e+006
},
/obj/structure/cable{
- icon_state = "5-6"
- },
-/turf/simulated/floor/plating,
-/area/mine/laborcamp)
-"cf" = (
-/obj/machinery/power/terminal,
-/obj/structure/cable{
- icon_state = "0-8"
+ icon_state = "0-4"
},
/turf/simulated/floor/plating,
/area/mine/laborcamp)
@@ -880,6 +873,9 @@
/turf/simulated/floor/plating,
/area/mine/laborcamp)
"ch" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/simulated/floor/plating,
/area/mine/laborcamp)
"ci" = (
@@ -1033,21 +1029,22 @@
/turf/simulated/floor/plasteel,
/area/mine/laborcamp)
"cz" = (
-/obj/machinery/power/port_gen/pacman{
- anchored = 1
- },
-/obj/structure/cable,
-/turf/simulated/floor/plating,
-/area/mine/laborcamp)
-"cA" = (
-/obj/machinery/power/smes{
- charge = 5e+006
+/obj/machinery/power/terminal{
+ dir = 1
},
/obj/structure/cable{
icon_state = "0-4"
},
+/obj/structure/reagent_dispensers/fueltank,
+/turf/simulated/floor/plating,
+/area/mine/laborcamp)
+"cA" = (
/obj/structure/cable{
- icon_state = "0-9"
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0;
+ tag = ""
},
/turf/simulated/floor/plating,
/area/mine/laborcamp)
@@ -1056,7 +1053,13 @@
/turf/simulated/floor/plating,
/area/mine/laborcamp)
"cC" = (
-/obj/structure/reagent_dispensers/fueltank,
+/obj/machinery/power/port_gen/pacman{
+ anchored = 1
+ },
+/obj/structure/cable{
+ d2 = 8;
+ icon_state = "0-8"
+ },
/turf/simulated/floor/plating,
/area/mine/laborcamp)
"cD" = (
@@ -11202,7 +11205,7 @@ bm
aq
bB
bM
-cf
+ch
cA
aq
aj
@@ -11460,7 +11463,7 @@ aq
aq
aq
cg
-cB
+cA
aq
aj
cQ
@@ -11716,7 +11719,7 @@ aD
aD
aD
aq
-ch
+cB
cC
aq
aj
diff --git a/_maps/map_files/shuttles/emergency_dept.dmm b/_maps/map_files/shuttles/emergency_dept.dmm
index 739056d20d6..fb479c23995 100644
--- a/_maps/map_files/shuttles/emergency_dept.dmm
+++ b/_maps/map_files/shuttles/emergency_dept.dmm
@@ -17,81 +17,152 @@
"ad" = (
/turf/space,
/turf/simulated/shuttle/wall{
- tag = "icon-swall_f10";
icon_state = "swall_f10";
dir = 2
},
/area/shuttle/escape)
"ae" = (
-/turf/simulated/shuttle/wall{
- icon_state = "swall12";
- dir = 2
+/obj/structure/table/reinforced,
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "vault"
},
/area/shuttle/escape)
"af" = (
-/turf/simulated/shuttle/wall{
- icon_state = "swallc4"
+/obj/structure/table/reinforced,
+/obj/item/folder/red,
+/obj/item/restraints/handcuffs,
+/obj/item/flash,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
},
/area/shuttle/escape)
"ag" = (
-/obj/machinery/computer/emergency_shuttle,
-/turf/simulated/shuttle/floor,
+/obj/machinery/computer/robotics,
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "darkblue"
+ },
/area/shuttle/escape)
"ah" = (
-/turf/simulated/shuttle/wall{
- icon_state = "swallc3"
+/obj/machinery/computer/crew,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkblue"
},
/area/shuttle/escape)
"ai" = (
-/obj/machinery/computer/station_alert,
-/turf/simulated/shuttle/floor,
+/obj/machinery/computer/emergency_shuttle,
+/turf/simulated/floor/plasteel{
+ dir = 1;
+ icon_state = "darkblue"
+ },
/area/shuttle/escape)
"aj" = (
/obj/machinery/computer/communications,
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "darkblue"
},
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"ak" = (
-/obj/machinery/computer/security{
- network = list("SS13","Telecomms","Research Outpost","Mining Outpost")
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/donut_box,
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
},
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"al" = (
+/obj/structure/table/reinforced,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "vault"
+ },
+/area/shuttle/escape)
+"am" = (
+/obj/structure/table/reinforced,
+/obj/machinery/recharger,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "vault"
+ },
+/area/shuttle/escape)
+"an" = (
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/shuttle/escape)
+"ao" = (
/obj/structure/chair/comfy/shuttle{
dir = 1
},
-/turf/simulated/shuttle/floor,
-/area/shuttle/escape)
-"am" = (
-/obj/structure/table,
-/turf/simulated/shuttle/floor,
-/area/shuttle/escape)
-"an" = (
-/obj/machinery/computer/crew,
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
},
-/turf/simulated/shuttle/floor,
-/area/shuttle/escape)
-"ao" = (
-/obj/machinery/computer/robotics,
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"ap" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/toolbox/mechanical,
+/turf/simulated/floor/plasteel{
+ dir = 4;
+ icon_state = "vault"
+ },
+/area/shuttle/escape)
+"aq" = (
/turf/simulated/shuttle/wall{
icon_state = "swall3";
dir = 2
},
/area/shuttle/escape)
-"aq" = (
-/turf/simulated/shuttle/floor,
+"ar" = (
+/obj/machinery/computer/security{
+ network = list("SS13","Research Outpost","Mining Outpost","Telecomms")
+ },
+/obj/structure/sign/poster/official/nanotrasen_logo{
+ pixel_x = -32;
+ pixel_y = 0
+ },
+/turf/simulated/floor/plasteel{
+ dir = 9;
+ icon_state = "darkred"
+ },
+/area/shuttle/escape)
+"as" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/shuttle/escape)
+"at" = (
+/obj/item/radio/intercom{
+ dir = 4;
+ name = "Station Intercom (General)";
+ pixel_x = 29;
+ pixel_y = -60
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/shuttle/escape)
+"au" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/shuttle/escape)
+"av" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
+ },
/area/shuttle/escape)
"aw" = (
/turf/simulated/shuttle/wall{
@@ -100,49 +171,240 @@
},
/area/shuttle/escape)
"ax" = (
-/turf/simulated/shuttle/wall{
- icon_state = "swall14";
- dir = 2
+/obj/machinery/computer/station_alert,
+/obj/structure/sign/poster/official/nanotrasen_logo{
+ pixel_x = 32;
+ pixel_y = 0
+ },
+/turf/simulated/floor/plasteel{
+ dir = 5;
+ icon_state = "darkyellow"
},
/area/shuttle/escape)
"ay" = (
-/obj/machinery/door/airlock/command/glass{
- name = "Escape Shuttle Cockpit";
- req_access_txt = "19"
+/obj/machinery/computer/secure_data,
+/turf/simulated/floor/plasteel{
+ dir = 10;
+ icon_state = "darkred"
},
-/turf/simulated/shuttle/floor,
/area/shuttle/escape)
"az" = (
-/obj/structure/chair/comfy/shuttle,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aA" = (
-/obj/machinery/status_display{
- pixel_y = 30
+/obj/machinery/light,
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
},
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
},
-/obj/structure/chair/comfy/shuttle,
-/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"aB" = (
-/obj/structure/grille,
-/obj/structure/window/full/shuttle{
- icon_state = "16"
+/obj/machinery/light,
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
},
-/turf/simulated/floor/plating,
/area/shuttle/escape)
"aC" = (
+/obj/machinery/computer/atmos_alert,
+/turf/simulated/floor/plasteel{
+ dir = 6;
+ icon_state = "darkyellow"
+ },
+/area/shuttle/escape)
+"aD" = (
+/obj/machinery/status_display,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
+ },
+/area/shuttle/escape)
+"aE" = (
+/obj/machinery/door/airlock/command/glass{
+ name = "Escape Shuttle Cockpit";
+ normalspeed = 0;
+ req_access_txt = "19"
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/shuttle/escape)
+"aF" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"aG" = (
+/obj/machinery/recharger/wallcharger{
+ pixel_x = 32;
+ pixel_y = 0
+ },
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"aH" = (
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"aI" = (
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = null;
+ name = "Escape Shuttle Infirmary";
+ req_access_txt = "0"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"aJ" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/fancy/donut_box,
+/obj/item/restraints/handcuffs,
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"aL" = (
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = null;
+ name = "Escape Shuttle Infirmary";
+ normalspeed = 0;
+ req_access_txt = "5"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"aM" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"aN" = (
+/obj/structure/sign/directions/security{
+ dir = 1;
+ pixel_y = 7
+ },
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
+ },
+/area/shuttle/escape)
+"aO" = (
+/mob/living/simple_animal/bot/secbot,
/turf/simulated/floor/plasteel{
icon_state = "cafeteria";
dir = 2
},
/area/shuttle/escape)
-"aD" = (
+"aP" = (
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall7";
+ icon_state = "swall7";
+ dir = 2
+ },
+/area/shuttle/escape)
+"aR" = (
/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"aS" = (
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria";
+ dir = 2
+ },
+/area/shuttle/escape)
+"aT" = (
+/obj/item/twohanded/required/kirbyplants,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "neutralfull"
+ },
+/area/shuttle/escape)
+"aU" = (
+/obj/structure/chair/stool/bar,
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria";
+ dir = 2
+ },
+/area/shuttle/escape)
+"aV" = (
+/obj/structure/table/wood,
+/turf/simulated/floor/plasteel{
+ icon_state = "cafeteria";
+ dir = 2
+ },
+/area/shuttle/escape)
+"aW" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Escape Shuttle Brig";
+ normalspeed = 0;
+ req_access_txt = "63"
+ },
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"aX" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"aZ" = (
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall14";
+ icon_state = "swall14";
+ dir = 2
+ },
+/area/shuttle/escape)
+"ba" = (
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "neutralfull"
+ },
+/area/shuttle/escape)
+"bb" = (
+/obj/structure/sign/greencross,
+/turf/simulated/shuttle/wall{
+ dir = 2;
+ icon_state = "swallc3"
+ },
+/area/shuttle/escape)
+"bc" = (
+/obj/structure/bed/roller,
+/obj/machinery/light{
+ dir = 1;
+ on = 1
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"bd" = (
+/obj/item/storage/box/drinkingglasses,
+/obj/item/reagent_containers/food/drinks/shaker,
+/obj/structure/table/wood,
+/obj/machinery/light{
+ icon_state = "tube1";
dir = 4
},
/turf/simulated/floor/plasteel{
@@ -150,60 +412,7 @@
dir = 2
},
/area/shuttle/escape)
-"aE" = (
-/obj/structure/table/wood,
-/turf/simulated/floor/plasteel{
- icon_state = "cafeteria";
- dir = 2
- },
-/area/shuttle/escape)
-"aF" = (
-/obj/machinery/status_display{
- pixel_y = 30
- },
-/obj/machinery/light/spot{
- tag = "icon-tube1 (NORTH)";
- icon_state = "tube1";
- dir = 1
- },
-/turf/simulated/floor/plasteel{
- icon_state = "cafeteria";
- dir = 2
- },
-/area/shuttle/escape)
-"aG" = (
-/obj/item/storage/box/drinkingglasses,
-/obj/item/reagent_containers/food/drinks/shaker,
-/obj/structure/table/wood,
-/turf/simulated/floor/plasteel{
- icon_state = "cafeteria";
- dir = 2
- },
-/area/shuttle/escape)
-"aH" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = -28
- },
-/turf/simulated/shuttle/floor4,
-/area/shuttle/escape)
-"aI" = (
-/turf/simulated/shuttle/floor4,
-/area/shuttle/escape)
-"aJ" = (
-/obj/structure/grille,
-/obj/structure/window/full/shuttle{
- icon_state = "15"
- },
-/turf/simulated/floor/plating,
-/area/shuttle/escape)
-"aK" = (
-/obj/structure/chair/comfy/shuttle,
-/turf/simulated/floor/plasteel{
- icon_state = "cafeteria";
- dir = 2
- },
-/area/shuttle/escape)
-"aL" = (
+"be" = (
/obj/machinery/chem_dispenser/beer,
/obj/structure/table/wood,
/turf/simulated/floor/plasteel{
@@ -211,24 +420,40 @@
dir = 2
},
/area/shuttle/escape)
-"aM" = (
-/obj/machinery/door/airlock/security/glass{
- name = "Escape Shuttle Cell";
- req_access_txt = "2"
+"bf" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/o2{
+ pixel_x = -3;
+ pixel_y = -3
+ },
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/toxin{
+ pixel_x = 5;
+ pixel_y = 5
},
-/turf/simulated/floor/plating,
-/area/shuttle/escape)
-"aN" = (
-/obj/item/storage/box/drinkingglasses,
-/obj/item/reagent_containers/food/drinks/shaker,
-/obj/item/clothing/mask/cigarette/cigar,
-/obj/structure/table/wood,
/turf/simulated/floor/plasteel{
- icon_state = "cafeteria";
- dir = 2
+ tag = "icon-whiteblue (NORTHEAST)";
+ icon_state = "whiteblue";
+ dir = 5
},
/area/shuttle/escape)
-"aO" = (
+"bg" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/obj/machinery/light,
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"bh" = (
+/obj/machinery/recharger/wallcharger{
+ pixel_x = 5;
+ pixel_y = -28
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "dark"
+ },
+/area/shuttle/escape)
+"bi" = (
/obj/machinery/chem_dispenser/soda,
/obj/structure/table/wood,
/turf/simulated/floor/plasteel{
@@ -236,842 +461,1093 @@
dir = 2
},
/area/shuttle/escape)
-"aP" = (
-/obj/machinery/door/airlock/shuttle{
- aiControlDisabled = 1;
- hackProof = 1;
- id_tag = "s_docking_airlock";
- name = "Shuttle Hatch"
- },
-/turf/simulated/floor/plating,
-/area/shuttle/escape)
-"aQ" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 1
- },
-/turf/simulated/shuttle/floor4,
-/area/shuttle/escape)
-"aR" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 1
- },
-/turf/simulated/floor/plasteel{
- icon_state = "cafeteria";
- dir = 2
- },
-/area/shuttle/escape)
-"aS" = (
-/turf/simulated/shuttle/wall{
- tag = "icon-swall7";
- icon_state = "swall7";
- dir = 2
- },
-/area/shuttle/escape)
-"aT" = (
-/obj/docking_port/mobile/emergency{
- dir = 4;
- dwidth = 11;
- height = 13;
- timid = 1;
- width = 24
- },
-/obj/machinery/door/airlock/shuttle{
- aiControlDisabled = 1;
- hackProof = 1;
- id_tag = "s_docking_airlock";
- name = "Shuttle Hatch"
- },
-/turf/simulated/shuttle/floor,
-/area/shuttle/escape)
-"aU" = (
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"aV" = (
-/obj/machinery/door/window/southright{
- autoclose = 1;
- name = "engineering door";
- req_access_txt = "32"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
- },
-/area/shuttle/escape)
-"aW" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/shuttle/floor4,
-/area/shuttle/escape)
-"aX" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
- },
-/area/shuttle/escape)
-"aY" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"aZ" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"ba" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor5"
- },
-/area/shuttle/escape)
-"bb" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor4,
-/area/shuttle/escape)
-"bc" = (
-/obj/machinery/door/window/southright{
- autoclose = 1;
- name = "science door";
- req_access_txt = "47"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor5"
- },
-/area/shuttle/escape)
-"bd" = (
-/obj/machinery/door/window/northleft{
- autoclose = 1;
- name = "security door";
+"bj" = (
+/obj/machinery/door/airlock/security/glass{
+ name = "Escape Shuttle Cell";
+ normalspeed = 0;
req_access_txt = "2"
},
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
-"be" = (
-/obj/structure/window/reinforced{
- dir = 1
+"bk" = (
+/obj/machinery/door/airlock/mining/glass{
+ name = "Escape Shuttle Cargo";
+ normalspeed = 0;
+ req_access_txt = "50"
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "neutralfull"
},
/area/shuttle/escape)
-"bf" = (
-/obj/item/radio/intercom{
- dir = 8;
- name = "station intercom (General)";
- pixel_x = -28
+"bl" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
},
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
+/obj/machinery/light{
icon_state = "tube1";
dir = 8
},
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
-"bg" = (
-/obj/structure/grille,
-/obj/structure/window/full/shuttle{
- icon_state = "8"
- },
-/turf/simulated/floor/plating,
-/area/shuttle/escape)
-"bh" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bi" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bj" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
- },
-/area/shuttle/escape)
-"bk" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor4,
-/area/shuttle/escape)
-"bl" = (
-/obj/machinery/door/window/northleft{
- autoclose = 1;
- name = "medical door";
- req_access_txt = "5"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
"bm" = (
-/obj/structure/window/reinforced,
-/obj/structure/chair/comfy/shuttle{
+/obj/machinery/sleeper/upgraded{
dir = 4
},
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
},
/area/shuttle/escape)
"bn" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
+/obj/structure/table/reinforced,
/turf/simulated/shuttle/floor{
- icon_state = "floor5"
+ icon_state = "floor2"
},
/area/shuttle/escape)
"bo" = (
-/obj/structure/window/reinforced,
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
+/obj/machinery/door/airlock/shuttle{
+ aiControlDisabled = 1;
+ hackProof = 1;
+ id_tag = "s_docking_airlock";
+ name = "Shuttle Hatch"
},
+/turf/simulated/floor/plasteel,
/area/shuttle/escape)
"bp" = (
-/obj/structure/window/reinforced,
/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
dir = 4
},
-/turf/simulated/floor/plasteel,
+/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
"bq" = (
-/obj/structure/window/reinforced,
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"br" = (
-/obj/structure/window/reinforced,
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor5"
- },
-/area/shuttle/escape)
-"bs" = (
-/obj/structure/closet/walllocker/emerglocker{
- pixel_x = 28
- },
-/obj/machinery/light/spot{
- tag = "icon-tube1 (EAST)";
- icon_state = "tube1";
- dir = 4
- },
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
-"bt" = (
-/obj/structure/window/reinforced,
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor5"
- },
-/area/shuttle/escape)
-"bu" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
- icon_state = "tube1";
- dir = 8
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bv" = (
-/obj/machinery/light/spot{
- tag = "icon-tube1 (EAST)";
- icon_state = "tube1";
- dir = 4
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bw" = (
-/obj/machinery/door/airlock/shuttle{
- aiControlDisabled = 1;
- hackProof = 1;
- id_tag = "s_docking_airlock";
- name = "Shuttle Hatch"
- },
-/turf/simulated/shuttle/floor,
-/area/shuttle/escape)
-"bx" = (
-/obj/structure/noticeboard,
-/turf/simulated/shuttle/wall{
- icon_state = "swall12";
- dir = 2
- },
-/area/shuttle/escape)
-"by" = (
-/obj/machinery/door/airlock/shuttle{
- aiControlDisabled = 1;
- hackProof = 1;
- id_tag = null;
- name = "Shuttle Cargo Hatch"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
-"bz" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
-"bA" = (
-/obj/structure/window/reinforced{
- dir = 1
- },
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor5"
- },
-/area/shuttle/escape)
-"bB" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/o2{
- layer = 2.8;
- pixel_x = 4;
- pixel_y = 6
- },
-/obj/item/storage/firstaid/regular{
- pixel_x = 2;
- pixel_y = 6
- },
-/obj/item/storage/firstaid/regular{
- pixel_x = -2;
- pixel_y = 4
- },
-/obj/item/bodybag{
- pixel_x = 5
- },
-/obj/item/storage/firstaid/fire,
-/obj/item/storage/firstaid/regular{
- pixel_x = 2;
- pixel_y = 3
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bC" = (
-/obj/machinery/door/airlock/medical/glass{
- id_tag = null;
- name = "Escape Shuttle Infirmary";
- req_access_txt = "0"
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bD" = (
-/turf/simulated/shuttle/wall{
- icon_state = "swall11";
- dir = 2
- },
-/area/shuttle/escape)
-"bE" = (
-/obj/machinery/door/airlock/shuttle{
- aiControlDisabled = 1;
- hackProof = 1;
- id_tag = "s_docking_airlock";
- name = "Shuttle Hatch"
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor2"
- },
-/area/shuttle/escape)
-"bF" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 4
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
-"bG" = (
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
-"bH" = (
-/obj/structure/chair/comfy/shuttle{
- dir = 8
- },
-/turf/simulated/shuttle/floor{
- icon_state = "floor3"
- },
-/area/shuttle/escape)
-"bI" = (
-/obj/machinery/vending/wallmed{
- layer = 3.3;
- name = "Emergency NanoMed";
- pixel_x = 28;
- pixel_y = 0;
- req_access_txt = "0"
- },
-/obj/machinery/sleeper,
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bJ" = (
-/obj/item/radio/intercom{
- dir = 4;
- name = "station intercom (General)";
- pixel_x = 28
- },
-/obj/item/extinguisher,
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bK" = (
-/obj/structure/closet/cardboard,
-/obj/machinery/light/spot{
- tag = "icon-tube1 (WEST)";
- icon_state = "tube1";
- dir = 8
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bL" = (
-/obj/machinery/recharge_station,
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bN" = (
-/obj/structure/bed/roller,
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bO" = (
-/obj/machinery/sleeper,
-/obj/machinery/light/spot{
- tag = "icon-tube1 (EAST)";
- icon_state = "tube1";
- dir = 4
- },
-/turf/simulated/floor/plasteel,
-/area/shuttle/escape)
-"bP" = (
/turf/space,
/turf/simulated/shuttle/wall{
icon_state = "swall_f5";
dir = 2
},
/area/shuttle/escape)
-"bQ" = (
-/obj/structure/window/reinforced{
+"br" = (
+/obj/structure/chair/comfy/shuttle{
dir = 1
},
-/obj/structure/shuttle/engine/heater,
-/turf/simulated/shuttle/plating,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
/area/shuttle/escape)
-"bR" = (
+"bs" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swall11";
+ dir = 2
+ },
+/area/shuttle/escape)
+"bt" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swall7";
+ dir = 2
+ },
+/area/shuttle/escape)
+"bu" = (
/obj/structure/shuttle/engine/heater,
/obj/structure/window/reinforced{
dir = 1
},
/turf/simulated/shuttle/plating,
/area/shuttle/escape)
-"bS" = (
+"bv" = (
/turf/space,
/turf/simulated/shuttle/wall{
icon_state = "swall_f9";
dir = 2
},
/area/shuttle/escape)
-"bT" = (
+"bw" = (
/obj/structure/shuttle/engine/propulsion,
/turf/simulated/shuttle/plating,
/area/shuttle/escape)
+"bx" = (
+/obj/structure/bed/roller,
+/obj/machinery/iv_drip,
+/obj/machinery/light,
+/turf/simulated/floor/plasteel{
+ tag = "icon-whiteblue (EAST)";
+ icon_state = "whiteblue";
+ dir = 4
+ },
+/area/shuttle/escape)
+"by" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/escape)
+"bz" = (
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/escape)
+"bA" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/escape)
+"bB" = (
+/obj/structure/table/reinforced,
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/escape)
+"bC" = (
+/obj/structure/sign/directions/engineering,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
+ },
+/area/shuttle/escape)
+"bD" = (
+/obj/machinery/door/airlock/shuttle{
+ aiControlDisabled = 1;
+ hackProof = 1;
+ id_tag = "s_docking_airlock";
+ name = "Shuttle Hatch"
+ },
+/obj/docking_port/mobile/emergency{
+ dir = 4;
+ dwidth = 11;
+ height = 18;
+ timid = 1;
+ width = 29
+ },
+/turf/simulated/floor/plasteel,
+/area/shuttle/escape)
+"bE" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 1
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/escape)
+"bF" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"bG" = (
+/obj/machinery/status_display,
+/turf/simulated/shuttle/wall{
+ tag = "icon-swall14";
+ icon_state = "swall14";
+ dir = 2
+ },
+/area/shuttle/escape)
+"bH" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"bI" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/escape)
+"bJ" = (
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/escape)
+"bK" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/escape)
+"bL" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/escape)
+"bM" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/escape)
+"bO" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bP" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bQ" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"bR" = (
+/obj/structure/flora/ausbushes/grassybush,
+/obj/structure/flora/ausbushes/lavendergrass,
+/obj/structure/flora/ausbushes/ppflowers,
+/obj/structure/flora/ausbushes/sunnybush,
+/obj/structure/window/full/shuttle,
+/turf/simulated/floor/grass,
+/area/shuttle/escape)
+"bS" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/escape)
+"bT" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/escape)
"bU" = (
-/turf/space,
+/obj/structure/sign/directions/science,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
+ },
+/area/shuttle/escape)
+"bV" = (
+/obj/structure/sign/directions/cargo,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
+ },
+/area/shuttle/escape)
+"bW" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/obj/machinery/recharger/wallcharger{
+ pixel_x = -24
+ },
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"bX" = (
+/obj/machinery/ai_status_display,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall3";
+ dir = 2
+ },
+/area/shuttle/escape)
+"bY" = (
+/obj/structure/flora/ausbushes/grassybush,
+/obj/structure/flora/ausbushes/lavendergrass,
+/obj/structure/flora/ausbushes/ywflowers,
+/obj/structure/flora/ausbushes/fernybush,
+/obj/structure/window/full/shuttle,
+/turf/simulated/floor/grass,
+/area/shuttle/escape)
+"bZ" = (
+/obj/machinery/recharge_station/upgraded,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "neutralfull"
+ },
+/area/shuttle/escape)
+"ca" = (
+/obj/machinery/light,
+/turf/simulated/floor/plasteel{
+ dir = 8;
+ icon_state = "neutralfull"
+ },
+/area/shuttle/escape)
+"cb" = (
+/obj/machinery/door/airlock/engineering/glass{
+ name = "Escape Shuttle Engineering";
+ normalspeed = 0;
+ req_access_txt = "32";
+ req_one_access_txt = "0"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor2"
+ },
+/area/shuttle/escape)
+"cc" = (
+/obj/structure/extinguisher_cabinet,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall3";
+ dir = 2
+ },
+/area/shuttle/escape)
+"cd" = (
+/obj/machinery/door/airlock/research/glass{
+ name = "Escape Shuttle Research";
+ normalspeed = 0;
+ req_access_txt = "47"
+ },
+/turf/simulated/shuttle/floor{
+ icon_state = "floor5"
+ },
+/area/shuttle/escape)
+"cf" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "swallc4"
+ },
+/area/shuttle/escape)
+"ck" = (
+/obj/structure/chair/comfy/shuttle{
+ dir = 8
+ },
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"cp" = (
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cw" = (
+/obj/structure/bed/roller,
+/obj/machinery/iv_drip,
+/turf/simulated/floor/plasteel{
+ tag = "icon-whiteblue (EAST)";
+ icon_state = "whiteblue";
+ dir = 4
+ },
+/area/shuttle/escape)
+"cA" = (
+/obj/machinery/light{
+ icon_state = "tube1";
+ dir = 8
+ },
+/obj/structure/chair/comfy/shuttle{
+ dir = 4
+ },
+/turf/simulated/floor/plasteel{
+ icon_state = "bot";
+ dir = 1
+ },
+/area/shuttle/escape)
+"cD" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/backpack/medic,
+/obj/item/storage/belt/medical,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cE" = (
+/obj/structure/bed/roller,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cG" = (
+/obj/structure/table/reinforced,
+/obj/item/clothing/gloves/color/latex/nitrile,
+/obj/item/clothing/mask/breath,
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"cH" = (
+/turf/simulated/shuttle/wall{
+ icon_state = "wall3"
+ },
+/area/shuttle/escape)
+"sc" = (
+/obj/machinery/door/airlock/medical/glass{
+ id_tag = null;
+ name = "Escape Shuttle Medical Seating";
+ normalspeed = 0;
+ req_access_txt = "5"
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"xD" = (
+/obj/structure/table/reinforced,
+/obj/item/reagent_containers/iv_bag/blood/random,
+/obj/item/reagent_containers/iv_bag/blood/random,
+/obj/item/reagent_containers/iv_bag/blood/random,
+/obj/item/reagent_containers/iv_bag/blood/random,
+/obj/item/reagent_containers/iv_bag/blood/random,
+/obj/item/reagent_containers/iv_bag/blood/random,
+/turf/simulated/floor/plasteel{
+ tag = "icon-whiteblue (EAST)";
+ icon_state = "whiteblue";
+ dir = 4
+ },
+/area/shuttle/escape)
+"PY" = (
+/obj/structure/table/reinforced,
+/obj/item/storage/firstaid/machine{
+ pixel_x = -5;
+ pixel_y = -5
+ },
+/obj/item/storage/firstaid/regular,
+/obj/item/storage/firstaid/adv{
+ pixel_x = 5;
+ pixel_y = 5
+ },
+/turf/simulated/floor/plasteel{
+ dir = 2;
+ icon_state = "cmo"
+ },
+/area/shuttle/escape)
+"Qf" = (
+/obj/machinery/defibrillator_mount/loaded,
+/turf/simulated/shuttle/wall{
+ icon_state = "swall12";
+ dir = 2
+ },
+/area/shuttle/escape)
+"UN" = (
+/obj/structure/chair/comfy/shuttle,
+/turf/simulated/shuttle/floor4,
+/area/shuttle/escape)
+"Wy" = (
+/obj/structure/chair/comfy/shuttle,
+/obj/machinery/light{
+ dir = 1;
+ on = 1
+ },
+/turf/simulated/shuttle/floor4,
/area/shuttle/escape)
(1,1,1) = {"
aa
-aa
-aa
-aa
-aa
ab
-ap
-ap
-ap
-aP
-aS
-aT
-ap
-aB
-bg
-aJ
-ap
-bw
-aS
-bE
+aq
ac
-ap
-bP
+aq
+aP
+aq
+aq
+aq
+bo
+aP
+bD
+aq
+ac
+ac
+ac
+aq
+bo
+aq
+bo
+bt
+aq
+ac
+ac
+aq
+aq
+bt
+bq
aa
"}
(2,1,1) = {"
aa
-aa
-ab
-ap
-ap
-aw
+av
+az
+bl
+az
+ac
+az
+bW
az
aH
-aI
-aI
-ae
-aU
-bf
-aW
-bj
-bm
-bu
-aU
-ae
-aU
-aU
-bK
-ax
+aN
+ba
bP
+bO
+bP
+bP
+bP
+ba
+aT
+ba
+bR
+bP
+cA
+bP
+bP
+bP
+av
+cH
+cH
"}
(3,1,1) = {"
aa
-ab
-af
-aq
-aq
-ae
-aA
-aI
-aI
-aI
-ae
-aU
-bd
-aI
-be
-aV
-aU
-aU
-bx
-aU
-aU
-bL
-bQ
-bT
+ac
+aH
+aH
+aH
+bj
+aH
+aH
+aH
+aH
+av
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+bV
+ba
+ba
+ba
+ba
+ba
+av
+bu
+bw
"}
(4,1,1) = {"
aa
-ae
-ai
-al
-aq
-ae
-az
-aI
-aI
-aQ
-ae
-aU
-bk
-bb
+av
aX
-bo
-aU
-aU
-by
-aU
-aU
-bL
+bp
+aX
+ac
+aH
+aH
+aH
+aR
+av
+ba
bQ
-bT
+bQ
+bQ
+bQ
+bQ
+bQ
+ba
+ba
+bk
+ba
+ba
+ba
+ba
+ba
+ac
+bu
+bw
"}
(5,1,1) = {"
-aa
-ae
-aj
-al
+ab
+bs
+aq
+aq
aq
-ae
-az
-aI
-aI
-aQ
-ae
-aU
-aB
-bg
-bg
-aJ
-aU
-aU
-aB
-bg
-bg
-aJ
aw
-bS
+Wy
+aH
+aH
+bg
+av
+ba
+bP
+bP
+bP
+bP
+bP
+bP
+ba
+ba
+bR
+bQ
+ck
+bQ
+bQ
+bQ
+av
+cH
+cH
"}
(6,1,1) = {"
-ab
-af
-ak
-al
-aq
-ax
-aB
-aJ
-aM
-aB
-aJ
-aU
-aY
-bh
-bh
-bp
-aU
-aU
-aY
-bh
-bh
-bh
+av
ae
-bU
+am
+ar
+ay
+aD
+aJ
+aH
+aH
+aH
+aW
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ca
+bG
+bY
+cc
+bR
+bX
+bY
+aw
+cH
+cH
"}
(7,1,1) = {"
ac
-ag
-al
-aq
-aq
-ay
-aC
-aC
-aC
-aC
-aC
-aU
-aU
-aU
-aU
-aU
-aU
-aU
-aU
-aU
-aU
-aU
-ae
-bU
+af
+an
+as
+aA
+av
+UN
+aG
+aH
+aH
+aW
+ba
+bQ
+bQ
+bQ
+bQ
+bQ
+bQ
+ba
+ba
+bR
+by
+bL
+by
+by
+bn
+av
+cH
+cH
"}
(8,1,1) = {"
-ad
-ah
-am
+ac
+ag
+ao
+an
+bh
+aZ
aq
aq
-ae
-aD
-aD
-aD
-aD
-aD
-aU
-aZ
-bi
-bi
-bq
-aU
-aU
-aZ
-bi
-bi
-bi
-ae
-bU
+aW
+ac
+cf
+ba
+bP
+bP
+bP
+bP
+bP
+bP
+ba
+ba
+bC
+bz
+bz
+bz
+bz
+br
+av
+bu
+bw
"}
(9,1,1) = {"
-aa
-ae
+ac
+ah
+ao
+an
an
-al
-aq
-ae
aE
+an
+an
+an
+an
aE
-aE
-aE
-aE
-aU
-aB
-bg
-bg
-aJ
-aU
-aU
-aB
-bg
-bg
-aJ
-aw
-bP
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+cb
+bz
+bz
+bz
+bz
+br
+ac
+bu
+bw
"}
(10,1,1) = {"
-aa
-ae
+ac
+ai
ao
-al
-aq
-ae
-aC
-aC
-aC
-aC
-aC
-aU
-bz
-bF
+an
+an
+aE
+an
+an
+an
+an
+aE
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
ba
-br
-aU
-aU
-bC
-aU
-aU
-bN
bR
-bT
+bz
+bz
+bz
+bz
+br
+av
+bu
+bw
"}
(11,1,1) = {"
-aa
-ad
-ah
-aq
-aq
-ae
-aF
-aK
-aN
-aR
-aC
-aU
-bl
-bG
-bn
-bc
-aU
-aU
ac
-aU
-aU
-bB
+aj
+ao
+at
+an
+aZ
+aq
+aq
+aL
+ac
+bb
+ba
+bQ
+bQ
+bQ
+bQ
+bQ
+bQ
+ba
+ba
bR
-bT
+bA
+bM
+bA
+bA
+bn
+av
+bu
+bw
"}
(12,1,1) = {"
-aa
-aa
-ad
-ap
-ap
+ac
+ak
+an
+au
+aB
+av
+bm
+cp
+cp
+cp
+aI
+ba
+bP
+bP
+bP
+bP
+bP
+bP
+ba
+ca
+bG
+bY
+cc
+bR
+bX
+bY
aw
-aG
-aL
-aO
-aR
-aC
-aU
-bs
-bH
-bA
-bt
-bv
-aU
-ae
-bI
-bJ
-bO
-ax
-bS
+cH
+cH
"}
(13,1,1) = {"
+av
+al
+ap
+ax
+aC
+aD
+bm
+cp
+cp
+cp
+aI
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+ba
+bR
+bI
+bS
+bI
+bI
+bB
+av
+cH
+cH
+"}
+(14,1,1) = {"
+ad
+bt
+aq
+aq
+aq
+aw
+bc
+cp
+cp
+bx
+av
+ba
+aS
+aU
+aU
+aU
+aU
+aS
+ba
+ba
+bU
+bJ
+bJ
+bJ
+bJ
+bE
+av
+cH
+cH
+"}
+(15,1,1) = {"
aa
+av
+bF
+aM
+bF
+Qf
+cE
+cp
+cp
+cw
+av
+ba
+aO
+aV
+aV
+aV
+aV
+aU
+ba
+ba
+cd
+bJ
+bJ
+bJ
+bJ
+bE
+ac
+bu
+bw
+"}
+(16,1,1) = {"
aa
+ac
+cp
+cp
+cp
+sc
+cp
+cp
+cp
+xD
+av
+ba
+aS
+aS
+aS
+aS
+aV
+aU
+ba
+ba
+bR
+bJ
+bJ
+bJ
+bJ
+bE
+av
+bu
+bw
+"}
+(17,1,1) = {"
aa
-aa
+av
+aF
+bH
+aF
+av
+cG
+PY
+cD
+bf
+av
+aT
+aS
+bd
+be
+bi
+aV
+aU
+bZ
+bZ
+bR
+bK
+bT
+bK
+bK
+bB
+av
+cH
+cH
+"}
+(18,1,1) = {"
aa
ad
-ap
-ap
-ap
+aq
ac
-ap
-ap
-ap
-aB
-bg
-aJ
-ap
+aq
+bs
+aq
+aq
+aq
+aq
+bs
ac
-bD
-ap
-ap
-ap
-bS
+ac
+ac
+ac
+ac
+ac
+aq
+ac
+ac
+bs
+ac
+aq
+ac
+ac
+ac
+bs
+bv
aa
"}
diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm
index ed4cb0d5940..ee1cd3fa762 100644
--- a/code/__DEFINES/layers.dm
+++ b/code/__DEFINES/layers.dm
@@ -7,6 +7,7 @@
#define PLANE_SPACE_PARALLAX -90
#define FLOOR_PLANE -2
+#define FLOOR_OVERLAY_PLANE -1.5
#define GAME_PLANE -1
#define BLACKNESS_PLANE 0 //To keep from conflicts with SEE_BLACKNESS internals
diff --git a/code/__DEFINES/logs.dm b/code/__DEFINES/logs.dm
index 25d1fac7323..96fac582283 100644
--- a/code/__DEFINES/logs.dm
+++ b/code/__DEFINES/logs.dm
@@ -4,3 +4,8 @@
#define SAY_LOG "Say"
#define EMOTE_LOG "Emote"
#define MISC_LOG "Misc"
+#define DEADCHAT_LOG "Deadchat"
+#define OOC_LOG "OOC"
+#define LOOC_LOG "LOOC"
+
+#define ALL_LOGS list(ATTACK_LOG, DEFENSE_LOG, CONVERSION_LOG, SAY_LOG, EMOTE_LOG, DEADCHAT_LOG, OOC_LOG, LOOC_LOG, MISC_LOG)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 5e52d25538f..fc0f7520e0e 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1919,16 +1919,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
return pois
-/*
- * Returns all player mobs in an assoc list with ckey as key and the mob as value
-*/
-/proc/get_assoc_mob_list_by_ckey()
- var/list/mob/mobs = list()
- for(var/i in GLOB.player_list)
- var/mob/M = i
- mobs[M.ckey] = M
- return mobs
-
/proc/flash_color(mob_or_client, flash_color="#960000", flash_time=20)
var/client/C
if(istype(mob_or_client, /mob))
@@ -2027,5 +2017,10 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
set waitfor = FALSE
return call(source, proctype)(arglist(arguments))
+/proc/IsFrozen(atom/A)
+ if(A in GLOB.frozen_atom_list)
+ return TRUE
+ return FALSE
+
/// Waits at a line of code until X is true
#define UNTIL(X) while(!(X)) stoplag()
diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm
index f5f71e65c57..50e70bc62a4 100644
--- a/code/_globalvars/logging.dm
+++ b/code/_globalvars/logging.dm
@@ -34,4 +34,6 @@ GLOBAL_PROTECT(IClog)
GLOBAL_LIST_EMPTY(OOClog)
GLOBAL_PROTECT(OOClog)
+GLOBAL_DATUM_INIT(logging, /datum/logging, new /datum/logging())
+
GLOBAL_LIST_INIT(investigate_log_subjects, list("notes", "watchlist", "hrefs"))
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index d840f64bb4a..36b6d647b7d 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -73,7 +73,9 @@
var/dragged = modifiers["drag"]
if(dragged && !modifiers[dragged])
return
-
+ if(IsFrozen(A) && !is_admin(usr))
+ to_chat(usr, "Interacting with admin-frozen players is not permitted.")
+ return
if(modifiers["middle"] && modifiers["shift"] && modifiers["ctrl"])
MiddleShiftControlClickOn(A)
return
diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm
index ef89317d0f5..16a44e00ece 100644
--- a/code/controllers/subsystem/jobs.dm
+++ b/code/controllers/subsystem/jobs.dm
@@ -644,6 +644,27 @@ SUBSYSTEM_DEF(jobs)
oldjobdatum.current_positions--
newjobdatum.current_positions++
+/datum/controller/subsystem/jobs/proc/notify_dept_head(jobtitle, antext)
+ // Used to notify the department head of jobtitle X that their employee was brigged, demoted or terminated
+ if(!jobtitle || !antext)
+ return
+ var/datum/job/tgt_job = GetJob(jobtitle)
+ if(!tgt_job)
+ return
+ if(!tgt_job.department_head[1])
+ return
+ var/boss_title = tgt_job.department_head[1]
+ var/obj/item/pda/target_pda
+ for(var/obj/item/pda/check_pda in GLOB.PDAs)
+ if(check_pda.ownrank == boss_title)
+ target_pda = check_pda
+ break
+ if(!target_pda)
+ return
+ var/datum/data/pda/app/messenger/PM = target_pda.find_program(/datum/data/pda/app/messenger)
+ if(PM && PM.can_receive())
+ PM.notify("Automated Notification: \"[antext]\" (Unable to Reply)")
+
/datum/controller/subsystem/jobs/proc/fetch_transfer_record_html(var/centcom)
var/record_html = "
"
diff --git a/code/controllers/subsystem/tickets/mentor_tickets.dm b/code/controllers/subsystem/tickets/mentor_tickets.dm
index 3fd003418a4..af4ea2e914d 100644
--- a/code/controllers/subsystem/tickets/mentor_tickets.dm
+++ b/code/controllers/subsystem/tickets/mentor_tickets.dm
@@ -6,17 +6,23 @@ GLOBAL_REAL(SSmentor_tickets, /datum/controller/subsystem/tickets/mentor_tickets
/datum/controller/subsystem/tickets/mentor_tickets
name = "Mentor Tickets"
+ offline_implications = "Mentor tickets will no longer be marked as stale. No immediate action is needed."
ticket_system_name = "Mentor Tickets"
ticket_name = "Mentor Ticket"
span_class = "mentorhelp"
+ other_ticket_name = "Admin"
+ other_ticket_permission = R_ADMIN
close_rights = R_MENTOR | R_ADMIN
- offline_implications = "Mentor tickets will no longer be marked as stale. No immediate action is needed."
-
-/datum/controller/subsystem/tickets/mentor_tickets/message_staff(var/msg)
- message_mentorTicket(msg)
+ rights_needed = R_MENTOR | R_ADMIN | R_MOD
/datum/controller/subsystem/tickets/mentor_tickets/Initialize()
close_messages = list("- [ticket_name] Closed -",
"Please try to be as descriptive as possible in mentor helps. Mentors do not know the full situation you're in and need more information to give you a helpful response.",
"Your [ticket_name] has now been closed.")
return ..()
+
+/datum/controller/subsystem/tickets/mentor_tickets/message_staff(msg)
+ message_mentorTicket(msg)
+
+/datum/controller/subsystem/tickets/mentor_tickets/create_other_system_ticket(datum/ticket/T)
+ SStickets.newTicket(T.clientName, T.content, T.title)
diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm
index 8fae7179706..64f91e96b6c 100644
--- a/code/controllers/subsystem/tickets/tickets.dm
+++ b/code/controllers/subsystem/tickets/tickets.dm
@@ -12,18 +12,23 @@
SUBSYSTEM_DEF(tickets)
name = "Admin Tickets"
- var/span_class = "adminticket"
- var/ticket_system_name = "Admin Tickets"
- var/ticket_name = "Admin Ticket"
- var/close_rights = R_ADMIN
- var/list/close_messages
init_order = INIT_ORDER_TICKETS
wait = 300
priority = FIRE_PRIORITY_TICKETS
offline_implications = "Admin tickets will no longer be marked as stale. No immediate action is needed."
-
flags = SS_BACKGROUND
+ var/span_class = "adminticket"
+ var/ticket_system_name = "Admin Tickets"
+ var/ticket_name = "Admin Ticket"
+ var/close_rights = R_ADMIN
+ var/rights_needed = R_ADMIN | R_MOD
+
+ /// The name of the other ticket type to convert to
+ var/other_ticket_name = "Mentor"
+ /// Which permission to look for when seeing if there is staff available for the other ticket type
+ var/other_ticket_permission = R_MENTOR
+ var/list/close_messages
var/list/allTickets = list() //make it here because someone might ahelp before the system has initialized
var/ticketCounter = 1
@@ -114,9 +119,37 @@ SUBSYSTEM_DEF(tickets)
to_chat_safe(returnClient(N), "Your [ticket_name] has now been resolved.")
return TRUE
+/datum/controller/subsystem/tickets/proc/convert_to_other_ticket(ticketId)
+ if(!check_rights(rights_needed))
+ return
+ if(alert("Are you sure to convert this ticket to an '[other_ticket_name]' ticket?",,"Yes","No") != "Yes")
+ return
+ if(!other_ticket_system_staff_check())
+ return
+ var/datum/ticket/T = allTickets[ticketId]
+ convert_ticket(T)
+
+/datum/controller/subsystem/tickets/proc/other_ticket_system_staff_check()
+ var/list/staff = staff_countup(other_ticket_permission)
+ if(!staff[1])
+ if(alert("No active staff online to answer the ticket. Are you sure you want to convert the ticket?",, "No", "Yes") != "Yes")
+ return FALSE
+ return TRUE
+
+/datum/controller/subsystem/tickets/proc/convert_ticket(datum/ticket/T)
+ T.ticketState = TICKET_CLOSED
+ var/client/C = usr.client
+ to_chat_safe(T.clientName, list("[key_name_hidden(C)] has converted your ticket to a [other_ticket_name] ticket.",\
+ "Be sure to use the correct type of help next time!"))
+ message_staff("[C] has converted ticket number [T.ticketNum] to a [other_ticket_name] ticket.")
+ log_game("[C] has converted ticket number [T.ticketNum] to a [other_ticket_name] ticket.")
+ create_other_system_ticket(T)
+
+/datum/controller/subsystem/tickets/proc/create_other_system_ticket(datum/ticket/T)
+ SSmentor_tickets.newTicket(T.clientName, T.content, T.title)
/datum/controller/subsystem/tickets/proc/autoRespond(N)
- if(!check_rights(R_ADMIN|R_MOD))
+ if(!check_rights(rights_needed))
return
var/datum/ticket/T = allTickets[N]
@@ -131,6 +164,7 @@ SUBSYSTEM_DEF(tickets)
"Already Resolved" = "The problem has been resolved already.",
"Mentorhelp" = "Please redirect your question to Mentorhelp, as they are better experienced with these types of questions.",
"Happens Again" = "Thanks, let us know if it continues to happen.",
+ "Github Issue Report" = "To report a bug, please go to our Github page. Then go to 'Issues'. Then 'New Issue'. Then fill out the report form. If the report would reveal current-round information, file it after the round ends.",
"Clear Cache" = "To fix a blank screen, go to the 'Special Verbs' tab and press 'Reload UI Resources'. If that fails, clear your BYOND cache (instructions provided with 'Reload UI Resources'). If that still fails, please adminhelp again, stating you have already done the following." ,
"IC Issue" = "This is an In Character (IC) issue and will not be handled by admins. You could speak to Security, Internal Affairs, a Departmental Head, Nanotrasen Representetive, or any other relevant authority currently on station.",
"Reject" = "Reject",
@@ -157,14 +191,17 @@ SUBSYSTEM_DEF(tickets)
resolveTicket(N)
message_staff("[C] has auto responded to [T.clientName]\'s adminhelp with: [message_key] ")
log_game("[C] has auto responded to [T.clientName]\'s adminhelp with: [response_phrases[message_key]]")
+ if("Mentorhelp")
+ convert_ticket(T)
else
var/msg_sound = sound('sound/effects/adminhelp.ogg')
SEND_SOUND(returnClient(N), msg_sound)
- to_chat(returnClient(N), "[key_name_hidden(C)] is autoresponding with: [response_phrases[message_key]]")//for this we want the full value of whatever key this is to tell the player so we do response_phrases[message_key]
+ to_chat_safe(returnClient(N), "[key_name_hidden(C)] is autoresponding with: [response_phrases[message_key]]")//for this we want the full value of whatever key this is to tell the player so we do response_phrases[message_key]
message_staff("[C] has auto responded to [T.clientName]\'s adminhelp with: [message_key] ") //we want to use the short named keys for this instead of the full sentence which is why we just do message_key
T.lastStaffResponse = "Autoresponse: [message_key]"
resolveTicket(N)
log_game("[C] has auto responded to [T.clientName]\'s adminhelp with: [response_phrases[message_key]]")
+
//Set ticket state with key N to closed
/datum/controller/subsystem/tickets/proc/closeTicket(N)
var/datum/ticket/T = allTickets[N]
@@ -352,7 +389,7 @@ UI STUFF
dat += "| [T.content[i]] |
"
dat += "
"
- dat += "Re-Open[check_rights(R_ADMIN|R_MOD, 0) ? "Auto": ""]Resolve
"
+ dat += "Re-Open[check_rights(rights_needed, 0) ? "Auto": ""]Resolve
"
if(!T.staffAssigned)
dat += "No staff member assigned to this [ticket_name] - Take Ticket
"
@@ -367,6 +404,7 @@ UI STUFF
dat += "
"
dat += "Close Ticket"
+ dat += "Convert Ticket"
var/datum/browser/popup = new(user, "[ticket_system_name]detail", "[ticket_system_name] #[T.ticketNum]", 1000, 600)
popup.set_content(dat)
@@ -449,7 +487,6 @@ UI STUFF
if(closeTicket(indexNum))
showDetailUI(usr, indexNum)
-
if(href_list["detailreopen"])
var/indexNum = text2num(href_list["detailreopen"])
if(openTicket(indexNum))
@@ -469,6 +506,10 @@ UI STUFF
var/indexNum = text2num(href_list["autorespond"])
autoRespond(indexNum)
+ if(href_list["convert_ticket"])
+ var/indexNum = text2num(href_list["convert_ticket"])
+ convert_to_other_ticket(indexNum)
+
if(href_list["resolveall"])
if(ticket_system_name == "Mentor Tickets")
usr.client.resolveAllMentorTickets()
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index f619e9aa9bd..3e3e1696e61 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -57,6 +57,9 @@
W.plane = initial(W.plane)
W.loc = affected_mob.loc
W.dropped(affected_mob)
+ if(isobj(affected_mob.loc))
+ var/obj/O = affected_mob.loc
+ O.force_eject_occupant()
var/mob/living/new_mob = new new_form(affected_mob.loc)
if(istype(new_mob))
new_mob.a_intent = "harm"
diff --git a/code/datums/log_viewer.dm b/code/datums/log_viewer.dm
index 72872e93a3c..5f7084a738b 100644
--- a/code/datums/log_viewer.dm
+++ b/code/datums/log_viewer.dm
@@ -1,16 +1,23 @@
-#define ALL_LOGS list(ATTACK_LOG, DEFENSE_LOG, CONVERSION_LOG, SAY_LOG, EMOTE_LOG, MISC_LOG)
+#define UPDATE_CKEY_MOB(__ckey) var/mob/result = selected_ckeys_mobs[__ckey];\
+if(!result || result.ckey != __ckey){\
+ result = get_mob_by_ckey(__ckey);\
+ selected_ckeys_mobs[__ckey] = result;\
+}
/datum/log_viewer
var/time_from = 0
var/time_to = 4 HOURS // 4 Hours should be enough. INFINITY would screw the UI up
- var/list/selected_mobs = list() // The mobs in question
+ var/list/selected_mobs = list() // The mobs in question.
+ var/list/selected_ckeys = list() // The ckeys selected to search for. Will show all mobs the ckey is attached to
+ var/list/mob/selected_ckeys_mobs = list()
var/list/selected_log_types = ALL_LOGS // The log types being searched for
-
var/list/log_records = list() // Found and sorted records
/datum/log_viewer/proc/clear_all()
selected_mobs.Cut()
selected_log_types = ALL_LOGS
+ selected_ckeys.Cut()
+ selected_ckeys_mobs.Cut()
time_from = initial(time_from)
time_to = initial(time_to)
log_records.Cut()
@@ -19,13 +26,17 @@
/datum/log_viewer/proc/search()
log_records.Cut() // Empty the old results
var/list/invalid_mobs = list()
+ var/list/ckeys = selected_ckeys.Copy()
for(var/i in selected_mobs)
var/mob/M = i
- if(!M || QDELETED(M))
+ if(!M || QDELETED(M) || !M.last_known_ckey)
invalid_mobs |= M
continue
+ ckeys |= M.last_known_ckey
+
+ for(var/ckey in ckeys)
for(var/log_type in selected_log_types)
- var/list/logs = M.logs[log_type]
+ var/list/logs = GLOB.logging.get_logs_by_type(ckey, log_type)
var/len_logs = length(logs)
if(len_logs)
var/start_index = get_earliest_log_index(logs)
@@ -95,13 +106,19 @@
if(!mobs?.len)
return
for(var/i in mobs)
- var/mob/M = i
- if(istype(M))
- selected_mobs |= M
+ add_mob(usr, i, FALSE)
-/datum/log_viewer/proc/add_mob(mob/user, mob/M)
+/datum/log_viewer/proc/add_ckey(mob/user, ckey)
+ if(!user || !user)
+ return
+ selected_ckeys |= ckey
+ UPDATE_CKEY_MOB(ckey)
+ show_ui(user)
+
+/datum/log_viewer/proc/add_mob(mob/user, mob/M, show_the_ui = TRUE)
if(!M || !user)
return
+
selected_mobs |= M
show_ui(user)
@@ -112,7 +129,7 @@
var/trStyle = "border-top:1px solid; border-bottom:1px solid; padding-top: 5px; padding-bottom: 5px;"
var/dat
dat += ""
- dat += ""
+ dat += "
"
dat += "
Time Search Range: [gameTimestamp(wtime = time_from)]"
dat += " To:
[gameTimestamp(wtime = time_to)]"
dat += "
"
@@ -125,19 +142,24 @@
continue
dat += "
[get_display_name(M)]"
dat += "
Add Mob"
- dat += "
Add Mob (by ckey)"
dat += "
Clear All Mobs"
dat += "
"
+ dat += "
Ckeys being used:"
+ for(var/ckey in selected_ckeys)
+ dat += "
[get_ckey_name(ckey)]"
+ dat += "
Add ckey"
+ dat += "
Clear All ckeys"
+ dat += "
"
+
dat += "
Log Types:"
- for(var/i in all_log_types)
- var/log_type = i
+ for(var/log_type in all_log_types)
var/enabled = (log_type in selected_log_types)
var/text
var/style
if(enabled)
text = "
[log_type]"
- style = "background: [get_logtype_color(i)]"
+ style = "background: [get_logtype_color(log_type)]"
else
text = log_type
@@ -153,7 +175,7 @@
var/tdStyleType = "width:80px; text-align:center;"
var/tdStyleWho = "width:400px; text-align:center;"
var/tdStyleWhere = "width:150px; text-align:center;"
- dat += "
"
+ dat += "
"
dat += "
"
dat += "| When | Type | Who | What | Target | Where |
"
for(var/i in log_records)
@@ -207,15 +229,20 @@
selected_mobs.Cut()
show_ui(usr)
return
+ if(href_list["clear_ckeys"])
+ selected_ckeys.Cut()
+ selected_ckeys_mobs.Cut()
+ show_ui(usr)
+ return
if(href_list["add_mob"])
var/list/mobs = getpois(TRUE, TRUE)
var/datum/async_input/A = input_autocomplete_async(usr, "Please, select a mob: ", mobs)
A.on_close(CALLBACK(src, .proc/add_mob, usr))
return
- if(href_list["add_mob_ckey"])
- var/list/mobs = get_assoc_mob_list_by_ckey()
- var/datum/async_input/A = input_autocomplete_async(usr, "Please, select a ckey: ", mobs)
- A.on_close(CALLBACK(src, .proc/add_mob, usr))
+ if(href_list["add_ckey"])
+ var/list/ckeys = GLOB.logging.get_ckeys_logged()
+ var/datum/async_input/A = input_autocomplete_async(usr, "Please, select a ckey: ", ckeys)
+ A.on_close(CALLBACK(src, .proc/add_ckey, usr))
return
if(href_list["remove_mob"])
var/mob/M = locate(href_list["remove_mob"])
@@ -223,6 +250,10 @@
selected_mobs -= M
show_ui(usr)
return
+ if(href_list["remove_ckey"])
+ selected_ckeys -= href_list["remove_ckey"]
+ show_ui(usr)
+ return
if(href_list["toggle_log_type"])
var/log_type = href_list["toggle_log_type"]
if(log_type in selected_log_types)
@@ -246,6 +277,12 @@
return "deepskyblue"
if(MISC_LOG)
return "gray"
+ if(DEADCHAT_LOG)
+ return "#cc00c6"
+ if(OOC_LOG)
+ return "#002eb8"
+ if(LOOC_LOG)
+ return "#6699CC"
return "slategray"
/datum/log_viewer/proc/get_display_name(mob/M)
@@ -254,4 +291,12 @@
name = "[name] ([M.real_name])"
if(isobserver(M))
name = "[name] (DEAD)"
- return name
+ return "\[[M.last_known_ckey]\] [name]"
+
+/datum/log_viewer/proc/get_ckey_name(ckey)
+ UPDATE_CKEY_MOB(ckey)
+ var/mob/M = selected_ckeys_mobs[ckey]
+
+ return get_display_name(M)
+
+#undef UPDATE_CKEY_MOB
diff --git a/code/datums/logging.dm b/code/datums/logging.dm
new file mode 100644
index 00000000000..bac26610e5e
--- /dev/null
+++ b/code/datums/logging.dm
@@ -0,0 +1,47 @@
+/datum/logging
+ var/list/datum/log_record/logs = list() // Assoc list of assoc lists (ckey, (log_type, list/logs))
+
+/datum/logging/proc/add_log(ckey, datum/log_record/log)
+ if(!ckey)
+ log_debug("GLOB.logging.add_log called with an invalid ckey")
+ return
+
+ if(!logs[ckey])
+ logs[ckey] = list()
+
+ var/list/log_types_list = logs[ckey]
+
+ if(!log_types_list[log.log_type])
+ log_types_list[log.log_type] = list()
+
+ var/list/datum/log_record/log_records = log_types_list[log.log_type]
+ log_records.Add(log)
+
+/datum/logging/proc/get_ckeys_logged()
+ var/list/ckeys = list()
+ for(var/ckey in logs)
+ ckeys.Add(ckey)
+ return ckeys
+
+/* Returns the logs of a given ckey and log_type
+ * If no logs exist it will return an empty list
+*/
+/datum/logging/proc/get_logs_by_type(ckey, log_type)
+ if(!ckey)
+ log_debug("GLOB.logging.get_logs_by_type called with an invalid ckey")
+ return
+ if(!log_type || !(log_type in ALL_LOGS))
+ log_debug("GLOB.logging.get_logs_by_type called with an invalid log_type '[log_type]'")
+ return
+
+ var/list/log_types_list = logs[ckey]
+ // Check if logs exist for the ckey
+ if(!length(log_types_list))
+ return list()
+
+ var/list/datum/log_record/log_records = log_types_list[log_type]
+
+ // Check if logs exist for this type
+ if(!log_records)
+ return list()
+ return log_records
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 103865bee94..0c992bbb32c 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -100,14 +100,6 @@
current.mind = null
leave_all_huds() //leave all the huds in the old body, so it won't get huds if somebody else enters it
- for(var/log_type in current.logs) // Copy the old logs
- var/list/logs = current.logs[log_type]
- if(new_character.logs[log_type])
- new_character.logs[log_type] += logs.Copy() // Append the old ones
- new_character.logs[log_type] = sortTim(new_character.logs[log_type], /proc/compare_log_record) // Sort them on time
- else
- new_character.logs[log_type] = logs.Copy() // Just copy them
-
SSnanoui.user_transferred(current, new_character)
if(new_character.mind) //remove any mind currently in our new body's mind variable
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index 09c874ce8a8..40aeda21b58 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -194,7 +194,7 @@ GLOBAL_LIST_INIT(wireColours, list("red", "blue", "green", "black", "orange", "b
return 1
/datum/wires/CanUseTopic(mob/user, datum/topic_state/state)
- if(!CanUse(user))
+ if(!holder || !CanUse(user))
return STATUS_CLOSE
return ..()
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index fb0ccff32cb..d887153c6d5 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -282,6 +282,9 @@
occupant = null
icon_state = "scanner_open"
+/obj/machinery/dna_scannernew/force_eject_occupant()
+ go_out(null, TRUE)
+
/obj/machinery/dna_scannernew/ex_act(severity)
if(occupant)
occupant.ex_act(severity)
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index bf5fbb70731..433fc5b526a 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -20,8 +20,8 @@ GLOBAL_LIST_EMPTY(all_cults)
var/mob/living/carbon/human/H = mind.current
if(ismindshielded(H)) //mindshield protects against conversions unless removed
return FALSE
-// if(mind.offstation_role) cant convert offstation roles such as ghost spawns
-// return FALSE Commented out until we can figure out why offstation_role is getting set to TRUE on normal crew
+ if(mind.offstation_role)
+ return FALSE
if(issilicon(mind.current))
return FALSE //can't convert machines, that's ratvar's thing
if(isguardian(mind.current))
@@ -231,6 +231,8 @@ GLOBAL_LIST_EMPTY(all_cults)
/datum/game_mode/cult/proc/get_unconvertables()
var/list/ucs = list()
for(var/mob/living/carbon/human/player in GLOB.player_list)
+ if(player.mind && player.mind.offstation_role)
+ continue
if(!is_convertable_to_cult(player.mind))
ucs += player.mind
return ucs
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index e4d0befa61e..7c5a03e29e6 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -411,6 +411,9 @@
for(var/atom/movable/A in contents - component_parts - list(beaker))
A.forceMove(loc)
+/obj/machinery/sleeper/force_eject_occupant()
+ go_out()
+
/obj/machinery/sleeper/proc/inject_chemical(mob/living/user as mob, chemical, amount)
if(!(chemical in possible_chems))
to_chat(user, "The sleeper does not offer that chemical!")
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 1ee30b6e9d0..3fa78dd02e6 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -172,6 +172,9 @@
for(var/atom/movable/A in contents - component_parts)
A.forceMove(loc)
+/obj/machinery/bodyscanner/force_eject_occupant()
+ go_out()
+
/obj/machinery/bodyscanner/ex_act(severity)
if(occupant)
occupant.ex_act(severity)
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 8d6c545e0a8..98f56feeb6a 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -390,7 +390,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if(!job_in_department(SSjobs.GetJob(t1)))
return 0
if(t1 == "Custom")
- var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN))
+ var/temp_t = sanitize(reject_bad_name(copytext(input("Enter a custom job assignment.", "Assignment"), 1, MAX_MESSAGE_LEN), TRUE))
//let custom jobs function as an impromptu alt title, mainly for sechuds
if(temp_t && modify)
SSjobs.log_job_transfer(modify.registered_name, modify.getRankAndAssignment(), temp_t, scan.registered_name)
@@ -419,7 +419,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
message_admins("[key_name_admin(usr)] has reassigned \"[modify.registered_name]\" from \"[jobnamedata]\" to \"[t1]\".")
SSjobs.log_job_transfer(modify.registered_name, jobnamedata, t1, scan.registered_name)
- SSjobs.slot_job_transfer(modify.rank, t1)
+ if(modify.owner_uid)
+ SSjobs.slot_job_transfer(modify.rank, t1)
var/mob/living/carbon/human/H = modify.getPlayer()
if(istype(H))
@@ -436,7 +437,7 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if(is_authenticated(usr) && !target_dept)
var/t2 = modify
if((modify == t2 && (in_range(src, usr) || (istype(usr, /mob/living/silicon))) && istype(loc, /turf)))
- var/temp_name = reject_bad_name(href_list["reg"])
+ var/temp_name = reject_bad_name(href_list["reg"], TRUE)
if(temp_name)
modify.registered_name = temp_name
else
@@ -465,6 +466,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if(is_authenticated(usr) && !target_dept)
var/delcount = SSjobs.delete_log_records(scan.registered_name, TRUE)
if(delcount)
+ message_admins("[key_name_admin(usr)] has wiped all ID computer logs.")
+ usr.create_log(MISC_LOG, "wiped all ID computer logs.")
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
SSnanoui.update_uis(src)
@@ -504,9 +507,16 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if("terminate")
if(is_authenticated(usr) && !target_dept)
var/jobnamedata = modify.getRankAndAssignment()
- log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".")
- message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".")
+ var/reason = sanitize(copytext(input("Enter legal reason for termination. Enter nothing to cancel.", "Employment Termination"), 1, MAX_MESSAGE_LEN))
+ if(!reason || !is_authenticated(usr) || !modify)
+ return FALSE
+ var/m_ckey = modify.getPlayerCkey()
+ var/m_ckey_text = m_ckey ? "([m_ckey])" : "(no ckey)"
+ log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" [m_ckey_text] the \"[jobnamedata]\" for: \"[reason]\".")
+ message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" [m_ckey_text] the \"[jobnamedata]\" for: \"[reason]\".")
+ usr.create_log(MISC_LOG, "terminated the employment of \"[modify.registered_name]\" [m_ckey_text] the \"[jobnamedata]\"")
SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name)
+ SSjobs.notify_dept_head(modify.rank, "[scan.registered_name] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\" for \"[reason]\".")
modify.assignment = "Terminated"
modify.access = list()
@@ -518,16 +528,20 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0)
if(!job_in_department(SSjobs.GetJob(modify.rank), FALSE))
visible_message("[src]: Heads may only demote members of their own department.")
return 0
-
+ var/reason = sanitize(copytext(input("Enter legal reason for demotion. Enter nothing to cancel.","Legal Demotion"),1,MAX_MESSAGE_LEN))
+ if(!reason || !is_authenticated(usr) || !modify)
+ return 0
var/list/access = list()
var/datum/job/jobdatum = new /datum/job/civilian
access = jobdatum.get_access()
-
var/jobnamedata = modify.getRankAndAssignment()
- log_game("[key_name(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Demoted)\".")
- message_admins("[key_name_admin(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" to \"Civilian (Demoted)\".")
+ var/m_ckey = modify.getPlayerCkey()
+ var/m_ckey_text = m_ckey ? "([m_ckey])" : "(no ckey)"
+ log_game("[key_name(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" [m_ckey_text] to \"Civilian (Demoted)\" for: \"[reason]\".")
+ message_admins("[key_name_admin(usr)] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" [m_ckey_text] to \"Civilian (Demoted)\" for: \"[reason]\".")
+ usr.create_log(MISC_LOG, "demoted \"[modify.registered_name]\" [m_ckey_text] the \"[jobnamedata]\"")
SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Demoted", scan.registered_name)
-
+ SSjobs.notify_dept_head(modify.rank, "[scan.registered_name] has demoted \"[modify.registered_name]\" the \"[jobnamedata]\" for \"[reason]\".")
modify.access = access
modify.rank = "Civilian"
modify.assignment = "Demoted"
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 4213ff517bf..8be09ef30b7 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -443,6 +443,9 @@
for(var/atom/movable/A in contents - component_parts - list(beaker))
A.forceMove(get_step(loc, SOUTH))
+/obj/machinery/atmospherics/unary/cryo_cell/force_eject_occupant()
+ go_out()
+
/// Called when either the occupant is dead and the AUTO_EJECT_DEAD flag is present, OR the occupant is alive, has no external damage, and the AUTO_EJECT_HEALTHY flag is present.
/obj/machinery/atmospherics/unary/cryo_cell/proc/auto_eject(eject_flag)
on = FALSE
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 2e0c4c54375..fecd006886e 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -769,9 +769,13 @@
return ..()
+
/proc/cryo_ssd(var/mob/living/carbon/person_to_cryo)
if(istype(person_to_cryo.loc, /obj/machinery/cryopod))
return 0
+ if(isobj(person_to_cryo.loc))
+ var/obj/O = person_to_cryo.loc
+ O.force_eject_occupant()
var/list/free_cryopods = list()
for(var/obj/machinery/cryopod/P in GLOB.machines)
if(!P.occupant && istype(get_area(P), /area/crew_quarters/sleep))
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 9970974e4ff..36eba1a6ee5 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -86,8 +86,8 @@
Arresting Officer: [usr.name].[R ? "" : " Detainee record not found, manual record update required."]"
Radio.autosay(announcetext, name, "Security", list(z))
- if(prisoner_trank != "unknown")
- notify_dept_head(prisoner_trank, announcetext)
+ if(prisoner_trank != "unknown" && prisoner_trank != "Civilian")
+ SSjobs.notify_dept_head(prisoner_trank, announcetext)
if(R)
prisoner = R
@@ -104,31 +104,6 @@
update_all_mob_security_hud()
return 1
-
-/obj/machinery/door_timer/proc/notify_dept_head(jobtitle, antext)
- if(!jobtitle || !antext)
- return
- if(jobtitle == "Civilian")
- // Don't notify the HoP about greytiding civilians
- return
- var/datum/job/brigged_job = SSjobs.GetJob(jobtitle)
- if(!brigged_job)
- return
- if(!brigged_job.department_head[1])
- return
- var/boss_title = brigged_job.department_head[1]
-
- var/obj/item/pda/target_pda
- for(var/obj/item/pda/check_pda in GLOB.PDAs)
- if(check_pda.ownrank == boss_title)
- target_pda = check_pda
- if(!target_pda)
- return
- var/datum/data/pda/app/messenger/PM = target_pda.find_program(/datum/data/pda/app/messenger)
- if(PM && PM.can_receive())
- PM.notify("Message from Brig Timer (Automated), \"[antext]\" (Unable to Reply)")
-
-
/obj/machinery/door_timer/Initialize()
..()
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index da4df4f8382..cd6b33d0a95 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -740,10 +740,11 @@
if(!occupant)
return
- if(user != occupant)
- to_chat(occupant, "The machine kicks you out!")
- if(user.loc != loc)
- to_chat(occupant, "You leave the not-so-cozy confines of the SSU.")
+ if(user)
+ if(user != occupant)
+ to_chat(occupant, "The machine kicks you out!")
+ if(user.loc != loc)
+ to_chat(occupant, "You leave the not-so-cozy confines of [src].")
occupant.forceMove(loc)
occupant = null
if(!state_open)
@@ -751,6 +752,8 @@
update_icon()
return
+/obj/machinery/suit_storage_unit/force_eject_occupant()
+ eject_occupant()
/obj/machinery/suit_storage_unit/verb/get_out()
set name = "Eject Suit Storage Unit"
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 540e1074844..69f70207452 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1273,6 +1273,9 @@
L.client.RemoveViewMod("mecha")
zoom_mode = FALSE
+/obj/mecha/force_eject_occupant()
+ go_out()
+
/////////////////////////
////// Access stuff /////
/////////////////////////
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index ac635eebef7..75e1c6a710d 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -15,6 +15,7 @@
*/
GLOBAL_LIST_INIT(metal_recipes, list(
new /datum/stack_recipe("stool", /obj/structure/chair/stool, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("barstool", /obj/structure/chair/stool/bar, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("chair", /obj/structure/chair, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("shuttle seat", /obj/structure/chair/comfy/shuttle, 2, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("sofa (middle)", /obj/structure/chair/sofa, one_per_turf = 1, on_floor = 1),
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index dc26b14e24b..b780a837559 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -212,6 +212,11 @@
return M
owner_ckey = null
+/obj/item/card/id/proc/getPlayerCkey()
+ var/mob/living/carbon/human/H = getPlayer()
+ if(istype(H))
+ return H.ckey
+
/obj/item/card/id/proc/is_untrackable()
return untrackable
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index d40c628ed90..7a56c53f73a 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -351,3 +351,9 @@ a {
/obj/proc/check_uplink_validity()
return TRUE
+
+/obj/proc/force_eject_occupant()
+ // This proc handles safely removing occupant mobs from the object if they must be teleported out (due to being SSD/AFK, by admin teleport, etc) or transformed.
+ // In the event that the object doesn't have an overriden version of this proc to do it, log a runtime so one can be added.
+ CRASH("Proc force_eject_occupant() is not overriden on a machine containing a mob.")
+
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 04373502832..6db1846e872 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -354,6 +354,11 @@
/obj/structure/closet/AllowDrop()
return TRUE
+/obj/structure/closet/force_eject_occupant()
+ // Its okay to silently teleport mobs out of lockers, since the only thing affected is their contents list.
+ return
+
+
/obj/structure/closet/bluespace
name = "bluespace closet"
desc = "A storage unit that moves and stores through the fourth dimension."
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 6bc1c4ba142..def0142a481 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -53,6 +53,7 @@
wet_overlay = image('icons/effects/water.dmi', src, "ice_floor")
else
wet_overlay = image('icons/effects/water.dmi', src, "wet_static")
+ wet_overlay.plane = FLOOR_OVERLAY_PLANE
overlays += wet_overlay
if(time == INFINITY)
return
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 824159487eb..fe2d2e836ae 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -53,6 +53,7 @@ GLOBAL_VAR_INIT(admin_ooc_colour, "#b82e00")
return
log_ooc(msg, src)
+ mob.create_log(OOC_LOG, msg)
var/display_colour = GLOB.normal_ooc_colour
if(holder && !holder.fakekey)
@@ -205,7 +206,7 @@ GLOBAL_VAR_INIT(admin_ooc_colour, "#b82e00")
return
log_looc(msg, src)
-
+ mob.create_log(LOOC_LOG, msg)
var/mob/source = mob.get_looc_source()
var/list/heard = get_mobs_in_view(7, source)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 6b5bf938f81..5f930f946c7 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -901,15 +901,21 @@
else if(href_list["boot2"])
var/mob/M = locateUID(href_list["boot2"])
- if(istype(M, /mob))
- if(M.client && M.client.holder && (M.client.holder.rights & R_BAN))
- to_chat(usr, "[key_name_admin(M)] cannot be kicked from the server.")
+ if(!ismob(M))
+ return
+ var/client/C = M.client
+ if(C == null)
+ to_chat(usr, "Mob has no client to kick.")
+ return
+ if(alert("Kick [C.ckey]?",,"Yes","No") == "Yes")
+ if(C && C.holder && (C.holder.rights & R_BAN))
+ to_chat(usr, "[key_name_admin(C)] cannot be kicked from the server.")
return
- to_chat(M, "You have been kicked from the server")
- log_admin("[key_name(usr)] booted [key_name(M)].")
- message_admins("[key_name_admin(usr)] booted [key_name_admin(M)].", 1)
- //M.client = null
- qdel(M.client)
+ to_chat(C, "You have been kicked from the server")
+ log_admin("[key_name(usr)] booted [key_name(C)].")
+ message_admins("[key_name_admin(usr)] booted [key_name_admin(C)].", 1)
+ //C = null
+ qdel(C)
else if(href_list["open_logging_view"])
var/mob/M = locateUID(href_list["open_logging_view"])
@@ -1665,6 +1671,12 @@
return
SStickets.autoRespond(index)
+ if(href_list["convert_ticket"])
+ var/indexNum = text2num(href_list["convert_ticket"])
+ if(href_list["is_mhelp"])
+ SSmentor_tickets.convert_to_other_ticket(indexNum)
+ else
+ SStickets.convert_to_other_ticket(indexNum)
else if(href_list["cult_nextobj"])
if(alert(usr, "Validate the current Cult objective and unlock the next one?", "Cult Cheat Code", "Yes", "No") != "Yes")
return
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index f74b8c9d030..761f89ed04a 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -125,22 +125,28 @@ GLOBAL_LIST_INIT(adminhelp_ignored_words, list("unknown","the","a","an","of","mo
ticketNum = T.ticketNum // ticketNum is the number of their ticket.
T.addResponse(src, msg)
- msg = "[span][selected_type]: [key_name(src, TRUE, selected_type)] ([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_TP(mob,"TP")]) ([ADMIN_SM(mob,"SM")]) ([admin_jump_link(mob)]) (TICKET) [ai_found ? "(CL)" : ""] (TAKE) (RESOLVE) [isMhelp ? "" : "(AUTO)"] : [span][msg]"
+ var/finalised_msg = "[span][selected_type]: [key_name(src, TRUE, selected_type)] "
+ finalised_msg += "([ADMIN_QUE(mob,"?")]) ([ADMIN_PP(mob,"PP")]) ([ADMIN_VV(mob,"VV")]) ([ADMIN_TP(mob,"TP")]) ([ADMIN_SM(mob,"SM")]) "
+ finalised_msg += "([admin_jump_link(mob)]) (TICKET) "
+ finalised_msg += "[ai_found ? "(CL)" : ""] (TAKE) "
+ finalised_msg += "(RESOLVE) [isMhelp ? "" : "(AUTO)"] "
+ finalised_msg += "(CONVERT) : [span][msg]"
+
if(isMhelp)
//Open a new adminticket and inform the user.
- SSmentor_tickets.newTicket(src, prunedmsg, msg)
+ SSmentor_tickets.newTicket(src, prunedmsg, finalised_msg)
for(var/client/X in mentorholders + modholders + adminholders)
if(X.prefs.sound & SOUND_MENTORHELP)
- X << 'sound/effects/adminhelp.ogg'
- to_chat(X, msg)
+ SEND_SOUND(X, 'sound/effects/adminhelp.ogg')
+ to_chat(X, finalised_msg)
else //Ahelp
//Open a new adminticket and inform the user.
- SStickets.newTicket(src, prunedmsg, msg)
+ SStickets.newTicket(src, prunedmsg, finalised_msg)
for(var/client/X in modholders + adminholders)
if(X.prefs.sound & SOUND_ADMINHELP)
- X << 'sound/effects/adminhelp.ogg'
+ SEND_SOUND(X, 'sound/effects/adminhelp.ogg')
window_flash(X)
- to_chat(X, msg)
+ to_chat(X, finalised_msg)
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index 0c1a8c5f14f..ca83b5bad08 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -22,6 +22,10 @@
to_chat(src, "Nowhere to jump to!")
return
+ if(isobj(usr.loc))
+ var/obj/O = usr.loc
+ O.force_eject_occupant()
+
admin_forcemove(usr, T)
log_admin("[key_name(usr)] jumped to [A]")
if(!isobserver(usr))
@@ -35,6 +39,9 @@
if(!check_rights(R_ADMIN))
return
+ if(isobj(usr.loc))
+ var/obj/O = usr.loc
+ O.force_eject_occupant()
log_admin("[key_name(usr)] jumped to [T.x], [T.y], [T.z] in [T.loc]")
if(!isobserver(usr))
message_admins("[key_name_admin(usr)] jumped to [T.x], [T.y], [T.z] in [T.loc]", 1)
@@ -52,6 +59,9 @@
log_admin("[key_name(usr)] jumped to [key_name(M)]")
if(!isobserver(usr))
message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
+ if(isobj(usr.loc))
+ var/obj/O = usr.loc
+ O.force_eject_occupant()
if(src.mob)
var/mob/A = src.mob
var/turf/T = get_turf(M)
@@ -70,6 +80,9 @@
var/turf/T = locate(tx, ty, tz)
if(T)
+ if(isobj(usr.loc))
+ var/obj/O = usr.loc
+ O.force_eject_occupant()
admin_forcemove(usr, T)
if(isobserver(usr))
var/mob/dead/observer/O = usr
@@ -96,7 +109,9 @@
log_admin("[key_name(usr)] jumped to [key_name(M)]")
if(!isobserver(usr))
message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
-
+ if(isobj(usr.loc))
+ var/obj/O = usr.loc
+ O.force_eject_occupant()
admin_forcemove(usr, M.loc)
feedback_add_details("admin_verb","JK") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -111,6 +126,10 @@
log_admin("[key_name(usr)] teleported [key_name(M)]")
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)]", 1)
+
+ if(isobj(M.loc))
+ var/obj/O = M.loc
+ O.force_eject_occupant()
admin_forcemove(M, get_turf(usr))
feedback_add_details("admin_verb","GM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -135,6 +154,9 @@
log_admin("[key_name(usr)] teleported [key_name(M)]")
message_admins("[key_name_admin(usr)] teleported [key_name(M)]", 1)
if(M)
+ if(isobj(M.loc))
+ var/obj/O = M.loc
+ O.force_eject_occupant()
admin_forcemove(M, get_turf(usr))
admin_forcemove(usr, M.loc)
feedback_add_details("admin_verb","GK") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -148,6 +170,9 @@
var/area/A = input(usr, "Pick an area.", "Pick an area") in return_sorted_areas()
if(A)
+ if(isobj(M.loc))
+ var/obj/O = M.loc
+ O.force_eject_occupant()
admin_forcemove(M, pick(get_area_turfs(A)))
feedback_add_details("admin_verb","SMOB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_admin("[key_name(usr)] teleported [key_name(M)] to [A]")
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 43db66cabc5..03b9dfb60e7 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -917,6 +917,9 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention)
if(istype(landmark))
var/datum/map_template/ruin/template = landmark.ruin_template
+ if(isobj(usr.loc))
+ var/obj/O = usr.loc
+ O.force_eject_occupant()
admin_forcemove(usr, get_turf(landmark))
to_chat(usr, "[template.name]")
diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm
index 35e80e53d18..a17649bb008 100644
--- a/code/modules/assembly/mousetrap.dm
+++ b/code/modules/assembly/mousetrap.dm
@@ -63,6 +63,7 @@
else if(ismouse(target))
var/mob/living/simple_animal/mouse/M = target
visible_message("SPLAT!")
+ M.death()
M.splat()
playsound(loc, 'sound/effects/snap.ogg', 50, 1)
layer = MOB_LAYER - 0.2
diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm
index 27f0919a3ce..2180f9a0f63 100644
--- a/code/modules/food_and_drinks/food.dm
+++ b/code/modules/food_and_drinks/food.dm
@@ -33,6 +33,9 @@
deltimer(ant_timer)
return ..()
+/obj/item/reagent_containers/food/set_APTFT()
+ set hidden = TRUE
+
/obj/item/reagent_containers/food/proc/check_for_ants()
if(!antable)
return
diff --git a/code/modules/hydroponics/beekeeping/honeycomb.dm b/code/modules/hydroponics/beekeeping/honeycomb.dm
index 23bc55dfea2..1d086bae0f0 100644
--- a/code/modules/hydroponics/beekeeping/honeycomb.dm
+++ b/code/modules/hydroponics/beekeeping/honeycomb.dm
@@ -17,6 +17,8 @@
pixel_y = rand(8,-8)
update_icon()
+/obj/item/reagent_containers/honeycomb/set_APTFT()
+ set hidden = TRUE
/obj/item/reagent_containers/honeycomb/update_icon()
overlays.Cut()
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 336ebdb8b67..31ff0098335 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -53,7 +53,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
if(ismob(body))
T = get_turf(body) //Where is the body located?
attack_log_old = body.attack_log_old //preserve our attack logs by copying them to our ghost
- logs = body.logs.Copy()
var/mutable_appearance/MA = copy_appearance(body)
if(body.mind && body.mind.name)
diff --git a/code/modules/mob/living/carbon/human/species/_species.dm b/code/modules/mob/living/carbon/human/species/_species.dm
index 6b17f64591c..a8e1eee5f52 100644
--- a/code/modules/mob/living/carbon/human/species/_species.dm
+++ b/code/modules/mob/living/carbon/human/species/_species.dm
@@ -519,9 +519,6 @@
/datum/species/proc/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style = M.martial_art) //Handles any species-specific attackhand events.
if(!istype(M))
return
- if(H.frozen)
- to_chat(M, "Do not touch Admin-Frozen people.")
- return
if(istype(M))
var/obj/item/organ/external/temp = M.bodyparts_by_name["r_hand"]
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 9d4c8a3c06d..93a3b6f14cd 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -59,8 +59,9 @@
//Even if we don't push/swap places, we "touched" them, so spread fire
spreadFire(M)
- if(now_pushing)
- return 1
+ // No pushing if we're already pushing past something, or if the mob we're pushing into is anchored.
+ if(now_pushing || M.anchored)
+ return TRUE
//Should stop you pushing a restrained person out of the way
if(isliving(M))
@@ -68,7 +69,7 @@
if(L.pulledby && L.pulledby != src && L.restrained())
if(!(world.time % 5))
to_chat(src, "[L] is restrained, you cannot push past.")
- return 1
+ return TRUE
if(L.pulling)
if(ismob(L.pulling))
@@ -76,28 +77,28 @@
if(P.restrained())
if(!(world.time % 5))
to_chat(src, "[L] is restrained, you cannot push past.")
- return 1
+ return TRUE
if(moving_diagonally) //no mob swap during diagonal moves.
- return 1
+ return TRUE
if(a_intent == INTENT_HELP) // Help intent doesn't mob swap a mob pulling a structure
if(isstructure(M.pulling) || isstructure(pulling))
- return 1
+ return TRUE
if(!M.buckled && !M.has_buckled_mobs())
var/mob_swap
//the puller can always swap with it's victim if on grab intent
if(M.pulledby == src && a_intent == INTENT_GRAB)
- mob_swap = 1
+ mob_swap = TRUE
//restrained people act if they were on 'help' intent to prevent a person being pulled from being seperated from their puller
else if((M.restrained() || M.a_intent == INTENT_HELP) && (restrained() || a_intent == INTENT_HELP))
- mob_swap = 1
+ mob_swap = TRUE
if(mob_swap)
//switch our position with M
if(loc && !loc.Adjacent(M.loc))
- return 1
- now_pushing = 1
+ return TRUE
+ now_pushing = TRUE
var/oldloc = loc
var/oldMloc = M.loc
@@ -114,18 +115,18 @@
if(!M_passmob)
M.pass_flags &= ~PASSMOB
- now_pushing = 0
- return 1
+ now_pushing = FALSE
+ return TRUE
// okay, so we didn't switch. but should we push?
// not if he's not CANPUSH of course
if(!(M.status_flags & CANPUSH))
- return 1
+ return TRUE
//anti-riot equipment is also anti-push
if(M.r_hand && (prob(M.r_hand.block_chance * 2)) && !istype(M.r_hand, /obj/item/clothing))
- return 1
+ return TRUE
if(M.l_hand && (prob(M.l_hand.block_chance * 2)) && !istype(M.l_hand, /obj/item/clothing))
- return 1
+ return TRUE
//Called when we bump into an obj
/mob/living/proc/ObjBump(obj/O)
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 24818d07652..f44244b7eae 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -123,6 +123,7 @@
for(var/mob/living/simple_animal/mouse/M in view(1, src))
if(!M.stat && Adjacent(M))
custom_emote(1, "splats \the [M]!")
+ M.death()
M.splat()
movement_target = null
stop_automated_movement = 0
diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm
index 152e2494132..2881141f4dd 100644
--- a/code/modules/mob/living/simple_animal/friendly/mouse.dm
+++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm
@@ -80,15 +80,6 @@
icon_resting = "mouse_[mouse_color]_sleep"
desc = "It's a small [mouse_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself."
-/mob/living/simple_animal/mouse/proc/splat()
- src.health = 0
- src.stat = DEAD
- src.icon_dead = "mouse_[mouse_color]_splat"
- src.icon_state = "mouse_[mouse_color]_splat"
- layer = MOB_LAYER
- if(client)
- client.time_died_as_mouse = world.time
-
/mob/living/simple_animal/mouse/attack_hand(mob/living/carbon/human/M as mob)
if(M.a_intent == INTENT_HELP)
get_scooped(M)
@@ -110,6 +101,10 @@
desc = "It's toast."
death()
+/mob/living/simple_animal/mouse/proc/splat()
+ icon_dead = "mouse_[mouse_color]_splat"
+ icon_state = "mouse_[mouse_color]_splat"
+
/mob/living/simple_animal/mouse/death(gibbed)
// Only execute the below if we successfully died
playsound(src, squeak_sound, 40, 1)
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 5345bda5b94..c222f76eadb 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -28,6 +28,7 @@
/mob/Login()
GLOB.player_list |= src
+ last_known_ckey = ckey
update_Login_details()
world.update_status()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 3b86faeb7e6..82c9cfdc065 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -19,7 +19,6 @@
for(var/datum/alternate_appearance/AA in viewing_alternate_appearances)
AA.viewers -= src
viewing_alternate_appearances = null
- logs.Cut()
LAssailant = null
return ..()
@@ -880,6 +879,9 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
return
if(!Adjacent(usr))
return
+ if(IsFrozen(src) && !is_admin(usr))
+ to_chat(usr, "Interacting with admin-frozen players is not permitted.")
+ return
if(isLivingSSD(src) && M.client && M.client.send_ssd_warning(src))
return
show_inv(usr)
@@ -1235,10 +1237,13 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
create_log_in_list(debug_log, text, collapse, world.timeofday)
/mob/proc/create_log(log_type, what, target = null, turf/where = get_turf(src))
- LAZYINITLIST(logs[log_type])
- var/list/log_list = logs[log_type]
+ if(!ckey)
+ return
+ var/real_ckey = ckey
+ if(ckey[1] == "@") // Admin aghosting will do this
+ real_ckey = copytext(ckey, 2)
var/datum/log_record/record = new(log_type, src, what, target, where, world.time)
- log_list.Add(record)
+ GLOB.logging.add_log(real_ckey, record)
/proc/create_log_in_list(list/target, text, collapse = TRUE, last_log)//forgive me code gods for this shitcode proc
//this proc enables lovely stuff like an attack log that looks like this: "[18:20:29-18:20:45]21x John Smith attacked Andrew Jackson with a crowbar."
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 1477be47d89..80404460b50 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -36,7 +36,7 @@
var/list/attack_log_old = list( )
var/list/debug_log = null
- var/list/logs = list() // Logs for each log type defined in __DEFINES/logs.dm
+ var/last_known_ckey = null // Used in logging
var/last_log = 0
var/obj/machinery/machine = null
diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm
index 0417e28f546..41032185c3b 100644
--- a/code/modules/mob/say.dm
+++ b/code/modules/mob/say.dm
@@ -55,6 +55,7 @@
return
say_dead_direct("[pick("complains", "moans", "whines", "laments", "blubbers", "salts")], \"[message]\"", src)
+ create_log(DEADCHAT_LOG, message)
/mob/proc/say_understands(var/mob/other, var/datum/language/speaking = null)
if(stat == DEAD)
diff --git a/code/modules/modular_computers/file_system/programs/command/card.dm b/code/modules/modular_computers/file_system/programs/command/card.dm
index b85fb710e38..cae4b5ed2e2 100644
--- a/code/modules/modular_computers/file_system/programs/command/card.dm
+++ b/code/modules/modular_computers/file_system/programs/command/card.dm
@@ -222,7 +222,7 @@
if(is_authenticated(usr) && modify)
var/t1 = href_list["assign_target"]
if(t1 == "Custom")
- var/temp_t = sanitize(copytext(input("Enter a custom job assignment.","Assignment"),1,MAX_MESSAGE_LEN))
+ var/temp_t = sanitize(reject_bad_name(copytext(input("Enter a custom job assignment.", "Assignment"), 1, MAX_MESSAGE_LEN), TRUE))
//let custom jobs function as an impromptu alt title, mainly for sechuds
if(temp_t && modify)
SSjobs.log_job_transfer(modify.registered_name, modify.getRankAndAssignment(), temp_t, scan.registered_name)
@@ -251,7 +251,8 @@
message_admins("[key_name_admin(usr)] has reassigned \"[modify.registered_name]\" from \"[jobnamedata]\" to \"[t1]\".")
SSjobs.log_job_transfer(modify.registered_name, jobnamedata, t1, scan.registered_name)
- SSjobs.slot_job_transfer(modify.rank, t1)
+ if(modify.owner_uid)
+ SSjobs.slot_job_transfer(modify.rank, t1)
var/mob/living/carbon/human/H = modify.getPlayer()
if(istype(H))
@@ -266,7 +267,7 @@
if("PRG_reg")
if(is_authenticated(usr))
- var/temp_name = reject_bad_name(href_list["reg"])
+ var/temp_name = reject_bad_name(href_list["reg"], TRUE)
if(temp_name)
modify.registered_name = temp_name
else
@@ -290,6 +291,8 @@
if(is_authenticated(usr))
var/delcount = SSjobs.delete_log_records(scan.registered_name, TRUE)
if(delcount)
+ message_admins("[key_name_admin(usr)] has wiped all ID computer logs.")
+ usr.create_log(MISC_LOG, "wiped all ID computer logs.")
playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0)
if("PRG_print")
@@ -331,9 +334,14 @@
if("PRG_terminate")
if(is_authenticated(usr))
var/jobnamedata = modify.getRankAndAssignment()
- log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".")
- message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\".")
+ var/reason = sanitize(copytext(input("Enter legal reason for termination. Enter nothing to cancel.", "Employment Termination"), 1, MAX_MESSAGE_LEN))
+ if(!reason || !is_authenticated(usr) || !modify)
+ return
+ log_game("[key_name(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\" for: \"[reason]\".")
+ message_admins("[key_name_admin(usr)] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\" for: \"[reason]\".")
+ usr.create_log(MISC_LOG, "terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\"")
SSjobs.log_job_transfer(modify.registered_name, jobnamedata, "Terminated", scan.registered_name)
+ SSjobs.notify_dept_head(modify.rank, "[scan.registered_name] has terminated the employment of \"[modify.registered_name]\" the \"[jobnamedata]\" for \"[reason]\".")
modify.assignment = "Terminated"
modify.access = list()
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 4aee2398b68..080114554bb 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -270,7 +270,6 @@
M.mind.transfer_to(new_mob)
else
new_mob.attack_log_old = M.attack_log_old.Copy()
- new_mob.logs = M.logs.Copy()
new_mob.key = M.key
to_chat(new_mob, "Your form morphs into that of a [randomize].")
diff --git a/code/modules/reagents/reagent_containers/applicator.dm b/code/modules/reagents/reagent_containers/applicator.dm
index 962f12b4a08..87be22d3c8f 100644
--- a/code/modules/reagents/reagent_containers/applicator.dm
+++ b/code/modules/reagents/reagent_containers/applicator.dm
@@ -22,6 +22,9 @@
ignore_flags = TRUE
to_chat(user, "You short out the safeties on [src].")
+/obj/item/reagent_containers/applicator/set_APTFT()
+ set hidden = TRUE
+
/obj/item/reagent_containers/applicator/on_reagent_change()
if(!emagged)
var/found_forbidden_reagent = FALSE
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index 8783d8a8c19..6e0f4277bde 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -24,6 +24,9 @@
mode = SYRINGE_INJECT
update_icon()
+/obj/item/reagent_containers/syringe/set_APTFT()
+ set hidden = TRUE
+
/obj/item/reagent_containers/syringe/on_reagent_change()
update_icon()
diff --git a/goon/browserassets/css/browserOutput-dark.css b/goon/browserassets/css/browserOutput-dark.css
index e7b79557619..8b162e5b336 100644
--- a/goon/browserassets/css/browserOutput-dark.css
+++ b/goon/browserassets/css/browserOutput-dark.css
@@ -38,7 +38,7 @@ a.popt {text-decoration: none;}
* CUSTOM FONTS
*
******************************************/
-@font-face { font-family: PxPlus IBM MDA; src: url('PxPlus_IBM_MDA.ttf'); }
+@font-face { font-family: PxPlus IBM MDA; src: url('PxPlus_IBM_MDA.ttf'); }
/*****************************************
*
@@ -281,7 +281,7 @@ em {font-style: normal; font-weight: bold;}
.sciradio {color: #993399;}
.supradio {color: #9F8545;}
.srvradio {color: #80A000;}
-.admin_channel {color: #9A04D1; font-weight: bold;}
+.admin_channel {color: #fcba03; font-weight: bold;}
.mentor_channel {color: #775BFF; font-weight: bold;}
.mentor_channel_admin {color: #A35CFF; font-weight: bold;}
.djradio {color: #996600;}
diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css
index 962ce7bb8e7..61307508c9b 100644
--- a/goon/browserassets/css/browserOutput.css
+++ b/goon/browserassets/css/browserOutput.css
@@ -37,7 +37,7 @@ a.popt {text-decoration: none;}
* CUSTOM FONTS
*
******************************************/
-@font-face { font-family: PxPlus IBM MDA; src: url('PxPlus_IBM_MDA.ttf'); }
+@font-face { font-family: PxPlus IBM MDA; src: url('PxPlus_IBM_MDA.ttf'); }
/*****************************************
*
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index 92006f54cc2..07593d09c0c 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 730149860d5..827b67b4332 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 52a619508be..26c2a7ea734 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 6d116a6b02e..acb6af50d18 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi
index 97a11d05cad..444863abd71 100644
Binary files a/icons/obj/contraband.dmi and b/icons/obj/contraband.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 46249c1bda0..4aa7e948971 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -271,6 +271,7 @@
#include "code\datums\hud.dm"
#include "code\datums\log_record.dm"
#include "code\datums\log_viewer.dm"
+#include "code\datums\logging.dm"
#include "code\datums\mind.dm"
#include "code\datums\mixed.dm"
#include "code\datums\mutable_appearance.dm"