diff --git a/_maps/map_files/CogStation/CogStation.dmm b/_maps/map_files/CogStation/CogStation.dmm
index 40a57135fd..3c64b9f6ad 100644
--- a/_maps/map_files/CogStation/CogStation.dmm
+++ b/_maps/map_files/CogStation/CogStation.dmm
@@ -2878,7 +2878,6 @@
/turf/closed/wall/r_wall,
/area/security/processing)
"agX" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/structure/cable{
icon_state = "1-2"
},
@@ -4171,22 +4170,11 @@
/turf/open/floor/plasteel,
/area/construction/secondary)
"akg" = (
-/obj/machinery/power/solar_control{
- dir = 4;
- id = "foreport";
- name = "Port Bow Solar Control"
- },
-/obj/structure/sign/warning/electricshock{
- pixel_x = -32
- },
/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "0-4"
+ icon_state = "1-2"
},
/turf/open/floor/plating,
-/area/maintenance/solars/port)
+/area/maintenance/solars/starboard/fore)
"akh" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel,
@@ -4196,14 +4184,16 @@
/turf/open/floor/plating,
/area/construction/secondary)
"akj" = (
-/obj/structure/chair{
- dir = 8
- },
/obj/structure/cable{
icon_state = "4-8"
},
+/obj/machinery/door/airlock/external{
+ name = "Starboard Bow Solar Exterior Airlock";
+ req_access_txt = "10;13"
+ },
+/obj/machinery/door/firedoor,
/turf/open/floor/plating,
-/area/maintenance/solars/port)
+/area/maintenance/solars/starboard/fore)
"akk" = (
/obj/item/stack/tile/plasteel{
pixel_x = 10;
@@ -4361,18 +4351,12 @@
/turf/open/floor/plasteel,
/area/security/warden)
"akz" = (
-/obj/machinery/light/small{
- dir = 1;
- light_color = "#ffc1c1"
+/obj/machinery/door/airlock/external,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
},
-/obj/machinery/power/terminal{
- dir = 4
- },
-/obj/structure/cable{
- icon_state = "0-8"
- },
-/turf/open/floor/plating,
-/area/maintenance/solars/port)
+/turf/open/floor/plasteel,
+/area/router/service)
"akA" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -6331,16 +6315,16 @@
/turf/open/floor/plasteel,
/area/security/brig)
"aoW" = (
-/obj/machinery/door/firedoor,
-/obj/machinery/door/airlock/external/glass{
- name = "Port Bow Solars External Access";
- req_access_txt = "10;13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
+/obj/machinery/power/solar_control{
+ dir = 4;
+ id = "foreport";
+ name = "Port Bow Solar Control"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "0-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
@@ -7335,12 +7319,19 @@
/turf/open/floor/plasteel,
/area/security/brig)
"arr" = (
-/obj/structure/table,
-/obj/machinery/cell_charger,
-/obj/structure/sign/warning/vacuum/external{
- pixel_x = -32
+/obj/machinery/light/small{
+ dir = 1;
+ light_color = "#ffc1c1"
+ },
+/obj/machinery/power/terminal{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/obj/structure/chair{
+ dir = 8
},
-/obj/item/stock_parts/cell/high/plus,
/turf/open/floor/plating,
/area/maintenance/solars/port)
"ars" = (
@@ -7774,10 +7765,16 @@
/turf/open/floor/plasteel,
/area/security/prison)
"asl" = (
-/obj/machinery/portable_atmospherics/canister/oxygen,
-/obj/machinery/camera{
- c_tag = "Port Bow Solar Maintenance";
- dir = 1
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/firedoor,
+/obj/machinery/door/airlock/external/glass{
+ name = "Port Bow Solars External Access";
+ req_access_txt = "10;13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
@@ -7991,12 +7988,18 @@
name = "Canister Storage"
})
"asH" = (
-/obj/machinery/firealarm{
- dir = 1;
- pixel_y = -26
+/obj/machinery/camera{
+ c_tag = "Port Bow Solar Maintenance";
+ dir = 1
},
-/obj/machinery/atmospherics/pipe/manifold/general/visible{
- dir = 8
+/obj/structure/table,
+/obj/machinery/cell_charger,
+/obj/item/stock_parts/cell/high/plus,
+/obj/structure/sign/warning/vacuum/external{
+ pixel_x = -32
+ },
+/obj/structure/sign/warning/electricshock{
+ pixel_y = -32
},
/turf/open/floor/plating,
/area/maintenance/solars/port)
@@ -8236,12 +8239,16 @@
/turf/open/floor/plasteel/cafeteria,
/area/crew_quarters/kitchen)
"atn" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+/obj/machinery/firealarm{
+ dir = 1;
+ pixel_y = -26
+ },
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
dir = 8
},
-/obj/machinery/door/airlock/external,
-/turf/open/floor/plasteel,
-/area/router/service)
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/open/floor/plating,
+/area/maintenance/solars/port)
"ato" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -10451,13 +10458,11 @@
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai)
"aya" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "1-2"
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
},
-/obj/machinery/camera{
- c_tag = "AI Core Exterior";
- dir = 1
+/obj/structure/cable{
+ icon_state = "2-4"
},
/turf/open/floor/plating/airless,
/area/space/nearstation)
@@ -15104,19 +15109,19 @@
},
/area/chapel/main)
"aHj" = (
-/obj/machinery/door/firedoor,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
},
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/obj/machinery/door/airlock/external{
- name = "Starboard Bow Solar Exterior Airlock";
- req_access_txt = "10;13"
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
},
-/turf/open/floor/plating,
-/area/maintenance/solars/starboard/fore)
+/turf/open/floor/plasteel,
+/area/tcommsat/computer)
"aHk" = (
/obj/structure/chair{
dir = 4
@@ -15272,13 +15277,14 @@
/area/bridge)
"aHE" = (
/obj/structure/cable{
- icon_state = "2-4"
+ icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
},
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/turf/open/floor/plating,
+/area/tcommsat/computer)
"aHF" = (
/turf/open/floor/plasteel/dark,
/area/bridge)
@@ -20986,19 +20992,18 @@
/turf/open/floor/plasteel,
/area/security/brig)
"aTh" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/machinery/light{
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/door/airlock/external/glass{
+ name = "Telecommunications External Access";
+ req_access_txt = "61"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
-/obj/machinery/power/apc{
- name = "AI Upload Foyer APC";
- pixel_y = -24
- },
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/turf/open/floor/plating,
+/area/tcommsat/computer)
"aTi" = (
/obj/effect/turf_decal/tile/blue{
dir = 4
@@ -22804,14 +22809,14 @@
/turf/open/floor/wood,
/area/library)
"aXf" = (
-/obj/structure/window/reinforced/spawner/east,
-/obj/structure/table/wood,
+/obj/machinery/photocopier,
/obj/machinery/light{
dir = 1;
- light_color = "#c1caff"
+ light_color = "#e8eaff"
},
-/turf/open/floor/carpet,
-/area/library)
+/obj/item/paper/fluff/cogstation/eva,
+/turf/open/floor/plasteel/dark,
+/area/security/checkpoint/customs)
"aXg" = (
/obj/machinery/vending/coffee,
/turf/open/floor/plasteel,
@@ -23913,35 +23918,20 @@
/turf/closed/wall,
/area/lawoffice)
"aZz" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/lattice,
+/obj/machinery/camera{
+ c_tag = "Routing Depot - Fore Exterior";
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/item/paper_bin,
-/obj/item/pen,
-/turf/open/floor/plasteel/dark,
-/area/lawoffice)
+/turf/open/space/basic,
+/area/maintenance/department/eva)
"aZA" = (
-/obj/structure/table/reinforced,
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/machinery/computer/card{
dir = 8
},
+/obj/item/paper/guides/cogstation/job_changes,
/turf/open/floor/plasteel/dark,
-/area/lawoffice)
+/area/security/checkpoint/customs)
"aZB" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -23961,7 +23951,9 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
-/obj/item/book/manual/wiki/security_space_law,
+/obj/item/paper_bin,
+/obj/item/pen,
+/obj/structure/window/reinforced/spawner/north,
/turf/open/floor/plasteel/dark,
/area/lawoffice)
"aZD" = (
@@ -24018,13 +24010,21 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/civilian)
"aZI" = (
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
-/obj/effect/landmark/start/lawyer,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/machinery/door/window/northleft{
+ name = "Law Office Counter";
+ req_access_txt = "38"
+ },
/turf/open/floor/plasteel/dark,
/area/lawoffice)
"aZJ" = (
@@ -24426,13 +24426,21 @@
/turf/open/floor/wood,
/area/library)
"baz" = (
-/obj/machinery/photocopier,
-/obj/machinery/light{
- dir = 1;
- light_color = "#e8eaff"
+/obj/structure/table/reinforced,
+/obj/effect/turf_decal/tile/neutral,
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
},
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 8
+ },
+/obj/item/book/manual/wiki/security_space_law,
+/obj/structure/window/reinforced/spawner/north,
/turf/open/floor/plasteel/dark,
-/area/security/checkpoint/customs)
+/area/lawoffice)
"baA" = (
/obj/structure/filingcabinet/chestdrawer,
/obj/item/folder/blue,
@@ -25282,11 +25290,17 @@
/turf/closed/wall/r_wall,
/area/science/mixing)
"bcz" = (
-/obj/machinery/computer/card{
- dir = 8
+/obj/effect/turf_decal/tile/neutral{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/machinery/newscaster{
+ pixel_x = -30
},
/turf/open/floor/plasteel/dark,
-/area/security/checkpoint/customs)
+/area/lawoffice)
"bcA" = (
/obj/effect/turf_decal/tile/brown{
dir = 1
@@ -26131,9 +26145,21 @@
/turf/open/floor/plasteel,
/area/quartermaster/office)
"beC" = (
-/obj/machinery/recharge_station,
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/rack,
+/obj/item/storage/toolbox/mechanical,
+/obj/item/radio/off,
+/obj/effect/turf_decal/tile/yellow,
+/obj/effect/turf_decal/tile/yellow{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/yellow{
+ dir = 1
+ },
+/obj/machinery/airalarm{
+ pixel_y = 24
+ },
+/turf/open/floor/plasteel,
+/area/tcommsat/computer)
"beD" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
@@ -26156,13 +26182,16 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"beG" = (
-/obj/structure/lattice,
-/obj/machinery/camera{
- c_tag = "Routing Depot - Fore Exterior";
+/obj/effect/turf_decal/tile/neutral{
dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/effect/turf_decal/tile/neutral{
+ dir = 1
+ },
+/obj/effect/landmark/start/lawyer,
+/obj/structure/chair/stool,
+/turf/open/floor/plasteel/dark,
+/area/lawoffice)
"beH" = (
/obj/structure/window/reinforced/spawner/east,
/obj/machinery/light{
@@ -30649,9 +30678,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bnS" = (
-/obj/machinery/atmospherics/components/unary/outlet_injector/on,
-/turf/open/floor/plating/airless,
-/area/space/nearstation)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/cogpool)
"bnT" = (
/obj/structure/disposalpipe/segment,
/turf/closed/wall/r_wall,
@@ -30768,17 +30799,17 @@
/turf/open/floor/plasteel,
/area/ai_monitored/nuke_storage)
"bof" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/obj/machinery/door/airlock/external/glass{
name = "Pool Exterior Access";
req_access_txt = "13"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
-/turf/open/floor/plating,
+/turf/open/space/basic,
/area/crew_quarters/fitness/cogpool)
"bog" = (
/obj/machinery/light{
@@ -32879,19 +32910,9 @@
/turf/open/floor/plasteel/stairs/left,
/area/hydroponics)
"bsx" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 1
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/door/airlock/external{
- name = "Recycler Exterior Access";
- req_one_access_txt = "13;50"
- },
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plasteel,
-/area/maintenance/disposal)
+/obj/structure/lattice,
+/turf/closed/wall/r_wall,
+/area/crew_quarters/fitness/cogpool)
"bsy" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/disposalpipe/segment,
@@ -33297,21 +33318,9 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"btw" = (
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
- },
-/obj/structure/cable{
- icon_state = "2-8"
- },
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/light/small,
-/turf/open/floor/plating{
- icon_state = "platingdmg2"
- },
-/area/maintenance/department/eva)
+/obj/machinery/atmospherics/components/unary/outlet_injector/on,
+/turf/open/floor/plating/airless,
+/area/router)
"btx" = (
/obj/machinery/space_heater,
/turf/open/floor/plating,
@@ -34237,17 +34246,13 @@
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"bvM" = (
-/obj/machinery/door/airlock/external/glass{
- name = "External Construction Access";
- req_one_access_txt = "10;31"
+/obj/structure/lattice,
+/obj/machinery/camera{
+ c_tag = "Routing Depot - Aft Exterior";
+ pixel_x = 22
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
-/turf/open/floor/plasteel,
-/area/quartermaster/warehouse)
+/turf/open/space/basic,
+/area/router)
"bvN" = (
/obj/machinery/atmospherics/components/binary/valve/digital/on{
dir = 4
@@ -34971,21 +34976,30 @@
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/ai)
"bxm" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/turf/closed/wall/r_wall,
-/area/tcommsat/computer)
-"bxn" = (
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "2-4"
},
/obj/structure/cable{
- icon_state = "4-8"
+ icon_state = "2-8"
},
-/turf/open/floor/plasteel,
-/area/tcommsat/computer)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/light/small,
+/turf/open/floor/plating,
+/area/maintenance/department/eva)
+"bxn" = (
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/camera{
+ c_tag = "AI Core Exterior";
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/maintenance/department/eva)
"bxo" = (
/obj/machinery/door/airlock/external{
name = "Telecommunications External Access";
@@ -35048,18 +35062,13 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"bxt" = (
-/obj/machinery/door/airlock/external/glass{
- name = "Telecommunications External Access";
- req_access_txt = "61"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
},
/turf/open/floor/plating,
-/area/tcommsat/computer)
+/area/maintenance/disposal)
"bxu" = (
/obj/structure/rack,
/obj/item/circuitboard/machine/telecomms/broadcaster,
@@ -35217,18 +35226,15 @@
/turf/open/floor/plasteel,
/area/tcommsat/computer)
"bxK" = (
-/obj/structure/rack,
-/obj/item/storage/toolbox/mechanical,
-/obj/item/radio/off,
-/obj/effect/turf_decal/tile/yellow,
-/obj/effect/turf_decal/tile/yellow{
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/delivery,
+/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/yellow{
- dir = 1
- },
/turf/open/floor/plasteel,
-/area/tcommsat/computer)
+/area/maintenance/disposal)
"bxL" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -35905,11 +35911,11 @@
/turf/open/floor/plating,
/area/maintenance/starboard/central)
"bzp" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
+/obj/structure/lattice/catwalk,
+/obj/structure/disposalpipe/segment,
+/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
-/area/maintenance/solars/starboard/fore)
+/area/maintenance/disposal)
"bzq" = (
/obj/machinery/light{
dir = 8
@@ -37644,12 +37650,20 @@
/turf/open/floor/plasteel/showroomfloor,
/area/medical/morgue)
"bDb" = (
-/mob/living/simple_animal/mouse/white{
- desc = "Wubba lubba dub dub.";
- name = "Rick"
+/obj/structure/lattice/catwalk,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/turf/open/floor/plasteel/showroomfloor,
-/area/medical/morgue)
+/obj/machinery/door/airlock/external{
+ name = "Recycler Exterior Access";
+ req_one_access_txt = "13;50"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
+/turf/open/floor/plasteel,
+/area/maintenance/disposal)
"bDc" = (
/obj/machinery/vending/security,
/obj/structure/disposalpipe/segment,
@@ -39183,23 +39197,9 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"bFY" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/structure/noticeboard{
- pixel_y = 28
- },
-/obj/machinery/light{
- dir = 1
- },
-/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/medical/medbay/central)
+/obj/structure/lattice/catwalk,
+/turf/closed/wall/r_wall,
+/area/engine/atmos)
"bFZ" = (
/obj/machinery/chem_heater,
/turf/open/floor/plasteel/white,
@@ -45857,11 +45857,11 @@
/area/engine/atmos)
"bTJ" = (
/obj/structure/lattice,
-/obj/machinery/atmospherics/pipe/simple/violet/hidden{
- dir = 8
- },
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/orange/visible,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/maintenance/disposal)
"bTK" = (
/turf/open/floor/engine/co2,
/area/engine/atmos)
@@ -46099,17 +46099,12 @@
/turf/open/floor/plasteel,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bUj" = (
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/atmospherics/pipe/simple/violet/hidden{
+ dir = 8
},
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
- dir = 9
- },
-/turf/open/floor/plasteel,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/lattice/catwalk,
+/turf/open/space/basic,
+/area/space/nearstation)
"bUk" = (
/obj/structure/closet/crate,
/obj/effect/decal/cleanable/cobweb,
@@ -46481,11 +46476,11 @@
/turf/open/floor/plasteel,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bUV" = (
-/obj/structure/lattice,
/obj/structure/disposalpipe/segment,
/obj/machinery/atmospherics/pipe/simple/violet/hidden{
dir = 10
},
+/obj/structure/lattice/catwalk,
/turf/open/space/basic,
/area/space/nearstation)
"bUW" = (
@@ -46837,14 +46832,9 @@
/turf/open/floor/plating,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bVD" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
-/obj/machinery/atmospherics/pipe/simple/orange/hidden{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/lattice,
+/turf/open/space/basic,
+/area/space)
"bVE" = (
/obj/effect/landmark/start/atmospheric_technician,
/obj/machinery/atmospherics/pipe/simple/orange/visible{
@@ -47270,13 +47260,16 @@
/turf/open/floor/engine/n2o,
/area/engine/atmos)
"bWq" = (
-/obj/structure/lattice,
-/obj/machinery/camera{
- c_tag = "Routing Depot - Aft Exterior";
- pixel_x = 22
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
+/obj/machinery/airalarm{
+ dir = 8;
+ pixel_x = 23
+ },
+/turf/open/floor/plasteel,
+/area/hallway/primary/central)
"bWr" = (
/obj/structure/closet/l3closet/scientist,
/obj/effect/turf_decal/stripes/line,
@@ -47442,17 +47435,18 @@
/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"bWJ" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/disposalpipe/segment,
-/obj/structure/cable{
- icon_state = "2-4"
- },
+/obj/structure/lattice/catwalk,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/floor/plasteel,
-/area/ai_monitored/turret_protected/ai_upload_foyer)
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{
+ dir = 1
+ },
+/turf/open/space/basic,
+/area/space/nearstation)
"bWK" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/orange/visible,
@@ -49080,14 +49074,15 @@
},
/area/library)
"bZV" = (
+/obj/structure/window/reinforced/spawner/east,
/obj/structure/table/wood,
-/obj/structure/window/reinforced/spawner/north,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/floor/carpet{
- icon_state = "carpetsymbol"
+/obj/machinery/light{
+ dir = 1;
+ light_color = "#c1caff"
},
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/open/floor/carpet,
/area/library)
"bZW" = (
/obj/structure/sign/warning/fire,
@@ -49805,18 +49800,24 @@
/turf/open/floor/plating,
/area/ai_monitored/storage/eva)
"cbI" = (
-/obj/structure/lattice/catwalk,
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{
- dir = 1
- },
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
+ dir = 4
+ },
+/obj/machinery/door/airlock/external{
+ name = "Atmospherics External Airlock";
+ req_access_txt = "24"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"cbJ" = (
/obj/structure/table/reinforced,
/obj/item/analyzer,
@@ -49858,19 +49859,13 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/external{
- name = "Atmospherics External Airlock";
- req_access_txt = "24"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
dir = 4
},
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/engine/atmos)
"cbM" = (
@@ -51026,24 +51021,17 @@
/turf/closed/wall/r_wall,
/area/medical/medbay/lobby)
"cea" = (
-/obj/effect/turf_decal/delivery,
-/obj/machinery/photocopier,
-/obj/structure/disposalpipe/segment{
- dir = 4
+/obj/structure/table/wood,
+/obj/structure/window/reinforced/spawner/north,
+/obj/structure/cable{
+ icon_state = "1-2"
},
-/obj/machinery/requests_console{
- department = "Cargo Bay";
- departmentType = 2;
- name = "Cargo RC";
- pixel_y = 30
+/obj/item/paper_bin,
+/obj/item/pen,
+/turf/open/floor/carpet{
+ icon_state = "carpetsymbol"
},
-/obj/machinery/camera{
- c_tag = "Supply - Delivery Office Aft";
- network = list("ss13","rd")
- },
-/obj/item/paper/guides/cogstation/disposals,
-/turf/open/floor/plasteel,
-/area/quartermaster/sorting)
+/area/library)
"ceb" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -55857,6 +55845,28 @@
},
/turf/open/floor/wood,
/area/library)
+"cnQ" = (
+/obj/structure/lattice,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/camera{
+ c_tag = "Supply - Warehouse Exterior";
+ dir = 1
+ },
+/turf/open/space/basic,
+/area/quartermaster/warehouse)
+"cnR" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/manifold/supplymain/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cnS" = (
/obj/structure/cable{
icon_state = "0-2"
@@ -56625,18 +56635,25 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"cpm" = (
-/obj/structure/chair/stool,
-/obj/effect/turf_decal/tile/neutral{
+/obj/effect/turf_decal/delivery,
+/obj/machinery/photocopier,
+/obj/structure/disposalpipe/segment{
dir = 4
},
-/obj/effect/turf_decal/tile/neutral{
- dir = 1
+/obj/machinery/requests_console{
+ department = "Cargo Bay";
+ departmentType = 2;
+ name = "Cargo RC";
+ pixel_y = 30
},
-/obj/machinery/newscaster{
- pixel_x = -30
+/obj/machinery/camera{
+ c_tag = "Supply - Delivery Office Aft";
+ network = list("ss13","rd")
},
-/turf/open/floor/plasteel/dark,
-/area/lawoffice)
+/obj/item/paper/guides/cogstation/disposals,
+/obj/item/paper/fluff/cogstation/mulebot,
+/turf/open/floor/plasteel,
+/area/quartermaster/sorting)
"cpn" = (
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
@@ -58509,8 +58526,9 @@
req_access_txt = "5"
},
/obj/item/clipboard,
-/obj/item/clothing/glasses/hud/health,
/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/item/paper/guides/cogstation/letter_med,
+/obj/item/clothing/glasses/hud/health,
/obj/item/pen,
/obj/item/clothing/glasses/hud/health,
/turf/open/floor/plasteel/white,
@@ -61375,6 +61393,16 @@
/obj/machinery/atmospherics/pipe/simple/cyan/hidden,
/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
+"cyd" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden{
+ dir = 8
+ },
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
+/turf/open/floor/plating,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cye" = (
/obj/structure/disposalpipe/segment{
dir = 5
@@ -65719,19 +65747,24 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"cFs" = (
-/obj/structure/table,
-/obj/effect/turf_decal/tile/red{
+/obj/effect/turf_decal/tile/blue{
+ dir = 4
+ },
+/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/effect/turf_decal/tile/red{
- dir = 8
+/obj/structure/noticeboard{
+ pixel_y = 28
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/obj/item/storage/backpack/duffelbag/med/surgery,
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/cyan/hidden{
+ dir = 4
+ },
+/obj/item/paper/guides/cogstation/letter_med,
/turf/open/floor/plasteel/white,
-/area/medical/medbay/zone2{
- name = "Medbay Treatment Center"
- })
+/area/medical/medbay/central)
"cFt" = (
/obj/effect/turf_decal/tile/blue{
dir = 1
@@ -67921,6 +67954,11 @@
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/toilet/restrooms)
+"cJg" = (
+/obj/structure/disposalpipe/segment,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/quartermaster/warehouse)
"cJh" = (
/obj/structure/table,
/obj/structure/bedsheetbin/towel,
@@ -68022,6 +68060,18 @@
/area/engine/engineering{
name = "Engine Room"
})
+"cJq" = (
+/obj/machinery/atmospherics/pipe/simple/supplymain/visible,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/door/airlock/external/glass{
+ name = "External Construction Access";
+ req_one_access_txt = "10;31"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/turf/open/floor/plasteel,
+/area/quartermaster/warehouse)
"cJr" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
@@ -68030,23 +68080,28 @@
/turf/open/space/basic,
/area/space/nearstation)
"cJs" = (
-/obj/structure/lattice/catwalk,
/obj/structure/disposalpipe/segment,
-/obj/machinery/atmospherics/pipe/simple/supplymain/visible{
- dir = 4
- },
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/quartermaster/warehouse)
"cJt" = (
-/obj/structure/lattice/catwalk,
+/obj/effect/turf_decal/stripes/line,
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/power/apc{
+ name = "AI Upload Foyer APC";
+ pixel_y = -24
+ },
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "0-4"
},
-/obj/machinery/atmospherics/pipe/manifold/supplymain/visible{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 5
},
-/turf/open/space/basic,
-/area/space/nearstation)
+/turf/open/floor/plasteel,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cJu" = (
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
dir = 1
@@ -69993,6 +70048,21 @@
"cNB" = (
/turf/open/floor/plating,
/area/quartermaster/miningdock/airless)
+"cNC" = (
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/disposalpipe/segment,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cND" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel,
@@ -70935,15 +71005,25 @@
/turf/open/space/basic,
/area/space/nearstation)
"cPG" = (
-/obj/structure/lattice,
-/obj/structure/disposalpipe/segment,
-/obj/machinery/camera{
- c_tag = "Supply - Warehouse Exterior";
- dir = 1
+/obj/effect/turf_decal/stripes/line,
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/obj/machinery/atmospherics/pipe/simple/orange/hidden,
-/turf/open/space/basic,
-/area/space/nearstation)
+/obj/machinery/turretid{
+ control_area = "/area/science/server";
+ icon_state = "control_stun";
+ name = "Computer Core turret control";
+ pixel_x = -3;
+ pixel_y = -23;
+ req_access_txt = "65"
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/science/server{
+ name = "Computer Core"
+ })
"cPH" = (
/obj/machinery/conveyor_switch{
id = "EngiCargoConveyer"
@@ -71796,9 +71876,6 @@
/obj/item/paper/guides/jobs/medical/cloning{
pixel_x = -4
},
-/obj/item/paper/fluff/cogstation/cloner{
- pixel_x = 6
- },
/turf/open/floor/plasteel,
/area/medical/medbay/central)
"cRc" = (
@@ -71864,22 +71941,11 @@
/turf/open/floor/plasteel/white/corner,
/area/engine/atmos)
"cRh" = (
-/obj/effect/turf_decal/stripes/line,
-/obj/structure/cable{
- icon_state = "1-8"
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 4
},
-/obj/machinery/turretid{
- control_area = "/area/science/server";
- icon_state = "control_stun";
- name = "Computer Core turret control";
- pixel_x = -3;
- pixel_y = -23;
- req_access_txt = "65"
- },
-/turf/open/floor/plasteel,
-/area/science/server{
- name = "Computer Core"
- })
+/turf/closed/wall/r_wall,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
"cRi" = (
/obj/effect/turf_decal/tile/purple{
dir = 1
@@ -72023,6 +72089,53 @@
},
/turf/open/floor/plasteel,
/area/science/robotics/lab)
+"cRs" = (
+/obj/machinery/recharge_station,
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden{
+ dir = 9
+ },
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
+ },
+/turf/open/floor/plating,
+/area/ai_monitored/turret_protected/ai_upload_foyer)
+"cRt" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supplymain/hidden,
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/quartermaster/warehouse)
+"cRu" = (
+/obj/effect/turf_decal/delivery,
+/turf/open/floor/plasteel,
+/area/science/mixing)
+"cRv" = (
+/mob/living/simple_animal/opossum{
+ desc = "Wubba lubba dub dub.";
+ name = "Rick"
+ },
+/turf/open/floor/plasteel/showroomfloor,
+/area/medical/morgue)
+"cRw" = (
+/obj/structure/table,
+/obj/effect/turf_decal/tile/red{
+ dir = 1
+ },
+/obj/effect/turf_decal/tile/red{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/orange/hidden,
+/obj/item/paper/guides/cogstation/letter_med{
+ pixel_y = 4
+ },
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/turf/open/floor/plasteel/white,
+/area/medical/medbay/zone2{
+ name = "Medbay Treatment Center"
+ })
"cVq" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible{
dir = 4
@@ -72130,14 +72243,6 @@
},
/turf/open/floor/plasteel,
/area/engine/atmos)
-"frb" = (
-/obj/structure/lattice/catwalk,
-/obj/machinery/atmospherics/pipe/simple/supplymain/visible,
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/turf/open/space/basic,
-/area/space/nearstation)
"fti" = (
/obj/machinery/atmospherics/components/binary/pump,
/obj/machinery/atmospherics/pipe/simple/orange/hidden{
@@ -84950,7 +85055,7 @@ akI
aAJ
cMp
aYa
-bxm
+akI
akI
aNC
bxv
@@ -85206,7 +85311,7 @@ aLH
akI
aAK
aRC
-bxn
+aHj
akI
bxA
hiV
@@ -85723,7 +85828,7 @@ aXm
aXs
bxC
akI
-bxK
+beC
bxY
byh
byb
@@ -85977,7 +86082,7 @@ aaU
aaU
aEa
cMK
-bxt
+aHE
akI
akI
akI
@@ -86233,9 +86338,9 @@ aaU
aaa
aaU
aEa
-aHE
-bab
-aaa
+cMK
+aTh
+akI
aaa
aaU
aaa
@@ -86490,7 +86595,8 @@ aaU
aaU
aaU
aEb
-aPT
+aya
+bab
aaU
aaU
aye
@@ -86508,7 +86614,6 @@ aye
aye
aye
aye
-aye
aaa
aaa
aaa
@@ -90657,7 +90762,7 @@ aaa
aaa
aaa
aaa
-aaa
+aWj
aaU
aaa
aaU
@@ -90913,9 +91018,9 @@ aaa
aaa
aaa
aaa
-aaa
-aWj
-aaU
+bcw
+aUZ
+bcw
aaa
bcy
cnU
@@ -91171,7 +91276,7 @@ aaa
aaa
aaa
bcw
-aUZ
+cRu
bcw
aaa
bcy
@@ -91193,7 +91298,7 @@ aaa
aaa
aaU
aaa
-bAb
+brs
bxT
bFq
bHY
@@ -91363,10 +91468,10 @@ aaa
aaa
aaU
abx
-aqw
-aoW
-aqw
-aqw
+aiN
+alu
+aiN
+abx
aaU
aaa
aaa
@@ -91620,9 +91725,9 @@ aaa
aaa
aaU
abx
-akg
-apS
-arr
+aiN
+asl
+aiN
abx
aaU
aaa
@@ -91877,9 +91982,9 @@ aaa
aaa
aaU
aiN
-akj
-anV
-asl
+aoW
+apS
+asH
abx
aaU
aaU
@@ -92134,9 +92239,9 @@ aaa
aaa
aaU
aiN
-akz
+arr
aDO
-asH
+atn
awm
axc
awm
@@ -95499,7 +95604,7 @@ aNL
aNL
aVl
aYT
-baz
+aXf
bFH
aYT
aaU
@@ -97043,7 +97148,7 @@ aVL
aYT
baG
bbM
-bcz
+aZA
aYT
bdy
beM
@@ -98094,7 +98199,7 @@ bgA
bWf
bXm
bZQ
-ccN
+bWq
ccN
cei
ccN
@@ -99380,12 +99485,12 @@ bWh
csG
bQA
aZy
-aXf
+bZV
bZJ
bZF
cpu
bax
-bZV
+cea
bZX
ccY
cab
@@ -99628,8 +99733,8 @@ bnz
bpw
bQx
bll
-aZz
-cpm
+aZC
+bcz
bad
bah
baR
@@ -99885,8 +99990,8 @@ bnA
bpy
bQI
bll
-aZA
aZI
+beG
bae
chP
baS
@@ -100142,7 +100247,7 @@ bnD
bpC
bQx
bll
-aZC
+baz
aZN
bCS
bak
@@ -102760,7 +102865,7 @@ caR
czi
cKj
buS
-bFY
+cFs
cEX
bIU
aJE
@@ -103536,7 +103641,7 @@ cFe
cFk
cFm
cFq
-cFs
+cRw
cFz
bqt
blx
@@ -104781,8 +104886,8 @@ bLz
bNe
ajO
bQb
-bUj
-aTh
+cnR
+cJt
bfh
brb
bzN
@@ -105022,9 +105127,9 @@ bOV
aRq
cjD
bnU
-btw
+bxm
bns
-aya
+bxn
avy
alo
awn
@@ -105039,7 +105144,7 @@ bPp
bPU
bQi
bUU
-bWJ
+cNC
bWP
cbV
bzR
@@ -105279,7 +105384,7 @@ aSt
aSt
aSt
aSt
-cpG
+aWd
aSt
brs
avv
@@ -105296,7 +105401,7 @@ cRf
bPV
bQT
bVq
-cRh
+cPG
bfh
cbY
cdn
@@ -105523,7 +105628,7 @@ axV
aog
aog
aSH
-beG
+aZz
aaU
aaU
aaU
@@ -105535,9 +105640,9 @@ aRv
aaU
aaU
aaU
-aWj
-aSq
-aWj
+aSt
+cpG
+aSt
aaU
avv
ajO
@@ -105553,7 +105658,7 @@ ajO
ajO
aRy
bVC
-aRy
+cRh
bfh
bfh
bBR
@@ -105809,8 +105914,8 @@ bmH
aYZ
bht
bcY
-bVD
-beC
+cyd
+cRs
cgF
bfh
bBS
@@ -106033,7 +106138,7 @@ aOJ
aOJ
bmF
bnT
-aRJ
+bnT
aRJ
aRJ
chm
@@ -106289,13 +106394,13 @@ bfv
bfv
bkW
bmJ
+bnS
bof
aQJ
aQJ
aQJ
aQJ
aQJ
-aQJ
aRZ
aaU
aaa
@@ -106357,7 +106462,7 @@ cyP
byQ
bzS
czw
-bDb
+cRv
bBu
crX
czI
@@ -106547,7 +106652,7 @@ bjL
blD
bmK
boi
-aaU
+bsx
aaU
aaU
aaU
@@ -106805,7 +106910,7 @@ aOJ
aPN
bes
aaU
-aye
+bQe
aye
bQe
aye
@@ -107839,7 +107944,7 @@ aye
aye
aaU
aWj
-bnS
+btw
buq
bwC
bAr
@@ -108619,7 +108724,7 @@ bMS
bBv
bXM
bvB
-bWq
+bvM
acY
adz
bsz
@@ -109124,7 +109229,7 @@ aaa
aaa
aaU
aWj
-bnS
+btw
buq
bwZ
bBC
@@ -113190,7 +113295,7 @@ abe
aeP
agX
ajS
-aHj
+akg
bvm
ahP
aif
@@ -113448,7 +113553,7 @@ aaV
ahP
ahP
ahP
-bzp
+akj
ahP
aif
aiB
@@ -115821,10 +115926,10 @@ bra
bwW
bwW
aaU
-bdR
-cJr
-bTJ
-aaa
+anr
+aWj
+bUj
+bVD
aaa
cPz
aaa
@@ -116078,8 +116183,8 @@ brr
bCr
cwv
bAQ
-bAQ
-cJs
+bxt
+bzp
bUV
caf
bam
@@ -116089,7 +116194,7 @@ bYl
bam
bam
bam
-bam
+cJg
bbX
bbX
bcn
@@ -116335,8 +116440,8 @@ brP
brX
bsh
bsu
-bsx
-cJt
+bxK
+bDb
sVC
cdp
sVC
@@ -116346,8 +116451,8 @@ bZp
sVC
sVC
sVC
-frb
-bvM
+cJq
+cRt
bvW
bvX
bwd
@@ -116593,7 +116698,7 @@ bsi
bsv
bsy
bsy
-bsD
+bTJ
bsI
bRv
bsD
@@ -116602,8 +116707,8 @@ bsD
cPE
cPF
cPF
-cPF
-cPG
+cnQ
+cJs
bBL
bBL
bCm
@@ -118141,9 +118246,9 @@ bJv
aaU
cwJ
aaU
-cbG
-aaU
-aaU
+bWJ
+mIT
+cJr
aaU
bbT
bbT
@@ -118397,10 +118502,10 @@ bPA
wPS
aaa
cwI
-aaa
+cwA
cbI
-mIT
-cJr
+cwA
+anr
aaa
aaU
aaU
@@ -118654,9 +118759,9 @@ bgM
cwA
cwA
cwL
-cww
+cwA
cbL
-cww
+cwA
bdR
mIT
mIT
@@ -118670,7 +118775,7 @@ bgk
bbT
bkd
bbT
-cea
+cpm
bVG
cgn
cje
@@ -119876,7 +119981,7 @@ aaa
aaa
aaa
arM
-atn
+atl
arM
aaU
aaU
@@ -120132,9 +120237,9 @@ aaa
aaa
aaa
aaa
-aaa
-aWj
-aaU
+arM
+akz
+arM
aaU
aaU
aaU
@@ -120390,9 +120495,9 @@ aaa
aaa
aaa
aaa
-aaa
-aaa
-aaa
+aWj
+aaU
+aaU
aaa
aaa
aaU
@@ -125338,11 +125443,11 @@ aWj
cww
cJm
cww
-aaU
-aaa
-aaa
-aaa
-aaa
+aWj
+aWj
+aWj
+aWj
+aWj
aaU
aaU
aaa
@@ -125593,9 +125698,9 @@ bal
aaU
aWj
cww
-cJn
+cJm
cww
-aaU
+aWj
bal
bal
bal
@@ -125849,10 +125954,10 @@ aaa
aaa
aaU
aWj
+bFY
+cJn
+cww
aWj
-aWj
-aaa
-aaa
aaa
aaa
aaa
@@ -126105,11 +126210,11 @@ aaa
aaa
aaa
aaU
-aaa
-aaa
-aaa
-aaa
-aaa
+aWj
+aWj
+aWj
+aWj
+aWj
bal
bal
bal
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index fdc313c30a..6f0636d3cb 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -982,11 +982,11 @@
/area/security/prison)
"aci" = (
/obj/structure/lattice/catwalk,
-/obj/machinery/door/airlock/external{
- req_one_access_txt = "13,8"
+/obj/structure/cable{
+ icon_state = "0-2"
},
/turf/open/space,
-/area/maintenance/starboard/fore)
+/area/solar/starboard/fore)
"acj" = (
/obj/machinery/light/small{
dir = 1
@@ -3123,6 +3123,17 @@
},
/turf/open/floor/plasteel,
/area/security/prison)
+"afQ" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/maintenance/solars/starboard/fore)
"afR" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 1
@@ -5480,15 +5491,17 @@
/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
"akd" = (
-/turf/open/space,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
"ake" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
-/obj/structure/lattice/catwalk,
/turf/open/space,
-/area/maintenance/solars/starboard/fore)
+/area/space)
"akf" = (
/obj/machinery/conveyor{
dir = 1;
@@ -6294,11 +6307,6 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/turf/open/floor/plating,
/area/maintenance/solars/starboard/fore)
"alx" = (
@@ -6997,6 +7005,10 @@
/obj/structure/window/reinforced,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/recreation)
+"amB" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/maintenance/port)
"amC" = (
/obj/structure/chair{
dir = 4
@@ -7014,6 +7026,17 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall,
/area/crew_quarters/fitness/recreation)
+"amF" = (
+/obj/machinery/door/airlock/maintenance/abandoned{
+ name = "Storage Room";
+ req_access_txt = "12"
+ },
+/obj/structure/barricade/wooden,
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"amG" = (
+/turf/closed/wall,
+/area/crew_quarters/fitness/pool)
"amH" = (
/obj/machinery/door/airlock/external{
req_one_access_txt = "13,8"
@@ -7086,14 +7109,9 @@
/turf/open/floor/plasteel/dark,
/area/engine/gravity_generator)
"amN" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
+/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plating,
-/area/maintenance/solars/starboard/fore)
+/area/crew_quarters/fitness/pool)
"amO" = (
/obj/machinery/light/small{
dir = 8
@@ -7158,6 +7176,13 @@
icon_state = "platingdmg2"
},
/area/maintenance/port)
+"amV" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
"amW" = (
/obj/structure/table/reinforced,
/obj/item/folder,
@@ -7438,6 +7463,9 @@
/obj/item/paper,
/turf/open/floor/plasteel,
/area/security/main)
+"anz" = (
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/pool)
"anA" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/structure/disposalpipe/segment,
@@ -7898,6 +7926,10 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/security/warden)
+"aov" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
"aow" = (
/obj/machinery/door/firedoor,
/obj/structure/cable/yellow{
@@ -8616,6 +8648,12 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
+"apP" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
"apQ" = (
/obj/structure/reagent_dispensers/peppertank{
pixel_x = 32
@@ -8682,6 +8720,9 @@
/obj/item/assembly/flash/handheld,
/turf/open/floor/plasteel,
/area/security/main)
+"apX" = (
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
"apY" = (
/obj/structure/table,
/obj/item/folder/red,
@@ -8747,6 +8788,12 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/fitness/recreation)
+"aqe" = (
+/obj/machinery/pool/filter{
+ pixel_y = 16
+ },
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
"aqf" = (
/obj/structure/closet/lasertag/blue,
/obj/effect/turf_decal/tile/neutral{
@@ -9248,6 +9295,12 @@
},
/turf/open/floor/plasteel/showroomfloor,
/area/security/warden)
+"arh" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
"ari" = (
/obj/machinery/holopad,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -9478,6 +9531,14 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
+"arF" = (
+/obj/structure/pool/ladder{
+ dir = 8;
+ icon_state = "ladder";
+ pixel_x = 4
+ },
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
"arG" = (
/obj/structure/closet,
/obj/item/storage/box/lights/mixed,
@@ -10167,6 +10228,13 @@
/obj/structure/chair,
/turf/open/floor/plasteel/grimy,
/area/security/main)
+"asN" = (
+/obj/machinery/light/built{
+ icon_state = "tube-empty";
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/pool)
"asO" = (
/obj/item/paper_bin{
pixel_x = -3;
@@ -10466,6 +10534,10 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"atw" = (
+/obj/machinery/pool/drain,
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
"atx" = (
/obj/structure/cable/yellow{
icon_state = "2-4"
@@ -10536,6 +10608,12 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"atC" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
"atD" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -10558,6 +10636,10 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"atF" = (
+/obj/machinery/pool/controller,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/pool)
"atG" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -10601,6 +10683,23 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"atJ" = (
+/obj/structure/sign/poster/ripped{
+ pixel_y = 32
+ },
+/obj/structure/table,
+/obj/structure/cable/yellow{
+ icon_state = "0-2"
+ },
+/obj/item/light/tube,
+/obj/machinery/power/apc{
+ areastring = "/area/crew_quarters/fitness/pool";
+ dir = 4;
+ name = "Pool APC";
+ pixel_x = 26
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/pool)
"atK" = (
/obj/machinery/computer/prisoner/gulag_teleporter_computer{
dir = 1
@@ -11069,6 +11168,24 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"auQ" = (
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"auR" = (
+/obj/structure/pool/Lboard,
+/turf/open/pool,
+/area/crew_quarters/fitness/pool)
+"auS" = (
+/obj/structure/pool/Rboard,
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/pool)
+"auT" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/pool)
"auU" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -11659,6 +11776,50 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"avU" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-4"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"avV" = (
+/obj/structure/cable/yellow{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/door/airlock/maintenance/abandoned,
+/obj/structure/barricade/wooden,
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"avW" = (
+/obj/structure/cable/yellow{
+ icon_state = "1-2"
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/structure/cable/yellow{
+ icon_state = "1-8"
+ },
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/maintenance/port/aft)
+"avX" = (
+/obj/structure/chair{
+ dir = 8
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness/pool)
"avY" = (
/obj/machinery/door/airlock/external{
name = "Labor Camp Shuttle Airlock";
@@ -11932,6 +12093,11 @@
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
+"awA" = (
+/obj/structure/closet/athletic_mixed,
+/obj/item/toy/poolnoodle/blue,
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
"awB" = (
/obj/structure/reagent_dispensers/watertank,
/obj/item/storage/box/lights/mixed,
@@ -12053,6 +12219,18 @@
/obj/effect/spawner/lootdrop/maintenance,
/turf/open/floor/plating,
/area/maintenance/port/fore)
+"awN" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"awO" = (
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
"awP" = (
/obj/item/clothing/gloves/color/rainbow,
/obj/item/clothing/shoes/sneakers/rainbow,
@@ -12105,6 +12283,25 @@
"awW" = (
/turf/closed/wall/r_wall,
/area/security/nuke_storage)
+"awX" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 4
+ },
+/turf/open/floor/plating,
+/area/crew_quarters/fitness/pool)
+"awY" = (
+/obj/machinery/door/airlock/external{
+ name = "Solar Maintenance";
+ req_access_txt = "10; 13"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/maintenance/solars/starboard/aft)
"awZ" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
@@ -54179,21 +54376,6 @@
/obj/structure/lattice/catwalk,
/turf/open/space,
/area/solar/port/aft)
-"cek" = (
-/obj/machinery/door/airlock/external{
- req_access_txt = "13"
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
-"cel" = (
-/obj/structure/sign/warning/vacuum/external{
- pixel_y = 32
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
"cem" = (
/obj/structure/cable/yellow{
icon_state = "1-2"
@@ -54885,16 +55067,6 @@
},
/turf/open/floor/plating,
/area/maintenance/port/fore)
-"cfB" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/structure/cable/yellow{
- icon_state = "1-2"
- },
-/obj/effect/turf_decal/stripes/line{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
"cfC" = (
/obj/item/trash/pistachios,
/obj/structure/closet,
@@ -55509,13 +55681,6 @@
/obj/structure/reagent_dispensers/cooking_oil,
/turf/open/floor/plasteel/showroomfloor,
/area/crew_quarters/kitchen)
-"cgG" = (
-/obj/structure/closet/emcloset/anchored,
-/obj/effect/turf_decal/stripes/line{
- dir = 1
- },
-/turf/open/floor/plating,
-/area/maintenance/port/aft)
"cgH" = (
/obj/structure/cable/yellow{
icon_state = "4-8"
@@ -81287,19 +81452,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/aft)
-"gsT" = (
-/obj/machinery/door/airlock/external{
- name = "Solar Maintenance";
- req_access_txt = "10; 13"
- },
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plating,
-/area/solar/starboard/aft)
"gEk" = (
/obj/structure/cable/yellow{
icon_state = "2-8"
@@ -97098,15 +97250,15 @@ bTp
bUP
bVS
bXv
-bYC
-bYC
-bYC
-bYC
-aaa
-aaf
-aaa
-aaa
-aaf
+bTn
+bTn
+bTn
+bTn
+amG
+auQ
+auQ
+amG
+amG
aaf
aaf
aaa
@@ -97356,16 +97508,16 @@ bTn
bTn
bTn
bTn
+amN
+anz
+arh
+asN
+anz
+arh
+awN
+amG
aaa
-aaf
-aaa
-aaa
-aaf
-aaf
-aaf
-aaf
-aaa
-aaa
+lMJ
aaa
aaa
aaa
@@ -97609,20 +97761,20 @@ bzx
alC
mEe
alK
-aob
-aob
dix
-alK
-aaf
-aaf
-aaf
-aaf
-aaf
-aaa
-aaa
-aaf
-aaa
+aob
+amB
+amF
+amV
+apX
+apX
+apX
+apX
+apX
+awO
+auQ
aaa
+lMJ
aaa
aaa
aaa
@@ -97869,17 +98021,17 @@ bTr
bUQ
bVT
aob
-alK
-aaa
-aaf
-aaa
-aaa
-aaa
-aaa
-aaa
-aaf
-aaa
+amG
+anz
+aqe
+apX
+atw
+apX
+apX
+anz
+auQ
aaa
+lMJ
aaa
aaa
aaa
@@ -98126,15 +98278,15 @@ alK
bJs
bVU
bXx
-alK
-aaa
-aaf
-aaf
-ack
-aaf
-aaf
-aaf
-aaf
+amG
+aov
+apX
+arF
+apX
+auR
+apX
+anz
+auQ
aaf
aaf
aaf
@@ -98383,15 +98535,15 @@ alK
bUR
alK
alK
-alK
-aaa
-aaf
-aaa
-ack
-aaf
-aaa
-aaa
-aaa
+amG
+apP
+anz
+anz
+atC
+auS
+atC
+awX
+amG
aaa
aaa
aaa
@@ -98640,15 +98792,15 @@ alK
alK
alK
bXy
-dux
-dux
-dux
-dux
-cek
-dux
-dux
-dux
-dux
+amG
+amG
+amG
+amG
+atF
+auT
+avX
+amG
+amG
ckN
ckN
ckN
@@ -98900,11 +99052,11 @@ bXz
bYE
bYE
cbp
-dux
-cel
-bUU
-cgG
-dux
+amG
+atJ
+avU
+awA
+amG
cjp
ckO
cmg
@@ -99157,11 +99309,11 @@ dux
dux
dux
cbq
-dux
-dux
-cek
-dux
-dux
+amG
+amG
+avV
+amG
+amG
cjq
ckP
ckS
@@ -99416,7 +99568,7 @@ dux
cbr
bYE
cem
-cfB
+avW
cbp
dux
diE
@@ -119752,7 +119904,7 @@ cJf
dvY
aaa
dbN
-gsT
+awY
dbN
aaa
aaa
@@ -124021,7 +124173,7 @@ aaf
aaa
aaf
dnh
-aci
+amH
dnh
ape
dnS
@@ -126848,7 +127000,7 @@ aaa
aaf
aaa
aaa
-akd
+ake
alv
apm
apm
@@ -127103,7 +127255,7 @@ aaf
aaa
aaa
aaf
-akd
+alv
alv
alv
alv
@@ -127359,10 +127511,10 @@ abR
abR
abR
abR
-abR
-ake
+aci
+afQ
+akd
alw
-amN
sGh
apo
aqz
@@ -127617,7 +127769,7 @@ aaf
aaa
aaa
aaf
-akd
+alv
alv
alv
alv
@@ -127876,7 +128028,7 @@ aaa
aaf
aaa
aaa
-akd
+ake
alv
apm
apm
diff --git a/_maps/map_files/Snaxi/IcemoonUnderground_Above.dmm b/_maps/map_files/Snaxi/IcemoonUnderground_Above.dmm
index 403f155854..153ad4265d 100644
--- a/_maps/map_files/Snaxi/IcemoonUnderground_Above.dmm
+++ b/_maps/map_files/Snaxi/IcemoonUnderground_Above.dmm
@@ -112,7 +112,7 @@
/obj/machinery/light/small{
dir = 8
},
-/turf/closed/mineral/random/snow,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/unexplored/rivers)
"eH" = (
/obj/machinery/airalarm{
@@ -581,7 +581,7 @@
desc = "A horn off of a bicycle. This one has been charred to hell and back, yet somehow it still honks.";
name = "charred bike horn"
},
-/turf/closed/mineral/random/snow,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/unexplored/rivers)
"nN" = (
/turf/closed/wall/r_wall,
@@ -722,6 +722,9 @@
},
/turf/open/floor/plasteel,
/area/mine/living_quarters)
+"rs" = (
+/turf/open/floor/plating/asteroid/snow/icemoon,
+/area/icemoon/underground/unexplored/rivers)
"ry" = (
/obj/effect/turf_decal/tile/purple{
dir = 8
@@ -809,6 +812,9 @@
},
/turf/open/floor/plasteel/white,
/area/mine/living_quarters)
+"sL" = (
+/turf/open/transparent/openspace/icemoon,
+/area/icemoon/underground/unexplored/rivers)
"sM" = (
/obj/structure/table,
/obj/item/storage/firstaid/toxin{
@@ -2367,7 +2373,7 @@
/obj/machinery/light/small{
dir = 1
},
-/turf/closed/mineral/random/snow,
+/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/unexplored/rivers)
"WE" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
@@ -29940,9 +29946,9 @@ ah
ah
ah
ah
+rs
ah
-ah
-ah
+rs
ah
ah
ah
@@ -30199,8 +30205,8 @@ ah
ah
ah
ah
-ah
-ah
+rs
+rs
ah
ah
ah
@@ -30456,8 +30462,8 @@ ah
ah
ah
ah
-ah
-ah
+rs
+rs
ah
ah
ah
@@ -30712,10 +30718,10 @@ ah
ah
ah
nE
-ah
-ah
-ah
-ah
+rs
+sL
+sL
+rs
ah
ah
ah
@@ -30968,11 +30974,11 @@ ah
ah
ah
ah
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+rs
+sL
+rs
ah
ah
ah
@@ -31498,8 +31504,8 @@ ah
ah
ah
ah
-ah
-ah
+rs
+rs
ah
ah
ah
@@ -31749,14 +31755,14 @@ ah
ah
ah
ah
+rs
+rs
+rs
+rs
ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+rs
ah
ah
ah
@@ -32005,14 +32011,14 @@ Gw
op
nd
ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
+sL
+rs
+rs
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -32262,15 +32268,15 @@ GI
Lg
nd
ah
-ah
-ah
-ah
+sL
+sL
+rs
op
WE
op
-ah
-ah
-ah
+rs
+rs
+rs
ah
ah
ah
@@ -32519,17 +32525,17 @@ GN
Lu
nd
ah
-ah
-ah
-ah
+rs
+rs
+rs
op
sa
op
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -32782,11 +32788,11 @@ nd
op
WM
op
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -33039,10 +33045,10 @@ Rx
ry
WO
op
-ah
-ah
-ah
-ah
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -33296,9 +33302,9 @@ sa
sa
sa
op
-ah
-ah
-ah
+rs
+rs
+rs
ah
ah
ah
@@ -33553,8 +33559,8 @@ TA
sa
Xf
op
-ah
-ah
+rs
+rs
ah
ah
ah
@@ -33810,8 +33816,8 @@ TA
sa
sa
op
-ah
-ah
+rs
+rs
ah
ah
ah
@@ -37651,8 +37657,8 @@ ah
ah
ah
ah
-ah
-ah
+rs
+rs
op
sa
Ho
@@ -37908,8 +37914,8 @@ ah
ah
ah
ah
-ah
-ah
+rs
+rs
op
ET
HY
@@ -38165,18 +38171,18 @@ ah
ah
ah
ah
-ah
-ah
+rs
+rs
op
op
Iq
op
op
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -38422,19 +38428,19 @@ ah
ah
ah
ah
-ah
-ah
-ah
+rs
+rs
+rs
op
Iv
op
-ah
-ah
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -38680,18 +38686,18 @@ ah
ah
ah
ah
-ah
-ah
+rs
+rs
op
Ho
op
-ah
-ah
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+sL
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -38937,18 +38943,18 @@ ah
ah
ah
ah
-ah
-ah
+sL
+rs
op
Ho
op
-ah
-ah
-ah
-ah
-ah
-ah
-ah
+rs
+sL
+sL
+sL
+rs
+rs
+rs
ah
ah
ah
@@ -39193,21 +39199,21 @@ ah
ah
ah
ah
-ah
-ah
-ah
+sL
+sL
+rs
op
Ho
op
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
+rs
+sL
+sL
+sL
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -39444,26 +39450,26 @@ ah
ah
ah
ah
+rs
+rs
+rs
ah
ah
ah
ah
-ah
-ah
-ah
-ah
-ah
+rs
+rs
er
IB
er
-ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
+rs
+sL
+sL
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -39700,24 +39706,24 @@ ah
ah
ah
ah
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
+rs
+rs
er
IB
er
-ah
-ah
-ah
-ah
-ah
+rs
+sL
+sL
+rs
+rs
ah
ah
ah
@@ -39957,24 +39963,24 @@ ah
ah
ah
ah
-ah
+rs
eZ
fB
er
+rs
ah
ah
ah
-ah
-ah
-ah
+rs
+rs
er
IB
er
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+sL
+sL
+rs
ah
ah
ah
@@ -40213,25 +40219,25 @@ ah
ah
ah
ah
-ah
-ah
+rs
+rs
er
fC
er
+rs
+rs
ah
ah
-ah
-ah
-ah
-ah
+rs
+rs
er
IF
er
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+sL
+sL
+rs
ah
ah
ah
@@ -40470,25 +40476,25 @@ ah
ah
ah
ah
-ah
+rs
er
er
fD
er
er
+rs
ah
-ah
-ah
-ah
+rs
+rs
Be
er
IK
er
er
-ah
-ah
-ah
-ah
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -40743,8 +40749,8 @@ IM
gS
er
eq
-ah
-ah
+rs
+rs
ah
ah
ah
@@ -40983,7 +40989,7 @@ ah
ah
ah
ah
-ah
+rs
eq
eH
fb
@@ -41000,8 +41006,8 @@ IB
fC
Nt
eq
-ah
-ah
+rs
+rs
ah
ah
ah
@@ -41240,7 +41246,7 @@ ah
ah
ah
ah
-ah
+rs
er
eI
fc
@@ -41497,7 +41503,7 @@ ah
ah
ah
ah
-ah
+rs
er
eJ
fd
@@ -41774,8 +41780,8 @@ er
Tk
NK
er
-ah
-ah
+rs
+rs
ah
ah
ah
@@ -42009,7 +42015,7 @@ ah
ah
ah
ah
-ah
+rs
dW
ei
es
@@ -42031,9 +42037,9 @@ Rf
Tn
NP
VC
-ah
-ah
-ah
+rs
+rs
+rs
ah
ah
ah
@@ -42265,8 +42271,8 @@ ah
ah
ah
ah
-ah
-ah
+rs
+rs
dX
ej
et
@@ -42288,8 +42294,8 @@ er
To
UJ
er
-ah
-ah
+rs
+rs
ah
ah
ah
@@ -42522,8 +42528,8 @@ ah
ah
ah
ah
-ah
-ah
+rs
+rs
dX
ej
eu
@@ -42780,7 +42786,7 @@ ah
ah
ah
ah
-ah
+rs
dW
ek
ew
@@ -44069,9 +44075,9 @@ ah
ah
ah
ex
-ah
-ah
-ah
+rs
+rs
+rs
ex
ah
ah
@@ -44324,13 +44330,13 @@ ah
ah
ah
ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -44581,13 +44587,13 @@ ah
ah
ah
ah
-ah
-ah
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -44839,11 +44845,11 @@ ah
ah
ah
ah
-ah
-ah
-ah
-ah
-ah
+rs
+rs
+rs
+rs
+rs
ah
ah
ah
@@ -45097,9 +45103,9 @@ ah
ah
ah
ah
-ah
-ah
-ah
+rs
+rs
+rs
ah
ah
ah
diff --git a/_maps/map_files/Snaxi/IcemoonUnderground_Below.dmm b/_maps/map_files/Snaxi/IcemoonUnderground_Below.dmm
index 42971e4315..79e5080644 100644
--- a/_maps/map_files/Snaxi/IcemoonUnderground_Below.dmm
+++ b/_maps/map_files/Snaxi/IcemoonUnderground_Below.dmm
@@ -5,6 +5,9 @@
"b" = (
/turf/closed/mineral/random/high_chance/snow,
/area/icemoon/underground/unexplored/rivers)
+"c" = (
+/turf/open/floor/plating/asteroid/snow/icemoon,
+/area/icemoon/underground/unexplored/rivers)
"d" = (
/turf/closed/wall,
/area/icemoon/underground/explored)
@@ -19,6 +22,9 @@
/obj/item/gps/mining,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
+"G" = (
+/turf/open/floor/plating/asteroid/snow/icemoon,
+/area/mine/maintenance)
"N" = (
/obj/item/flashlight/lantern{
on = 1
@@ -33,6 +39,22 @@
/obj/structure/ladder,
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
+"X" = (
+/obj/machinery/telecomms/relay/preset/mining,
+/obj/machinery/bluespace_beacon,
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
+/obj/structure/window/reinforced,
+/obj/machinery/door/window/eastright{
+ dir = 8;
+ req_access_txt = "48"
+ },
+/turf/open/floor/circuit,
+/area/icemoon/underground/explored)
(1,1,1) = {"
a
@@ -39499,9 +39521,9 @@ a
a
a
a
-a
-a
-a
+c
+c
+c
a
a
a
@@ -40011,13 +40033,13 @@ a
a
a
a
-a
+c
e
i
h
h
e
-a
+c
a
a
a
@@ -40268,13 +40290,13 @@ a
a
a
a
-a
+c
h
h
T
h
h
-a
+c
a
a
a
@@ -40525,13 +40547,13 @@ a
a
a
a
-a
+c
e
N
h
-h
+G
e
-a
+c
a
a
a
@@ -40786,7 +40808,7 @@ a
d
O
h
-e
+X
d
a
a
@@ -41041,9 +41063,9 @@ a
a
a
a
-a
-a
-a
+c
+c
+c
a
a
a
diff --git a/_maps/map_files/Snaxi/Snaxi.dmm b/_maps/map_files/Snaxi/Snaxi.dmm
index 45e6e4dee0..ed574fa1a4 100644
--- a/_maps/map_files/Snaxi/Snaxi.dmm
+++ b/_maps/map_files/Snaxi/Snaxi.dmm
@@ -254,10 +254,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
"aar" = (
-/obj/effect/spawner/structure/window/reinforced,
-/obj/structure/sign/departments/botany,
-/turf/open/floor/plating,
-/area/hydroponics)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/fore)
"aas" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/disposalpipe/segment{
@@ -310,6 +311,9 @@
dir = 1
},
/obj/machinery/disposal/bin,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 5
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"aaw" = (
@@ -516,13 +520,6 @@
},
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/fitness/recreation)
-"aaM" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4
- },
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
"aaN" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
/obj/machinery/quantumpad{
@@ -602,7 +599,8 @@
/obj/structure/sign/departments/restroom{
pixel_x = 32
},
-/turf/open/floor/carpet,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"aaV" = (
/obj/structure/sign/directions/evac{
@@ -673,8 +671,8 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/structure/sign/mining{
- pixel_x = 32
+/obj/machinery/light{
+ dir = 4
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
@@ -942,7 +940,7 @@
/obj/structure/sign/poster/official/fashion{
pixel_y = -32
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"abB" = (
/obj/structure/cable{
@@ -1080,13 +1078,14 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"abL" = (
-/obj/structure/table,
-/obj/item/mmi,
-/obj/item/mmi,
-/obj/item/mmi,
/obj/structure/sign/poster/official/state_laws{
pixel_y = -32
},
+/obj/machinery/camera{
+ c_tag = "Robotics Lab South";
+ dir = 1;
+ network = list("ss13","rd")
+ },
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
"abM" = (
@@ -1184,14 +1183,8 @@
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"abU" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 5
- },
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"abV" = (
/obj/effect/turf_decal/tile/red{
dir = 1
@@ -1358,7 +1351,9 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/visible,
+/obj/machinery/atmospherics/components/binary/valve{
+ dir = 4
+ },
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"acV" = (
@@ -1568,8 +1563,9 @@
icon_state = "4-8"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 9
+ dir = 4
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"aeG" = (
@@ -1711,6 +1707,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/visible{
dir = 9
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"akB" = (
@@ -1858,7 +1855,6 @@
/obj/structure/table/reinforced,
/obj/machinery/door/window/eastright{
base_state = "left";
- dir = 8;
icon_state = "left";
name = "Chemistry Desk";
req_access_txt = "33"
@@ -1866,6 +1862,10 @@
/obj/machinery/door/firedoor/border_only{
dir = 8
},
+/obj/machinery/door/window/eastright{
+ dir = 8;
+ name = "Chemistry Desk"
+ },
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"anw" = (
@@ -2075,8 +2075,8 @@
/obj/machinery/door/firedoor/border_only{
dir = 1
},
-/obj/machinery/door/airlock/external,
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"arE" = (
@@ -2164,6 +2164,7 @@
/obj/structure/disposalpipe/segment{
dir = 9
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"asE" = (
@@ -2505,17 +2506,10 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/highsecurity{
- name = "AI Upload Access";
- req_access_txt = "16"
- },
-/obj/machinery/door/firedoor/border_only{
- dir = 4
- },
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/dark,
+/turf/closed/wall/r_wall,
/area/ai_monitored/turret_protected/ai_upload)
"axc" = (
/obj/structure/table,
@@ -2604,17 +2598,9 @@
/obj/structure/plasticflaps/opaque,
/turf/open/floor/plasteel/dark,
/area/science/lab)
-"axL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 10
- },
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
"axN" = (
-/obj/machinery/atmospherics/pipe/simple/supply/visible{
- dir = 10
- },
-/turf/open/floor/plating/asteroid/snow/icemoon,
+/obj/structure/fluff/railing,
+/turf/open/transparent/openspace/icemoon,
/area/icemoon/surface/outdoors)
"ayk" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -2626,7 +2612,14 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/closed/wall/r_wall,
+/obj/machinery/door/airlock/highsecurity{
+ name = "AI Upload Access";
+ req_access_txt = "16"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload)
"aym" = (
/obj/structure/cable{
@@ -2741,20 +2734,34 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/conveyor_switch/oneway{
- dir = 8;
- id = "robo2"
- },
/obj/machinery/firealarm{
dir = 8;
pixel_x = 24
},
+/obj/structure/table,
+/obj/item/storage/firstaid/regular{
+ empty = 1;
+ name = "First-Aid (empty)"
+ },
+/obj/item/storage/firstaid/regular{
+ empty = 1;
+ name = "First-Aid (empty)"
+ },
+/obj/item/storage/firstaid/regular{
+ empty = 1;
+ name = "First-Aid (empty)"
+ },
+/obj/item/healthanalyzer,
+/obj/item/healthanalyzer,
+/obj/item/healthanalyzer,
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
"ayC" = (
-/obj/machinery/mecha_part_fabricator,
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
+/obj/structure/fluff/railing/corner{
+ dir = 8
+ },
+/turf/open/transparent/openspace/icemoon,
+/area/icemoon/surface/outdoors)
"ayD" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -2805,6 +2812,7 @@
/obj/structure/disposalpipe/segment{
dir = 9
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/maintenance/department/electrical)
"azq" = (
@@ -2890,20 +2898,11 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"azH" = (
-/obj/machinery/conveyor{
- dir = 8;
- id = "robo2"
+/obj/structure/fluff/railing{
+ dir = 4
},
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass{
- amount = 20;
- pixel_x = -3;
- pixel_y = 6
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
+/turf/open/transparent/openspace/icemoon,
+/area/icemoon/surface/outdoors)
"aAe" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/structure/disposalpipe/segment{
@@ -3136,24 +3135,11 @@
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
"aCr" = (
-/obj/structure/table,
-/obj/item/storage/firstaid/regular{
- empty = 1;
- name = "First-Aid (empty)"
+/obj/structure/fluff/railing{
+ dir = 8
},
-/obj/item/storage/firstaid/regular{
- empty = 1;
- name = "First-Aid (empty)"
- },
-/obj/item/storage/firstaid/regular{
- empty = 1;
- name = "First-Aid (empty)"
- },
-/obj/item/healthanalyzer,
-/obj/item/healthanalyzer,
-/obj/item/healthanalyzer,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
+/turf/open/transparent/openspace/icemoon,
+/area/icemoon/surface/outdoors)
"aCV" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -3199,8 +3185,7 @@
/area/hallway/primary/port)
"aDc" = (
/obj/effect/landmark/start/scientist,
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
+/turf/open/floor/circuit,
/area/science/lab)
"aDd" = (
/obj/structure/cable{
@@ -3226,10 +3211,6 @@
/obj/machinery/vending/clothing,
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
-"aDf" = (
-/obj/effect/turf_decal/stripes/line,
-/turf/open/floor/plasteel/white,
-/area/science/lab)
"aDg" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -3380,8 +3361,10 @@
/turf/open/floor/plasteel,
/area/security/checkpoint/medical)
"aEE" = (
-/obj/machinery/rnd/destructive_analyzer,
-/turf/open/floor/circuit,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/turf/open/floor/plasteel/white,
/area/science/lab)
"aEF" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
@@ -3390,25 +3373,24 @@
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"aEG" = (
-/turf/open/floor/circuit,
-/area/science/lab)
-"aEH" = (
-/obj/machinery/computer/rdconsole/core{
- dir = 1
+/obj/structure/fluff/railing{
+ dir = 10
},
+/turf/open/transparent/openspace/icemoon,
+/area/icemoon/surface/outdoors)
+"aEH" = (
/obj/machinery/light,
/turf/open/floor/circuit,
/area/science/lab)
"aEI" = (
-/obj/machinery/rnd/production/protolathe/department/science,
+/obj/machinery/rnd/destructive_analyzer,
/turf/open/floor/circuit,
/area/science/lab)
"aEJ" = (
/turf/closed/wall/r_wall,
/area/hallway/secondary/entry)
"aEK" = (
-/obj/machinery/rnd/production/circuit_imprinter/department/science,
-/obj/item/reagent_containers/glass/beaker/sulphuric,
+/obj/machinery/rnd/production/protolathe/department/science,
/turf/open/floor/circuit,
/area/science/lab)
"aEL" = (
@@ -3606,35 +3588,11 @@
/turf/open/floor/circuit,
/area/science/robotics/mechbay)
"aHK" = (
-/obj/structure/rack,
-/obj/item/storage/toolbox/mechanical{
- pixel_x = -2;
- pixel_y = -1
+/obj/structure/fluff/railing{
+ dir = 6
},
-/obj/item/storage/toolbox/electrical{
- pixel_x = 1;
- pixel_y = 6
- },
-/obj/item/clothing/head/welding{
- pixel_x = -3;
- pixel_y = 5
- },
-/obj/item/clothing/head/welding{
- pixel_x = -3;
- pixel_y = 5
- },
-/obj/item/clothing/glasses/welding,
-/obj/item/clothing/glasses/welding,
-/obj/item/multitool{
- pixel_x = 3
- },
-/obj/item/multitool{
- pixel_x = 3
- },
-/obj/item/storage/belt/utility,
-/obj/item/storage/belt/utility,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
+/turf/open/transparent/openspace/icemoon,
+/area/icemoon/surface/outdoors)
"aHU" = (
/obj/machinery/rnd/production/techfab/department/service,
/turf/open/floor/plating,
@@ -3749,11 +3707,12 @@
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/entry)
"aKa" = (
-/obj/machinery/atmospherics/components/binary/valve/digital{
- dir = 4
+/obj/structure/cable{
+ icon_state = "0-2"
},
-/turf/closed/wall/r_wall,
-/area/storage/atmos)
+/obj/machinery/power/tracker,
+/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
+/area/solar/port/fore)
"aKf" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/disposalpipe/segment{
@@ -4062,14 +4021,14 @@
/turf/open/floor/wood,
/area/security/courtroom)
"aNL" = (
-/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/machinery/door/firedoor/border_only{
dir = 1;
name = "north facing firelock"
},
/obj/structure/fans/tiny,
-/turf/open/floor/carpet,
+/obj/machinery/door/airlock/external/glass,
+/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"aNS" = (
/obj/machinery/turnstile{
@@ -4136,18 +4095,12 @@
/obj/structure/cable{
icon_state = "0-4"
},
-/obj/machinery/power/apc{
- areastring = "/area/storage/atmos";
- dir = 8;
- name = "Atmospherics APC";
- pixel_x = -24
- },
/obj/structure/extinguisher_cabinet{
pixel_y = -30
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"aOq" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -4159,7 +4112,7 @@
dir = 8
},
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"aOr" = (
/obj/structure/lattice/catwalk,
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
@@ -4203,9 +4156,11 @@
/turf/open/floor/plating,
/area/security/checkpoint/medical)
"aPC" = (
-/obj/effect/spawner/structure/window/reinforced,
-/turf/open/floor/plating,
-/area/storage/atmos)
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/fore)
"aPD" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -4213,10 +4168,17 @@
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"aPE" = (
-/turf/closed/wall/r_wall,
-/area/storage/atmos)
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/power/solar{
+ id = "auxsolareast";
+ name = "Port Auxiliary Solar Array"
+ },
+/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
+/area/solar/port/fore)
"aPY" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -4286,7 +4248,7 @@
icon_state = "2-4"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"aQT" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -4352,6 +4314,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 9
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"aSI" = (
@@ -4700,6 +4663,13 @@
},
/turf/open/floor/plating,
/area/quartermaster/storage)
+"bfo" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"bfB" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -4755,6 +4725,12 @@
/obj/machinery/vending/coffee,
/turf/open/floor/plasteel/dark,
/area/maintenance/department/bridge)
+"bjR" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"bjU" = (
/obj/machinery/airalarm{
dir = 8;
@@ -4804,13 +4780,6 @@
/obj/machinery/holopad,
/turf/open/floor/plasteel/dark,
/area/maintenance/department/bridge)
-"blD" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"blI" = (
/obj/machinery/hydroponics/soil,
/obj/item/seeds/ambrosia,
@@ -4977,6 +4946,12 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
+"bqb" = (
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"bqx" = (
/obj/structure/table/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -5185,9 +5160,6 @@
/area/icemoon/surface/outdoors)
"buF" = (
/obj/machinery/light,
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
/obj/structure/table,
/obj/item/clothing/gloves/color/yellow,
/obj/item/clothing/gloves/color/yellow,
@@ -5200,6 +5172,9 @@
dir = 8
},
/obj/item/pipe_dispenser,
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"buI" = (
@@ -6106,9 +6081,6 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/airalarm{
- pixel_y = 28
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
@@ -6218,9 +6190,6 @@
/obj/effect/turf_decal/tile/brown{
dir = 4
},
-/obj/machinery/light{
- dir = 4
- },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"bCM" = (
@@ -6414,6 +6383,17 @@
/obj/machinery/vending/wardrobe/science_wardrobe,
/turf/open/floor/plasteel/white,
/area/science/misc_lab)
+"bEp" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/grille,
+/obj/structure/cable,
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/plating/asteroid/snow/icemoon,
+/area/icemoon/surface/outdoors)
"bEJ" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
/obj/effect/turf_decal/tile/purple{
@@ -6921,7 +6901,7 @@
/obj/structure/window/reinforced,
/obj/structure/table/reinforced,
/obj/machinery/button/door{
- id = "xenobio2";
+ id = "xenobiospec";
name = "Containment Blast Doors";
pixel_y = 4;
req_access_txt = "55"
@@ -6982,7 +6962,7 @@
req_access_txt = "55"
},
/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
+ id = "xenobiospec";
name = "containment blast door"
},
/turf/open/floor/engine,
@@ -7138,35 +7118,9 @@
/obj/machinery/disposal/bin,
/turf/open/floor/plasteel/cult,
/area/lawoffice)
-"bJQ" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/obj/machinery/door/airlock/external{
- name = "Arrivals Airlock"
- },
-/obj/structure/fans/tiny,
-/turf/open/floor/plating,
-/area/hallway/secondary/exit/departure_lounge)
"bKl" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel,
+/turf/open/transparent/glass/reinforced,
/area/crew_quarters/fitness)
"bKo" = (
/obj/machinery/door/airlock/public/glass{
@@ -7245,7 +7199,7 @@
icon_state = "0-4"
},
/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
+/area/solar/port/aft)
"bLI" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
@@ -7477,6 +7431,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
+/obj/machinery/recharge_station,
/turf/open/floor/plasteel,
/area/maintenance/department/electrical)
"bOp" = (
@@ -7621,16 +7576,16 @@
dir = 8;
name = "west facing firelock"
},
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
+ id = "xenobiospec";
name = "containment blast door"
},
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
-/obj/structure/disposalpipe/segment{
- dir = 4
- },
/turf/open/floor/engine,
/area/science/xenobiology)
"bPW" = (
@@ -8578,23 +8533,14 @@
"chp" = (
/turf/open/floor/plating,
/area/maintenance/aft)
-"chN" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"chZ" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
+"cih" = (
+/obj/structure/cable,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/aft)
"cio" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -8822,7 +8768,7 @@
icon_state = "0-4"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"cly" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple,
/turf/open/floor/plating/snowed/smoothed/icemoon,
@@ -9154,6 +9100,12 @@
},
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/fitness/recreation)
+"cvN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"cwm" = (
/obj/machinery/vending/boozeomat,
/obj/machinery/firealarm{
@@ -9506,15 +9458,6 @@
},
/turf/open/floor/plating,
/area/bridge)
-"cDO" = (
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"cDS" = (
/obj/structure/bodycontainer/morgue{
dir = 8
@@ -9542,6 +9485,12 @@
/obj/structure/reflector/single,
/turf/open/floor/plating,
/area/engine/storage)
+"cEs" = (
+/obj/machinery/atmospherics/pipe/simple/supply/visible,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/light/floor,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"cFm" = (
/obj/structure/reagent_dispensers/peppertank{
pixel_x = -30
@@ -9698,7 +9647,7 @@
},
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"cKQ" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
@@ -9723,7 +9672,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/plasteel,
+/turf/open/floor/wood,
/area/crew_quarters/fitness)
"cLC" = (
/obj/effect/turf_decal/tile/brown{
@@ -9770,7 +9719,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"cNE" = (
/obj/structure/cable{
@@ -10043,6 +9992,13 @@
"cTO" = (
/turf/closed/wall/r_wall,
/area/quartermaster/miningoffice)
+"cTV" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"cUd" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -10062,6 +10018,40 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard/aft)
+"cUs" = (
+/obj/effect/landmark/start/ai,
+/obj/item/radio/intercom{
+ freerange = 1;
+ name = "Common Channel";
+ pixel_x = 25;
+ pixel_y = -4
+ },
+/obj/item/radio/intercom{
+ freerange = 1;
+ frequency = 1447;
+ name = "Private Channel";
+ pixel_x = 25;
+ pixel_y = -13
+ },
+/obj/item/radio/intercom{
+ freerange = 1;
+ listening = 0;
+ name = "Custom Channel";
+ pixel_x = 25;
+ pixel_y = 7
+ },
+/obj/machinery/button/door{
+ id = "AI Chamber entrance shutters";
+ name = "AI Chamber entrance shutters control";
+ pixel_x = -7;
+ pixel_y = -24;
+ req_access_txt = "16"
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/circuit,
+/area/ai_monitored/turret_protected/ai)
"cUC" = (
/obj/structure/chair,
/obj/effect/landmark/start/geneticist,
@@ -10090,6 +10080,12 @@
},
/turf/open/floor/pod/dark,
/area/maintenance/starboard)
+"cVa" = (
+/obj/structure/fluff/railing{
+ dir = 9
+ },
+/turf/open/transparent/openspace/icemoon,
+/area/engine/atmospherics_engine)
"cVu" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/blue{
@@ -10143,6 +10139,10 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
+"cWI" = (
+/obj/structure/cable,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
"cWO" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 4
@@ -10167,11 +10167,9 @@
/turf/open/floor/plasteel/dark,
/area/security/prison)
"cXI" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai)
+/obj/structure/cable,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/fore)
"cXO" = (
/obj/structure/cable,
/obj/effect/landmark/start/ai/secondary,
@@ -10495,21 +10493,23 @@
name = "Port Solar Array"
},
/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
+/area/solar/port/aft)
"dfy" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/structure/cable{
icon_state = "1-4"
},
/obj/structure/cable{
icon_state = "2-4"
},
+/obj/effect/landmark/event_spawn,
+/obj/machinery/flasher{
+ id = "AI";
+ pixel_x = -26;
+ pixel_y = 3
+ },
/obj/machinery/ai_slipper{
uses = 10
},
-/obj/effect/landmark/event_spawn,
/turf/open/floor/circuit/off,
/area/ai_monitored/turret_protected/ai)
"dfV" = (
@@ -10817,8 +10817,8 @@
dir = 4
},
/obj/machinery/door/airlock/atmos{
- name = "Atmospherics";
- req_access_txt = "24"
+ name = "Antimatter Engine";
+ req_access_txt = "10"
},
/obj/machinery/door/firedoor/border_only{
dir = 8;
@@ -10886,10 +10886,11 @@
/obj/structure/cable{
icon_state = "2-4"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 6
+/obj/structure/cable{
+ icon_state = "2-8"
},
-/turf/open/floor/carpet,
+/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"duI" = (
/obj/structure/cable{
@@ -10934,6 +10935,7 @@
/obj/structure/disposalpipe/segment{
dir = 6
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"dvs" = (
@@ -10946,7 +10948,7 @@
/obj/machinery/door/firedoor/border_only{
name = "south facing firelock"
},
-/turf/open/floor/carpet,
+/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"dvw" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -11053,12 +11055,6 @@
},
/turf/open/floor/pod/dark,
/area/maintenance/starboard)
-"dAi" = (
-/obj/structure/sign/warning/pods{
- pixel_x = -32
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
"dAs" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -11158,36 +11154,11 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"dDC" = (
-/obj/effect/turf_decal/tile/neutral,
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/obj/effect/turf_decal/tile/neutral{
- dir = 4
- },
-/obj/effect/turf_decal/tile/neutral{
+/obj/structure/fluff/railing{
dir = 1
},
-/obj/structure/closet/crate/engineering{
- name = "Antimatter Engine Crate"
- },
-/obj/machinery/power/am_control_unit,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_shielding_container,
-/obj/item/am_containment,
-/obj/item/am_containment,
-/turf/open/floor/plasteel/dark,
-/area/engine/secure_construction)
+/turf/open/transparent/openspace/icemoon,
+/area/icemoon/surface/outdoors)
"dDK" = (
/obj/machinery/atmospherics/pipe/simple/supply/visible{
dir = 6
@@ -11265,9 +11236,11 @@
/turf/closed/wall,
/area/quartermaster/qm)
"dFJ" = (
-/obj/effect/turf_decal/stripes/corner,
-/turf/open/floor/plasteel/white,
-/area/science/lab)
+/obj/structure/fluff/railing{
+ dir = 5
+ },
+/turf/open/transparent/openspace/icemoon,
+/area/icemoon/surface/outdoors)
"dGb" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -11354,7 +11327,7 @@
/obj/machinery/door/firedoor/border_only{
name = "south facing firelock"
},
-/turf/open/floor/carpet,
+/turf/open/floor/carpet/blue,
/area/crew_quarters/dorms)
"dJc" = (
/obj/structure/cable{
@@ -11386,7 +11359,7 @@
/obj/structure/disposalpipe/segment{
dir = 6
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"dKw" = (
/obj/structure/cable{
@@ -11437,6 +11410,11 @@
"dMj" = (
/turf/closed/wall/r_wall,
/area/ai_monitored/nuke_storage)
+"dMo" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/light/floor,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"dMI" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -12102,6 +12080,7 @@
dir = 1;
sortType = 26
},
+/obj/machinery/atmospherics/components/unary/vent_pump/on,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"egM" = (
@@ -12218,15 +12197,6 @@
},
/turf/open/floor/plasteel/dark,
/area/security/brig)
-"ejw" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"ekw" = (
/obj/structure/chair{
dir = 1
@@ -12287,6 +12257,18 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/exit/departure_lounge)
+"eoH" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"eoL" = (
/obj/structure/chair{
dir = 4
@@ -12354,9 +12336,6 @@
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"ery" = (
-/obj/machinery/light{
- dir = 8
- },
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
@@ -12371,10 +12350,6 @@
/obj/effect/turf_decal/tile/blue{
dir = 1
},
-/obj/item/radio/intercom{
- name = "Station Intercom (General)";
- pixel_x = -28
- },
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"erG" = (
@@ -12587,6 +12562,12 @@
},
/turf/open/floor/plasteel/white,
/area/science/mixing)
+"eyc" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/closed/wall,
+/area/crew_quarters/dorms)
"eyP" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -12690,6 +12671,13 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/aft)
+"eCS" = (
+/obj/machinery/door/airlock{
+ id_tag = "Dorm5";
+ name = "Room Four"
+ },
+/turf/open/floor/carpet/purple,
+/area/crew_quarters/dorms)
"eDr" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -12870,7 +12858,7 @@
/area/hallway/primary/central)
"eHK" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+/obj/machinery/atmospherics/pipe/layer_manifold{
dir = 4
},
/turf/open/floor/plating,
@@ -12982,25 +12970,6 @@
},
/turf/open/floor/plasteel,
/area/maintenance/aft)
-"eLl" = (
-/obj/structure/window{
- dir = 1
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/structure/window{
- dir = 4
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"eLm" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -13174,10 +13143,6 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
-"eOO" = (
-/obj/structure/weightmachine/weightlifter,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"eOZ" = (
/obj/machinery/atmospherics/components/binary/pump/on,
/turf/open/floor/plasteel/dark,
@@ -13417,6 +13382,20 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/mineral/wood,
/area/maintenance/bar)
+"eXy" = (
+/obj/effect/turf_decal/stripes/corner,
+/turf/open/floor/plasteel/white,
+/area/science/lab)
+"eXO" = (
+/obj/structure/table,
+/obj/item/mmi,
+/obj/item/mmi,
+/obj/item/mmi,
+/obj/structure/window/reinforced{
+ dir = 8
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"eYe" = (
/obj/machinery/conveyor{
dir = 4;
@@ -13489,7 +13468,7 @@
icon_state = "1-4"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/aft)
"faR" = (
/obj/structure/window/reinforced{
dir = 8
@@ -13497,7 +13476,7 @@
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
/obj/effect/landmark/blobstart,
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"faV" = (
/obj/machinery/light{
dir = 4
@@ -13819,6 +13798,13 @@
/obj/machinery/space_heater,
/turf/open/floor/plating,
/area/icemoon/surface/outdoors)
+"fkA" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"fkC" = (
/obj/machinery/atmospherics/pipe/simple/green/visible,
/turf/closed/wall/r_wall,
@@ -13914,9 +13900,14 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/security/armory)
"fne" = (
-/obj/effect/landmark/start/roboticist,
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/fore)
"fni" = (
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/carbon_output{
dir = 8
@@ -13957,6 +13948,11 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/engine/engineering)
+"fol" = (
+/obj/machinery/rnd/production/circuit_imprinter/department/science,
+/obj/item/reagent_containers/glass/beaker/sulphuric,
+/turf/open/floor/circuit,
+/area/science/lab)
"foy" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -13986,17 +13982,6 @@
/turf/open/floor/plating,
/area/maintenance/disposal)
"fpS" = (
-/obj/structure/table,
-/obj/item/hemostat,
-/obj/item/retractor,
-/obj/item/scalpel{
- pixel_y = 12
- },
-/obj/item/circular_saw,
-/obj/item/cautery{
- pixel_x = 4
- },
-/obj/item/surgical_drapes,
/obj/machinery/airalarm{
pixel_y = 23
},
@@ -14004,7 +13989,14 @@
c_tag = "Robotics Lab";
network = list("ss13","rd")
},
-/turf/open/floor/plasteel/white,
+/obj/machinery/mecha_part_fabricator,
+/obj/item/stack/sheet/glass{
+ amount = 20;
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/obj/item/stack/sheet/metal/fifty,
+/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
"fqj" = (
/obj/machinery/field/generator,
@@ -14088,7 +14080,7 @@
icon_state = "1-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/port/aft)
"fsA" = (
/obj/structure/bodycontainer/morgue,
/obj/effect/turf_decal/tile/blue{
@@ -14115,11 +14107,8 @@
/turf/open/floor/plasteel/dark/telecomms,
/area/tcommsat/server)
"ftH" = (
-/obj/machinery/mineral/ore_redemption{
- input_dir = 2;
- output_dir = 1
- },
-/turf/open/floor/plating,
+/obj/effect/spawner/structure/window/reinforced,
+/turf/open/space/basic,
/area/quartermaster/miningdock)
"ftM" = (
/obj/structure/cable{
@@ -14189,11 +14178,6 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"fvz" = (
-/obj/structure/table/optable{
- name = "Robotics Operating Table"
- },
-/obj/item/tank/internals/anesthetic,
-/obj/item/clothing/mask/breath,
/obj/structure/extinguisher_cabinet{
pixel_y = 30
},
@@ -14355,6 +14339,9 @@
c_tag = "Bathrooms";
dir = 1
},
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 8
+ },
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/dorms)
"fBG" = (
@@ -14376,9 +14363,6 @@
/turf/open/floor/engine,
/area/engine/atmospherics_engine)
"fCQ" = (
-/obj/structure/toilet/secret/low_loot{
- pixel_y = 14
- },
/obj/machinery/button/door{
id = "Bath2";
name = "Door Bolt Control";
@@ -14391,6 +14375,7 @@
dir = 8
},
/obj/effect/landmark/blobstart,
+/obj/machinery/recharge_station,
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/dorms)
"fDi" = (
@@ -14416,6 +14401,13 @@
"fDJ" = (
/turf/open/floor/plasteel/white,
/area/medical/medbay/zone3)
+"fEz" = (
+/obj/machinery/computer/operating,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"fET" = (
/obj/effect/turf_decal/tile/neutral,
/obj/machinery/camera{
@@ -14514,7 +14506,18 @@
dir = 4
},
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
+"fIk" = (
+/obj/machinery/button/door{
+ id = "holoprivacy";
+ name = "Holodeck Privacy";
+ pixel_x = 24;
+ pixel_y = 7
+ },
+/turf/open/floor/engine{
+ name = "Holodeck Projector Floor"
+ },
+/area/holodeck/rec_center)
"fIu" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -14733,11 +14736,11 @@
pixel_y = -28
},
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"fNh" = (
/obj/structure/cable,
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"fNC" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -14869,6 +14872,9 @@
dir = 8;
name = "west facing firelock"
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
/turf/open/floor/plating,
/area/crew_quarters/dorms)
"fPN" = (
@@ -14955,6 +14961,13 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
+"fSb" = (
+/obj/machinery/airalarm{
+ dir = 4;
+ pixel_x = -22
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"fSw" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -14998,8 +15011,14 @@
/obj/machinery/light{
dir = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
+"fUc" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/aft)
"fUm" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -15044,7 +15063,7 @@
icon_state = "2-4"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"fVT" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/engine,
@@ -15273,6 +15292,12 @@
/obj/item/storage/fancy/donut_box,
/turf/open/floor/plasteel,
/area/security/checkpoint/supply)
+"gdH" = (
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
+ dir = 8
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/dorms)
"gdL" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 1
@@ -15441,6 +15466,12 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/engine/engineering)
+"gjZ" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 9
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/fitness)
"gkl" = (
/obj/machinery/jukebox,
/turf/open/floor/wood,
@@ -15504,28 +15535,6 @@
},
/turf/open/floor/plasteel,
/area/engine/engineering)
-"gls" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/machinery/door/window/westright{
- name = "Red Corner"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"gmf" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/structure/disposalpipe/segment,
@@ -15699,9 +15708,6 @@
/turf/closed/wall,
/area/security/courtroom)
"grZ" = (
-/obj/structure/cable{
- icon_state = "1-2"
- },
/obj/structure/table,
/obj/item/aiModule/core/full/custom,
/obj/item/aiModule/core/freeformcore,
@@ -15713,6 +15719,9 @@
dir = 1;
network = list("aiupload")
},
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai_upload)
"gsr" = (
@@ -15814,12 +15823,11 @@
/turf/open/floor/plasteel/dark,
/area/bridge)
"guI" = (
-/obj/machinery/light/floor,
-/obj/structure/disposalpipe/segment{
- dir = 5
+/obj/structure/cable{
+ icon_state = "0-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/port/fore)
"guR" = (
/obj/structure/table/glass,
/obj/effect/turf_decal/tile/yellow{
@@ -16063,7 +16071,7 @@
dir = 1
},
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"gCG" = (
/obj/structure/closet/firecloset,
/turf/open/floor/plating,
@@ -16078,15 +16086,10 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"gCO" = (
-/obj/machinery/light,
-/obj/machinery/door/airlock/public/glass{
- name = "Holodeck Door"
- },
-/obj/structure/fans/tiny,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/turf/open/floor/plasteel/white,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"gCS" = (
/obj/structure/bodycontainer/morgue,
@@ -16240,6 +16243,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"gIW" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
"gJi" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible,
/obj/machinery/atmospherics/pipe/simple/green/visible{
@@ -16486,7 +16495,7 @@
},
/obj/effect/landmark/event_spawn,
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"gPE" = (
/obj/machinery/portable_atmospherics/pump,
/obj/machinery/firealarm{
@@ -16662,7 +16671,7 @@
icon_state = "2-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"gTH" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -16692,11 +16701,18 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"gUc" = (
-/obj/machinery/light,
-/turf/open/floor/plasteel/white,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/camera{
+ c_tag = "Dorms Central";
+ dir = 1
+ },
+/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"gUw" = (
/obj/structure/plasticflaps,
@@ -16773,7 +16789,8 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/turf/open/floor/plasteel/white,
+/obj/effect/landmark/start/roboticist,
+/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
"gXE" = (
/obj/structure/table,
@@ -17108,13 +17125,16 @@
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"hiO" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
+ },
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"hjv" = (
@@ -17158,6 +17178,14 @@
},
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
+"hlQ" = (
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = 30
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"hlT" = (
/obj/structure/disposalpipe/segment{
dir = 6
@@ -17168,9 +17196,6 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/structure/cable{
- icon_state = "1-2"
- },
/turf/open/floor/circuit/off,
/area/ai_monitored/turret_protected/ai)
"hmM" = (
@@ -17195,6 +17220,15 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"hnN" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
+/obj/structure/disposalpipe/segment,
+/obj/machinery/light/floor,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"hnO" = (
/obj/machinery/atmospherics/components/unary/cryo_cell,
/turf/open/floor/plasteel/white,
@@ -17219,20 +17253,10 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"hop" = (
-/obj/structure/window{
- dir = 4
+/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "4-8"
},
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/effect/landmark/start/assistant,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"hoq" = (
@@ -17342,6 +17366,7 @@
/obj/machinery/light{
dir = 1
},
+/obj/machinery/vending/cigarette,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"hrN" = (
@@ -17361,15 +17386,14 @@
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
"hrS" = (
-/obj/effect/turf_decal/tile/neutral,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/fore)
"hse" = (
/obj/structure/cable{
- icon_state = "1-4"
+ icon_state = "0-4"
},
-/turf/open/floor/circuit/off,
-/area/ai_monitored/turret_protected/ai)
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/fore)
"hsl" = (
/turf/open/floor/plating,
/area/maintenance/starboard)
@@ -17419,12 +17443,6 @@
},
/turf/open/floor/wood,
/area/bridge/meeting_room)
-"hsQ" = (
-/obj/effect/turf_decal/tile/neutral{
- dir = 8
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"hta" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -17471,11 +17489,14 @@
/turf/open/floor/engine/co2,
/area/engine/atmos)
"huF" = (
-/obj/machinery/mineral/stacking_unit_console{
- machinedir = 4
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/turf/closed/wall,
-/area/maintenance/disposal)
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/fore)
"huQ" = (
/obj/machinery/power/terminal{
dir = 1
@@ -17507,6 +17528,14 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"hvG" = (
+/obj/machinery/light,
+/obj/machinery/airalarm{
+ dir = 1;
+ pixel_y = -22
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"hwg" = (
/obj/machinery/computer/teleporter{
dir = 8
@@ -17567,7 +17596,7 @@
},
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"hxP" = (
/obj/machinery/door/airlock/medical/glass{
id_tag = "MedbayFoyer";
@@ -17589,6 +17618,18 @@
/obj/structure/closet/secure_closet/personal/cabinet,
/turf/open/floor/carpet,
/area/quartermaster/miningoffice)
+"hyx" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/obj/machinery/airalarm{
+ pixel_y = 28
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/miningdock)
"hyz" = (
/obj/machinery/vending/autodrobe,
/turf/open/floor/plasteel,
@@ -17680,7 +17721,7 @@
dir = 1;
name = "north facing firelock"
},
-/turf/open/floor/carpet,
+/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"hBb" = (
/obj/machinery/camera{
@@ -17710,6 +17751,10 @@
/obj/machinery/vending/medical,
/turf/open/floor/plasteel/white,
/area/medical/virology)
+"hBM" = (
+/obj/effect/turf_decal/stripes/line,
+/turf/open/floor/plasteel/white,
+/area/science/lab)
"hBQ" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -17720,6 +17765,16 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"hCx" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Dormitory"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 8;
+ name = "west facing firelock"
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"hCD" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -17829,7 +17884,7 @@
dir = 4
},
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"hFG" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -17855,7 +17910,7 @@
icon_state = "0-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"hGU" = (
/obj/structure/closet/secure_closet/personal/cabinet{
pixel_x = -8
@@ -17896,6 +17951,12 @@
},
/turf/open/floor/plasteel,
/area/engine/atmospherics_engine)
+"hHV" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/dorms)
"hHW" = (
/obj/effect/turf_decal/tile/yellow{
dir = 1
@@ -18001,7 +18062,7 @@
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"hKt" = (
/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
@@ -18127,7 +18188,7 @@
/area/engine/secure_construction)
"hNT" = (
/obj/effect/landmark/event_spawn,
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"hNZ" = (
/obj/effect/turf_decal/tile/yellow{
@@ -18154,7 +18215,7 @@
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"hOw" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/effect/turf_decal/tile/neutral{
@@ -18403,6 +18464,10 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
+"hUg" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"hUo" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -18554,6 +18619,10 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
+"hWp" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"hWW" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
@@ -18866,28 +18935,6 @@
/obj/machinery/space_heater,
/turf/open/floor/plasteel,
/area/engine/atmos)
-"igK" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/obj/machinery/door/window/eastleft{
- name = "Blue Corner"
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"igO" = (
/obj/machinery/vending/boozeomat,
/turf/open/floor/wood{
@@ -18916,17 +18963,6 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/flasher{
- id = "AI";
- pixel_x = -26;
- pixel_y = 3
- },
-/obj/machinery/turretid{
- icon_state = "control_stun";
- name = "AI Chamber turret control";
- pixel_x = -25;
- pixel_y = -3
- },
/turf/open/floor/circuit/off,
/area/ai_monitored/turret_protected/ai)
"ihE" = (
@@ -18937,6 +18973,7 @@
dir = 10
},
/obj/machinery/atmospherics/components/unary/portables_connector/visible,
+/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plasteel,
/area/science/mixing)
"ihJ" = (
@@ -18970,6 +19007,9 @@
/obj/machinery/power/smes,
/turf/open/floor/plating,
/area/maintenance/department/electrical)
+"ihY" = (
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"iiM" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
@@ -19305,6 +19345,12 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
+"iru" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/turf/open/floor/circuit/off,
+/area/ai_monitored/turret_protected/ai)
"irN" = (
/obj/machinery/requests_console{
department = "AI";
@@ -19363,7 +19409,7 @@
},
/obj/machinery/light,
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"itw" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -19437,7 +19483,7 @@
dir = 1;
name = "north facing firelock"
},
-/turf/open/floor/carpet,
+/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"iuP" = (
/obj/machinery/door/airlock/external{
@@ -19446,15 +19492,6 @@
},
/turf/open/floor/engine,
/area/engine/atmospherics_engine)
-"ivM" = (
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/obj/machinery/door/airlock/external{
- name = "Escape Airlock"
- },
-/turf/open/floor/plating,
-/area/hallway/secondary/exit/departure_lounge)
"ivQ" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -19488,6 +19525,13 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/storage)
+"iwH" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = 27
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"ixf" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -19501,6 +19545,12 @@
/obj/item/hand_tele,
/turf/open/floor/plasteel/dark,
/area/teleporter)
+"ixO" = (
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/aft)
"ixZ" = (
/obj/structure/chair/office/dark,
/mob/living/simple_animal/pet/cat/Runtime{
@@ -19791,6 +19841,13 @@
/obj/effect/turf_decal/tile/blue{
dir = 8
},
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = -28
+ },
+/obj/machinery/light{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"iFl" = (
@@ -19976,7 +20033,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"iJK" = (
/obj/structure/table/reinforced,
@@ -20018,6 +20075,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"iMk" = (
+/obj/effect/spawner/structure/window/reinforced,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating,
+/area/ai_monitored/turret_protected/aisat/service)
"iML" = (
/obj/machinery/light,
/obj/machinery/requests_console{
@@ -20030,14 +20094,15 @@
/turf/open/floor/carpet,
/area/crew_quarters/heads/hop)
"iMX" = (
-/obj/structure/cable,
-/obj/machinery/power/terminal,
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/machinery/porta_turret/ai{
+ dir = 4
+ },
/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai_upload)
"iNi" = (
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
/obj/machinery/computer/rdconsole/production{
dir = 4
},
@@ -20047,6 +20112,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"iNE" = (
@@ -20062,22 +20130,6 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
-"iNK" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"iNV" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -20102,12 +20154,6 @@
/obj/structure/extinguisher_cabinet{
pixel_x = -27
},
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
-/obj/structure/window/plasma/reinforced{
- dir = 1
- },
/obj/machinery/rnd/production/protolathe/department/engineering,
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -20119,6 +20165,12 @@
c_tag = "Engineering Storage";
dir = 4
},
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"iOG" = (
@@ -20163,6 +20215,13 @@
/obj/machinery/light,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"iQu" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"iQv" = (
/obj/machinery/door/airlock/public/glass{
name = "Courtroom";
@@ -20204,12 +20263,12 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"iRF" = (
-/obj/machinery/door/airlock/external,
/obj/machinery/door/firedoor/border_only{
dir = 1;
name = "north facing firelock"
},
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plating,
/area/hallway/primary/aft)
"iRO" = (
@@ -20246,9 +20305,13 @@
/turf/open/floor/plasteel/cult,
/area/lawoffice)
"iSB" = (
-/obj/machinery/light/floor,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
+/obj/structure/cable,
+/obj/machinery/power/solar{
+ id = "auxsolareast";
+ name = "Port Auxiliary Solar Array"
+ },
+/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
+/area/solar/port/fore)
"iTP" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/carpet,
@@ -20404,7 +20467,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"iZu" = (
/obj/machinery/firealarm{
@@ -20709,7 +20772,7 @@
/area/quartermaster/storage)
"jjB" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"jjC" = (
/obj/structure/closet/crate,
@@ -20776,7 +20839,7 @@
},
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"jmU" = (
/obj/effect/turf_decal/tile/brown{
dir = 1
@@ -20898,10 +20961,11 @@
/turf/open/floor/plasteel/dark,
/area/hallway/primary/fore)
"jso" = (
-/obj/machinery/light/small{
- dir = 8
+/obj/machinery/power/smes{
+ charge = 5e+006
},
-/turf/open/floor/circuit/off,
+/obj/structure/cable,
+/turf/open/floor/circuit,
/area/ai_monitored/turret_protected/ai)
"jsu" = (
/obj/structure/cable{
@@ -20952,11 +21016,11 @@
/turf/open/floor/plasteel/dark,
/area/hallway/primary/fore)
"jvV" = (
-/obj/machinery/mineral/stacking_unit_console{
- machinedir = 8
+/obj/structure/cable{
+ icon_state = "0-2"
},
-/turf/closed/wall,
-/area/maintenance/disposal)
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/fore)
"jwc" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -21027,7 +21091,7 @@
name = "Starboard Solar Array"
},
/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/aft)
"jxS" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/obj/structure/cable{
@@ -21122,22 +21186,6 @@
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
-"jAT" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/landmark/start/assistant,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"jBk" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -21256,6 +21304,12 @@
/obj/effect/landmark/start/paramedic,
/turf/open/floor/plasteel/white,
/area/medical/paramedic)
+"jEm" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
"jER" = (
/obj/machinery/vending/kink,
/turf/open/floor/plating,
@@ -21569,7 +21623,7 @@
},
/obj/effect/turf_decal/stripes/corner,
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"jOB" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -21604,6 +21658,12 @@
},
/turf/open/floor/plating,
/area/engine/atmospherics_engine)
+"jPf" = (
+/obj/machinery/computer/rdconsole/core{
+ dir = 8
+ },
+/turf/open/floor/circuit,
+/area/science/lab)
"jPh" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -21824,6 +21884,9 @@
"jWr" = (
/turf/closed/wall/r_wall,
/area/storage/tech)
+"jWw" = (
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
"jWx" = (
/obj/structure/table/glass,
/obj/item/stack/sheet/mineral/plasma,
@@ -21882,7 +21945,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"jYS" = (
/obj/structure/chair{
@@ -21941,6 +22004,13 @@
/obj/machinery/smartfridge,
/turf/open/floor/plasteel,
/area/hydroponics)
+"kbE" = (
+/obj/structure/chair/comfy/brown{
+ color = "#596479";
+ dir = 8
+ },
+/turf/open/transparent/glass/reinforced,
+/area/crew_quarters/fitness)
"kbR" = (
/obj/structure/table,
/obj/item/storage/firstaid/regular{
@@ -22027,15 +22097,18 @@
},
/turf/open/floor/plasteel,
/area/storage/auxiliary)
+"kdy" = (
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/dorms)
"kdA" = (
/obj/structure/table/glass,
/obj/machinery/firealarm{
dir = 4;
pixel_x = -24
},
-/obj/effect/turf_decal/stripes/line{
- dir = 6
- },
/turf/open/floor/plasteel/white,
/area/science/lab)
"kdM" = (
@@ -22124,24 +22197,11 @@
/turf/open/floor/carpet,
/area/chapel/office)
"kge" = (
-/obj/structure/window{
- dir = 8
- },
-/obj/structure/window{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
+/obj/structure/chair/comfy/brown{
+ color = "#596479";
dir = 4
},
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/landmark/start/assistant,
-/turf/open/floor/plasteel,
+/turf/open/transparent/glass/reinforced,
/area/crew_quarters/fitness)
"kgx" = (
/obj/structure/table,
@@ -22245,6 +22305,14 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
+"kjx" = (
+/obj/machinery/door/window/eastright{
+ dir = 8;
+ name = "Robotics Surgery";
+ req_access_txt = "29"
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"kkn" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -22412,7 +22480,7 @@
icon_state = "2-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"kol" = (
/obj/machinery/light{
dir = 1
@@ -22934,6 +23002,13 @@
},
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"kHJ" = (
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plating/asteroid/snow/icemoon,
+/area/icemoon/surface/outdoors)
"kHP" = (
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
dir = 4
@@ -22963,6 +23038,12 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
+"kIV" = (
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"kJk" = (
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 9
@@ -23063,7 +23144,6 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
@@ -23071,6 +23151,7 @@
dir = 4
},
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"kMy" = (
@@ -23153,9 +23234,6 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"kPu" = (
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
/obj/structure/table,
/obj/item/stack/sheet/metal/fifty,
/obj/item/stack/sheet/metal/fifty,
@@ -23166,6 +23244,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"kPA" = (
@@ -23227,9 +23308,6 @@
},
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/maintenance/aft/secondary)
-"kRk" = (
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/dorms)
"kRz" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -23363,6 +23441,13 @@
"kVO" = (
/turf/closed/wall,
/area/hallway/primary/aft)
+"kWz" = (
+/obj/machinery/door/airlock{
+ id_tag = "Dorm6";
+ name = "Room Five"
+ },
+/turf/open/floor/carpet/purple,
+/area/crew_quarters/dorms)
"kWC" = (
/obj/structure/disposalpipe/segment{
dir = 4
@@ -23373,6 +23458,17 @@
/obj/machinery/door/airlock/maintenance,
/turf/open/floor/plating,
/area/maintenance/aft/secondary)
+"kXL" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Snow Airlock"
+ },
+/obj/effect/mapping_helpers/airlock/cyclelink_helper,
+/obj/machinery/door/firedoor/border_only{
+ dir = 1;
+ name = "north facing firelock"
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"kXY" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -23486,7 +23582,7 @@
name = "Port Auxiliary Solar Array"
},
/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"lbv" = (
/obj/machinery/atmospherics/components/binary/pump,
/obj/machinery/door/firedoor/border_only{
@@ -23495,6 +23591,19 @@
},
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
+"lcv" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/floor,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"ldt" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -23593,15 +23702,15 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/airlock/public/glass{
- name = "Hydroponics";
- req_access_txt = "35"
- },
/obj/machinery/door/firedoor/border_only{
dir = 1;
name = "north facing firelock"
},
/obj/structure/disposalpipe/segment,
+/obj/machinery/door/airlock{
+ name = "Hydroponics";
+ req_access_txt = "35"
+ },
/turf/open/floor/plasteel,
/area/hydroponics)
"lfD" = (
@@ -23621,6 +23730,12 @@
/obj/structure/closet/cardboard,
/turf/open/floor/plating,
/area/maintenance/starboard)
+"lgg" = (
+/obj/structure/fluff/railing{
+ dir = 5
+ },
+/turf/open/transparent/openspace/icemoon,
+/area/engine/atmospherics_engine)
"lgn" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -23673,14 +23788,12 @@
/turf/open/floor/plasteel,
/area/maintenance/aft)
"lhr" = (
-/obj/structure/cable{
- icon_state = "0-8"
+/obj/machinery/mineral/stacking_unit_console{
+ machinedir = 1;
+ pixel_x = -30
},
-/obj/machinery/power/smes{
- charge = 5e+006
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai_upload)
+/turf/open/floor/plasteel,
+/area/maintenance/disposal)
"lhB" = (
/obj/machinery/camera{
c_tag = "Northwestern Hall 7";
@@ -23710,29 +23823,27 @@
/obj/structure/cable{
icon_state = "2-8"
},
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
-/obj/effect/landmark/start/assistant,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 10
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"liL" = (
-/obj/structure/cable{
- icon_state = "0-2"
- },
/obj/machinery/ai_slipper{
uses = 10
},
-/obj/machinery/power/apc/highcap/five_k{
- areastring = "/area/ai_monitored/turret_protected/ai";
+/obj/machinery/door/window{
+ base_state = "rightsecure";
dir = 4;
- name = "AI Chamber APC";
- pixel_x = 24
+ icon_state = "rightsecure";
+ layer = 4.1;
+ name = "Secondary AI Core Access";
+ obj_integrity = 300;
+ pixel_x = 4;
+ req_access_txt = "16"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
},
/turf/open/floor/circuit/off,
/area/ai_monitored/turret_protected/ai)
@@ -23757,11 +23868,11 @@
/turf/open/floor/pod/dark,
/area/medical/paramedic)
"lki" = (
-/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"lkP" = (
@@ -23992,7 +24103,7 @@
dir = 4
},
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"lqW" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -24544,7 +24655,12 @@
dir = 4
},
/obj/effect/turf_decal/tile/neutral,
-/obj/structure/weightmachine/stacklifter,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 9
+ },
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"lJi" = (
@@ -24571,12 +24687,6 @@
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/icemoon/surface/outdoors)
-"lJN" = (
-/obj/machinery/light{
- dir = 1
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/dorms)
"lKT" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -24591,12 +24701,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/wood,
/area/crew_quarters/theatre)
-"lLv" = (
-/obj/structure/chair/comfy/beige{
- dir = 8
- },
-/turf/open/floor/carpet,
-/area/crew_quarters/dorms)
"lLD" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -24672,6 +24776,19 @@
},
/turf/open/floor/carpet/orange,
/area/engine/secure_construction)
+"lOa" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Dormitory"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 8;
+ name = "west facing firelock"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"lOs" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
@@ -24716,27 +24833,35 @@
/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plasteel,
/area/engine/atmospherics_engine)
-"lQp" = (
+"lQd" = (
/obj/structure/cable{
- icon_state = "1-2"
+ icon_state = "4-8"
},
-/obj/machinery/porta_turret/ai{
- dir = 4
+/obj/structure/cable{
+ icon_state = "1-8"
},
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
+"lQp" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 1;
+ name = "waste relief valve"
+ },
+/turf/open/floor/plasteel,
+/area/engine/atmos)
"lQs" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/wood,
/area/hallway/secondary/exit/departure_lounge)
"lQJ" = (
-/obj/machinery/atmospherics/components/unary/vent_pump/on,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
+/obj/structure/fluff/railing{
+ dir = 9
},
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
+/turf/open/transparent/openspace/icemoon,
+/area/icemoon/surface/outdoors)
"lRx" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -25107,7 +25232,9 @@
dir = 4
},
/obj/effect/turf_decal/tile/green,
-/turf/open/floor/plasteel,
+/turf/open/floor/plasteel/dark/side{
+ dir = 5
+ },
/area/hydroponics)
"mbM" = (
/obj/effect/turf_decal/tile/blue{
@@ -25216,6 +25343,13 @@
},
/turf/open/floor/plasteel/white,
/area/crew_quarters/heads/cmo)
+"mfU" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Holodeck Door"
+ },
+/obj/machinery/door/firedoor,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"mgo" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/machinery/door/firedoor/border_only{
@@ -25391,7 +25525,7 @@
icon_state = "4-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/port/fore)
"mmO" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -25475,11 +25609,11 @@
/turf/open/floor/plating,
/area/medical/virology)
"mps" = (
-/obj/machinery/atmospherics/components/binary/valve{
- dir = 4
+/obj/structure/chair/comfy/beige{
+ dir = 8
},
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"mqb" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 8
@@ -25499,6 +25633,15 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/aft)
+"mqd" = (
+/obj/item/paper/fluff{
+ info = "Crystal has been moved to a lockbox in secure storage until further notice.";
+ name = "Note from an engineer";
+ pixel_x = -5;
+ pixel_y = 3
+ },
+/turf/open/floor/engine,
+/area/engine/supermatter)
"mqm" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -25591,7 +25734,7 @@
/turf/open/floor/plating,
/area/maintenance/aft/secondary)
"mtP" = (
-/turf/open/floor/carpet,
+/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"mtY" = (
/obj/structure/cable{
@@ -25846,17 +25989,28 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
+"mEH" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"mEI" = (
/obj/structure/table/reinforced,
/obj/machinery/door/window/eastright{
base_state = "left";
- dir = 2;
+ dir = 1;
icon_state = "left";
name = "Chemistry Desk";
req_access_txt = "33"
},
/obj/machinery/door/firedoor/border_only,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/machinery/door/window/eastright{
+ dir = 2;
+ name = "Chemistry Desk"
+ },
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"mFg" = (
@@ -25917,6 +26071,16 @@
/obj/machinery/space_heater,
/turf/open/floor/plating,
/area/icemoon/surface/outdoors)
+"mHm" = (
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"mHT" = (
/obj/structure/closet/l3closet/scientist,
/obj/item/extinguisher,
@@ -26527,7 +26691,7 @@
},
/obj/structure/bed,
/obj/effect/spawner/lootdrop/bedsheet,
-/turf/open/floor/carpet,
+/turf/open/floor/carpet/blue,
/area/crew_quarters/dorms)
"mWD" = (
/obj/structure/cable{
@@ -26618,6 +26782,10 @@
/obj/machinery/door/firedoor/border_only{
dir = 1
},
+/obj/machinery/door/window/eastright{
+ dir = 1;
+ name = "Chemistry Desk"
+ },
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"mZk" = (
@@ -26635,7 +26803,11 @@
name = "Station Intercom (General)";
pixel_x = 30
},
-/turf/open/floor/carpet,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"nbr" = (
/obj/structure/cable{
@@ -26975,13 +27147,13 @@
/turf/open/floor/plating,
/area/security/checkpoint/medical)
"nlF" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Holodeck Door"
- },
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/plasteel/white,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"nlM" = (
/obj/machinery/light{
@@ -26994,19 +27166,6 @@
/obj/machinery/rnd/production/techfab/department/cargo,
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
-"nmL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
-/obj/effect/landmark/start/assistant,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/crew_quarters/fitness)
"nmM" = (
/obj/effect/turf_decal/tile/yellow{
dir = 1
@@ -27147,7 +27306,6 @@
/area/storage/auxiliary)
"nrY" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
@@ -27155,7 +27313,8 @@
name = "south facing firelock"
},
/obj/structure/fans/tiny,
-/turf/open/floor/carpet,
+/obj/machinery/door/airlock/external/glass,
+/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"nsf" = (
/obj/machinery/door/firedoor,
@@ -27244,6 +27403,12 @@
dir = 4;
network = list("aicore")
},
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/circuit/off,
/area/ai_monitored/turret_protected/ai)
"ntX" = (
@@ -27258,7 +27423,7 @@
},
/obj/machinery/power/tracker,
/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"nuJ" = (
/obj/structure/cable{
icon_state = "1-8"
@@ -27362,7 +27527,7 @@
icon_state = "0-2"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"nyT" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/closed/wall/r_wall,
@@ -27450,7 +27615,7 @@
pixel_x = -24;
specialfunctions = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/carpet/blue,
/area/crew_quarters/dorms)
"nBk" = (
/obj/structure/cable{
@@ -27572,16 +27737,26 @@
/turf/open/floor/plasteel,
/area/engine/engineering)
"nDd" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/structure/closet/crate/engineering{
+ name = "Antimatter Engine Crate"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/atmospherics/pipe/simple/supply/visible,
-/obj/machinery/light/floor,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/obj/machinery/power/am_control_unit,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_shielding_container,
+/obj/item/am_containment,
+/obj/item/am_containment,
+/turf/open/floor/carpet/orange,
+/area/engine/secure_construction)
"nDl" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -27597,8 +27772,21 @@
icon_state = "0-8"
},
/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
+"nDN" = (
+/obj/machinery/atmospherics/pipe/simple/supply/visible{
+ dir = 4
+ },
+/obj/structure/disposalpipe/segment{
+ dir = 4
+ },
+/obj/machinery/light/floor,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"nEa" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -27640,6 +27828,16 @@
},
/turf/open/floor/carpet,
/area/hallway/primary/port)
+"nEH" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"nEI" = (
/obj/structure/dresser,
/obj/machinery/camera{
@@ -27792,6 +27990,13 @@
/obj/machinery/atmospherics/pipe/simple/orange/visible,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
+"nJB" = (
+/obj/machinery/light,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"nJI" = (
/obj/structure/table/reinforced,
/obj/machinery/door/window/southleft{
@@ -27921,10 +28126,15 @@
/area/hallway/primary/port)
"nOY" = (
/obj/machinery/camera{
- c_tag = "Dorms West";
+ c_tag = "Dorms Northeast";
dir = 8
},
-/turf/open/floor/carpet,
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"nPd" = (
/obj/structure/cable{
@@ -28021,6 +28231,13 @@
/obj/machinery/atmospherics/pipe/simple/general/visible,
/turf/closed/wall/r_wall,
/area/science/mixing)
+"nRA" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/structure/chair/comfy/beige,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"nRS" = (
/obj/structure/disposalpipe/segment{
dir = 10
@@ -28184,6 +28401,12 @@
},
/turf/open/floor/plasteel/dark,
/area/security/main)
+"nYd" = (
+/obj/machinery/atmospherics/components/binary/valve{
+ dir = 4
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"nYv" = (
/obj/structure/chair{
dir = 8
@@ -28639,7 +28862,7 @@
dir = 4;
name = "east facing firelock"
},
-/turf/open/floor/plasteel,
+/turf/open/floor/wood,
/area/crew_quarters/fitness)
"ojs" = (
/obj/structure/cable{
@@ -28824,6 +29047,18 @@
},
/turf/open/floor/engine/n2,
/area/engine/atmos)
+"onO" = (
+/obj/machinery/power/apc/highcap/five_k{
+ areastring = "/area/ai_monitored/turret_protected/ai";
+ dir = 4;
+ name = "AI Chamber APC";
+ pixel_x = 24
+ },
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/circuit/off,
+/area/ai_monitored/turret_protected/ai)
"onY" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/green/visible{
@@ -28860,45 +29095,8 @@
/turf/open/floor/plasteel,
/area/engine/break_room)
"ooR" = (
-/obj/structure/cable{
- icon_state = "0-4"
- },
-/obj/effect/landmark/start/ai,
-/obj/item/radio/intercom{
- freerange = 1;
- frequency = 1447;
- name = "Private Channel";
- pixel_x = -25;
- pixel_y = -10
- },
-/obj/item/radio/intercom{
- freerange = 1;
- listening = 0;
- name = "Custom Channel";
- pixel_y = 27
- },
-/obj/item/radio/intercom{
- freerange = 1;
- name = "Common Channel";
- pixel_x = -25
- },
-/obj/machinery/button/door{
- id = "AI Chamber entrance shutters";
- name = "AI Chamber entrance shutters control";
- pixel_x = 8;
- pixel_y = 23;
- req_access_txt = "16"
- },
-/obj/machinery/door/window{
- base_state = "rightsecure";
- dir = 4;
- icon_state = "rightsecure";
- name = "Primary AI Core Access";
- obj_integrity = 300;
- req_access_txt = "16"
- },
-/turf/open/floor/circuit,
-/area/ai_monitored/turret_protected/ai)
+/turf/open/floor/plating/asteroid/snow/icemoon,
+/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters)
"opq" = (
/obj/machinery/computer/rdservercontrol{
dir = 1
@@ -28917,11 +29115,8 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
- },
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plasteel,
/area/maintenance/aft)
"opY" = (
@@ -28995,6 +29190,10 @@
},
/turf/open/floor/plasteel,
/area/security/checkpoint/medical)
+"ord" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"orN" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -29253,10 +29452,7 @@
/area/engine/engineering)
"oBj" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
-/obj/machinery/door/airlock/external{
- name = "External Access";
- req_access_txt = "13"
- },
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plasteel,
/area/maintenance/aft)
"oBl" = (
@@ -29281,7 +29477,7 @@
c_tag = "Dorms South";
dir = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"oBF" = (
/obj/structure/cable{
@@ -29401,6 +29597,12 @@
},
/turf/open/floor/wood,
/area/hallway/primary/central)
+"oGZ" = (
+/obj/structure/fluff/railing{
+ dir = 6
+ },
+/turf/open/transparent/openspace/icemoon,
+/area/engine/atmospherics_engine)
"oHl" = (
/obj/structure/closet/crate/secure/engineering{
name = "TEG crate"
@@ -29601,15 +29803,13 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"oME" = (
-/obj/structure/cable{
- icon_state = "4-8"
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = -24
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
- dir = 4
- },
-/obj/machinery/light/floor,
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/obj/machinery/vending/snack/random,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"oNv" = (
/obj/structure/table/wood,
/turf/open/floor/wood,
@@ -29679,17 +29879,27 @@
/obj/effect/landmark/start/head_of_personnel,
/turf/open/floor/carpet,
/area/crew_quarters/heads/hop)
+"oPk" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
"oPP" = (
/obj/structure/table/reinforced,
/obj/machinery/door/window/eastright{
base_state = "left";
- dir = 2;
+ dir = 1;
icon_state = "left";
name = "Chemistry Desk";
req_access_txt = "33"
},
/obj/machinery/door/firedoor/border_only,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/machinery/door/window/eastright{
+ dir = 2;
+ name = "Chemistry Desk"
+ },
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"oPS" = (
@@ -29798,6 +30008,12 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/engine/storage)
+"oUT" = (
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"oUV" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -29994,17 +30210,7 @@
/turf/open/floor/plasteel,
/area/storage/primary)
"pbf" = (
-/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
dir = 1
},
/turf/open/floor/plasteel,
@@ -30085,13 +30291,11 @@
/turf/open/floor/carpet,
/area/hallway/secondary/exit/departure_lounge)
"pce" = (
-/obj/machinery/door/airlock/external{
- name = "Auxiliary Airlock"
- },
/obj/machinery/door/firedoor/border_only{
name = "south facing firelock"
},
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plating,
/area/hallway/secondary/exit/departure_lounge)
"pcl" = (
@@ -30233,23 +30437,11 @@
dir = 4
},
/obj/machinery/disposal/bin,
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"pgk" = (
-/obj/structure/window{
- dir = 1
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/turf/open/floor/plasteel,
+/obj/structure/table,
+/turf/open/transparent/glass/reinforced,
/area/crew_quarters/fitness)
"pgp" = (
/turf/closed/wall,
@@ -30419,7 +30611,7 @@
icon_state = "2-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/port/aft)
"pkJ" = (
/turf/open/floor/wood{
icon_state = "wood-broken6"
@@ -30553,6 +30745,13 @@
"pqj" = (
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
+"pqm" = (
+/obj/machinery/camera{
+ c_tag = "Dorms Northwest";
+ dir = 4
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"pqs" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{
dir = 4
@@ -30692,7 +30891,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"ptv" = (
/obj/machinery/atmospherics/components/unary/outlet_injector/on/layer1,
@@ -30705,6 +30904,16 @@
},
/turf/open/floor/engine,
/area/engine/atmospherics_engine)
+"ptH" = (
+/obj/machinery/computer/holodeck{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"ptU" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -30718,7 +30927,7 @@
dir = 4
},
/obj/machinery/door/poddoor/preopen{
- id = "xenobio2";
+ id = "xenobiospec";
name = "containment blast door"
},
/turf/open/floor/engine,
@@ -30887,6 +31096,15 @@
},
/turf/open/floor/circuit/telecomms/mainframe,
/area/tcommsat/server)
+"pvP" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
"pvV" = (
/obj/machinery/airalarm{
pixel_y = 26
@@ -30923,6 +31141,9 @@
/area/engine/storage)
"pwE" = (
/obj/effect/landmark/start/cyborg,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/service)
"pwL" = (
@@ -31078,14 +31299,12 @@
/turf/open/floor/plasteel/freezer,
/area/security/prison)
"pze" = (
-/obj/machinery/door/airlock/external{
- name = "Auxiliary Airlock"
- },
/obj/machinery/door/firedoor/border_only{
dir = 1;
name = "north facing firelock"
},
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plating,
/area/quartermaster/miningdock)
"pzk" = (
@@ -31176,6 +31395,11 @@
},
/turf/open/floor/wood,
/area/crew_quarters/heads/captain)
+"pDg" = (
+/obj/structure/table,
+/obj/item/paicard,
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"pDh" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 4
@@ -31346,8 +31570,12 @@
/turf/open/floor/plasteel,
/area/storage/primary)
"pIf" = (
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
+/obj/machinery/vending/cigarette,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
+"pIs" = (
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/aft)
"pIz" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
@@ -31376,6 +31604,18 @@
},
/turf/open/floor/plasteel/dark,
/area/maintenance/department/bridge)
+"pJm" = (
+/obj/structure/table/optable{
+ name = "Robotics Operating Table"
+ },
+/obj/item/tank/internals/anesthetic,
+/obj/item/clothing/mask/breath,
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_y = 29
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"pJS" = (
/turf/closed/wall,
/area/quartermaster/storage)
@@ -31651,6 +31891,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 10
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"pQg" = (
@@ -31806,7 +32047,6 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 1
},
@@ -31814,7 +32054,8 @@
name = "south facing firelock"
},
/obj/structure/fans/tiny,
-/turf/open/floor/carpet,
+/obj/machinery/door/airlock/external/glass,
+/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"pXl" = (
/obj/machinery/computer/cloning{
@@ -32022,7 +32263,7 @@
icon_state = "4-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/port/fore)
"qfT" = (
/obj/machinery/holopad,
/turf/open/floor/carpet,
@@ -32103,6 +32344,10 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"qim" = (
+/obj/machinery/light,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"qip" = (
/obj/structure/disposalpipe/trunk{
dir = 8
@@ -32147,6 +32392,18 @@
},
/turf/open/floor/plasteel,
/area/storage/primary)
+"qjF" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
"qkg" = (
/obj/effect/turf_decal/tile/green{
dir = 4
@@ -32238,23 +32495,7 @@
/turf/closed/wall,
/area/quartermaster/miningdock)
"qnx" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/turf/open/floor/plasteel,
+/turf/open/transparent/glass/reinforced,
/area/crew_quarters/fitness)
"qnC" = (
/obj/structure/cable,
@@ -32338,7 +32579,7 @@
},
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/plasma,
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"qqo" = (
/obj/machinery/light{
dir = 4
@@ -32704,7 +32945,7 @@
},
/obj/effect/turf_decal/bot,
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"qAI" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -32731,6 +32972,13 @@
},
/turf/open/floor/carpet,
/area/hallway/primary/central)
+"qBl" = (
+/obj/machinery/mineral/ore_redemption{
+ input_dir = 4;
+ output_dir = 8
+ },
+/turf/open/floor/plating,
+/area/quartermaster/miningdock)
"qBu" = (
/obj/machinery/atmospherics/components/binary/pump,
/turf/open/floor/plasteel,
@@ -32867,7 +33115,7 @@
name = "Station Intercom (General)";
pixel_y = 29
},
-/turf/open/floor/carpet,
+/turf/open/floor/carpet/blue,
/area/crew_quarters/dorms)
"qFZ" = (
/obj/structure/closet/emcloset,
@@ -32948,12 +33196,19 @@
/area/hallway/primary/fore)
"qHC" = (
/obj/effect/spawner/structure/window/reinforced,
-/obj/machinery/atmospherics/pipe/simple/yellow/visible,
+/obj/machinery/atmospherics/pipe/layer_manifold,
/turf/open/floor/plating,
/area/engine/atmos)
"qHL" = (
-/obj/structure/chair/comfy/beige{
- dir = 1
+/obj/machinery/door/airlock/public/glass{
+ name = "Dormitory"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4;
+ name = "east facing firelock"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
},
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
@@ -32988,13 +33243,10 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/structure/chair/stool{
- pixel_y = 8
- },
/obj/machinery/camera{
- c_tag = "Dorms Central"
+ c_tag = "Dorms East"
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"qIR" = (
/obj/machinery/button/massdriver{
@@ -33023,6 +33275,18 @@
/obj/effect/turf_decal/tile/green,
/turf/open/floor/plasteel/white,
/area/medical/virology)
+"qIW" = (
+/obj/structure/cable{
+ icon_state = "1-8"
+ },
+/obj/structure/cable{
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
"qJs" = (
/obj/structure/chair,
/obj/effect/turf_decal/stripes/line{
@@ -33076,9 +33340,6 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"qKA" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -33086,6 +33347,9 @@
dir = 8
},
/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 10
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"qKP" = (
@@ -33184,6 +33448,14 @@
},
/turf/open/floor/plasteel/freezer,
/area/medical/surgery)
+"qOJ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/visible,
+/obj/machinery/light/floor,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"qOL" = (
/obj/effect/landmark/event_spawn,
/turf/open/floor/carpet,
@@ -33337,6 +33609,12 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"qSF" = (
+/obj/structure/chair/comfy/beige{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"qSJ" = (
/obj/machinery/airalarm{
pixel_y = 28
@@ -33527,6 +33805,12 @@
},
/turf/open/floor/engine,
/area/engine/engineering)
+"qZb" = (
+/obj/structure/fluff/railing{
+ dir = 10
+ },
+/turf/open/transparent/openspace/icemoon,
+/area/engine/atmospherics_engine)
"qZO" = (
/obj/machinery/atmospherics/pipe/simple/supply/visible{
dir = 4
@@ -33566,14 +33850,20 @@
/turf/closed/wall/r_wall,
/area/maintenance/starboard)
"raM" = (
-/obj/machinery/door/airlock/external,
-/obj/machinery/door/firedoor/border_only{
- dir = 8;
- name = "west facing firelock"
+/obj/effect/spawner/structure/window/reinforced,
+/obj/machinery/door/poddoor/shutters/preopen{
+ id = "holoprivacy";
+ name = "Holodeck Shutters"
},
-/obj/structure/fans/tiny,
/turf/open/floor/plating,
/area/crew_quarters/dorms)
+"rbb" = (
+/obj/machinery/space_heater,
+/obj/machinery/light{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"rbg" = (
/obj/structure/disposalpipe/sorting/mail/flip{
dir = 8;
@@ -34095,7 +34385,7 @@
name = "Starboard Solar Array"
},
/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/aft)
"roS" = (
/obj/machinery/computer/card/minor/cmo{
dir = 4
@@ -34327,9 +34617,9 @@
/turf/open/floor/engine,
/area/engine/engineering)
"ruo" = (
-/obj/machinery/atmospherics/pipe/simple/supply/visible,
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
+/obj/machinery/vending/cola/random,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"ruD" = (
/obj/machinery/airalarm{
dir = 1;
@@ -34412,7 +34702,7 @@
name = "Port Solar Array"
},
/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
+/area/solar/port/aft)
"rxJ" = (
/obj/item/stack/cable_coil/random,
/turf/open/floor/plating/asteroid/snow/icemoon,
@@ -34547,7 +34837,6 @@
/obj/effect/turf_decal/stripes/line{
dir = 1
},
-/obj/machinery/portable_atmospherics/canister,
/turf/open/floor/plasteel,
/area/science/mixing)
"rDE" = (
@@ -34570,6 +34859,18 @@
},
/turf/open/floor/plating,
/area/maintenance/department/electrical)
+"rEF" = (
+/obj/structure/bed,
+/obj/effect/spawner/lootdrop/bedsheet,
+/obj/machinery/button/door{
+ id = "Dorm6";
+ name = "Dorm Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/turf/open/floor/carpet/purple,
+/area/crew_quarters/dorms)
"rFk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel/freezer,
@@ -34705,6 +35006,12 @@
},
/turf/open/floor/circuit/off,
/area/ai_monitored/turret_protected/ai)
+"rKC" = (
+/obj/machinery/camera{
+ c_tag = "Dorms West"
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"rLb" = (
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -34804,28 +35111,16 @@
/turf/open/floor/plasteel,
/area/hallway/primary/port)
"rPU" = (
-/obj/machinery/conveyor{
- dir = 4;
- id = "robo1"
+/obj/machinery/light{
+ dir = 8
},
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/metal/fifty,
-/obj/item/stack/sheet/glass{
- amount = 20;
- pixel_x = -3;
- pixel_y = 6
- },
-/turf/open/floor/plasteel/dark,
-/area/science/robotics/lab)
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"rQs" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
/area/hallway/primary/fore)
"rQu" = (
-/obj/structure/cable{
- icon_state = "1-8"
- },
/obj/machinery/firealarm{
dir = 8;
pixel_x = 24
@@ -34865,9 +35160,27 @@
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"rRk" = (
-/obj/structure/chair/comfy/beige,
+/obj/machinery/door/airlock/public/glass{
+ name = "Dormitory"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4;
+ name = "east facing firelock"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
+"rRQ" = (
+/obj/effect/turf_decal/stripes/corner{
+ dir = 1
+ },
+/turf/open/floor/plasteel/white,
+/area/science/lab)
"rRV" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
@@ -34936,6 +35249,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 6
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"rTW" = (
@@ -35052,9 +35366,7 @@
/turf/open/floor/wood,
/area/crew_quarters/bar)
"rYc" = (
-/obj/machinery/computer/arcade/battle{
- dir = 8
- },
+/obj/machinery/vending/cigarette,
/turf/open/floor/wood,
/area/crew_quarters/bar)
"rYi" = (
@@ -35100,6 +35412,13 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"sae" = (
+/obj/machinery/firealarm{
+ dir = 8;
+ pixel_x = 24
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"sat" = (
/obj/machinery/light,
/turf/open/floor/plasteel/white,
@@ -35184,6 +35503,12 @@
/turf/open/floor/plasteel,
/area/maintenance/aft)
"scF" = (
+/obj/machinery/turretid{
+ icon_state = "control_stun";
+ name = "AI Chamber turret control";
+ pixel_x = 24;
+ pixel_y = -3
+ },
/obj/structure/cable{
icon_state = "1-2"
},
@@ -35674,6 +35999,16 @@
},
/turf/open/floor/engine/n2o,
/area/engine/atmos)
+"stP" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/structure/grille,
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating/asteroid/snow/icemoon,
+/area/icemoon/surface/outdoors)
"stW" = (
/obj/structure/table/reinforced,
/obj/machinery/door/poddoor/shutters/preopen{
@@ -35688,7 +36023,7 @@
"sub" = (
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/co2,
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"sup" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -35751,14 +36086,8 @@
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"swQ" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"sxa" = (
/obj/machinery/requests_console{
department = "Medbay";
@@ -35963,20 +36292,16 @@
/turf/closed/wall/r_wall,
/area/crew_quarters/heads/captain)
"sFw" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
- dir = 1
- },
/obj/machinery/light,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/blue{
+/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
},
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"sGC" = (
@@ -36059,7 +36384,7 @@
/turf/open/floor/engine,
/area/engine/engineering)
"sIT" = (
-/obj/structure/reagent_dispensers/fueltank,
+/obj/machinery/recharge_station,
/turf/open/floor/pod/dark,
/area/medical/paramedic)
"sJs" = (
@@ -36091,9 +36416,6 @@
/turf/open/floor/plasteel/dark,
/area/hallway/secondary/entry)
"sKN" = (
-/obj/structure/window/plasma/reinforced{
- dir = 8
- },
/obj/machinery/rnd/production/circuit_imprinter,
/obj/effect/turf_decal/tile/yellow{
dir = 4
@@ -36101,6 +36423,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/structure/window/reinforced{
+ dir = 8
+ },
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"sLg" = (
@@ -36152,6 +36477,12 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
+"sLF" = (
+/obj/structure/sign/mining{
+ pixel_x = 32
+ },
+/turf/open/floor/plasteel,
+/area/quartermaster/miningdock)
"sLN" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,
/turf/open/floor/plasteel,
@@ -36216,6 +36547,32 @@
name = "Robotics Lab APC";
pixel_x = 25
},
+/obj/structure/table,
+/obj/item/storage/toolbox/mechanical{
+ pixel_x = -2;
+ pixel_y = -1
+ },
+/obj/item/storage/toolbox/electrical{
+ pixel_x = 1;
+ pixel_y = 6
+ },
+/obj/item/clothing/head/welding{
+ pixel_x = -3;
+ pixel_y = 5
+ },
+/obj/item/clothing/head/welding{
+ pixel_x = -3;
+ pixel_y = 5
+ },
+/obj/item/clothing/glasses/welding,
+/obj/item/clothing/glasses/welding,
+/obj/item/multitool{
+ pixel_x = 3
+ },
+/obj/item/multitool{
+ pixel_x = 3
+ },
+/obj/item/storage/belt/utility,
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
"sOi" = (
@@ -36310,6 +36667,15 @@
},
/turf/open/floor/plating/asteroid/snow/icemoon,
/area/icemoon/surface/outdoors)
+"sQk" = (
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
"sRh" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -36396,8 +36762,24 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"sTq" = (
+/obj/structure/fluff/railing{
+ dir = 1
+ },
/turf/open/transparent/openspace/icemoon,
/area/engine/atmospherics_engine)
+"sTt" = (
+/obj/structure/table,
+/obj/item/paper_bin{
+ pixel_x = -6;
+ pixel_y = 4
+ },
+/obj/item/pen/fourcolor,
+/obj/item/paper_bin/bundlenatural{
+ pixel_x = 6;
+ pixel_y = 4
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"sTz" = (
/obj/effect/turf_decal/bot_white,
/obj/structure/window/reinforced{
@@ -36884,22 +37266,9 @@
/turf/open/floor/plasteel/dark,
/area/hallway/primary/fore)
"tgd" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/structure/window{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red{
- dir = 4
- },
-/obj/effect/turf_decal/tile/red{
- dir = 8
- },
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"tht" = (
@@ -37181,7 +37550,7 @@
icon_state = "1-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/port/aft)
"tod" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -37288,6 +37657,7 @@
/obj/structure/disposalpipe/segment{
dir = 6
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"tqp" = (
@@ -37357,7 +37727,7 @@
icon_state = "1-2"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"ttl" = (
/obj/structure/cable{
@@ -37555,6 +37925,18 @@
},
/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
+"tzb" = (
+/obj/machinery/light/small{
+ dir = 8
+ },
+/obj/structure/cable{
+ icon_state = "0-2"
+ },
+/obj/machinery/power/terminal{
+ dir = 1
+ },
+/turf/open/floor/circuit/off,
+/area/ai_monitored/turret_protected/ai)
"tzB" = (
/obj/machinery/atmospherics/pipe/simple{
dir = 6
@@ -37749,6 +38131,12 @@
/obj/machinery/atmospherics/components/binary/pump/on,
/turf/open/floor/plasteel,
/area/engine/atmos)
+"tEC" = (
+/obj/structure/cable{
+ icon_state = "0-8"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/aft)
"tEQ" = (
/obj/effect/spawner/structure/window/reinforced,
/turf/open/floor/plating,
@@ -37776,11 +38164,12 @@
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"tFu" = (
-/obj/structure/cable{
- icon_state = "2-4"
+/obj/item/radio/intercom{
+ name = "Station Intercom (General)";
+ pixel_x = 30
},
-/turf/open/floor/plasteel/dark,
-/area/ai_monitored/turret_protected/ai)
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"tFN" = (
/obj/machinery/atmospherics/pipe/heat_exchanging/simple{
dir = 4
@@ -37816,11 +38205,9 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/door/airlock/external{
- name = "Escape Airlock"
- },
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/carpet,
/area/hallway/primary/port)
"tHr" = (
@@ -37894,9 +38281,12 @@
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/ai_upload_foyer)
"tJi" = (
-/obj/machinery/vending/wardrobe/robo_wardrobe,
-/turf/open/floor/plasteel/white,
-/area/science/robotics/lab)
+/obj/structure/closet/secure_closet/personal/cabinet,
+/obj/machinery/light/small{
+ dir = 8
+ },
+/turf/open/floor/carpet/purple,
+/area/crew_quarters/dorms)
"tJA" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -37966,6 +38356,16 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/turf/open/floor/plasteel,
/area/quartermaster/miningoffice)
+"tLb" = (
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/visible{
+ dir = 4
+ },
+/obj/machinery/light/floor,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"tLA" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -38109,17 +38509,14 @@
/turf/open/floor/plasteel/freezer,
/area/medical/surgery)
"tOz" = (
-/obj/machinery/light{
- dir = 1
+/obj/machinery/firealarm{
+ dir = 4;
+ pixel_x = -24
},
-/obj/machinery/door/airlock/public/glass{
- name = "Holodeck Door"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 6
},
-/obj/structure/fans/tiny,
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"tOE" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
@@ -38140,10 +38537,12 @@
name = "Fitness Room APC";
pixel_y = -24
},
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/structure/cable{
+ icon_state = "1-4"
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"tPB" = (
@@ -38231,18 +38630,11 @@
/turf/open/floor/plasteel/dark,
/area/maintenance/department/bridge)
"tRC" = (
-/obj/effect/turf_decal/tile/yellow{
- dir = 8
- },
-/obj/effect/turf_decal/tile/yellow{
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/effect/turf_decal/tile/red{
- dir = 1
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/structure/window{
- dir = 8
+/obj/structure/cable{
+ icon_state = "4-8"
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
@@ -38270,11 +38662,13 @@
/turf/open/floor/plasteel/white,
/area/science/xenobiology)
"tSd" = (
-/obj/structure/cable{
- icon_state = "2-8"
+/obj/item/radio/intercom{
+ dir = 4;
+ name = "Station Intercom (General)";
+ pixel_y = 29
},
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai)
+/turf/open/floor/carpet/purple,
+/area/crew_quarters/dorms)
"tSB" = (
/obj/machinery/atmospherics/pipe/simple{
dir = 4
@@ -38350,6 +38744,12 @@
},
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
+"tUq" = (
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
+ dir = 1
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"tUF" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
@@ -38409,6 +38809,17 @@
},
/turf/open/floor/plasteel,
/area/science/robotics/mechbay)
+"tWs" = (
+/obj/machinery/door/airlock/external/glass,
+/obj/effect/mapping_helpers/airlock/cyclelink_helper{
+ dir = 1
+ },
+/obj/machinery/door/firedoor/border_only{
+ name = "south facing firelock"
+ },
+/obj/structure/fans/tiny,
+/turf/open/floor/plasteel,
+/area/crew_quarters/dorms)
"tXn" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -38431,7 +38842,7 @@
pixel_x = -24;
specialfunctions = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/carpet/blue,
/area/crew_quarters/dorms)
"tYT" = (
/obj/structure/cable{
@@ -38720,7 +39131,7 @@
/area/engine/atmos)
"ugk" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"uha" = (
/obj/structure/cable{
@@ -38803,7 +39214,7 @@
/obj/machinery/door/firedoor/border_only{
name = "south facing firelock"
},
-/turf/open/floor/carpet,
+/turf/open/floor/carpet/blue,
/area/crew_quarters/dorms)
"ukJ" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -38814,6 +39225,10 @@
},
/turf/open/floor/plasteel/freezer,
/area/crew_quarters/kitchen)
+"ule" = (
+/obj/structure/sign/departments/botany,
+/turf/closed/wall,
+/area/hydroponics)
"ulh" = (
/obj/machinery/atmospherics/components/unary/vent_pump/on{
dir = 1
@@ -38862,14 +39277,14 @@
/turf/open/floor/plating,
/area/crew_quarters/heads/hop)
"umC" = (
-/obj/structure/cable{
- icon_state = "4-8"
- },
/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral,
+/obj/structure/cable{
+ icon_state = "2-4"
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"umD" = (
@@ -38892,7 +39307,7 @@
dir = 4
},
/obj/structure/closet/wardrobe/white,
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"unA" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -39031,7 +39446,7 @@
/obj/structure/cable,
/obj/machinery/power/smes,
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"utS" = (
/obj/structure/table,
/obj/item/clothing/suit/apron/surgical,
@@ -39046,11 +39461,18 @@
},
/turf/open/floor/plasteel/freezer,
/area/medical/surgery)
+"utY" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"uup" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"uut" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 5
@@ -39105,13 +39527,9 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
- dir = 4
- },
/obj/effect/landmark/start/assistant,
-/obj/effect/turf_decal/tile/red,
-/obj/effect/turf_decal/tile/red{
- dir = 4
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 5
},
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
@@ -39194,6 +39612,12 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/starboard/aft)
+"uyV" = (
+/obj/structure/cable{
+ icon_state = "0-4"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/port/aft)
"uyW" = (
/obj/structure/cable{
icon_state = "0-4"
@@ -39384,13 +39808,13 @@
name = "Dormitory APC";
pixel_y = 24
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"uFq" = (
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 8
},
-/obj/machinery/door/airlock/external{
+/obj/machinery/door/airlock/external/glass{
name = "Arrivals Airlock"
},
/turf/open/floor/plating,
@@ -39566,12 +39990,6 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
-/obj/structure/window/plasma/reinforced{
- dir = 4
- },
-/obj/structure/window/plasma/reinforced{
- dir = 1
- },
/obj/structure/table,
/obj/item/stack/sheet/glass/fifty,
/obj/item/stack/sheet/glass/fifty,
@@ -39582,6 +40000,12 @@
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
+/obj/structure/window/reinforced{
+ dir = 1
+ },
+/obj/structure/window/reinforced{
+ dir = 4
+ },
/turf/open/floor/plasteel/dark,
/area/engine/engineering)
"uKy" = (
@@ -39769,12 +40193,14 @@
/obj/structure/cable,
/obj/machinery/power/tracker,
/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/aft)
"uRg" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
-/obj/structure/closet/bombcloset,
-/turf/open/floor/plasteel/white,
-/area/science/mixing)
+/obj/machinery/door/airlock{
+ id_tag = "Dorm7";
+ name = "Room Six"
+ },
+/turf/open/floor/carpet/purple,
+/area/crew_quarters/dorms)
"uRi" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -39843,8 +40269,14 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"uUi" = (
-/obj/machinery/computer/operating,
-/turf/open/floor/plasteel/white,
+/obj/machinery/mecha_part_fabricator,
+/obj/item/stack/sheet/glass{
+ amount = 20;
+ pixel_x = -3;
+ pixel_y = 6
+ },
+/obj/item/stack/sheet/metal/fifty,
+/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
"uUk" = (
/obj/structure/disposalpipe/segment{
@@ -39937,6 +40369,7 @@
"uWn" = (
/obj/structure/table,
/obj/item/toy/cards/deck,
+/obj/item/storage/crayons,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/fitness/recreation)
"uWo" = (
@@ -39968,6 +40401,7 @@
/obj/structure/disposalpipe/segment{
dir = 4
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"uWW" = (
@@ -40246,11 +40680,9 @@
/turf/open/floor/circuit,
/area/science/robotics/mechbay)
"vdW" = (
-/obj/structure/cable{
- icon_state = "1-4"
- },
-/turf/closed/wall/r_wall,
-/area/ai_monitored/turret_protected/ai_upload)
+/obj/structure/table/wood,
+/turf/open/floor/carpet/purple,
+/area/crew_quarters/dorms)
"vem" = (
/obj/structure/table/wood,
/obj/machinery/keycard_auth{
@@ -40268,7 +40700,7 @@
codes_txt = "patrol;next_patrol=CHW";
location = "Dorm"
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"veF" = (
/obj/structure/table/wood,
@@ -40407,7 +40839,7 @@
/obj/machinery/light{
dir = 1
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"vhf" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -40485,6 +40917,11 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
+"vko" = (
+/obj/machinery/atmospherics/pipe/simple/supply/visible,
+/obj/machinery/light/floor,
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/icemoon/surface/outdoors)
"vkw" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -40608,13 +41045,10 @@
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"vow" = (
-/obj/machinery/door/airlock/public/glass{
- name = "Holodeck Door"
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
},
-/obj/effect/mapping_helpers/airlock/cyclelink_helper{
- dir = 8
- },
-/turf/open/floor/plasteel/white,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"voD" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
@@ -40703,7 +41137,7 @@
pixel_x = -24;
specialfunctions = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/carpet/blue,
/area/crew_quarters/dorms)
"vqZ" = (
/obj/structure/window/plasma/reinforced{
@@ -40736,7 +41170,7 @@
"vrg" = (
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o,
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"vrx" = (
/turf/closed/wall/r_wall,
/area/crew_quarters/dorms)
@@ -40812,7 +41246,7 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"vuk" = (
/obj/effect/spawner/structure/window/plasma/reinforced,
@@ -41015,11 +41449,17 @@
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"vzS" = (
-/obj/machinery/atmospherics/pipe/simple/supply/visible{
- dir = 5
+/obj/structure/bed,
+/obj/effect/spawner/lootdrop/bedsheet,
+/obj/machinery/button/door{
+ id = "Dorm7";
+ name = "Dorm Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 25;
+ specialfunctions = 4
},
-/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/turf/open/floor/carpet/purple,
+/area/crew_quarters/dorms)
"vAh" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -41193,12 +41633,12 @@
icon_state = "4-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/aft)
"vDI" = (
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 6
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden{
+ dir = 1
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"vEd" = (
/obj/effect/landmark/event_spawn,
@@ -41208,7 +41648,7 @@
/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{
dir = 4
},
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"vEi" = (
/obj/structure/cable{
@@ -41295,6 +41735,7 @@
c_tag = "Northwest Paramedic Post";
network = list("ss13","medbay")
},
+/obj/item/wrench/medical,
/turf/open/floor/plasteel/white,
/area/medical/paramedic)
"vFe" = (
@@ -41306,6 +41747,18 @@
"vFM" = (
/turf/open/floor/plasteel,
/area/quartermaster/sorting)
+"vFT" = (
+/obj/structure/bed,
+/obj/effect/spawner/lootdrop/bedsheet,
+/obj/machinery/button/door{
+ id = "Dorm5";
+ name = "Dorm Bolt Control";
+ normaldoorcontrol = 1;
+ pixel_x = 25;
+ specialfunctions = 4
+ },
+/turf/open/floor/carpet/purple,
+/area/crew_quarters/dorms)
"vGi" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -41319,6 +41772,8 @@
/area/medical/virology)
"vGn" = (
/obj/machinery/light,
+/obj/vehicle/ridden/atv/snowmobile,
+/obj/item/key,
/turf/open/floor/pod/dark,
/area/medical/paramedic)
"vHU" = (
@@ -41430,17 +41885,7 @@
/obj/machinery/light{
dir = 1
},
-/obj/structure/table,
-/obj/item/paper_bin{
- pixel_x = -6;
- pixel_y = 4
- },
-/obj/item/pen/fourcolor,
-/obj/item/paper_bin/bundlenatural{
- pixel_x = 6;
- pixel_y = 4
- },
-/turf/open/floor/carpet,
+/turf/open/floor/wood,
/area/crew_quarters/dorms)
"vKO" = (
/obj/effect/spawner/structure/window/reinforced,
@@ -41457,16 +41902,15 @@
/turf/open/floor/plating,
/area/bridge)
"vKP" = (
-/obj/structure/weightmachine/stacklifter,
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
/obj/machinery/computer/security/telescreen/entertainment{
pixel_y = -32
},
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"vKT" = (
@@ -41477,7 +41921,7 @@
dir = 1
},
/turf/open/floor/plating,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"vLa" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -41601,6 +42045,10 @@
pixel_x = 3;
pixel_y = 3
},
+/obj/item/reagent_containers/glass/beaker/cryoxadone{
+ pixel_x = 5;
+ pixel_y = 9
+ },
/turf/open/floor/plasteel/white,
/area/medical/paramedic)
"vNY" = (
@@ -41669,15 +42117,15 @@
dir = 8
},
/area/chapel/main)
-"vQk" = (
-/obj/machinery/computer/holodeck{
- dir = 4
- },
-/turf/open/floor/plasteel/white,
-/area/crew_quarters/dorms)
"vQo" = (
/turf/closed/wall/r_wall,
/area/engine/supermatter)
+"vQz" = (
+/obj/structure/extinguisher_cabinet{
+ pixel_x = -27
+ },
+/turf/open/floor/wood,
+/area/crew_quarters/dorms)
"vQW" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/structure/cable{
@@ -41718,13 +42166,11 @@
/obj/structure/cable{
icon_state = "4-8"
},
-/obj/machinery/atmospherics/pipe/simple/supply/hidden{
- dir = 4
- },
/obj/structure/disposalpipe/sorting/mail/flip{
dir = 4;
sortType = 26
},
+/obj/machinery/atmospherics/pipe/manifold/supply/hidden,
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"vSg" = (
@@ -41875,6 +42321,22 @@
},
/turf/open/floor/plating,
/area/maintenance/department/electrical)
+"vVJ" = (
+/obj/machinery/door/airlock/public/glass{
+ name = "Dormitory"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 8;
+ name = "west facing firelock"
+ },
+/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+ dir = 4
+ },
+/obj/structure/cable{
+ icon_state = "4-8"
+ },
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"vVN" = (
/obj/effect/turf_decal/bot,
/obj/structure/window/reinforced{
@@ -41887,7 +42349,7 @@
/area/crew_quarters/fitness)
"vVZ" = (
/obj/structure/closet/secure_closet/personal/cabinet,
-/turf/open/floor/carpet,
+/turf/open/floor/carpet/blue,
/area/crew_quarters/dorms)
"vWg" = (
/obj/effect/turf_decal/delivery,
@@ -42232,11 +42694,11 @@
/turf/open/floor/plasteel/white,
/area/medical/medbay/central)
"weS" = (
-/obj/machinery/door/airlock/external,
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/plating,
/area/hallway/primary/aft)
"wfN" = (
@@ -42262,7 +42724,7 @@
/obj/machinery/door/firedoor/border_only{
name = "south facing firelock"
},
-/turf/open/floor/carpet,
+/turf/open/floor/carpet/blue,
/area/crew_quarters/dorms)
"wgu" = (
/obj/machinery/atmospherics/pipe/simple/supply/visible{
@@ -42281,6 +42743,20 @@
/obj/structure/chair/stool/bar,
/turf/open/floor/wood,
/area/crew_quarters/bar)
+"wgM" = (
+/obj/structure/sink{
+ dir = 8;
+ pixel_x = -12;
+ pixel_y = 2
+ },
+/obj/structure/mirror{
+ pixel_x = -28
+ },
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
+ dir = 4
+ },
+/turf/open/floor/plasteel/freezer,
+/area/crew_quarters/dorms)
"wha" = (
/obj/machinery/atmospherics/components/trinary/filter/atmos/flipped/n2o{
dir = 1
@@ -42733,7 +43209,7 @@
name = "Port Auxiliary Solar Array"
},
/turf/open/floor/plating/asteroid/snow/ice/icemoon/solarpanel,
-/area/icemoon/surface/outdoors)
+/area/solar/starboard/fore)
"wuQ" = (
/obj/structure/table,
/obj/machinery/plantgenes{
@@ -42925,7 +43401,7 @@
req_access_txt = "12;24"
},
/turf/open/floor/plasteel,
-/area/storage/atmos)
+/area/maintenance/department/electrical)
"wEm" = (
/obj/structure/barricade/wooden{
max_integrity = 10;
@@ -43174,6 +43650,12 @@
/obj/machinery/chem_master/condimaster,
/turf/open/floor/plasteel,
/area/hydroponics)
+"wMH" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/turf/open/floor/plating/snowed/smoothed/icemoon,
+/area/solar/starboard/aft)
"wMJ" = (
/obj/structure/closet/secure_closet/bar{
req_access_txt = "25"
@@ -43229,7 +43711,8 @@
icon_state = "4-8"
},
/obj/effect/landmark/event_spawn,
-/turf/open/floor/plasteel/white,
+/obj/effect/landmark/start/roboticist,
+/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
"wPT" = (
/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden,
@@ -43331,11 +43814,9 @@
/turf/open/floor/plasteel/dark,
/area/security/prison)
"wSc" = (
-/obj/machinery/door/airlock/external{
- name = "Escape Airlock"
- },
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass,
/turf/open/floor/carpet,
/area/hallway/primary/port)
"wSy" = (
@@ -43562,6 +44043,7 @@
/obj/machinery/light{
dir = 1
},
+/obj/machinery/vending/cigarette,
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"xaS" = (
@@ -43613,22 +44095,10 @@
/turf/open/floor/plasteel,
/area/hallway/primary/fore)
"xcL" = (
-/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
+/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
-/obj/structure/window{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 8
- },
-/obj/effect/turf_decal/tile/blue,
-/obj/effect/turf_decal/tile/blue{
- dir = 4
- },
-/obj/effect/turf_decal/tile/blue{
- dir = 1
- },
/turf/open/floor/plasteel,
/area/crew_quarters/fitness)
"xcY" = (
@@ -43658,6 +44128,14 @@
/obj/structure/disposalpipe/segment,
/turf/open/floor/plasteel,
/area/hallway/primary/central)
+"xdr" = (
+/obj/item/storage/backpack/duffelbag/med/surgery,
+/obj/structure/table,
+/obj/structure/extinguisher_cabinet{
+ pixel_y = 30
+ },
+/turf/open/floor/plasteel/dark,
+/area/science/robotics/lab)
"xdD" = (
/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{
dir = 4
@@ -43666,9 +44144,6 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"xeI" = (
-/obj/machinery/conveyor_switch/oneway{
- id = "robo1"
- },
/obj/structure/disposalpipe/segment{
dir = 9
},
@@ -43680,8 +44155,13 @@
/turf/open/floor/plasteel,
/area/engine/atmos)
"xfs" = (
-/obj/structure/table,
-/obj/item/paicard,
+/obj/machinery/door/airlock/public/glass{
+ name = "Dormitory"
+ },
+/obj/machinery/door/firedoor/border_only{
+ dir = 4;
+ name = "east facing firelock"
+ },
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"xfD" = (
@@ -43819,10 +44299,10 @@
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
dir = 4
},
-/obj/machinery/door/airlock/external{
- name = "Escape Airlock"
- },
/obj/structure/fans/tiny,
+/obj/machinery/door/airlock/external/glass{
+ name = "Arrivals Airlock"
+ },
/turf/open/floor/plating,
/area/hallway/secondary/exit/departure_lounge)
"xka" = (
@@ -43885,6 +44365,7 @@
/obj/machinery/light{
dir = 4
},
+/obj/machinery/vending/wardrobe/robo_wardrobe,
/turf/open/floor/plasteel/white,
/area/science/robotics/lab)
"xmr" = (
@@ -44092,7 +44573,7 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/turf/open/floor/plasteel/white,
+/turf/open/floor/plasteel/dark,
/area/science/robotics/lab)
"xtV" = (
/obj/structure/cable{
@@ -44104,6 +44585,7 @@
/obj/structure/disposalpipe/segment{
dir = 9
},
+/obj/machinery/light/floor,
/turf/open/floor/plating/snowed/smoothed/icemoon,
/area/icemoon/surface/outdoors)
"xui" = (
@@ -44242,11 +44724,8 @@
/turf/open/floor/engine/plasma,
/area/engine/atmos)
"xAv" = (
-/obj/machinery/atmospherics/pipe/simple/supply/visible{
- dir = 6
- },
-/turf/open/floor/plating/asteroid/snow/icemoon,
-/area/icemoon/surface/outdoors)
+/turf/open/floor/carpet,
+/area/crew_quarters/dorms)
"xBi" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -44857,6 +45336,7 @@
/obj/structure/disposalpipe/trunk{
dir = 4
},
+/obj/machinery/disposal/bin,
/turf/open/floor/wood,
/area/crew_quarters/bar)
"xUD" = (
@@ -44919,6 +45399,10 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/port)
+"xWI" = (
+/obj/machinery/vending/cigarette,
+/turf/open/floor/plasteel,
+/area/hallway/primary/port)
"xXS" = (
/obj/machinery/rnd/server,
/obj/machinery/atmospherics/components/unary/vent_pump/siphon/on{
@@ -45156,7 +45640,7 @@
icon_state = "2-8"
},
/turf/open/floor/plating/snowed/smoothed/icemoon,
-/area/icemoon/surface/outdoors)
+/area/solar/port/aft)
"ygB" = (
/obj/structure/cable{
icon_state = "2-8"
@@ -45218,6 +45702,9 @@
icon_state = "1-8"
},
/obj/effect/landmark/start/cyborg,
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
/turf/open/floor/plasteel/dark,
/area/ai_monitored/turret_protected/aisat/service)
"yiZ" = (
@@ -51538,17 +52025,17 @@ qrR
qrR
bTC
avT
-lbu
-aQK
-wuC
+aPE
+fne
+iSB
avT
-lbu
-aQK
-wuC
+aPE
+fne
+iSB
avT
-lbu
-aQK
-wuC
+aPE
+fne
+iSB
avT
wuf
yhx
@@ -51795,17 +52282,17 @@ qrR
qrR
bTC
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
avT
avT
@@ -51853,7 +52340,7 @@ ydp
ydp
buI
hnP
-swQ
+phs
ghq
ghq
ghq
@@ -52052,17 +52539,17 @@ qrR
qrR
bTC
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
avT
avT
@@ -52110,14 +52597,14 @@ ydp
ydp
buI
buJ
-cXI
+ghq
ghq
hfZ
shR
ntV
jso
-shR
-shR
+tzb
+iru
hfZ
ghq
ghq
@@ -52309,17 +52796,17 @@ avT
avT
avT
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
avT
yhx
@@ -52367,14 +52854,14 @@ ydp
bTC
buI
buJ
-cXI
+ghq
ghq
shR
shR
-shR
+onO
liL
scF
-hse
+lfD
shR
ghq
ghq
@@ -52566,17 +53053,17 @@ wuf
wuf
avT
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
-lbu
+aPE
qfJ
-wuC
+iSB
avT
wBg
avT
@@ -52585,12 +53072,12 @@ vrd
vrd
vrd
vrd
+nbC
+nbC
+nbC
+nbC
yhx
-yhx
-yhx
-yhx
-yhx
-yhx
+nbC
yhx
yhx
yhx
@@ -52624,12 +53111,12 @@ ydp
buI
fJZ
phs
-cXI
+ghq
ghq
shR
shR
cpe
-cpe
+cUs
cpe
xIJ
shR
@@ -52824,15 +53311,15 @@ avT
avT
avT
avT
-hGK
+guI
avT
avT
avT
-hGK
+guI
avT
avT
avT
-hGK
+guI
avT
aNg
chZ
@@ -52847,12 +53334,12 @@ avT
avT
avT
avT
+nbC
+nbC
+nbC
+nbC
yhx
-yhx
-yhx
-yhx
-yhx
-yhx
+nbC
ydp
ydp
ydp
@@ -52881,7 +53368,7 @@ ydp
buI
lGy
ghq
-cXI
+ghq
aJC
shR
qVf
@@ -53077,21 +53564,21 @@ yhx
yhx
wuf
avT
-nuu
-sXy
-sXy
-fNh
-xUL
-nyq
-sXy
-fNh
-xUL
-nyq
-sXy
-fNh
-xUL
-nyq
-sXy
+aKa
+aPC
+aPC
+cXI
+hrS
+jvV
+aPC
+cXI
+hrS
+jvV
+aPC
+cXI
+hrS
+jvV
+aPC
eWw
tnL
iaq
@@ -53138,12 +53625,12 @@ avT
buI
gJx
ghq
-cXI
+ghq
irN
irr
xIJ
cpe
-ooR
+ghq
cpe
xIJ
irr
@@ -53338,15 +53825,15 @@ avT
avT
avT
avT
-clq
+hse
avT
avT
avT
-clq
+hse
avT
avT
avT
-clq
+hse
avT
aNg
chZ
@@ -53395,9 +53882,9 @@ avT
buI
phs
ghq
-cXI
+ghq
+irr
irr
-tFu
hmC
rBA
dfy
@@ -53594,17 +54081,17 @@ fBG
wuf
avT
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
ajl
avT
@@ -53613,10 +54100,10 @@ vrd
vrd
vrd
vrd
-yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
+nbC
bBh
avT
avT
@@ -53643,7 +54130,7 @@ avT
avT
avT
avT
-bmX
+avT
avT
avT
avT
@@ -53652,8 +54139,8 @@ ayq
ghq
ghq
ghq
-tSd
-lQp
+ghq
+vmr
rQu
rKd
gHG
@@ -53851,17 +54338,17 @@ qrR
qrR
avT
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
avT
avT
@@ -53873,7 +54360,7 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
rUq
sXy
sXy
@@ -54108,17 +54595,17 @@ qrR
qrR
wuf
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
avT
avT
@@ -54130,13 +54617,13 @@ yhx
yhx
yhx
yhx
+nbC
+nbC
+nbC
+nbC
yhx
-yhx
-yhx
-yhx
-yhx
-yhx
-yhx
+nbC
+nbC
avT
avT
avT
@@ -54152,7 +54639,7 @@ ydp
avT
avT
avT
-avT
+bmX
apJ
apJ
apJ
@@ -54176,7 +54663,7 @@ cwT
aAC
mGl
grZ
-vdW
+cIh
ghq
bUB
bJf
@@ -54365,17 +54852,17 @@ qrR
qrR
wuf
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
-lbu
+aPE
mmM
-wuC
+iSB
avT
avT
avT
@@ -54393,7 +54880,7 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
@@ -54433,7 +54920,7 @@ hva
vZH
lac
iMX
-lhr
+cIh
ghq
bUB
bJf
@@ -54483,7 +54970,7 @@ wuf
avT
avT
avT
-bBh
+fUc
avT
avT
avT
@@ -54622,17 +55109,17 @@ qrR
qrR
wuf
avT
-lbu
-gTh
-wuC
+aPE
+huF
+iSB
avT
-lbu
-gTh
-wuC
+aPE
+huF
+iSB
avT
-lbu
-gTh
-wuC
+aPE
+huF
+iSB
avT
wuf
avT
@@ -54650,8 +55137,8 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
+nbC
+nbC
ydp
ydp
ydp
@@ -54740,7 +55227,7 @@ avT
avT
avT
avT
-bBh
+fUc
avT
avT
avT
@@ -54997,7 +55484,7 @@ rxI
rxI
rxI
avT
-hGK
+tEC
avT
rxI
rxI
@@ -55206,7 +55693,7 @@ nOG
vEm
fet
avT
-avT
+stP
avT
ydp
ydp
@@ -55253,9 +55740,9 @@ pjD
pjD
pjD
pjD
-fNh
-xUL
-nyq
+cih
+pIs
+ixO
fsh
fsh
fsh
@@ -55461,9 +55948,9 @@ azz
aAF
yiT
pwE
-fet
-avT
-avT
+iMk
+wMr
+bEp
bmX
avT
avT
@@ -55511,7 +55998,7 @@ dfx
dfx
dfx
avT
-clq
+uyV
avT
dfx
dfx
@@ -55720,7 +56207,7 @@ uKG
vEm
fet
avT
-avT
+kHJ
avT
avT
avT
@@ -55768,7 +56255,7 @@ avT
avT
avT
avT
-bBh
+fUc
avT
avT
avT
@@ -56025,7 +56512,7 @@ rxI
rxI
rxI
avT
-hGK
+tEC
avT
rxI
rxI
@@ -56281,9 +56768,9 @@ pjD
pjD
pjD
pjD
-fNh
-xUL
-nyq
+cih
+pIs
+ixO
fsh
fsh
fsh
@@ -56539,7 +57026,7 @@ dfx
dfx
dfx
avT
-clq
+uyV
avT
dfx
dfx
@@ -56796,7 +57283,7 @@ avT
avT
avT
avT
-bBh
+fUc
avT
avT
avT
@@ -57053,7 +57540,7 @@ rxI
rxI
rxI
avT
-hGK
+tEC
avT
rxI
rxI
@@ -57309,9 +57796,9 @@ pjD
pjD
pjD
pjD
-fNh
-xUL
-nyq
+cih
+pIs
+ixO
fsh
fsh
fsh
@@ -57567,7 +58054,7 @@ dfx
dfx
dfx
avT
-clq
+uyV
avT
dfx
dfx
@@ -57824,7 +58311,7 @@ avT
avT
avT
avT
-bBh
+fUc
avT
avT
avT
@@ -58007,7 +58494,7 @@ ydp
ydp
avT
bBh
-bmX
+avT
avT
gLH
ohf
@@ -58081,7 +58568,7 @@ avT
avT
avT
qlH
-bBh
+fUc
qlH
avT
avT
@@ -58286,8 +58773,8 @@ aFI
iek
wRz
erO
-aBK
-dFJ
+tmx
+tmx
kdA
aFI
avT
@@ -58544,8 +59031,8 @@ cwH
lam
erO
aBK
-aDf
-aEG
+aBK
+aBK
aFI
avT
avT
@@ -58800,8 +59287,8 @@ lWb
dfa
obB
aAe
-aBK
-aDf
+eXy
+aEE
aEE
bxM
avT
@@ -59057,8 +59544,8 @@ aFI
ays
mQK
auT
-aBK
-aDf
+hBM
+fol
aEI
bxM
avT
@@ -59314,7 +59801,7 @@ aFI
uJF
lam
jcS
-aBK
+hBM
aDc
aEH
bxM
@@ -59571,8 +60058,8 @@ nEi
jRU
uzT
gWn
-aBK
-aDf
+hBM
+jPf
aEK
bxM
avT
@@ -59828,7 +60315,7 @@ eGO
ayt
nuJ
aAw
-aBK
+rRQ
aEJ
aEJ
aIP
@@ -60135,11 +60622,11 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
xUL
bBh
xUL
-yhx
+nbC
yhx
yhx
yhx
@@ -60392,11 +60879,11 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
xUL
bBh
xUL
-yhx
+nbC
yhx
yhx
yhx
@@ -60648,12 +61135,12 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
+nbC
+nbC
xUL
bBh
xUL
-yhx
+nbC
yhx
yhx
yhx
@@ -60905,12 +61392,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
xUL
bBh
xUL
-yhx
+nbC
yhx
yhx
yhx
@@ -61159,15 +61646,15 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
+nbC
euS
sXy
jAq
-yhx
-yhx
+nbC
+nbC
yhx
yhx
yhx
@@ -61417,13 +61904,13 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
bBh
xUL
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -61666,21 +62153,21 @@ yhx
yhx
yhx
yhx
+nbC
+nbC
+nbC
+nbC
+nbC
+nbC
+nbC
yhx
-yhx
-yhx
-yhx
-yhx
-yhx
-yhx
-yhx
-yhx
+nbC
avT
avT
bBh
xUL
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -61920,10 +62407,10 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
+nbC
avT
xUL
xUL
@@ -61931,13 +62418,13 @@ xUL
xUL
avT
avT
-yhx
+nbC
xUL
xUL
bBh
xUL
-yhx
-yhx
+nbC
+nbC
yhx
yhx
yhx
@@ -62171,11 +62658,11 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
+nbC
+nbC
yhx
avT
avT
@@ -62193,7 +62680,7 @@ sXy
sXy
jAq
xUL
-yhx
+nbC
yhx
yhx
yhx
@@ -62409,9 +62896,9 @@ odR
dPx
sPA
sKh
+dMo
irt
-irt
-guI
+srB
avT
avT
avT
@@ -62425,10 +62912,10 @@ ydp
ydp
ydp
yhx
-yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
+nbC
avT
avT
avT
@@ -62441,16 +62928,16 @@ xUL
xUL
xUL
avT
-yhx
+nbC
xUL
xUL
xUL
xUL
xUL
avT
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
yhx
yhx
yhx
@@ -62666,7 +63153,7 @@ aLk
aNo
aOo
sKh
-irt
+dMo
srB
bzc
avT
@@ -62682,7 +63169,7 @@ ydp
ydp
ydp
yhx
-yhx
+nbC
avT
avT
avT
@@ -62696,16 +63183,16 @@ xUL
xUL
avT
avT
-yhx
-yhx
-yhx
-yhx
-yhx
-yhx
-yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
+nbC
+nbC
+nbC
+nbC
+nbC
+nbC
+nbC
yhx
yhx
yhx
@@ -62917,12 +63404,12 @@ aDb
qWM
hIH
nuS
-aPE
+qsD
wDR
fHF
-aPC
-aPE
-aPE
+aVv
+qsD
+qsD
hmM
bzc
bzc
@@ -62949,11 +63436,11 @@ xUL
xUL
xUL
avT
-yhx
-yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
+nbC
+nbC
yhx
yhx
yhx
@@ -63174,12 +63661,12 @@ bxk
bxk
hIH
iFl
-aPC
+aVv
gCC
qAF
hOc
aOp
-aPE
+qsD
hmM
bzc
bzc
@@ -63202,11 +63689,11 @@ avT
euS
jAq
xUL
-yhx
-yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
+nbC
+nbC
yhx
yhx
yhx
@@ -63431,12 +63918,12 @@ hTk
vHU
qTO
aHD
-aPC
+aVv
jOy
lqt
gPb
hFv
-aPC
+aVv
hmM
bzc
bzc
@@ -63458,8 +63945,8 @@ avT
euS
jAq
xUL
-yhx
-yhx
+nbC
+nbC
yhx
yhx
yhx
@@ -63688,7 +64175,7 @@ srU
aFO
aFY
aHD
-aPC
+aVv
hxx
vKT
faR
@@ -63714,8 +64201,8 @@ avT
euS
jAq
xUL
-yhx
-yhx
+nbC
+nbC
yhx
yhx
yhx
@@ -63945,7 +64432,7 @@ aDm
hLZ
aFY
aHD
-aPC
+aVv
cKK
sub
vrg
@@ -63970,8 +64457,8 @@ avT
euS
jAq
xUL
-yhx
-yhx
+nbC
+nbC
yhx
yhx
yhx
@@ -64152,9 +64639,9 @@ ydp
ydp
ydp
ydp
-ydp
-ydp
-avT
+bum
+bum
+bum
avT
mpj
gNb
@@ -64202,15 +64689,15 @@ aDp
eZi
aFU
aHD
-aPE
+qsD
jmf
fLW
utp
itp
-aPE
+qsD
aQV
vcG
-wgu
+lzB
avT
avT
ydp
@@ -64226,8 +64713,8 @@ avT
euS
jAq
xUL
-yhx
-yhx
+nbC
+nbC
yhx
yhx
yhx
@@ -64410,8 +64897,8 @@ ydp
ydp
ydp
ydp
-ydp
-avT
+bum
+bum
avT
mpj
eSJ
@@ -64459,12 +64946,12 @@ aDe
rJk
aFT
jOj
-aPE
-aKa
-aPE
-aPE
-aPE
-aPE
+qsD
+mSN
+qsD
+qsD
+qsD
+qsD
aQV
vcG
lzB
@@ -64483,7 +64970,7 @@ euS
jAq
xUL
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -64667,7 +65154,7 @@ ydp
ydp
ydp
ydp
-ydp
+bum
ydp
avT
mpj
@@ -64733,14 +65220,14 @@ ydp
ydp
ydp
ydp
-avT
+bmX
avT
avT
bBh
xUL
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
yhx
yhx
yhx
@@ -64982,7 +65469,7 @@ xUL
xUL
vcG
lzB
-bmX
+avT
avT
ydp
ydp
@@ -64995,8 +65482,8 @@ avT
avT
bBh
xUL
-yhx
-yhx
+nbC
+nbC
yhx
yhx
yhx
@@ -65190,7 +65677,7 @@ avT
avT
avT
xUL
-vBe
+xUL
mbm
iJl
iJl
@@ -65226,7 +65713,7 @@ xeI
rqW
rqW
aGD
-tJi
+rqW
myh
qLm
qTG
@@ -65252,7 +65739,7 @@ avT
avT
bBh
xUL
-yhx
+nbC
yhx
yhx
yhx
@@ -65479,9 +65966,9 @@ rQJ
fwn
awb
rqW
-ayC
-rPU
-fne
+rqW
+rqW
+rqW
rqW
rqW
fOA
@@ -65509,7 +65996,7 @@ avT
avT
bBh
xUL
-yhx
+nbC
yhx
yhx
yhx
@@ -65701,7 +66188,7 @@ ydp
ydp
avT
avT
-bmX
+avT
avT
xUL
ace
@@ -65735,12 +66222,12 @@ iPX
rQJ
fpS
wPD
+ihY
+rqW
+rqW
+rqW
rqW
-pIf
-pIf
-pIf
rqW
-aHK
myh
uJx
ikk
@@ -65766,7 +66253,7 @@ avT
avT
bBh
xUL
-yhx
+nbC
yhx
yhx
yhx
@@ -65993,11 +66480,11 @@ rQJ
fvz
awb
rqW
-ayC
-azH
-fne
rqW
-aCr
+rqW
+rqW
+rqW
+rqW
myh
lHH
oYn
@@ -66008,7 +66495,7 @@ wUr
avT
avT
avT
-vcG
+lcv
wgu
avT
avT
@@ -66023,7 +66510,7 @@ avT
avT
bBh
xUL
-yhx
+nbC
yhx
yhx
yhx
@@ -66218,7 +66705,7 @@ avT
avT
avT
avT
-bGt
+ace
avT
avT
avT
@@ -66475,7 +66962,7 @@ ydp
avT
avT
avT
-ace
+bGt
avT
avT
avT
@@ -66510,8 +66997,8 @@ myh
rQJ
rQJ
rQJ
-myh
-myh
+eXO
+kjx
rQJ
wUr
wUr
@@ -66767,9 +67254,9 @@ xxi
ayD
cGz
sqg
-avT
-ydp
-ydp
+xdr
+ihY
+rQJ
ydp
ydp
ydp
@@ -67023,10 +67510,10 @@ oaS
eqP
tcj
viF
-ayG
-avT
-avT
-ydp
+sqg
+pJm
+ihY
+rQJ
ydp
ydp
ydp
@@ -67281,9 +67768,9 @@ iat
pEF
nez
sqg
-avT
-avT
-avT
+fEz
+sae
+rQJ
ydp
ydp
ydp
@@ -67538,9 +68025,9 @@ axr
ayE
nez
sqg
-ydp
-ydp
-avT
+rQJ
+rQJ
+rQJ
ydp
ydp
ydp
@@ -67807,7 +68294,7 @@ ydp
avT
avT
avT
-vcG
+lcv
wgu
avT
avT
@@ -68042,7 +68529,7 @@ ujE
grz
arP
xWq
-wje
+xWI
nrd
wje
sqg
@@ -68792,7 +69279,7 @@ ace
avT
avT
avT
-bmX
+avT
avT
avT
avT
@@ -69058,7 +69545,7 @@ avT
avT
avT
vBe
-xnm
+tLb
xUL
rhX
lXR
@@ -69316,12 +69803,12 @@ avT
avT
xUL
xnm
-xUL
+vBe
eTu
kHd
ljT
kHd
-gVo
+kHd
rhX
xUL
xUL
@@ -69573,7 +70060,7 @@ avT
avT
xUL
xnm
-xUL
+vBe
eTu
kHd
apK
@@ -69606,7 +70093,7 @@ ydp
ydp
avT
avT
-vcG
+lcv
wgu
avT
avT
@@ -69829,7 +70316,7 @@ avT
avT
avT
vBe
-xnm
+tLb
xUL
rhX
rhX
@@ -70588,18 +71075,18 @@ avT
avT
avT
ace
-xUL
vBe
xUL
-xUL
-xUL
-xUL
vBe
xUL
xUL
xUL
vBe
xUL
+xUL
+xUL
+xUL
+vBe
xnm
avT
avT
@@ -70626,9 +71113,9 @@ ydp
ydp
ydp
ydp
-avT
-avT
-avT
+ydp
+ydp
+ydp
avT
avT
avT
@@ -70847,11 +71334,11 @@ avT
pQd
kLh
kQr
+qOJ
lZn
lZn
lZn
-lZn
-lZn
+qOJ
lZn
lZn
lZn
@@ -70881,12 +71368,12 @@ ydp
ydp
ydp
avT
-avT
-avT
-avT
-avT
-avT
-avT
+ydp
+ydp
+ydp
+ydp
+ydp
+ydp
avT
avT
avT
@@ -71138,23 +71625,23 @@ ydp
ydp
avT
avT
+ydp
+ydp
+ydp
+ydp
+ydp
+ydp
avT
avT
avT
-avT
-avT
-avT
-avT
-avT
-avT
-avT
+xUL
vcG
lzB
avT
avT
avT
avT
-bmX
+avT
ydp
ydp
ydp
@@ -71360,7 +71847,7 @@ avT
avT
avT
xZL
-qZO
+xBk
avT
avT
avT
@@ -71391,21 +71878,21 @@ ydp
ydp
ydp
ydp
+ydp
avT
avT
+bmX
+ydp
+ydp
+ydp
+ydp
+ydp
+ydp
+avT
avT
avT
xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-avT
-avT
-vcG
+lcv
wgu
xUL
xUL
@@ -71450,7 +71937,7 @@ nxv
kYF
bVM
avT
-bmX
+avT
ydp
ydp
ydp
@@ -71629,7 +72116,7 @@ avT
avT
avT
avT
-bmX
+avT
avT
avT
ydp
@@ -71651,17 +72138,17 @@ ydp
avT
avT
avT
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
+ydp
+ydp
+ydp
+ydp
+ydp
+ydp
avT
+avT
+avT
+avT
+xUL
vcG
lzB
xUL
@@ -71873,8 +72360,8 @@ ydp
avT
avT
avT
-xZL
-xBk
+aez
+qZO
avT
avT
avT
@@ -71907,18 +72394,18 @@ ydp
avT
avT
avT
+avT
+ydp
+ydp
+ydp
+ydp
+ydp
+ydp
+ydp
+avT
+avT
+avT
xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-avT
vcG
lzB
avT
@@ -72164,17 +72651,17 @@ ydp
avT
avT
avT
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
+avT
+avT
+ydp
+ydp
+ydp
+ydp
+ydp
+avT
+avT
+avT
+avT
xUL
vcG
lzB
@@ -72419,20 +72906,20 @@ ydp
ydp
ydp
avT
-bmX
+avT
+avT
+avT
+avT
+avT
+ydp
+ydp
+ydp
+avT
+avT
+avT
+avT
avT
xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-avT
vcG
lzB
avT
@@ -72678,18 +73165,18 @@ ydp
avT
avT
avT
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
avT
+avT
+avT
+avT
+ydp
+avT
+avT
+avT
+avT
+avT
+avT
+xUL
vcG
lzB
avT
@@ -72707,7 +73194,7 @@ avT
avT
avT
avT
-avT
+bmX
wql
wql
vEG
@@ -72935,18 +73422,18 @@ ydp
avT
avT
avT
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
avT
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+xUL
vcG
lzB
avT
@@ -73192,19 +73679,19 @@ ydp
ydp
avT
avT
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
avT
-vcG
+avT
+avT
+avT
+avT
+avT
+avT
+ydp
+ydp
+avT
+avT
+xUL
+lcv
wgu
avT
avT
@@ -73217,7 +73704,7 @@ ydp
ydp
ydp
ydp
-bmX
+avT
avT
wql
wql
@@ -73429,7 +73916,8 @@ avT
avT
avT
avT
-avT
+bmX
+ydp
ydp
ydp
ydp
@@ -73449,18 +73937,17 @@ ydp
ydp
avT
avT
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
avT
+avT
+avT
+avT
+avT
+avT
+ydp
+ydp
+ydp
+avT
+xUL
vcG
lzB
avT
@@ -73507,7 +73994,7 @@ bUD
bVM
avT
avT
-bmX
+avT
avT
avT
avT
@@ -73704,20 +74191,20 @@ ydp
ydp
ydp
ydp
+ydp
+ydp
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+ydp
+ydp
avT
avT
xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-avT
vcG
lzB
avT
@@ -73929,7 +74416,7 @@ avT
avT
avT
avT
-xZL
+aez
qZO
avT
avT
@@ -73961,20 +74448,20 @@ ydp
ydp
ydp
ydp
+ydp
+ydp
+avT
+avT
+avT
+ydp
+ydp
+avT
+avT
+avT
+avT
avT
avT
xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-avT
vcG
lzB
xUL
@@ -74218,20 +74705,20 @@ ydp
ydp
ydp
ydp
+ydp
+avT
+avT
+avT
+avT
+ydp
+ydp
+ydp
+avT
+avT
+avT
avT
avT
xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-avT
vcG
lzB
xUL
@@ -74477,20 +74964,20 @@ ydp
ydp
avT
avT
+ydp
+ydp
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+avT
xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-vcG
-lzB
+lcv
+nDN
xUL
xUL
xUL
@@ -74733,19 +75220,19 @@ ydp
ydp
avT
avT
+ydp
+ydp
+ydp
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+avT
avT
xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-avT
vcG
lzB
xUL
@@ -74800,7 +75287,7 @@ cer
avT
avT
avT
-bmX
+avT
avT
avT
avT
@@ -74992,19 +75479,19 @@ avT
avT
avT
avT
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
avT
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+avT
+xUL
vcG
-wgu
+lzB
xUL
xUL
xUL
@@ -75249,17 +75736,17 @@ avT
avT
avT
avT
-avT
xUL
xUL
xUL
-avT
-avT
xUL
xUL
xUL
-avT
-avT
+xUL
+xUL
+xUL
+xUL
+xUL
vcG
lzB
avT
@@ -75512,7 +75999,7 @@ nGx
nGx
nGx
nGx
-nGx
+hnN
nGx
nGx
nGx
@@ -75526,8 +76013,8 @@ avT
avT
bok
unA
-bJQ
-bJQ
+xjZ
+xjZ
unA
avT
avT
@@ -75762,7 +76249,7 @@ avT
avT
avT
avT
-tFr
+vcG
dvc
sLv
sLv
@@ -75985,7 +76472,7 @@ avT
avT
avT
avT
-xZL
+aez
qZO
avT
avT
@@ -76033,7 +76520,7 @@ avT
avT
avT
avT
-bmX
+avT
avT
avT
bok
@@ -76094,7 +76581,7 @@ ruD
clR
avT
avT
-bmX
+avT
avT
avT
avT
@@ -76534,7 +77021,7 @@ gky
vmM
jOo
azc
-lzB
+nDN
avT
avT
avT
@@ -76559,7 +77046,7 @@ wcB
unA
avT
avT
-bmX
+avT
avT
bwt
cTD
@@ -76808,7 +77295,7 @@ ncg
aXh
jHC
bok
-ivM
+uFq
bok
unA
uFq
@@ -77263,12 +77750,12 @@ ydp
ydp
ydp
ydp
-avT
-avT
-avT
-avT
-avT
-avT
+pgp
+iHM
+iHM
+iHM
+iHM
+iHM
avT
xZL
xBk
@@ -77520,15 +78007,15 @@ ydp
ydp
ydp
ydp
+pgp
+sTt
+nRA
+pDg
+qSF
+iHM
avT
-avT
-avT
-bHt
-nZE
-nZE
-nZE
aez
-xBk
+qZO
avT
avT
ydp
@@ -77561,7 +78048,7 @@ kxI
dPM
xNs
wwx
-nDd
+aAh
aDQ
avT
avT
@@ -77777,15 +78264,15 @@ ydp
ydp
ydp
avT
-avT
-avT
-avT
+pgp
+xAv
+xAv
mps
xAv
-ruo
-ruo
+iHM
+avT
acQ
-aUb
+xBk
avT
avT
avT
@@ -78021,28 +78508,28 @@ yhx
yhx
yhx
yhx
-ydp
-ydp
-ydp
-ydp
-ydp
-ydp
+nbC
+nbC
+nbC
+pgp
+pgp
+pgp
+pgp
+pgp
+pgp
+pgp
+pgp
+pgp
+pgp
+pgp
+rKC
+bjR
+xAv
+xAv
+pgp
avT
-avT
-avT
-avT
-avT
-avT
-avT
-avT
-avT
-avT
-axL
-aaM
-nZE
-nZE
-abU
-vBe
+xZL
+nYd
avT
avT
avT
@@ -78278,28 +78765,28 @@ yhx
yhx
yhx
yhx
-ydp
-ydp
-ydp
-ydp
-ydp
-ydp
+nbC
+nbC
avT
-avT
-avT
-avT
-avT
-avT
-iHM
+pgp
+tJi
+vdW
+pgp
+tJi
+vdW
+pgp
+tJi
+vdW
+pgp
tOz
-iHM
+tUq
gCO
-iHM
-axN
-ruo
-ruo
-aAh
-vzS
+hvG
+pgp
+pgp
+pgp
+xZL
+xBk
avT
ydp
ydp
@@ -78535,27 +79022,27 @@ yhx
yhx
yhx
yhx
-ydp
-ydp
-ydp
-ydp
-ydp
-ydp
avT
avT
avT
-avT
-avT
-avT
-iHM
-kRk
-iHM
-kRk
-iHM
-avT
-avT
-avT
-xZL
+pgp
+tSd
+vzS
+pgp
+tSd
+rEF
+pgp
+tSd
+vFT
+pgp
+vow
+swQ
+gCO
+swQ
+kXL
+mtP
+tWs
+aez
xBk
avT
ydp
@@ -78591,13 +79078,13 @@ spa
dIj
pIH
bpT
+dMo
irt
irt
+dMo
irt
irt
-irt
-irt
-irt
+dMo
gZS
uyK
aRt
@@ -78792,27 +79279,27 @@ yhx
yhx
yhx
yhx
-ydp
-ydp
-ydp
-ydp
-ydp
-ydp
avT
-avT
-iHM
-iHM
-iHM
-iHM
-iHM
+pgp
+pgp
+pgp
+uRg
+pgp
+pgp
+kWz
+pgp
+pgp
+eCS
+pgp
+pgp
vow
-iHM
-vow
-iHM
-iHM
-iHM
-iHM
-xZL
+swQ
+gCO
+swQ
+kXL
+mtP
+tWs
+aez
xBk
avT
ydp
@@ -79048,26 +79535,26 @@ yhx
yhx
yhx
yhx
-yhx
-ydp
-ydp
-ydp
-ydp
-ydp
-ydp
-avT
+ooR
avT
iHM
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
+oME
+rPU
+swQ
+fSb
+pqm
+swQ
+swQ
+rPU
+swQ
+swQ
+vQz
+vow
+swQ
+gCO
+swQ
+iHM
+rbb
iHM
xZL
xBk
@@ -79103,8 +79590,8 @@ cPI
hPe
vAs
ktw
-xZL
-lzB
+aez
+nDN
avT
avT
avT
@@ -79305,26 +79792,26 @@ ydp
ydp
ydp
ydp
-ydp
-ydp
-ydp
-ydp
-ydp
-ydp
-ydp
avT
avT
iHM
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
+pIf
+swQ
+swQ
+swQ
+swQ
+jjB
+ugk
+ugk
+ugk
+ugk
+ugk
+fkA
+ugk
+hUg
+qim
+iHM
+iHM
iHM
xZL
xBk
@@ -79346,7 +79833,7 @@ ydp
ydp
ydp
avT
-bmX
+avT
avT
avT
avT
@@ -79360,7 +79847,7 @@ spa
vir
fkr
ktw
-oME
+xZL
lzB
avT
avT
@@ -79562,27 +80049,27 @@ ydp
ydp
ydp
ydp
-ydp
-ydp
-ydp
-ydp
-ydp
-ydp
-avT
avT
avT
iHM
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
+ruo
+tFu
+swQ
+swQ
+hWp
+ptH
+iQu
+iQu
+iQu
+iQu
+mHm
+bfo
+swQ
+gCO
iHM
+lJC
+avT
+avT
xZL
xBk
avT
@@ -79820,29 +80307,29 @@ ydp
ydp
ydp
ydp
-ydp
-ydp
-ydp
-ydp
-avT
-avT
-avT
avT
+pgp
+pgp
+pgp
+raM
+raM
+raM
+raM
+mfU
+raM
+raM
+raM
+pgp
+vVJ
+hCx
+lOa
iHM
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-iHM
-xZL
-xBk
-vBe
+avT
+avT
+avT
+aez
+qZO
+xUL
ydp
ydp
ydp
@@ -79957,7 +80444,7 @@ jQj
avT
avT
avT
-bmX
+avT
avT
avT
avT
@@ -80078,25 +80565,25 @@ ydp
ydp
ydp
ydp
-ydp
-ydp
-ydp
+pgp
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+raM
+eoH
+xAv
+nJB
+iHM
+avT
+avT
avT
-xUL
-cav
-xUL
-iHM
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-kHD
-iHM
xZL
xBk
xUL
@@ -80125,7 +80612,7 @@ sLv
sLv
sLv
sLv
-sLv
+cEs
sLv
sLv
sLv
@@ -80335,25 +80822,25 @@ ydp
ydp
ydp
ydp
-ydp
-ydp
+raM
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+raM
+nlF
+xAv
+oUT
+iHM
+avT
avT
avT
-xUL
-xUL
-xUL
-iHM
-iHM
-iHM
-iHM
-iHM
-nlF
-iHM
-nlF
-iHM
-iHM
-iHM
-iHM
xZL
xBk
avT
@@ -80592,20 +81079,20 @@ ydp
ydp
ydp
ydp
-ydp
-ydp
-avT
-avT
-xUL
-xUL
-xUL
-avT
-avT
-avT
-avT
-iHM
-lJN
-vQk
+raM
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+raM
+nlF
+xAv
gUc
iHM
avT
@@ -80849,21 +81336,21 @@ ydp
ydp
ydp
ydp
-ydp
-ydp
-avT
-pgp
-xUL
-xUL
-xUL
-pgp
-avT
-avT
-avT
-iHM
-kRk
-kRk
-kRk
+raM
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+raM
+nlF
+xAv
+oUT
iHM
avT
avT
@@ -81106,28 +81593,28 @@ ydp
ydp
ydp
ydp
-ydp
-avT
-avT
pgp
-xUL
-bSC
-xUL
-pgp
-avT
-avT
-avT
-iHM
-vow
-iHM
-vow
+kHD
+kHD
+kHD
+fIk
+kHD
+kHD
+kHD
+kHD
+kHD
+kHD
+raM
+eoH
+xAv
+nJB
iHM
avT
avT
avT
-xZL
-xBk
-iSB
+aez
+qZO
+avT
wdv
xUL
xUL
@@ -81363,18 +81850,18 @@ ydp
ydp
ydp
ydp
-avT
-avT
-iHM
-iHM
+pgp
+pgp
pgp
raM
-iHM
pgp
-iHM
-iHM
-iHM
-iHM
+raM
+raM
+mfU
+raM
+raM
+raM
+pgp
rRk
xfs
qHL
@@ -81503,7 +81990,7 @@ avT
avT
avT
avT
-avT
+bmX
ydp
ydp
ydp
@@ -81625,20 +82112,20 @@ xUL
aNL
mtP
dvs
-mtP
-mtP
-dAi
-mtP
-mtP
-mtP
-mtP
-mtP
-lLv
-mtP
+jjB
+kIV
+ugk
+ugk
+ugk
+ugk
+utY
+mEH
+ugk
+hUg
oBD
iHM
-lJC
-lJC
+iHM
+iHM
xZL
xBk
avT
@@ -81661,7 +82148,7 @@ avT
avT
avT
tFr
-lzB
+nDN
avT
avT
avT
@@ -81882,30 +82369,30 @@ xUL
aNL
fTM
dvs
-mtP
+swQ
naE
-mtP
+bqb
aaU
nOY
-mtP
-naE
+iwH
+hlQ
duB
tsK
-tsK
+nEH
tsK
iuC
-tsK
+cTV
pXb
aSE
xBk
xUL
xUL
xUL
+xUL
+xUL
vBe
xUL
xUL
-xUL
-xUL
vBe
xUL
xUL
@@ -81915,7 +82402,7 @@ xUL
vBe
xUL
xUL
-xUL
+vBe
xUL
vcG
lzB
@@ -81975,7 +82462,7 @@ anA
wbT
rTs
hTL
-uRg
+hTL
jab
jFy
qJV
@@ -82140,39 +82627,39 @@ iHM
pgp
pgp
pgp
-pgp
+eyc
fPM
pgp
pgp
pgp
pgp
vhb
-mtP
+swQ
vDI
ugk
hAx
-ugk
+ord
nrY
-vsM
+vko
aUb
xUL
xUL
xUL
xUL
xUL
+vBe
+xUL
+xUL
+vBe
xUL
xUL
xUL
xUL
xUL
+vBe
xUL
xUL
-xUL
-xUL
-xUL
-xUL
-xUL
-xUL
+vBe
xUL
vcG
lzB
@@ -82392,19 +82879,19 @@ xUL
ydp
ydp
ydp
-bmX
+avT
avT
pgp
aab
dZV
-dZV
-gLk
+wgM
+kdy
pgp
qFH
nBd
wfS
iJs
-mtP
+swQ
sgL
qxk
pgp
@@ -82418,7 +82905,7 @@ xUL
xUL
xUL
avT
-bmX
+avT
avT
avT
avT
@@ -82478,7 +82965,7 @@ vAs
vAs
krT
pze
-bEi
+sLF
bEi
lbp
bAs
@@ -82654,25 +83141,25 @@ avT
pgp
aac
gLk
-gLk
-gLk
+hHV
+kdy
pgp
vVZ
mWy
pgp
iJs
-mtP
+swQ
inA
qMn
pgp
-wdv
-wdv
+pgp
+pgp
+xUL
+xUL
+xUL
+xUL
+vBe
vBe
-xUL
-xUL
-xUL
-xUL
-xUL
xUL
avT
avT
@@ -82740,7 +83227,7 @@ bFT
bCO
gRE
thV
-bCO
+qBl
bEa
kxj
aaw
@@ -82911,7 +83398,7 @@ avT
pgp
aab
aad
-gLk
+gdH
fBs
pgp
pgp
@@ -83457,10 +83944,10 @@ ydp
ydp
avT
avT
-bmX
+avT
avT
tFr
-lzB
+nDN
avT
avT
ydp
@@ -84178,7 +84665,7 @@ ydp
ydp
ydp
ydp
-avT
+bmX
avT
ydp
ydp
@@ -84693,7 +85180,7 @@ ydp
ydp
avT
avT
-bmX
+avT
avT
avT
avT
@@ -84795,7 +85282,7 @@ hJE
cmC
aIt
bCO
-bBN
+hyx
vTF
tRe
eVp
@@ -85080,7 +85567,7 @@ bPn
avT
avT
avT
-bmX
+avT
avT
avT
avT
@@ -85259,7 +85746,7 @@ ydp
avT
avT
tFr
-lzB
+nDN
avT
avT
avT
@@ -85432,23 +85919,23 @@ yhx
wuf
avT
nuu
-sXy
-sXy
+aar
+aar
fNh
-xUL
+abU
nyq
-sXy
+aar
fNh
-xUL
+abU
nyq
-sXy
+aar
fNh
-xUL
+abU
nyq
-sXy
-sXy
-sXy
-sXy
+aar
+aar
+aar
+aar
sDD
eNK
jwc
@@ -86290,7 +86777,7 @@ vcG
lzB
avT
avT
-bmX
+avT
avT
ydp
ydp
@@ -86512,7 +86999,7 @@ mGp
rgm
wAx
wAx
-wAx
+ule
uEz
uEz
wzf
@@ -87026,11 +87513,11 @@ mKv
sAh
sAh
acb
-aar
+urI
+uEz
+uEz
uEz
uEz
-hrS
-lQJ
lia
uvB
tOY
@@ -87058,7 +87545,7 @@ xUL
xUL
avT
tFr
-lzB
+nDN
avT
avT
ydp
@@ -87103,7 +87590,7 @@ avT
avT
avT
avT
-bmX
+avT
avT
avT
avT
@@ -87285,10 +87772,10 @@ sAh
acb
urI
qkO
-uEz
-blD
+qnx
kge
-gls
+kge
+qnx
tgd
tRC
pJS
@@ -87382,7 +87869,7 @@ avT
avT
avT
avT
-bmX
+avT
avT
avT
ydp
@@ -87542,12 +88029,12 @@ qss
qss
ylW
uoV
-uEz
-blD
+qnx
+pgk
pgk
bKl
-iNK
-chN
+tgd
+tRC
pJS
sWD
bNF
@@ -87799,9 +88286,9 @@ sAh
acb
urI
uoV
-uEz
-blD
-pgk
+qnx
+kbE
+kbE
qnx
pbf
sFw
@@ -87884,7 +88371,7 @@ sXy
ikA
avT
avT
-bmX
+avT
avT
avT
avT
@@ -88056,10 +88543,10 @@ sAh
acb
urI
uoV
-uEz
-blD
-eLl
-igK
+qnx
+kge
+kge
+qnx
xcL
hop
pJS
@@ -88287,14 +88774,14 @@ ydp
ydp
ydp
ydp
-bmX
+avT
avT
avT
bBh
avT
aKf
irQ
-huF
+cfp
cfp
gxY
cfp
@@ -88313,11 +88800,11 @@ qss
oXl
pPz
uoV
-uEz
-hsQ
-cDO
-jAT
-nmL
+qnx
+pgk
+pgk
+qnx
+tgd
vKP
pJS
hNg
@@ -88405,7 +88892,7 @@ ydp
ydp
ydp
ydp
-avT
+bmX
avT
ydp
ydp
@@ -88552,7 +89039,7 @@ avT
aKf
irQ
jLG
-piu
+lhr
piu
xac
gNI
@@ -88570,12 +89057,12 @@ wAx
wAx
wAx
hru
-uEz
-uEz
-uEz
-ejw
-rTv
-eOO
+qnx
+kbE
+kbE
+qnx
+tgd
+tRC
pJS
hNg
bNF
@@ -88802,7 +89289,7 @@ ydp
ydp
ydp
avT
-avT
+bmX
ydp
bBh
avT
@@ -88830,9 +89317,9 @@ pbg
uEz
uEz
uEz
-ejw
-rTv
-eOO
+cvN
+gjZ
+tRC
pJS
jiY
bNF
@@ -88857,7 +89344,7 @@ xUL
xiw
avT
tFr
-lzB
+nDN
avT
avT
avT
@@ -88945,7 +89432,7 @@ ydp
ydp
ydp
avT
-bmX
+avT
avT
ydp
ydp
@@ -90607,7 +91094,7 @@ bBh
avT
aKf
gLO
-jvV
+cfp
evO
cfp
kBe
@@ -90656,7 +91143,7 @@ avT
avT
avT
tFr
-lzB
+nDN
avT
avT
avT
@@ -91422,7 +91909,7 @@ uMF
jsl
gFM
cuY
-nGx
+hnN
nGx
nGx
nGx
@@ -91679,11 +92166,11 @@ dks
nEl
ust
sHJ
+cEs
sLv
sLv
sLv
sLv
-ybT
asr
avT
avT
@@ -91989,12 +92476,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
bBh
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -92195,7 +92682,7 @@ lGB
jJu
avT
avT
-bmX
+avT
avT
avT
avT
@@ -92246,12 +92733,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
bBh
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -92399,8 +92886,8 @@ bqN
avT
xUL
xUL
-bmX
avT
+bmX
bxL
bxL
bxL
@@ -92408,7 +92895,7 @@ xUL
bxL
dri
dri
-dDC
+uot
nQp
kVx
eLQ
@@ -92503,12 +92990,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
bBh
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -92641,7 +93128,7 @@ avT
avT
bzc
xUL
-avT
+bmX
avT
ydp
ydp
@@ -92660,7 +93147,7 @@ avT
avT
bxL
bxL
-bum
+axN
xUL
xUL
dri
@@ -92758,14 +93245,14 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
avT
avT
bBh
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -92895,7 +93382,7 @@ ydp
ydp
ydp
avT
-avT
+bum
bzh
xUL
avT
@@ -92917,7 +93404,7 @@ avT
bxL
bxL
bum
-bum
+axN
xUL
xUL
rww
@@ -92925,7 +93412,7 @@ rww
rww
ttQ
lNU
-bZI
+nDd
bZI
nNV
dBP
@@ -93015,14 +93502,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
avT
bBh
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -93152,9 +93639,9 @@ ydp
ydp
ydp
avT
-avT
-avT
-bmX
+bum
+bum
+bum
avT
avT
ydp
@@ -93174,7 +93661,7 @@ bxL
bxL
bum
bum
-bum
+axN
xUL
xUL
jrq
@@ -93272,14 +93759,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
euS
sXy
sXy
jAq
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -93409,10 +93896,10 @@ ydp
ydp
ydp
ydp
-avT
-avT
-avT
-avT
+bum
+bum
+bum
+bum
ydp
ydp
ydp
@@ -93431,7 +93918,7 @@ bKI
bum
bum
bum
-bum
+axN
xUL
xUL
rww
@@ -93529,14 +94016,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -93667,7 +94154,7 @@ ydp
ydp
avT
avT
-avT
+bum
avT
avT
ydp
@@ -93688,7 +94175,7 @@ bKI
bum
bum
bum
-bum
+axN
xUL
xUL
dri
@@ -93786,14 +94273,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
yhx
yhx
yhx
@@ -93945,7 +94432,7 @@ bKI
bum
bum
bum
-bum
+axN
xUL
xUL
wmB
@@ -94043,12 +94530,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -94199,10 +94686,10 @@ bKI
bCC
bCC
bKI
-bum
-bum
-bum
-bum
+azH
+azH
+azH
+aHK
xUL
xUL
fen
@@ -94245,7 +94732,7 @@ qzz
uqa
iIQ
avT
-bmX
+avT
avT
avT
ydp
@@ -94300,12 +94787,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -94557,7 +95044,7 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
@@ -94709,7 +95196,7 @@ bqN
bqN
bqN
bxL
-bum
+axN
xUL
xUL
xUL
@@ -94814,12 +95301,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -94966,8 +95453,8 @@ bqN
bqN
bxL
bxL
-bum
-bum
+ayC
+aEG
xUL
xUL
bKI
@@ -95071,12 +95558,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -95224,7 +95711,7 @@ bqN
bqN
bxL
bum
-bum
+axN
xUL
xUL
bKI
@@ -95328,12 +95815,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -95481,7 +95968,7 @@ bqN
bxL
bxL
bum
-bum
+axN
xUL
xUL
bKI
@@ -95585,12 +96072,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -95737,8 +96224,8 @@ bqN
bqN
bxL
bxL
-bum
-bum
+azH
+aHK
xUL
xUL
bKI
@@ -95840,14 +96327,14 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -96005,7 +96492,7 @@ bKI
bKI
bMT
fgj
-nOk
+lQp
lfG
sdr
gyE
@@ -96097,14 +96584,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -96359,9 +96846,9 @@ avT
avT
avT
bBh
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
yhx
yhx
yhx
@@ -96508,9 +96995,9 @@ bqN
bqN
bxL
bxL
-bum
-bum
-bum
+aCr
+aCr
+aEG
xUL
bOb
bKI
@@ -96611,7 +97098,7 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
@@ -96767,7 +97254,7 @@ bqN
bxL
bum
bum
-bum
+axN
xUL
bOb
bKI
@@ -96868,12 +97355,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -97024,7 +97511,7 @@ bqN
bxL
bum
bum
-bum
+axN
xUL
bOb
bKI
@@ -97073,7 +97560,7 @@ wFO
mZp
avT
avT
-bmX
+avT
avT
avT
avT
@@ -97125,12 +97612,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -97281,7 +97768,7 @@ bqN
bxL
bum
bum
-bum
+axN
xUL
bOb
bKI
@@ -97382,12 +97869,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -97538,13 +98025,13 @@ bqN
bxL
bum
bum
-bum
+axN
xUL
bOb
-xUL
-xUL
-xUL
-xUL
+dDC
+bum
+bum
+axN
xbp
onY
gNy
@@ -97639,12 +98126,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -97795,13 +98282,13 @@ bxL
bxL
bxL
bum
-bum
+axN
xUL
bOb
-bum
-bum
-bum
-bum
+dFJ
+azH
+azH
+aHK
xbp
fen
eHK
@@ -97896,12 +98383,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -98052,7 +98539,7 @@ bxL
bxL
bxL
bum
-bum
+axN
bDA
bGW
bYY
@@ -98153,12 +98640,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -98309,7 +98796,7 @@ bxL
bxL
bxL
bum
-bum
+axN
bFx
bOb
bKI
@@ -98410,7 +98897,7 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
@@ -98566,7 +99053,7 @@ bqN
bqN
bxL
bum
-bum
+axN
bFx
bRD
caS
@@ -98667,14 +99154,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
yhx
yhx
yhx
@@ -98823,7 +99310,7 @@ bqN
bxL
bxL
bum
-bum
+axN
aEF
bYY
ccD
@@ -98924,14 +99411,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -99079,8 +99566,8 @@ bqN
bqN
bxL
bxL
-bum
-bum
+azH
+aHK
xUL
xUL
bKI
@@ -99181,14 +99668,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -99340,12 +99827,13 @@ xUL
xUL
xUL
xUL
+dDC
bum
bum
-bum
-bum
+axN
xbp
xUL
+dDC
bum
bum
bum
@@ -99359,8 +99847,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
rGc
jPj
ucC
@@ -99438,14 +99925,14 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -99597,27 +100084,27 @@ xUL
xUL
xUL
xUL
-bum
-bum
-bum
-bum
+dFJ
+azH
+azH
+aHK
xbp
xUL
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
+dFJ
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+aHK
dQW
jls
ucC
@@ -99697,12 +100184,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -99850,8 +100337,8 @@ bqN
bqN
bxL
bxL
-bum
-bum
+aCr
+aEG
xUL
xUL
xUL
@@ -99954,7 +100441,7 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
@@ -100108,7 +100595,7 @@ bqN
bxL
bxL
bum
-bum
+axN
xUL
xUL
xUL
@@ -100211,12 +100698,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -100366,24 +100853,24 @@ bxL
bxL
bxL
bum
-bum
-bum
-bum
-bum
-bum
-bum
+aCr
+aCr
+aCr
+aCr
+aCr
+aEG
xbp
xUL
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
+lQJ
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aEG
rGc
tdX
tdX
@@ -100397,7 +100884,7 @@ aNU
kVD
noQ
leT
-leT
+mqd
leT
iCq
leT
@@ -100408,7 +100895,7 @@ wku
xGy
lBH
bnU
-bmX
+avT
avT
ydp
ydp
@@ -100468,12 +100955,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -100628,9 +101115,10 @@ bum
bum
bum
bum
-bum
+axN
xbp
xUL
+dDC
bum
bum
bum
@@ -100639,8 +101127,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
dQW
tdX
tdX
@@ -100725,12 +101212,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -100885,9 +101372,10 @@ bum
bum
bum
bum
-bum
+axN
xbp
xUL
+dDC
bum
bum
bum
@@ -100896,8 +101384,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
rGc
tdX
tdX
@@ -100982,12 +101469,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -101142,9 +101629,10 @@ bum
bum
bum
bum
-bum
+axN
xbp
xUL
+dDC
bum
bum
bum
@@ -101153,8 +101641,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
dQW
tdX
tdX
@@ -101244,7 +101731,7 @@ avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -101399,9 +101886,10 @@ bum
bum
bum
bum
-bum
+axN
xbp
xUL
+dDC
bum
bum
bum
@@ -101410,8 +101898,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
rGc
jPj
dQW
@@ -101494,14 +101981,14 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -101656,9 +102143,10 @@ bum
bum
bum
bum
-bum
+axN
xbp
xUL
+dDC
bum
bum
bum
@@ -101667,8 +102155,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
dQW
cly
cly
@@ -101751,14 +102238,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -101913,9 +102400,10 @@ bum
bum
bum
bum
-bum
+axN
xbp
xUL
+dDC
bum
bum
bum
@@ -101924,8 +102412,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
xUL
xUL
xUL
@@ -102008,14 +102495,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
avT
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -102170,9 +102657,10 @@ bum
bum
bum
bum
-bum
+axN
xbp
xUL
+dDC
bum
bum
bum
@@ -102181,8 +102669,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
xUL
xUL
xUL
@@ -102265,14 +102752,14 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
yhx
yhx
yhx
@@ -102427,9 +102914,10 @@ bum
bum
bum
bum
-bum
+axN
xbp
xUL
+dDC
bum
bum
bum
@@ -102438,16 +102926,15 @@ bum
bum
bum
bum
-bum
-bum
+axN
xUL
xUL
xUL
xUL
xUL
-bum
-bum
-bum
+lQJ
+aCr
+aCr
hBq
pCv
iuP
@@ -102522,12 +103009,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -102679,24 +103166,24 @@ bqN
bxL
bxL
bxL
-bum
-bum
-bum
-bum
-bum
-bum
+azH
+azH
+azH
+azH
+azH
+aHK
xbp
xUL
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
+dFJ
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+aHK
xUL
xUL
xUL
@@ -102779,12 +103266,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -103036,12 +103523,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -103293,12 +103780,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -103450,27 +103937,27 @@ bqN
bqN
bxL
bxL
-bum
-bum
-bum
-bum
-bum
-bum
+aCr
+aCr
+aCr
+aCr
+aCr
+aEG
xUL
xUL
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
+lQJ
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aEG
xUL
xbp
sTq
@@ -103550,12 +104037,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -103712,9 +104199,10 @@ bum
bum
bum
bum
-bum
+axN
xUL
xUL
+dDC
bum
bum
bum
@@ -103726,11 +104214,10 @@ bum
bum
bum
bum
-bum
-bum
+axN
xUL
xbp
-sTq
+lgg
hBq
xBV
hBq
@@ -103750,7 +104237,7 @@ avT
avT
avT
avT
-bmX
+avT
ydp
ydp
ydp
@@ -103807,12 +104294,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -103969,9 +104456,10 @@ bum
bum
bum
bum
-bum
+axN
xUL
xUL
+dDC
bum
bum
bum
@@ -103983,8 +104471,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
rGc
rvf
umD
@@ -104064,12 +104551,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
+nbC
yhx
yhx
yhx
@@ -104226,9 +104713,10 @@ bum
bum
bum
bum
-bum
+axN
xUL
xUL
+dDC
bum
bum
bum
@@ -104240,8 +104728,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
odg
xbp
bZa
@@ -104321,13 +104808,13 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
avT
avT
bBh
-yhx
-yhx
+nbC
+nbC
yhx
yhx
yhx
@@ -104351,7 +104838,7 @@ faJ
rot
avT
jxB
-aQK
+sQk
rot
avT
wuf
@@ -104483,9 +104970,10 @@ bum
bum
bum
bum
-bum
+axN
xUL
xUL
+dDC
bum
bum
bum
@@ -104497,12 +104985,11 @@ bum
bum
bum
bum
-bum
-bum
+axN
odg
xbp
-sTq
-sTq
+cVa
+qZb
lHa
nQd
umD
@@ -104584,8 +105071,8 @@ avT
avT
bBh
avT
-yhx
-yhx
+nbC
+nbC
yhx
yhx
yhx
@@ -104608,7 +105095,7 @@ vDy
rot
avT
jxB
-qfJ
+qjF
rot
avT
wuf
@@ -104740,9 +105227,10 @@ bum
bum
bum
bum
-bum
+axN
xUL
xUL
+dDC
bum
bum
bum
@@ -104754,12 +105242,11 @@ bum
bum
bum
bum
-bum
-bum
+axN
odg
xbp
-sTq
-sTq
+lgg
+oGZ
pQg
tFN
tFN
@@ -104835,13 +105322,13 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
avT
bBh
avT
-yhx
+nbC
yhx
yhx
yhx
@@ -104865,7 +105352,7 @@ vDy
rot
avT
jxB
-qfJ
+qjF
rot
avT
wuf
@@ -104997,9 +105484,10 @@ bxL
bum
bum
bum
-bum
+axN
xUL
xUL
+dDC
bum
bum
bum
@@ -105011,8 +105499,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
dQW
rvf
cly
@@ -105094,12 +105581,12 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
-yhx
-yhx
+nbC
+nbC
yhx
yhx
yhx
@@ -105122,7 +105609,7 @@ vDy
rot
avT
jxB
-qfJ
+qjF
rot
avT
avT
@@ -105254,9 +105741,10 @@ bxL
bxL
bxL
bum
-bum
+axN
xUL
xUL
+dDC
bum
bum
bum
@@ -105268,8 +105756,7 @@ bum
bum
bum
bum
-bum
-bum
+axN
xUL
wDd
alE
@@ -105351,7 +105838,7 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
@@ -105379,7 +105866,7 @@ vDy
rot
avT
jxB
-qfJ
+qjF
rot
avT
avT
@@ -105514,22 +106001,22 @@ bKI
bKI
xUL
xUL
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
+dFJ
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+azH
+aHK
+xUL
+xUL
+xUL
xUL
bOb
xUL
@@ -105608,7 +106095,7 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
bBh
avT
@@ -105628,15 +106115,15 @@ avT
avT
avT
avT
-hGK
+jEm
avT
avT
avT
-hGK
+jEm
avT
avT
avT
-hGK
+jEm
avT
avT
avT
@@ -105865,7 +106352,7 @@ yhx
yhx
yhx
yhx
-yhx
+nbC
avT
rUq
sXy
@@ -105877,26 +106364,26 @@ oBl
uyM
dUH
fUm
-sXy
-sXy
-sXy
-sXy
-sXy
-sXy
-sXy
-fNh
-xUL
-xUL
-xUL
-xUL
-xUL
-nyq
-sXy
-fNh
-xUL
-nyq
-sXy
-sXy
+wMH
+wMH
+wMH
+wMH
+wMH
+wMH
+wMH
+cWI
+jWw
+jWw
+jWw
+jWw
+jWw
+gIW
+wMH
+cWI
+jWw
+gIW
+wMH
+wMH
uRc
avT
wuf
@@ -106122,8 +106609,8 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
+nbC
+nbC
avT
avT
avT
@@ -106142,15 +106629,15 @@ avT
avT
avT
avT
-clq
+oPk
avT
avT
avT
-clq
+oPk
avT
avT
avT
-clq
+oPk
avT
avT
avT
@@ -106285,24 +106772,24 @@ bKI
bKI
bxL
bxL
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
-bum
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
+aCr
bxL
bqN
bqN
@@ -106311,7 +106798,7 @@ bqN
avT
avT
avT
-bmX
+avT
avT
avT
avT
@@ -106399,15 +106886,15 @@ avT
avT
avT
jxB
-mmM
+qIW
rot
avT
jxB
-mmM
+qIW
rot
avT
jxB
-knR
+lQd
rot
avT
avT
@@ -106637,11 +107124,11 @@ yhx
yhx
yhx
yhx
-yhx
-yhx
-yhx
-yhx
-yhx
+nbC
+nbC
+nbC
+nbC
+nbC
yhx
yhx
yhx
@@ -106656,15 +107143,15 @@ avT
avT
avT
jxB
-mmM
+qIW
rot
avT
jxB
-mmM
+qIW
rot
avT
jxB
-knR
+lQd
rot
avT
avT
@@ -106913,15 +107400,15 @@ avT
avT
avT
jxB
-mmM
+qIW
rot
avT
jxB
-mmM
+qIW
rot
avT
jxB
-knR
+lQd
rot
avT
wuf
@@ -107170,15 +107657,15 @@ avT
avT
avT
jxB
-mmM
+qIW
rot
avT
jxB
-mmM
+qIW
rot
avT
jxB
-knR
+lQd
rot
avT
wuf
@@ -107427,15 +107914,15 @@ avT
avT
avT
jxB
-gTh
+pvP
rot
avT
jxB
-gTh
+pvP
rot
avT
jxB
-gTh
+pvP
rot
avT
wuf
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index 585e8da7d7..6aca5cd998 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -99,7 +99,8 @@
#define NO_ASS_SLAP (1<<10)
#define BIMBOFICATION (1<<11)
#define NO_AUTO_WAG (1<<12)
-
+#define GENITAL_EXAMINE (1<<13)
+#define VORE_EXAMINE (1<<14)
#define TOGGLES_CITADEL 0
//belly sound pref things
diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm
index 3d15412efe..2273d34c82 100644
--- a/code/__DEFINES/colors.dm
+++ b/code/__DEFINES/colors.dm
@@ -2,19 +2,6 @@
#define COLOR_INPUT_DISABLED "#F0F0F0"
#define COLOR_INPUT_ENABLED "#D3B5B5"
-
-#define COLOR_DARKMODE_INFO_BUTTONS_BG "#40628A"
-#define COLOR_DARKMODE_ISSUE_BUTTON_BG "#A92C2C"
-#define COLOR_DARKMODE_BACKGROUND "#272727"
-#define COLOR_DARKMODE_DARKBACKGROUND "#242424"
-#define COLOR_DARKMODE_TEXT "#E0E0E0"
-
-#define COLOR_WHITEMODE_INFO_BUTTONS_BG "#90B3DD"
-#define COLOR_WHITEMODE_ISSUE_BUTTON_BG "#EF7F7F"
-#define COLOR_WHITEMODE_BACKGROUND "#F0F0F0"
-#define COLOR_WHITEMODE_DARKBACKGROUND "#E6E6E6"
-#define COLOR_WHITEMODE_TEXT "#000000"
-
#define COLOR_FLOORTILE_GRAY "#8D8B8B"
#define COLOR_ALMOST_BLACK "#333333"
#define COLOR_BLACK "#000000"
@@ -64,4 +51,4 @@
#define COLOR_ASSEMBLY_LBLUE "#5D99BE"
#define COLOR_ASSEMBLY_BLUE "#38559E"
#define COLOR_ASSEMBLY_PURPLE "#6F6192"
-#define COLOR_ASSEMBLY_PINK "#ff4adc"
\ No newline at end of file
+#define COLOR_ASSEMBLY_PINK "#ff4adc"
diff --git a/code/__DEFINES/configuration.dm b/code/__DEFINES/configuration.dm
index a4bf69b2ad..e9881677ba 100644
--- a/code/__DEFINES/configuration.dm
+++ b/code/__DEFINES/configuration.dm
@@ -1,6 +1,7 @@
//config files
#define CONFIG_GET(X) global.config.Get(/datum/config_entry/##X)
#define CONFIG_SET(X, Y) global.config.Set(/datum/config_entry/##X, ##Y)
+/// Gets the datum of the object, for when editing a const define.
#define CONFIG_GET_ENTRY(X) global.config.GetEntryDatum(/datum/config_entry/##X)
#define CONFIG_MAPS_FILE "maps.txt"
diff --git a/code/__DEFINES/dye_keys.dm b/code/__DEFINES/dye_keys.dm
index 133f9c47d3..a01dcacc18 100644
--- a/code/__DEFINES/dye_keys.dm
+++ b/code/__DEFINES/dye_keys.dm
@@ -4,6 +4,7 @@
#define DYE_REGISTRY_SNEAKERS "sneakers"
#define DYE_REGISTRY_FANNYPACK "fannypack"
#define DYE_REGISTRY_BEDSHEET "bedsheet"
+#define DYE_LAWYER_SPECIAL "lawyer_special"
#define DYE_RED "red"
#define DYE_ORANGE "orange"
@@ -16,6 +17,7 @@
#define DYE_RAINBOW "rainbow"
#define DYE_MIME "mime"
#define DYE_COSMIC "cosmic"
+#define DYE_SYNDICATE "syndicate"
#define DYE_QM "qm"
#define DYE_LAW "law"
#define DYE_CAPTAIN "captain"
@@ -26,3 +28,5 @@
#define DYE_CMO "cmo"
#define DYE_REDCOAT "redcoat"
#define DYE_CLOWN "clown"
+#define DYE_CHAP "chap"
+#define DYE_CENTCOM "centcom"
diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm
index 0e8e34d20e..df5b7d9f11 100644
--- a/code/__DEFINES/machines.dm
+++ b/code/__DEFINES/machines.dm
@@ -41,11 +41,13 @@
#define MC_HDD "HDD"
#define MC_SDD "SDD"
#define MC_CARD "CARD"
+#define MC_CARD2 "CARD2"
#define MC_NET "NET"
#define MC_PRINT "PRINT"
#define MC_CELL "CELL"
#define MC_CHARGE "CHARGE"
#define MC_AI "AI"
+#define MC_SENSORS "SENSORS"
//NTNet stuff, for modular computers
// NTNet module-configuration values. Do not change these. If you need to add another use larger number (5..6..7 etc)
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 927b661898..0704947dda 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -116,6 +116,7 @@ Will print: "/mob/living/carbon/human/death" (you can optionally embed it in a s
#define CRAYON_FONT "Comic Sans MS"
#define PRINTER_FONT "Times New Roman"
#define SIGNFONT "Times New Roman"
+#define CHARCOAL_FONT "Candara"
#define RESIZE_DEFAULT_SIZE 1
@@ -318,9 +319,9 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define SHELTER_DEPLOY_ANCHORED_OBJECTS "anchored objects"
//debug printing macros
-#define debug_world(msg) if (GLOB.Debug2) to_chat(world, "DEBUG: [msg]")
-#define debug_usr(msg) if (GLOB.Debug2&&usr) to_chat(usr, "DEBUG: [msg]")
-#define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.admins, "DEBUG: [msg]")
+#define debug_world(msg) if (GLOB.Debug2) to_chat(world, "DEBUG: [msg]")
+#define debug_usr(msg) if (GLOB.Debug2&&usr) to_chat(usr, "DEBUG: [msg]")
+#define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.admins, "DEBUG: [msg]")
#define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]")
#define INCREMENT_TALLY(L, stat) if(L[stat]){L[stat]++}else{L[stat] = 1}
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 6ddd269b4b..9c39446a67 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -64,7 +64,6 @@
#define DEFAULT_BODYPART_ICON 'icons/mob/human_parts.dmi'
#define DEFAULT_BODYPART_ICON_ORGANIC 'icons/mob/human_parts_greyscale.dmi'
#define DEFAULT_BODYPART_ICON_ROBOTIC 'icons/mob/augmentation/augments.dmi'
-#define DEFAULT_BODYPART_ICON_CITADEL 'modular_citadel/icons/mob/mutant_bodyparts.dmi'
#define MONKEY_BODYPART "monkey"
#define ALIEN_BODYPART "alien"
@@ -333,4 +332,4 @@
/// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine()
#define EXAMINE_MORE_TIME 1 SECONDS
-#define SILENCE_RANGED_MESSAGE (1<<0)
+#define SILENCE_RANGED_MESSAGE (1<<0)
diff --git a/code/__DEFINES/rockpaperscissors.dm b/code/__DEFINES/rockpaperscissors.dm
new file mode 100644
index 0000000000..77ba81938d
--- /dev/null
+++ b/code/__DEFINES/rockpaperscissors.dm
@@ -0,0 +1,7 @@
+#define ROCKPAPERSCISSORS_RANGE 3
+#define ROCKPAPERSCISSORS_TIME_LIMIT 20 SECONDS
+
+#define ROCKPAPERSCISSORS_LOSE "lose"
+#define ROCKPAPERSCISSORS_WIN "win"
+#define ROCKPAPERSCISSORS_TIE "tie"
+#define ROCKPAPERSCISSORS_NOT_DECIDED "not_decided"
\ No newline at end of file
diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index bfff1dc629..d6db35e68d 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -30,6 +30,8 @@
#define STATUS_EFFECT_FLESHMEND /datum/status_effect/fleshmend //Very fast healing; suppressed by fire, and heals less fire damage
+#define STATUS_EFFECT_PANACEA /datum/status_effect/panacea //Anatomic panacea that directly heals, rather than injecting a small chemical cocktail
+
#define STATUS_EFFECT_EXERCISED /datum/status_effect/exercised //Prevents heart disease
#define STATUS_EFFECT_HIPPOCRATIC_OATH /datum/status_effect/hippocraticOath //Gives you an aura of healing as well as regrowing the Rod of Asclepius if lost
diff --git a/code/__DEFINES/storage/volumetrics.dm b/code/__DEFINES/storage/volumetrics.dm
index c3f45976ce..e6b732e083 100644
--- a/code/__DEFINES/storage/volumetrics.dm
+++ b/code/__DEFINES/storage/volumetrics.dm
@@ -24,7 +24,10 @@ GLOBAL_LIST_INIT(default_weight_class_to_volume, list(
// Let's keep all of this in one place. given what we put above anyways..
// volume amount for items
+/// volume for a data disk
#define ITEM_VOLUME_DISK 1
+/// volume for a shotgun stripper clip holding 4 shells
+#define ITEM_VOLUME_STRIPPER_CLIP (DEFAULT_VOLUME_NORMAL * 0.5)
// #define SAMPLE_VOLUME_AMOUNT 2
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 81b5c5620f..37ca1c66dd 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -93,7 +93,6 @@
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
#define FIRE_PRIORITY_VORE 5
-#define FIRE_PRIORITY_PING 10
#define FIRE_PRIORITY_IDLE_NPC 10
#define FIRE_PRIORITY_SERVER_MAINT 10
#define FIRE_PRIORITY_RESEARCH 10
diff --git a/code/__DEFINES/tgui.dm b/code/__DEFINES/tgui.dm
index f5adeadade..467058f27a 100644
--- a/code/__DEFINES/tgui.dm
+++ b/code/__DEFINES/tgui.dm
@@ -26,3 +26,10 @@
#define TGUI_WINDOW_ID(index) "tgui-window-[index]"
/// Get a pool index of the provided window id
#define TGUI_WINDOW_INDEX(window_id) text2num(copytext(window_id, 13))
+
+/// Creates a message packet for sending via output()
+#define TGUI_CREATE_MESSAGE(type, payload) ( \
+ url_encode(json_encode(list( \
+ "type" = type, \
+ "payload" = payload, \
+ ))))
\ No newline at end of file
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index 5e57dd5328..a5ffda36f9 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -17,7 +17,7 @@
var/matrix/mtrx=new()
return mtrx.Scale(0.65)
-proc/get_racelist(var/mob/user)//This proc returns a list of species that 'user' has available to them. It searches the list of ckeys attached to the 'whitelist' var for a species and also checks if they're an admin.
+/proc/get_racelist(mob/user)//This proc returns a list of species that 'user' has available to them. It searches the list of ckeys attached to the 'whitelist' var for a species and also checks if they're an admin.
for(var/spath in subtypesof(/datum/species))
var/datum/species/S = new spath()
var/list/wlist = S.whitelist
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index 719735392d..0171057286 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -681,3 +681,11 @@
continue
if(istype(D, path))
return TRUE
+
+/proc/safe_json_encode(list/L, default = "")
+ . = default
+ return json_encode(L)
+
+/proc/safe_json_decode(string, default = list())
+ . = default
+ return json_decode(string)
diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index 3155fe2548..11332863f5 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -1103,15 +1103,26 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
alpha += 25
obj_flags &= ~FROZEN
+/// Save file used in icon2base64. Used for converting icons to base64.
+GLOBAL_DATUM_INIT(dummySave, /savefile, new("tmp/dummySave.sav")) //Cache of icons for the browser output
-//Converts an icon to base64. Operates by putting the icon in the iconCache savefile,
-// exporting it as text, and then parsing the base64 from that.
-// (This relies on byond automatically storing icons in savefiles as base64)
-/proc/icon2base64(icon/icon, iconKey = "misc")
+
+/// Generate a filename for this asset
+/// The same asset will always lead to the same asset name
+/// (Generated names do not include file extention.)
+/proc/generate_asset_name(file)
+ return "asset.[md5(fcopy_rsc(file))]"
+
+/**
+ * Converts an icon to base64. Operates by putting the icon in the iconCache savefile,
+ * exporting it as text, and then parsing the base64 from that.
+ * (This relies on byond automatically storing icons in savefiles as base64)
+ */
+/proc/icon2base64(icon/icon)
if (!isicon(icon))
return FALSE
- WRITE_FILE(GLOB.iconCache[iconKey], icon)
- var/iconData = GLOB.iconCache.ExportText(iconKey)
+ WRITE_FILE(GLOB.dummySave["dummy"], icon)
+ var/iconData = GLOB.dummySave.ExportText("dummy")
var/list/partial = splittext(iconData, "{")
return replacetext(copytext_char(partial[2], 3, -5), "\n", "")
@@ -1137,10 +1148,10 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
if (isfile(thing)) //special snowflake
var/name = sanitize_filename("[generate_asset_name(thing)].png")
if(!SSassets.cache[name])
- register_asset(name, thing)
+ SSassets.transport.register_asset(name, thing)
for (var/thing2 in targets)
- send_asset(thing2, key)
- return ""
+ SSassets.transport.send_assets(thing2, name)
+ return "
"
var/atom/A = thing
if (isnull(dir))
dir = A.dir
@@ -1162,11 +1173,11 @@ GLOBAL_LIST_INIT(freon_color_matrix, list("#2E5E69", "#60A2A8", "#A1AFB1", rgb(0
key = "[generate_asset_name(I)].png"
if(!SSassets.cache[key])
- register_asset(key, I)
+ SSassets.transport.register_asset(key, I)
for (var/thing2 in targets)
- send_asset(thing2, key)
+ SSassets.transport.send_assets(thing2, key)
- return "
"
+ return "
"
/proc/icon2base64html(thing)
if (!thing)
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index 045ca2c519..1d09057617 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -358,7 +358,7 @@
roundend_report.stylesheets = list()
roundend_report.add_stylesheet("roundend", 'html/browser/roundend.css')
roundend_report.add_stylesheet("font-awesome", 'html/font-awesome/css/all.min.css')
- roundend_report.open(0)
+ roundend_report.open(FALSE)
/datum/controller/subsystem/ticker/proc/personal_report(client/C, popcount)
var/list/parts = list()
@@ -402,7 +402,7 @@
for (var/i in GLOB.ai_list)
var/mob/living/silicon/ai/aiPlayer = i
if(aiPlayer.mind)
- parts += "[aiPlayer.name] (Played by: [aiPlayer.mind.key])'s laws [aiPlayer.stat != DEAD ? "at the end of the round" : "when it was deactivated"] were:"
+ parts += "[aiPlayer.name][aiPlayer.mind.hide_ckey ? "" : " (Played by: [aiPlayer.mind.key])"]'s laws [aiPlayer.stat != DEAD ? "at the end of the round" : "when it was deactivated"] were:"
parts += aiPlayer.laws.get_law_list(include_zeroth=TRUE)
parts += "Total law changes: [aiPlayer.law_change_counter]"
@@ -413,14 +413,14 @@
for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots)
borg_num--
if(robo.mind)
- robolist += "[robo.name] (Played by: [robo.mind.key])[robo.stat == DEAD ? " (Deactivated)" : ""][borg_num ?", ":""]
"
+ robolist += "[robo.name][robo.mind.hide_ckey ? "" : " (Played by: [robo.mind.key])"] [robo.stat == DEAD ? " (Deactivated)" : ""][borg_num ?", ":""]
"
parts += "[robolist]"
if(!borg_spacer)
borg_spacer = TRUE
for (var/mob/living/silicon/robot/robo in GLOB.silicon_mobs)
if (!robo.connected_ai && robo.mind)
- parts += "[borg_spacer?"
":""][robo.name] (Played by: [robo.mind.key]) [(robo.stat != DEAD)? "survived as an AI-less borg!" : "was unable to survive the rigors of being a cyborg without an AI."] Its laws were:"
+ parts += "[borg_spacer?"
":""][robo.name][robo.mind.hide_ckey ? "" : " (Played by: [robo.mind.key])"] [(robo.stat != DEAD)? "survived as an AI-less borg!" : "was unable to survive the rigors of being a cyborg without an AI."] Its laws were:"
if(robo) //How the hell do we lose robo between here and the world messages directly above this?
parts += robo.laws.get_law_list(include_zeroth=TRUE)
@@ -529,7 +529,7 @@
var/jobtext = ""
if(ply.assigned_role)
jobtext = " the [ply.assigned_role]"
- var/text = "[ply.key] was [ply.name][jobtext] and"
+ var/text = "[ply.hide_ckey ? "[ply.name][jobtext] " : "[ply.key] was [ply.name][jobtext] and "]"
if(ply.current)
if(ply.current.stat == DEAD)
text += " died"
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 7a18d2ce01..bbbf99c9de 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -462,16 +462,14 @@
else
. = max(0, min(255, 138.5177312231 * log(temp - 10) - 305.0447927307))
-/proc/fusionpower2text(power) //used when displaying fusion power on analyzers
- switch(power)
- if(0 to 5)
- return "low"
- if(5 to 20)
- return "mid"
- if(20 to 50)
- return "high"
- if(50 to INFINITY)
- return "super"
+/proc/instability2text(instability) //used when displaying fusion power on analyzers
+ switch(instability)
+ if(0 to 2)
+ return "stable, meaning that its heat will always increase."
+ if(2 to 3)
+ return "metastable, meaning that its heat will trend upwards."
+ if (3 to INFINITY)
+ return "unstable, meaning that its heat will trend downwards."
/proc/color2hex(color) //web colors
if(!color)
@@ -620,6 +618,12 @@
else //regex everything else (works for /proc too)
return lowertext(replacetext("[the_type]", "[type2parent(the_type)]/", ""))
+
+/// Return html to load a url.
+/// for use inside of browse() calls to html assets that might be loaded on a cdn.
+/proc/url2htmlloader(url)
+ return {"
"
dat += "Fetish content prefs" dat += "Arousal:[arousable == TRUE ? "Enabled" : "Disabled"]" + dat += "Genital examine text:[(cit_toggles & GENITAL_EXAMINE) ? "Enabled" : "Disabled"] " + dat += "Vore examine text:[(cit_toggles & VORE_EXAMINE) ? "Enabled" : "Disabled"] " dat += "Voracious MediHound sleepers: [(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"] " dat += "Hear Vore Sounds: [(cit_toggles & EATING_NOISES) ? "Yes" : "No"] " dat += "Hear Vore Digestion Sounds: [(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"] " @@ -1438,6 +1450,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(!isnull(msg)) features["ooc_notes"] = msg + if("hide_ckey") + hide_ckey = !hide_ckey + if(user) + user.mind?.hide_ckey = hide_ckey + if("hair") var/new_hair = input(user, "Choose your character's hair colour:", "Character Preference","#"+hair_color) as color|null if(new_hair) @@ -2092,8 +2109,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) else features["body_model"] = chosengender gender = chosengender - facial_hair_style = random_facial_hair_style(gender) - hair_style = random_hair_style(gender) if("body_size") var/min = CONFIG_GET(number/body_size_min) @@ -2119,6 +2134,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/selected_custom_speech_verb = input(user, "Choose your desired speech verb (none means your species speech verb)", "Character Preference") as null|anything in GLOB.speech_verbs if(selected_custom_speech_verb) custom_speech_verb = selected_custom_speech_verb + + if("bodysprite") + var/selected_body_sprite = input(user, "Choose your desired body sprite", "Character Preference") as null|anything in pref_species.allowed_limb_ids + if(selected_body_sprite) + chosen_limb_id = selected_body_sprite //this gets sanitized before loading else switch(href_list["preference"]) //CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj @@ -2342,6 +2362,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) parent.mob.hud_used.update_parallax_pref(parent.mob) // Citadel edit - Prefs don't work outside of this. :c + + if("genital_examine") + cit_toggles ^= GENITAL_EXAMINE + + if("vore_examine") + cit_toggles ^= VORE_EXAMINE + if("hound_sleeper") cit_toggles ^= MEDIHOUND_SLEEPER @@ -2510,6 +2537,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) character.dna.features = features.Copy() character.set_species(chosen_species, icon_update = FALSE, pref_load = TRUE) + if(chosen_limb_id && (chosen_limb_id in character.dna.species.allowed_limb_ids)) + character.dna.species.mutant_bodyparts["limbs_id"] = chosen_limb_id character.dna.real_name = character.real_name character.dna.nameless = character.nameless character.dna.custom_species = character.custom_species diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index a8183e4940..8591d77e50 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -514,7 +514,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["scars3"] >> scars_list["3"] S["scars4"] >> scars_list["4"] S["scars5"] >> scars_list["5"] - + S["chosen_limb_id"] >> chosen_limb_id + S["hide_ckey"] >> hide_ckey //saved per-character //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) @@ -844,6 +845,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["feature_ooc_notes"], features["ooc_notes"]) + WRITE_FILE(S["chosen_limb_id"], chosen_limb_id) + //Custom names for(var/custom_name_id in GLOB.preferences_custom_names) var/savefile_slot_name = custom_name_id + "_name" //TODO remove this @@ -856,6 +859,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["joblessrole"] , joblessrole) //Write prefs WRITE_FILE(S["job_preferences"] , job_preferences) + WRITE_FILE(S["hide_ckey"] , hide_ckey) //Quirks WRITE_FILE(S["all_quirks"] , all_quirks) @@ -871,6 +875,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["scars4"] , scars_list["4"]) WRITE_FILE(S["scars5"] , scars_list["5"]) + //gear loadout if(chosen_gear.len) var/text_to_save = chosen_gear.Join("|") diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 951e36f9a6..e16a491c61 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -145,8 +145,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, togglemidis)() to_chat(usr, "You will no longer hear sounds uploaded by admins") usr.stop_sound_channel(CHANNEL_ADMIN) var/client/C = usr.client - if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded) - C.chatOutput.stopMusic() + C?.tgui_panel?.stop_music() SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Hearing Midis", "[usr.client.prefs.toggles & SOUND_MIDI ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/verbs/menu/Settings/Sound/togglemidis/Get_checked(client/C) return C.prefs.toggles & SOUND_MIDI @@ -234,8 +233,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/Settings/Sound, toggleprayersounds)() set desc = "Stop Current Sounds" SEND_SOUND(usr, sound(null)) var/client/C = usr.client - if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded) - C.chatOutput.stopMusic() + C?.tgui_panel?.stop_music() SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Stop Self Sounds")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index fa1145ecea..99703482b9 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -158,88 +158,6 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") else to_chat(src, "There are no admin notices at the moment.") -/client/verb/fix_chat() - set name = "Fix chat" - set category = "OOC" - if (!chatOutput || !istype(chatOutput)) - var/action = alert(src, "Invalid Chat Output data found!\nRecreate data?", "Wot?", "Recreate Chat Output data", "Cancel") - if (action != "Recreate Chat Output data") - return - chatOutput = new /datum/chatOutput(src) - chatOutput.start() - action = alert(src, "Goon chat reloading, wait a bit and tell me if it's fixed", "", "Fixed", "Nope") - if (action == "Fixed") - log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by re-creating the chatOutput datum") - else - chatOutput.load() - action = alert(src, "How about now? (give it a moment (it may also try to load twice))", "", "Yes", "No") - if (action == "Yes") - log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by re-creating the chatOutput datum and forcing a load()") - else - action = alert(src, "Welp, I'm all out of ideas. Try closing byond and reconnecting.\nWe could also disable fancy chat and re-enable oldchat", "", "Thanks anyways", "Switch to old chat") - if (action == "Switch to old chat") - winset(src, "output", "is-visible=true;is-disabled=false") - winset(src, "browseroutput", "is-visible=false") - log_game("GOONCHAT: [key_name(src)] Failed to fix their goonchat window after recreating the chatOutput and forcing a load()") - - else if (chatOutput.loaded) - var/action = alert(src, "ChatOutput seems to be loaded\nDo you want me to force a reload, wiping the chat log or just refresh the chat window because it broke/went away?", "Hmmm", "Force Reload", "Refresh", "Cancel") - switch (action) - if ("Force Reload") - chatOutput.loaded = FALSE - chatOutput.start() //this is likely to fail since it asks , but we should try it anyways so we know. - action = alert(src, "Goon chat reloading, wait a bit and tell me if it's fixed", "", "Fixed", "Nope") - if (action == "Fixed") - log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by forcing a start()") - else - chatOutput.load() - action = alert(src, "How about now? (give it a moment (it may also try to load twice))", "", "Yes", "No") - if (action == "Yes") - log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by forcing a load()") - else - action = alert(src, "Welp, I'm all out of ideas. Try closing byond and reconnecting.\nWe could also disable fancy chat and re-enable oldchat", "", "Thanks anyways", "Switch to old chat") - if (action == "Switch to old chat") - winset(src, "output", "is-visible=true;is-disabled=false") - winset(src, "browseroutput", "is-visible=false") - log_game("GOONCHAT: [key_name(src)] Failed to fix their goonchat window forcing a start() and forcing a load()") - - if ("Refresh") - chatOutput.showChat() - action = alert(src, "Goon chat refreshing, wait a bit and tell me if it's fixed", "", "Fixed", "Nope, force a reload") - if (action == "Fixed") - log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by forcing a show()") - else - chatOutput.loaded = FALSE - chatOutput.load() - action = alert(src, "How about now? (give it a moment)", "", "Yes", "No") - if (action == "Yes") - log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by forcing a load()") - else - action = alert(src, "Welp, I'm all out of ideas. Try closing byond and reconnecting.\nWe could also disable fancy chat and re-enable oldchat", "", "Thanks anyways", "Switch to old chat") - if (action == "Switch to old chat") - winset(src, "output", "is-visible=true;is-disabled=false") - winset(src, "browseroutput", "is-visible=false") - log_game("GOONCHAT: [key_name(src)] Failed to fix their goonchat window forcing a show() and forcing a load()") - return - - else - chatOutput.start() - var/action = alert(src, "Manually loading Chat, wait a bit and tell me if it's fixed", "", "Fixed", "Nope") - if (action == "Fixed") - log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by manually calling start()") - else - chatOutput.load() - alert(src, "How about now? (give it a moment (it may also try to load twice))", "", "Yes", "No") - if (action == "Yes") - log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by manually calling start() and forcing a load()") - else - action = alert(src, "Welp, I'm all out of ideas. Try closing byond and reconnecting.\nWe could also disable fancy chat and re-enable oldchat", "", "Thanks anyways", "Switch to old chat") - if (action == "Switch to old chat") - winset(src, "output", list2params(list("on-show" = "", "is-disabled" = "false", "is-visible" = "true"))) - winset(src, "browseroutput", "is-disabled=true;is-visible=false") - log_game("GOONCHAT: [key_name(src)] Failed to fix their goonchat window after manually calling start() and forcing a load()") - - /client/verb/motd() set name = "MOTD" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index cf7dbc7462..6732f1c86c 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -80,7 +80,9 @@ item_state = "hostrench" flags_inv = 0 strip_delay = 80 - unique_reskin = list("Coat" = "hostrench", "Cloak" = "trenchcloak") + unique_reskin = list("Coat" = "hostrench", + "Cloak" = "trenchcloak" + ) /obj/item/clothing/suit/armor/vest/warden name = "warden's jacket" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 27fb0cc00d..85c1d0e114 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -118,7 +118,6 @@ icon_state = "plasmaman" item_state = "plasmaman" armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 0, "fire" = 95, "acid" = 95) - slowdown = 1 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS mutantrace_variation = USE_TAUR_CLIP_MASK can_adjust = FALSE diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm index 3fd83899c9..64c07f5a38 100644 --- a/code/modules/emoji/emoji_parse.dm +++ b/code/modules/emoji/emoji_parse.dm @@ -17,7 +17,7 @@ if(search) emoji = lowertext(copytext(text, pos + length(text[pos]), search)) var/isthisapath = (emoji[1] == "/") && text2path(emoji) - var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat) + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat) var/tag = sheet.icon_tag("emoji-[emoji]") if(tag) parsed += "[tag]" //evil way of enforcing 16x16 diff --git a/code/modules/events/brain_trauma.dm b/code/modules/events/brain_trauma.dm index 3e8182a827..0a07e2a693 100644 --- a/code/modules/events/brain_trauma.dm +++ b/code/modules/events/brain_trauma.dm @@ -14,7 +14,8 @@ continue if(!H.getorgan(/obj/item/organ/brain)) // If only I had a brain continue - + if(HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS)) + continue traumatize(H) break diff --git a/code/modules/events/fake_virus.dm b/code/modules/events/fake_virus.dm index 77520198e8..cebf1ed14b 100644 --- a/code/modules/events/fake_virus.dm +++ b/code/modules/events/fake_virus.dm @@ -6,7 +6,7 @@ /datum/round_event/fake_virus/start() var/list/fake_virus_victims = list() for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list)) - if(!H.client || H.stat == DEAD || H.InCritical()) + if(!H.client || H.stat == DEAD || H.InCritical() || HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS)) continue fake_virus_victims += H diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 895699434a..4d5f4e2dd0 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -97,9 +97,12 @@ All foods are distributed among various categories. Use common sense. return -/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, def_zone) +/obj/item/reagent_containers/food/snacks/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(user.a_intent == INTENT_HARM) return ..() + INVOKE_ASYNC(src, .proc/attempt_forcefeed, M, user) + +/obj/item/reagent_containers/food/snacks/proc/attempt_forcefeed(mob/living/M, mob/living/user) if(!eatverb) eatverb = pick("bite","chew","nibble","gnaw","gobble","chomp") if(!reagents.total_volume) //Shouldn't be needed but it checks to see if it has anything left in it. diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm deleted file mode 100644 index ce27dccb74..0000000000 --- a/code/modules/goonchat/browserOutput.dm +++ /dev/null @@ -1,341 +0,0 @@ -/********************************* -For the main html chat area -*********************************/ - -/// Should match the value set in the browser js -#define MAX_COOKIE_LENGTH 5 - -//Precaching a bunch of shit. Someone ship this out of here -GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of icons for the browser output - -//lazy renaming to chat_output, instead renamed to old chatOutput -/** - * The chatOutput datum exists to handle the goonchat browser. - * On client, created on Client/New() - */ -/datum/chatOutput - /// The client that owns us. - var/client/owner - /// How many times client data has been checked - var/total_checks = 0 - /// When to next clear the client data checks counter - var/next_time_to_clear = 0 - /// Has the client loaded the browser output area? - var/loaded = FALSE - /// If they haven't loaded chat, this is where messages will go until they do - var/list/messageQueue - var/cookieSent = FALSE // Has the client sent a cookie for analysis - var/broken = FALSE - var/list/connectionHistory //Contains the connection history passed from chat cookie - var/adminMusicVolume = 25 //This is for the Play Global Sound verb - -/datum/chatOutput/New(client/C) - owner = C - messageQueue = list() - connectionHistory = list() - -/** - * start: Tries to load the chat browser - * Aborts if a problem is encountered. - * Async because this is called from Client/New. - */ -/datum/chatOutput/proc/start() - set waitfor = FALSE - //Check for existing chat - if(!owner) - return FALSE - - if(!winexists(owner, "browseroutput")) // Oh goddamnit. - broken = TRUE - message_admins("Couldn't start chat for [key_name_admin(owner)]!") - . = FALSE - alert(owner.mob, "Updated chat window does not exist. If you are using a custom skin file please allow the game to update.") - return - - if(winget(owner, "browseroutput", "is-visible") == "true") //Already setup - doneLoading() - - else //Not setup - load() - - return TRUE - -/// Loads goonchat and sends assets. -/datum/chatOutput/proc/load() - set waitfor = FALSE - if(!owner) - return - - var/datum/asset/stuff = get_asset_datum(/datum/asset/group/goonchat) - stuff.send(owner) - - owner << browse(file('code/modules/goonchat/browserassets/html/browserOutput.html'), "window=browseroutput") - -/// Interprets input from the client. Will send data back if required. -/datum/chatOutput/Topic(href, list/href_list) - if(usr.client != owner) - return TRUE - - // Build arguments. - // Arguments are in the form "param[paramname]=thing" - var/list/params = list() - for(var/key in href_list) - if(length_char(key) > 7 && findtext(key, "param")) // 7 is the amount of characters in the basic param key template. - var/param_name = copytext_char(key, 7, -1) - var/item = href_list[key] - - params[param_name] = item - - var/data // Data to be sent back to the chat. - switch(href_list["proc"]) - if("doneLoading") - data = doneLoading(arglist(params)) - - if("debug") - data = debug(arglist(params)) - - if("ping") - data = ping(arglist(params)) - - if("analyzeClientData") - data = analyzeClientData(arglist(params)) - - if("setMusicVolume") - data = setMusicVolume(arglist(params)) - if("colorPresetPost") //User just swapped color presets in their goonchat preferences. Do we do anything else? - switch(href_list["preset"]) - if("light") - owner.force_white_theme() - if("dark" || "normal") - owner.force_dark_theme() - // if("swaptodarkmode") - // swaptodarkmode() - // if("swaptolightmode") - // swaptolightmode() - - if(data) - ehjax_send(data = data) - - -/// Called on chat output done-loading by JS. -/datum/chatOutput/proc/doneLoading() - if(loaded) - return - - testing("Chat loaded for [owner.ckey]") - loaded = TRUE - showChat() - - - for(var/message in messageQueue) - // whitespace has already been handled by the original to_chat - to_chat(owner, message, handle_whitespace=FALSE) - - messageQueue = null - sendClientData() - - syncRegex() - - //do not convert to to_chat() - SEND_TEXT(owner, "Failed to load fancy chat, reverting to old chat. Certain features won't work.") - -/// Hides the standard output and makes the browser visible. -/datum/chatOutput/proc/showChat() - winset(owner, "output", "is-visible=false") - winset(owner, "browseroutput", "is-disabled=false;is-visible=true") - -/// Calls syncRegex on all currently owned chatOutput datums -/proc/syncChatRegexes() - for (var/user in GLOB.clients) - var/client/C = user - var/datum/chatOutput/Cchat = C.chatOutput - if (Cchat && !Cchat.broken && Cchat.loaded) - Cchat.syncRegex() - -/// Used to dynamically add regexes to the browser output. Currently only used by the IC filter. -/datum/chatOutput/proc/syncRegex() - var/list/regexes = list() - /* - if (config.ic_filter_regex) - regexes["show_filtered_ic_chat"] = list( - config.ic_filter_regex.name, - "ig", - "$1" - ) - */ - if (regexes.len) - ehjax_send(data = list("syncRegex" = regexes)) - -/// Sends json encoded data to the browser. -/datum/chatOutput/proc/ehjax_send(client/C = owner, window = "browseroutput", data) - if(islist(data)) - data = json_encode(data) - C << output("[data]", "[window]:ehjaxCallback") - -/** - * Sends music data to the browser. If enabled by the browser, it will start playing. - * Arguments: - * music must be a https adress. - * extra_data is a list. The keys "pitch", "start" and "end" are used. - ** "pitch" determines the playback rate - ** "start" determines the start time of the sound - ** "end" determines when the musics stops playing - */ -/datum/chatOutput/proc/sendMusic(music, pitch, list/extra_data) //someone remove pitch - if(!findtext(music, GLOB.is_http_protocol)) - return - var/list/music_data = list("adminMusic" = url_encode(url_encode(music))) - - if(extra_data?.len) - music_data["musicRate"] = extra_data["pitch"] || pitch - music_data["musicSeek"] = extra_data["start"] - music_data["musicHalt"] = extra_data["end"] - - ehjax_send(data = music_data) - -/// Stops music playing throw the browser. -/datum/chatOutput/proc/stopMusic() - ehjax_send(data = "stopMusic") - -/// Setter for adminMusicVolume. Sanitizes the value to between 0 and 100. -/datum/chatOutput/proc/setMusicVolume(volume = "") - if(volume) - adminMusicVolume = clamp(text2num(volume), 0, 100) - -/// Sends client connection details to the chat to handle and save -/datum/chatOutput/proc/sendClientData() - //Get dem deets - var/list/deets = list("clientData" = list()) - deets["clientData"]["ckey"] = owner.ckey - deets["clientData"]["ip"] = owner.address - deets["clientData"]["compid"] = owner.computer_id - var/data = json_encode(deets) - ehjax_send(data = data) - -/// Called by client, sent data to investigate (cookie history so far) -/datum/chatOutput/proc/analyzeClientData(cookie = "") - //Spam check - if(world.time > next_time_to_clear) - next_time_to_clear = world.time + (3 SECONDS) - total_checks = 0 - - total_checks += 1 - - if(total_checks > SPAM_TRIGGER_AUTOMUTE) - message_admins("[key_name(owner)] kicked for goonchat topic spam") - qdel(owner) - return - - if(!cookie) - return - - if(cookie != "none") - var/list/connData = json_decode(cookie) - if (connData && islist(connData) && connData.len > 0 && connData["connData"]) - connectionHistory = connData["connData"] //lol fuck - var/list/found = new() - - if(connectionHistory.len > MAX_COOKIE_LENGTH) - message_admins("[key_name(src.owner)] was kicked for an invalid ban cookie)") - qdel(owner) - return - - for(var/i in connectionHistory.len to 1 step -1) - if(QDELETED(owner)) - //he got cleaned up before we were done - return - var/list/row = src.connectionHistory[i] - if (!row || row.len < 3 || (!row["ckey"] || !row["compid"] || !row["ip"])) //Passed malformed history object - return - if (world.IsBanned(row["ckey"], row["ip"], row["compid"], real_bans_only=TRUE)) - found = row - break - CHECK_TICK - - //Uh oh this fucker has a history of playing on a banned account!! - if (found.len > 0) - message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") - log_admin_private("[key_name(owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") - - cookieSent = TRUE - -/// Called by js client every 60 seconds -/datum/chatOutput/proc/ping() - return "pong" - -/// Called by js client on js error -/datum/chatOutput/proc/debug(error) - log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]") - -/// Global chat proc. to_chat_immediate will circumvent SSchat and send data as soon as possible. -/proc/to_chat_immediate(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = FALSE) - if(!target || !message) - return - - if(target == world) - target = GLOB.clients - - var/original_message = message - if(handle_whitespace) - message = replacetext(message, "\n", " ") - message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") //EIGHT SPACES IN TOTAL!! - if(trailing_newline) - message += " " - - if(islist(target)) - // Do the double-encoding outside the loop to save nanoseconds - var/twiceEncoded = url_encode(url_encode(message)) - for(var/I in target) - var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible - - if (!C) - continue - - //Send it to the old style output window. - SEND_TEXT(C, original_message) - - if(!C.chatOutput || C.chatOutput.broken) // A player who hasn't updated his skin file. - continue - - if(!C.chatOutput.loaded) - //Client still loading, put their messages in a queue - C.chatOutput.messageQueue += message - continue - - C << output(twiceEncoded, "browseroutput:output") - else - var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible - - if (!C) - return - - //Send it to the old style output window. - SEND_TEXT(C, original_message) - - if(!C.chatOutput || C.chatOutput.broken) // A player who hasn't updated his skin file. - return - - if(!C.chatOutput.loaded) - //Client still loading, put their messages in a queue - C.chatOutput.messageQueue += message - return - - // url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. - C << output(url_encode(url_encode(message)), "browseroutput:output") - -/// Sends a text message to the target. -/proc/to_chat(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = FALSE) - if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized) - to_chat_immediate(target, message, handle_whitespace, trailing_newline, confidential) - return - SSchat.queue(target, message, handle_whitespace, trailing_newline, confidential) - -/// Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation) -/datum/chatOutput/proc/swaptolightmode() - owner.force_white_theme() - -/// Light mode stuff. (See darkmode.dm for documentation) -/datum/chatOutput/proc/swaptodarkmode() - owner.force_dark_theme() - -#undef MAX_COOKIE_LENGTH diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css deleted file mode 100644 index 2669a3634a..0000000000 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ /dev/null @@ -1,464 +0,0 @@ -/***************************************** -* -* GLOBAL STYLES -* -******************************************/ -html, body { - padding: 0; - margin: 0; - height: 100%; - color: #000000; -} -body { - background: #E0E0E0; /*CIT CHANGE - darkens chatbox a lil*/ - font-family: Verdana, sans-serif; - font-size: 13px; - line-height: 1.2; - overflow-x: hidden; - overflow-y: scroll; - word-wrap: break-word; -} - -em { - font-style: normal; - font-weight: bold; -} - -img { - margin: 0; - padding: 0; - line-height: 1; - -ms-interpolation-mode: nearest-neighbor; - image-rendering: pixelated; -} -img.icon { - height: 1em; - min-height: 16px; - width: auto; - vertical-align: bottom; -} - - -.r:before { /* "repeated" badge class for combined messages */ - content: 'x'; -} -.r { - display: inline-block; - min-width: 0.5em; - font-size: 0.7em; - padding: 0.2em 0.3em; - line-height: 1; - color: white; - text-align: center; - white-space: nowrap; - vertical-align: middle; - background-color: crimson; - border-radius: 10px; -} - -a {color: #0000ff;} -a.visited {color: #ff00ff;} -a:visited {color: #ff00ff;} -a.popt {text-decoration: none;} - -/***************************************** -* -* OUTPUT NOT RELATED TO ACTUAL MESSAGES -* -******************************************/ -#loading { - position: fixed; - width: 300px; - height: 150px; - text-align: center; - left: 50%; - top: 50%; - margin: -75px 0 0 -150px; -} -#loading i {display: block; padding-bottom: 3px;} - -#messages { - font-size: 13px; - padding: 3px; - margin: 0; - word-wrap: break-word; -} -#newMessages { - position: fixed; - display: block; - bottom: 0; - right: 0; - padding: 8px; - background: #d0d0d0; - text-decoration: none; - font-variant: small-caps; - font-size: 1.1em; - font-weight: bold; - color: #333; -} -#newMessages:hover {background: #ccc;} -#newMessages i {vertical-align: middle; padding-left: 3px;} -#ping { - position: fixed; - top: 0; - right: 135px; - width: 45px; - background: #d0d0d0; - height: 30px; - padding: 8px 0 2px 0; -} -#ping i {display: block; text-align: center;} -#ping .ms { - display: block; - text-align: center; - font-size: 8pt; - padding-top: 2px; -} -#userBar { - position: fixed; - top: 0; - right: 0; -} -#userBar .subCell { - background: #d0d0d0; - height: 30px; - padding: 5px 0; - display: block; - color: #333; - text-decoration: none; - line-height: 28px; - border-top: 1px solid #b4b4b4; -} -#userBar .subCell:hover {background: #ccc;} -#userBar .toggle { - width: 45px; - background: #ccc; - border-top: 0; - float: right; - text-align: center; -} -#userBar .sub {clear: both; display: none; width: 180px;} -#userBar .sub.scroll {overflow-y: scroll;} -#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;} -#userBar .sub span { - display: block; - line-height: 30px; - float: left; -} -#userBar .sub i { - display: block; - padding: 0 5px; - font-size: 1.1em; - width: 22px; - text-align: center; - line-height: 30px; - float: right; -} -#userBar .sub input { - position: absolute; - padding: 7px 5px; - width: 121px; - line-height: 30px; - float: left; -} -#userBar .topCell {border-top: 0;} - -/* POPUPS */ -.popup { - position: fixed; - top: 50%; - left: 50%; - background: #d0d0d0; -} -.popup .close { - position: absolute; - background: #aaa; - top: 0; - right: 0; - color: #333; - text-decoration: none; - z-index: 2; - padding: 0 10px; - height: 30px; - line-height: 30px; -} -.popup .close:hover {background: #999;} -.popup .head { - background: #999; - color: #d0d0d0; - padding: 0 10px; - height: 30px; - line-height: 30px; - text-transform: uppercase; - font-size: 0.9em; - font-weight: bold; - border-bottom: 2px solid green; -} -.popup input {border: 1px solid #999; background: #fff; margin: 0; padding: 5px; outline: none; color: #333;} -.popup input[type=text]:hover, .popup input[type=text]:active, .popup input[type=text]:focus {border-color: green;} -.popup input[type=submit] {padding: 5px 10px; background: #999; color: #d0d0d0; text-transform: uppercase; font-size: 0.9em; font-weight: bold;} -.popup input[type=submit]:hover, .popup input[type=submit]:focus, .popup input[type=submit]:active {background: #aaa; cursor: pointer;} - -.changeFont {padding: 10px;} -.changeFont a {display: block; text-decoration: none; padding: 3px; color: #333;} -.changeFont a:hover {background: #ccc;} - -.highlightPopup {padding: 10px; text-align: center;} -.highlightPopup input[type=text] {display: block; width: 215px; text-align: left; margin-top: 5px;} -.highlightPopup input.highlightColor {background-color: #FFFF00;} -.highlightPopup input.highlightTermSubmit {margin-top: 5px;} - -/* ADMIN CONTEXT MENU */ -.contextMenu { - background-color: #d0d0d0; - position: fixed; - margin: 2px; - width: 150px; -} -.contextMenu a { - display: block; - padding: 2px 5px; - text-decoration: none; - color: #333; -} - -.contextMenu a:hover { - background-color: #ccc; -} - -/* ADMIN FILTER MESSAGES MENU */ -.filterMessages {padding: 5px;} -.filterMessages div {padding: 2px 0;} -.filterMessages input {} -.filterMessages label {} - -.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;} - - -/***************************************** -* -* OUTPUT ACTUALLY RELATED TO MESSAGES -* -******************************************/ - -/* MOTD */ -.motd {color: #638500; font-family: Verdana, sans-serif;} -.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;} -.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;} - -/* ADD HERE FOR BOLD */ -.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;} - -/* ADD HERE FOR ITALIC */ -.italic, .italics, .emote {font-style: italic;} - -/* OUTPUT COLORS */ -.highlight {background: yellow;} - -h1, h2, h3, h4, h5, h6 {color: #0000ff;font-family: Georgia, Verdana, sans-serif;} -h1.alert, h2.alert {color: #000000;} - -em {font-style: normal; font-weight: bold;} - -.ooc {color: #002eb8; font-weight: bold;} -.looc {color: #6699CC; font-weight: bold;} -.antagooc {color: #b8002e; font-weight: bold;} -.adminobserverooc {color: #0099cc; font-weight: bold;} -.adminooc {color: #700038; font-weight: bold;} - -.adminsay {color: #FF4500} -.admin {color: #386aff; font-weight: bold;} - -.name { font-weight: bold;} - -.say {} -.deadsay {color: #5c00e6;} -.binarysay {color: #20c20e; background-color: #000000; display: block;} -.binarysay a {color: #00ff00;} -.binarysay a:active, .binarysay a:visited {color: #88ff88;} -.radio {color: #008000;} -.sciradio {color: #993399;} -.comradio {color: #948f02;} -.secradio {color: #a30000;} -.medradio {color: #337296;} -.engradio {color: #fb5613;} -.suppradio {color: #a8732b;} -.servradio {color: #6eaa2c;} -.syndradio {color: #6d3f40;} -.centcomradio {color: #686868;} -.aiprivradio {color: #ff00ff;} -.redteamradio {color: #ff0000;} -.blueteamradio {color: #0000ff;} - -.yell { font-weight: bold;} - -.alert {color: #ff0000;} -h1.alert, h2.alert {color: #000000;} - -.emote { font-style: italic;} -.selecteddna {color: #ffffff; background-color: #001B1B} - -.attack {color: #ff0000;} -.disarm {color: #990000;} -.passive {color: #660000;} - -.userdanger {color: #ff0000; font-weight: bold; font-size: 185%;} -.bolddanger {color: #c51e1e;font-weight: bold;} -.danger {color: #ff0000;} -.tinydanger {color: #c51e1e; font-size: 85%;} -.smalldanger {color: #c51e1e; font-size: 90%;} -.warning {color: #ff0000; font-style: italic;} -.alertwarning {color: #FF0000; font-weight: bold} -.boldwarning {color: #ff0000; font-style: italic; font-weight: bold} -.announce {color: #228b22; font-weight: bold;} -.boldannounce {color: #ff0000; font-weight: bold;} -.greenannounce {color: #00ff00; font-weight: bold;} -.rose {color: #ff5050;} -.info {color: #0000CC;} -.notice {color: #000099;} -.tinynotice {color: #6685f5; font-style: italic; font-size: 85%;} -.smallnotice {color: #6685f5; font-size: 90%;} -.smallnoticeital {color: #6685f5; font-style: italic; font-size: 90%;} -.boldnotice {color: #000099; font-weight: bold;} -.adminnotice {color: #0000ff;} -.adminhelp {color: #ff0000; font-weight: bold;} -.unconscious {color: #0000ff; font-weight: bold;} -.suicide {color: #ff5050; font-style: italic;} -.green {color: #03ff39;} -.red {color: #FF0000;} -.pink {color: #FF69Bf;} -.blue {color: #0000FF;} -.nicegreen {color: #14a833;} -.userlove {color: #FF1493; font-style: italic; font-weight: bold; text-shadow: 0 0 6px #ff6dbc;} -.love {color: #ff006a; font-style: italic; text-shadow: 0 0 6px #ff6d6d;} -.shadowling {color: #3b2769;} -.cult {color: #960000;} - -.cultitalic {color: #960000; font-style: italic;} -.cultbold {color: #960000; font-style: italic; font-weight: bold;} -.cultboldtalic {color: #960000; font-weight: bold; font-size: 185%;} - -.cultlarge {color: #960000; font-weight: bold; font-size: 185%;} -.narsie {color: #960000; font-weight: bold; font-size: 925%;} -.narsiesmall {color: #960000; font-weight: bold; font-size: 370%;} -.colossus {color: #7F282A; font-size: 310%;} -.hierophant {color: #660099; font-weight: bold; font-style: italic;} -.hierophant_warning {color: #660099; font-style: italic;} -.purple {color: #5e2d79;} -.holoparasite {color: #35333a;} - -.revennotice {color: #1d2953;} -.revenboldnotice {color: #1d2953; font-weight: bold;} -.revenbignotice {color: #1d2953; font-weight: bold; font-size: 185%;} -.revenminor {color: #823abb} -.revenwarning {color: #760fbb; font-style: italic;} -.revendanger {color: #760fbb; font-weight: bold; font-size: 185%;} -.umbra {color: #5000A0;} -.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;} -.umbra_large {color: #5000A0; font-size: 185%; font-weight: bold; font-style: italic;} - -.deconversion_message {color: #5000A0; font-size: 185%; font-style: italic;} - -.brass {color: #BE8700;} -.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;} -.large_brass {color: #BE8700; font-size: 185%;} -.big_brass {color: #BE8700; font-size: 185%; font-weight: bold; font-style: italic;} -.ratvar {color: #BE8700; font-size: 370%; font-weight: bold; font-style: italic;} -.alloy {color: #42474D;} -.heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;} -.nezbere_large {color: #42474D; font-size: 185%; font-weight: bold; font-style: italic;} -.nezbere {color: #42474D; font-weight: bold; font-style: italic;} -.nezbere_small {color: #42474D;} -.sevtug_large {color: #AF0AAF; font-size: 185%; font-weight: bold; font-style: italic;} -.sevtug {color: #AF0AAF; font-weight: bold; font-style: italic;} -.sevtug_small {color: #AF0AAF;} -.inathneq_large {color: #1E8CE1; font-size: 185%; font-weight: bold; font-style: italic;} -.inathneq {color: #1E8CE1; font-weight: bold; font-style: italic;} -.inathneq_small {color: #1E8CE1;} -.nzcrentr_large {color: #DAAA18; font-size: 185%; font-weight: bold; font-style: italic;} -.nzcrentr {color: #DAAA18; font-weight: bold; font-style: italic;} -.nzcrentr_small {color: #DAAA18;} -.neovgre_large {color: #6E001A; font-size: 185%; font-weight: bold; font-style: italic;} -.neovgre {color: #6E001A; font-weight: bold; font-style: italic;} -.neovgre_small {color: #6E001A;} - -.newscaster {color: #800000;} -.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} - -.alien {color: #543354;} -.noticealien {color: #00c000;} -.alertalien {color: #00c000; font-weight: bold;} -.changeling {color: #800080; font-style: italic;} - -.spider {color: #4d004d; font-weight: bold; font-size: 185%;} - -.interface {color: #330033;} - -.sans {font-family: "Comic Sans MS", cursive, sans-serif;} -.papyrus {font-family: "Papyrus", cursive, sans-serif;} -.robot {font-family: "Courier New", cursive, sans-serif;} - -.command_headset {font-weight: bold; font-size: 160%;} -.small {font-size: 60%;} -.big {font-size: 185%;} -.reallybig {font-size: 245%;} -.extremelybig {font-size: 310%;} -.greentext {color: #00FF00; font-size: 185%;} -.redtext {color: #FF0000; font-size: 185%;} -.clown {color: #FF69Bf; font-size: 160%; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} -.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;} -.spooky {color: #FF6100;} -.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;} - -.lethal {color: #bf3d3d; font-weight: bold;} -.stun {color: #0f81bc; font-weight: bold;} -.ion {color: #d084d6; font-weight: bold;} -.xray {color: #32c025; font-weight: bold;} - -@keyframes velvet { - 0% { color: #400020; } - 40% { color: #FF0000; } - 50% { color: #FF8888; } - 60% { color: #FF0000; } - 100% { color: #400020; } -} - -.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite;} -@keyframes hypnocolor { - 0% { color: #202020; } - 25% { color: #4b02ac; } - 50% { color: #9f41f1; } - 75% { color: #541c9c; } - 100% { color: #7adbf3; } -} - -.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;} -@keyframes phobia { - 0% { color: #f75a5a; } - 50% { color: #dd0000; } - 100% { color: #f75a5a; } -} - - -.icon {height: 1em; width: auto;} - -.memo {color: #638500; text-align: center;} -.memoedit {text-align: center; font-size: 125%;} -.abductor {color: #800080; font-style: italic;} -.mind_control {color: #A00D6F; font-size: 100%; font-weight: bold; font-style: italic;} -.slime {color: #00CED1;} -.drone {color: #848482;} -.monkey {color: #975032;} -.swarmer {color: #2C75FF;} -.resonate {color: #298F85;} - -.monkeyhive {color: #774704;} -.monkeylead {color: #774704; font-size: 125%;} - -.connectionClosed, .fatalError {background: red; color: white; padding: 5px;} -.connectionClosed.restored {background: green;} -.internal.boldnshit {color: #000099; font-weight: bold;} - -/* HELPER CLASSES */ -.text-normal {font-weight: normal; font-style: normal;} -.hidden {display: none; visibility: hidden;} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_dark.css b/code/modules/goonchat/browserassets/css/browserOutput_dark.css deleted file mode 100644 index 3377bcf72c..0000000000 --- a/code/modules/goonchat/browserassets/css/browserOutput_dark.css +++ /dev/null @@ -1,159 +0,0 @@ -html, body {color: #E0E0E0;} -body { - background: #171717; - font-color: #E0E0E0; - scrollbar-face-color:#1A1A1A; - scrollbar-track-color:#171717; - scrollbar-highlight-color:#171717; -} - -a {color: #397ea5;} -a.visited {color: #7c00e6;} -a:visited {color: #7c00e6;} - -#newMessages { - background: #242424; - color: #E0E0E0; -} -#newMessages:hover {background: #272727;} - -#ping {background: #272727;} - -#userBar .subCell { - background: #272727; - color: #E0E0E0; - border-top: 1px solid #171717; -} -#userBar .subCell:hover {background: #272727;} -#userBar .toggle {background: #272727;} - -/* MOTD */ -.motd {color: #E0E0E0;} -.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #E0E0E0;} -.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #E0E0E0;} - -h1, h2, h3, h4, h5, h6 {color: #E0E0E0;} -h1.alert, h2.alert {color: #E0E0E0;} - -.ooc {color: #cca300;} -.looc {color: #d8b555;} -.antagooc {color: #ce254f;} -.adminobserverooc {color: #0099cc;} -.adminooc {color: #3d5bc3;} - -.admin {color: #5975da;} - -.deadsay {color: #e2c1ff;} -.radio {color: #1ecc43;} -.sciradio {color: #c68cfa;} -.comradio {color: #5177ff;} -.secradio {color: #dd3535;} -.medradio {color: #57b8f0;} -.engradio {color: #f37746;} -.suppradio {color: #b88646;} -.servradio {color: #6ca729;} -.syndradio {color: #8f4a4b;} -.centcomradio {color: #2681a5;} -.aiprivradio {color: #d65d95;} -.redteamradio {color: #ff4444;} -.blueteamradio {color: #3434fd;} - -.alert {color: #d82020;} -h1.alert, h2.alert {color: #99aab5;} - -.attack {color: #e01c1c;} -.disarm {color: #b42525;} -.passive {color: #a00f0f;} - -.userdanger {color: #c51e1e;} -.danger {color: #c51e1e;} -.warning {color: #c51e1e;} -.alertwarning {color: #c51e1e;} -.boldwarning {color: #c51e1e;} -.announce {color: #c51e1e;} -.boldannounce {color: #c51e1e;} -.greenannounce {color: #059223;} -.info {color: #6685f5;} -.notice {color: #6685f5;} -.boldnotice {color: #6685f5;} -.adminnotice {color: #6685f5;} -.adminhelp {color: #ff0000;} -.unconscious {color: #E0E0E0;} -.red {color: #FF0000;} -.pink {color: #ff70c1;} -.blue {color: #215cff;} -.green {color: #059223;} -.nicegreen {color: #059223;} -.userlove {color: #ff42a6; text-shadow: 0 0 6px #82365e;} -.love {color: #ff4591; text-shadow: 0 0 6px #994449;} -.shadowling {color: #8e8a99;} -.cult {color: #aa1c1c;} - -.cultitalic {color: #aa1c1c;} -.cultbold {color: #aa1c1c;} -.cultboldtalic {color: #aa1c1c;} - -.cultlarge {color: #aa1c1c;} -.narsie {color: #aa1c1c;} -.narsiesmall {color: #aa1c1c;} -.hierophant {color: #b441ee;} -.hierophant_warning {color: #c56bf1;} -.purple {color: #9956d3;} -.holoparasite {color: #88809c;} - -.revennotice {color: #3645aa;} -.revenboldnotice {color: #3645aa;} -.revenbignotice {color: #3645aa;} -.revenminor {color: #823ddd;} -.revenwarning {color: #8911d9;} -.revendanger {color: #8911d9;} -.umbra {color: #7c00e6;} -.umbra_emphasis {color: #7c00e6;} -.umbra_large {color: #7c00e6;} - -.deconversion_message {color: #a947ff;} - -.alloy {color: #545b64;} -.heavy_alloy {color: #545b64;} -.nezbere_large {color: #545b64;} -.nezbere {color: #545b64;} -.nezbere_small {color: #545b64;} -.inathneq_large {color: #1d7dc7;} -.inathneq {color: #1d7dc7;} -.inathneq_small {color: #1d7dc7;} -.neovgre_large {color: #7c0622;} -.neovgre {color: #7c0622;} -.neovgre_small {color: #7c0622;} - -.newscaster {color: #c05d5d;} -.ghostalert {color: #6600ff;} - -.alien {color: #855d85;} -.noticealien {color: #059223;} -.alertalien {color: #059223;} -.changeling {color: #059223;} - -.spider {color: #8800ff;} - -.interface {color: #750e75;} - -.greentext {color: #059223;} -.redtext {color: #c51e1e;} -.clown {color: #ff70c1;} -.velvet {color: #660015;} -@keyframes velvet { - 0% { color: #890020; } - 40% { color: #c51e1e; } - 50% { color: #FF8888; } - 60% { color: #c51e1e; } - 100% { color: #890020; } -} - -.abductor {color: #c204c2;} -.mind_control {color: #df3da9;} -.drone {color: #979795;} - -.monkeyhive {color: #a56408;} -.monkeylead {color: #af6805;} - -.internal.boldnshit {color: #3d5bc3;} diff --git a/code/modules/goonchat/browserassets/css/browserOutput_light.css b/code/modules/goonchat/browserassets/css/browserOutput_light.css deleted file mode 100644 index b7036c74d8..0000000000 --- a/code/modules/goonchat/browserassets/css/browserOutput_light.css +++ /dev/null @@ -1,14 +0,0 @@ -body {background: #F1F1F1;} - -#newMessages {background: #ddd;} -#ping {background: #ddd;} - -#userBar .subCell {background: #ddd;} - -/* POPUPS */ -.popup {background: #ddd;} -.popup .head {color: #ddd;} -.popup input[type=submit] {color: #ddd;} - -/* ADMIN CONTEXT MENU */ -.contextMenu {background-color: #ddd;} diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html deleted file mode 100644 index ce51cd8de8..0000000000 --- a/code/modules/goonchat/browserassets/html/browserOutput.html +++ /dev/null @@ -1,58 +0,0 @@ - - - -
-
-
-
- Loading...
- - If this takes longer than 30 seconds, it will automatically reload a maximum of 5 times. - If it still doesn't work, use the bug report button at the top right of the window. -
-
-
-
-
-
-
-
diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js
deleted file mode 100644
index ac30076de4..0000000000
--- a/code/modules/goonchat/browserassets/js/browserOutput.js
+++ /dev/null
@@ -1,1104 +0,0 @@
-
-/*****************************************
-*
-* FUNCTION AND VAR DECLARATIONS
-*
-******************************************/
-
-//DEBUG STUFF
-var escaper = encodeURIComponent || escape;
-var decoder = decodeURIComponent || unescape;
-window.onerror = function(msg, url, line, col, error) {
- if (document.location.href.indexOf("proc=debug") <= 0) {
- var extra = !col ? '' : ' | column: ' + col;
- extra += !error ? '' : ' | error: ' + error;
- extra += !navigator.userAgent ? '' : ' | user agent: ' + navigator.userAgent;
- var debugLine = 'Error: ' + msg + ' | url: ' + url + ' | line: ' + line + extra;
- window.location = '?_src_=chat&proc=debug¶m[error]='+escaper(debugLine);
- }
- return true;
-};
-
-//Globals
-window.status = 'Output';
-var $messages, $subOptions, $subAudio, $selectedSub, $contextMenu, $filterMessages, $last_message;
-var opts = {
- //General
- 'messageCount': 0, //A count...of messages...
- 'messageLimit': 2053, //A limit...for the messages...
- 'scrollSnapTolerance': 10, //If within x pixels of bottom
- 'clickTolerance': 10, //Keep focus if outside x pixels of mousedown position on mouseup
- 'imageRetryDelay': 50, //how long between attempts to reload images (in ms)
- 'imageRetryLimit': 50, //how many attempts should we make?
- 'popups': 0, //Amount of popups opened ever
- 'wasd': false, //Is the user in wasd mode?
- 'priorChatHeight': 0, //Thing for height-resizing detection
- 'restarting': false, //Is the round restarting?
- 'colorPreset': 0, // index in the color presets list.
- //'darkmode':false, //Are we using darkmode? If not WHY ARE YOU LIVING IN 2009??? <- /tg/ take on darktheme
-
- //Options menu
- 'selectedSubLoop': null, //Contains the interval loop for closing the selected sub menu
- 'suppressSubClose': false, //Whether or not we should be hiding the selected sub menu
- 'highlightTerms': [],
- 'highlightLimit': 5,
- 'highlightColor': '#FFFF00', //The color of the highlighted message
- 'pingDisabled': false, //Has the user disabled the ping counter
-
- //Ping display
- 'lastPang': 0, //Timestamp of the last response from the server.
- 'pangLimit': 35000,
- 'pingTime': 0, //Timestamp of when ping sent
- 'pongTime': 0, //Timestamp of when ping received
- 'noResponse': false, //Tracks the state of the previous ping request
- 'noResponseCount': 0, //How many failed pings?
-
- //Clicks
- 'mouseDownX': null,
- 'mouseDownY': null,
- 'preventFocus': false, //Prevents switching focus to the game window
-
- //Client Connection Data
- 'clientDataLimit': 5,
- 'clientData': [],
-
- //Admin music volume update
- 'volumeUpdateDelay': 5000, //Time from when the volume updates to data being sent to the server
- 'volumeUpdating': false, //True if volume update function set to fire
- 'updatedVolume': 0, //The volume level that is sent to the server
- 'musicStartAt': 0, //The position the music starts playing
- 'musicEndAt': 0, //The position the music... stops playing... if null, doesn't apply (so the music runs through)
-
- 'defaultMusicVolume': 25,
-
- 'messageCombining': true,
-
-};
-var replaceRegexes = {};
-
-// Array of names for chat display color presets. CIT SPECIFIC.
-// If not set to normal, a CSS file `browserOutput_${name}.css` will be added to the head.
-var colorPresets = [
- 'normal',
- 'light',
- 'dark'
-]
-
-function clamp(val, min, max) {
- return Math.max(min, Math.min(val, max))
-}
-
-//Polyfill for fucking date now because of course IE8 and below don't support it
-if (!Date.now) {
- Date.now = function now() {
- return new Date().getTime();
- };
-}
-//Polyfill for trim() (IE8 and below)
-if (typeof String.prototype.trim !== 'function') {
- String.prototype.trim = function () {
- return this.replace(/^\s+|\s+$/g, '');
- };
-}
-
-// CIT SPECIFIC.
-function updateColorPreset() {
- var el = $("#colorPresetLink")[0];
- el.href = "browserOutput_"+colorPresets[opts.colorPreset]+".css";
- runByond('?_src_=chat&proc=colorPresetPost&preset='+colorPresets[opts.colorPreset]);
-}
-
-// Linkify the contents of a node, within its parent.
-function linkify(parent, insertBefore, text) {
- var start = 0;
- var match;
- var regex = /(?:(?:https?:\/\/)|(?:www\.))(?:[^ ]*?\.[^ ]*?)+[-A-Za-z0-9+&@#\/%?=~_|$!:,.;()]+/ig;
- while ((match = regex.exec(text)) !== null) {
- // add the unmatched text
- parent.insertBefore(document.createTextNode(text.substring(start, match.index)), insertBefore);
-
- var href = match[0];
- if (!/^https?:\/\//i.test(match[0])) {
- href = "http://" + match[0];
- }
-
- // add the link
- var link = document.createElement("a");
- link.href = href;
- link.textContent = match[0];
- parent.insertBefore(link, insertBefore);
-
- start = regex.lastIndex;
- }
- if (start !== 0) {
- // add the remaining text and remove the original text node
- parent.insertBefore(document.createTextNode(text.substring(start)), insertBefore);
- parent.removeChild(insertBefore);
- }
-}
-
-// Recursively linkify the children of a given node.
-function linkify_node(node) {
- var children = node.childNodes;
- // work backwards to avoid the risk of looping forever on our own output
- for (var i = children.length - 1; i >= 0; --i) {
- var child = children[i];
- if (child.nodeType == Node.TEXT_NODE) {
- // text is to be linkified
- linkify(node, child, child.textContent);
- } else if (child.nodeName != "A" && child.nodeName != "a") {
- // do not linkify existing links
- linkify_node(child);
- }
- }
-}
-
-//Shit fucking piece of crap that doesn't work god fuckin damn it
-function linkify_fallback(text) {
- var rex = /((?:'+$0+'';
- }
- else {
- return $1 ? $0: ''+$0+'';
- }
- });
-}
-
-function byondDecode(message) {
- // Basically we url_encode twice server side so we can manually read the encoded version and actually do UTF-8.
- // The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b.
- // Marvelous.
- message = message.replace(/\+/g, "%20");
- try {
- // This is a workaround for the above not always working when BYOND's shitty url encoding breaks. (byond bug id:2399401)
- if (decodeURIComponent) {
- message = decodeURIComponent(message);
- } else {
- throw new Error("Easiest way to trigger the fallback")
- }
- } catch (err) {
- message = unescape(message);
- }
- return message;
-}
-
-function replaceRegex() {
- var selectedRegex = replaceRegexes[$(this).attr('replaceRegex')];
- if (selectedRegex) {
- var replacedText = $(this).html().replace(selectedRegex[0], selectedRegex[1]);
- $(this).html(replacedText);
- }
- $(this).removeAttr('replaceRegex');
-}
-
-// Get a highlight markup span
-function createHighlightMarkup() {
- var extra = '';
- if (opts.highlightColor) {
- extra += ' style="background-color: ' + opts.highlightColor + '"';
- }
- return '';
-}
-
-// Get all child text nodes that match a regex pattern
-function getTextNodes(elem, pattern) {
- var result = $([]);
- $(elem).contents().each(function(idx, child) {
- if (child.nodeType === 3 && /\S/.test(child.nodeValue) && pattern.test(child.nodeValue)) {
- result = result.add(child);
- }
- else {
- result = result.add(getTextNodes(child, pattern));
- }
- });
- return result;
-}
-
-// Highlight all text terms matching the registered regex patterns
-function highlightTerms(el) {
- var pattern = new RegExp("(" + opts.highlightTerms.join('|') + ")", 'gi');
- var nodes = getTextNodes(el, pattern);
-
- nodes.each(function (idx, node) {
- var content = $(node).text();
- var parent = $(node).parent();
- var pre = $(node.previousSibling);
- $(node).remove();
- content.split(pattern).forEach(function (chunk) {
- // Get our highlighted span/text node
- var toInsert = null;
- if (pattern.test(chunk)) {
- var tmpElem = $(createHighlightMarkup());
- tmpElem.text(chunk);
- toInsert = tmpElem;
- }
- else {
- toInsert = document.createTextNode(chunk);
- }
-
- // Insert back into our element
- if (pre.length == 0) {
- var result = parent.prepend(toInsert);
- pre = $(result[0].firstChild);
- }
- else {
- pre.after(toInsert);
- pre = $(pre[0].nextSibling);
- }
- });
- });
-}
-
-function iconError(E) {
- var that = this;
- setTimeout(function() {
- var attempts = $(that).data('reload_attempts');
- if (typeof attempts === 'undefined' || !attempts) {
- attempts = 1;
- }
- if (attempts > opts.imageRetryLimit)
- return;
- var src = that.src;
- that.src = null;
- that.src = src+'#'+attempts;
- $(that).data('reload_attempts', ++attempts);
- }, opts.imageRetryDelay);
-}
-
-//Send a message to the client
-function output(message, flag) {
- if (typeof message === 'undefined') {
- return;
- }
- if (typeof flag === 'undefined') {
- flag = '';
- }
-
- if (flag !== 'internal')
- opts.lastPang = Date.now();
-
- message = byondDecode(message).trim();
-
- //The behemoth of filter-code (for Admin message filters)
- //Note: This is proooobably hella inefficient
- var filteredOut = false;
- if (opts.hasOwnProperty('showMessagesFilters') && !opts.showMessagesFilters['All'].show) {
- //Get this filter type (defined by class on message)
- var messageHtml = $.parseHTML(message),
- messageClasses;
- if (opts.hasOwnProperty('filterHideAll') && opts.filterHideAll) {
- var internal = false;
- messageClasses = (!!$(messageHtml).attr('class') ? $(messageHtml).attr('class').split(/\s+/) : false);
- if (messageClasses) {
- for (var i = 0; i < messageClasses.length; i++) { //Every class
- if (messageClasses[i] == 'internal') {
- internal = true;
- break;
- }
- }
- }
- if (!internal) {
- filteredOut = 'All';
- }
- } else {
- //If the element or it's child have any classes
- if (!!$(messageHtml).attr('class') || !!$(messageHtml).children().attr('class')) {
- messageClasses = $(messageHtml).attr('class').split(/\s+/);
- if (!!$(messageHtml).children().attr('class')) {
- messageClasses = messageClasses.concat($(messageHtml).children().attr('class').split(/\s+/));
- }
- var tempCount = 0;
- for (var i = 0; i < messageClasses.length; i++) { //Every class
- var thisClass = messageClasses[i];
- $.each(opts.showMessagesFilters, function(key, val) { //Every filter
- if (key !== 'All' && val.show === false && typeof val.match != 'undefined') {
- for (var i = 0; i < val.match.length; i++) {
- var matchClass = val.match[i];
- if (matchClass == thisClass) {
- filteredOut = key;
- break;
- }
- }
- }
- if (filteredOut) return false;
- });
- if (filteredOut) break;
- tempCount++;
- }
- } else {
- if (!opts.showMessagesFilters['Misc'].show) {
- filteredOut = 'Misc';
- }
- }
- }
- }
-
- //Stuff we do along with appending a message
- var atBottom = false;
- if (!filteredOut) {
- var bodyHeight = $('body').height();
- var messagesHeight = $messages.outerHeight();
- var scrollPos = $('body,html').scrollTop();
-
- //Should we snap the output to the bottom?
- if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) {
- atBottom = true;
- if ($('#newMessages').length) {
- $('#newMessages').remove();
- }
- //If not, put the new messages box in
- } else {
- if ($('#newMessages').length) {
- var messages = $('#newMessages .number').text();
- messages = parseInt(messages);
- messages++;
- $('#newMessages .number').text(messages);
- if (messages == 2) {
- $('#newMessages .messageWord').append('s');
- }
- } else {
- $messages.after('1 new ');
- }
- }
- }
-
- opts.messageCount++;
-
- //Pop the top message off if history limit reached
- if (opts.messageCount >= opts.messageLimit) {
- $messages.children('div.entry:first-child').remove();
- opts.messageCount--; //I guess the count should only ever equal the limit
- }
-
- // Create the element - if combining is off, we use it, and if it's on, we
- // might discard it bug need to check its text content. Some messages vary
- // only in HTML markup, have the same text content, and should combine.
- var entry = document.createElement('div');
- entry.innerHTML = message;
- var trimmed_message = entry.textContent || entry.innerText || "";
-
- var handled = false;
- if (opts.messageCombining) {
- var lastmessages = $messages.children('div.entry:last-child').last();
- if (lastmessages.length && $last_message && $last_message == trimmed_message) {
- var badge = lastmessages.children('.r').last();
- if (badge.length) {
- badge = badge.detach();
- badge.text(parseInt(badge.text()) + 1);
- } else {
- badge = $('', {'class': 'r', 'text': 2});
- }
- lastmessages.html(message);
- lastmessages.find('[replaceRegex]').each(replaceRegex);
- lastmessages.append(badge);
- badge.animate({
- "font-size": "0.9em"
- }, 100, function() {
- badge.animate({
- "font-size": "0.7em"
- }, 100);
- });
- opts.messageCount--;
- handled = true;
- }
- }
-
- if (!handled) {
- //Actually append the message
- entry.className = 'entry';
-
- if (filteredOut) {
- entry.className += ' hidden';
- entry.setAttribute('data-filter', filteredOut);
- }
-
- $(entry).find('[replaceRegex]').each(replaceRegex);
-
- $last_message = trimmed_message;
- $messages[0].appendChild(entry);
- $(entry).find("img.icon").error(iconError);
-
- var to_linkify = $(entry).find(".linkify");
- if (typeof Node === 'undefined') {
- // Linkify fallback for old IE
- for(var i = 0; i < to_linkify.length; ++i) {
- to_linkify[i].innerHTML = linkify_fallback(to_linkify[i].innerHTML);
- }
- } else {
- // Linkify for modern IE versions
- for(var i = 0; i < to_linkify.length; ++i) {
- linkify_node(to_linkify[i]);
- }
- }
-
- //Actually do the snap
- //Stuff we can do after the message shows can go here, in the interests of responsiveness
- if (opts.highlightTerms && opts.highlightTerms.length > 0) {
- highlightTerms($(entry));
- }
- }
-
- if (!filteredOut && atBottom) {
- $('body,html').scrollTop($messages.outerHeight());
- }
-}
-
-function internalOutput(message, flag)
-{
- output(escaper(message), flag)
-}
-
-//Runs a route within byond, client or server side. Consider this "ehjax" for byond.
-function runByond(uri) {
- window.location = uri;
-}
-
-function setCookie(cname, cvalue, exdays) {
- cvalue = escaper(cvalue);
- var d = new Date();
- d.setTime(d.getTime() + (exdays*24*60*60*1000));
- var expires = 'expires='+d.toUTCString();
- document.cookie = cname + '=' + cvalue + '; ' + expires + "; path=/";
-}
-
-function getCookie(cname) {
- var name = cname + '=';
- var ca = document.cookie.split(';');
- for(var i=0; i < ca.length; i++) {
- var c = ca[i];
- while (c.charAt(0)==' ') c = c.substring(1);
- if (c.indexOf(name) === 0) {
- return decoder(c.substring(name.length,c.length));
- }
- }
- return '';
-}
-
-function rgbToHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B);}
-function toHex(n) {
- n = parseInt(n,10);
- if (isNaN(n)) return "00";
- n = Math.max(0,Math.min(n,255));
- return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16);
-}
-
-/*
-function swap() { //Swap to darkmode
- if (opts.darkmode){
- document.getElementById("sheetofstyles").href = "browserOutput_white.css";
- opts.darkmode = false;
- runByond('?_src_=chat&proc=swaptolightmode');
- } else {
- document.getElementById("sheetofstyles").href = "browserOutput.css";
- opts.darkmode = true;
- runByond('?_src_=chat&proc=swaptodarkmode');
- }
- setCookie('darkmode', (opts.darkmode ? 'true' : 'false'), 365);
-}
-*/
-function handleClientData(ckey, ip, compid) {
- //byond sends player info to here
- var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid};
- if (opts.clientData && !$.isEmptyObject(opts.clientData)) {
- runByond('?_src_=chat&proc=analyzeClientData¶m[cookie]='+JSON.stringify({'connData': opts.clientData}));
-
- for (var i = 0; i < opts.clientData.length; i++) {
- var saved = opts.clientData[i];
- if (currentData.ckey == saved.ckey && currentData.ip == saved.ip && currentData.compid == saved.compid) {
- return; //Record already exists
- }
- }
- //Lets make sure we obey our limit (can connect from server with higher limit)
- while (opts.clientData.length >= opts.clientDataLimit) {
- opts.clientData.shift();
- }
- } else {
- runByond('?_src_=chat&proc=analyzeClientData¶m[cookie]=none');
- }
-
- //Update the cookie with current details
- opts.clientData.push(currentData);
- setCookie('connData', JSON.stringify(opts.clientData), 365);
-}
-
-//Server calls this on ehjax response
-//Or, y'know, whenever really
-function ehjaxCallback(data) {
- opts.lastPang = Date.now();
- if (data == 'softPang') {
- return;
- } else if (data == 'pang') {
- opts.pingCounter = 0; //reset
- opts.pingTime = Date.now();
- runByond('?_src_=chat&proc=ping');
-
- } else if (data == 'pong') {
- if (opts.pingDisabled) {return;}
- opts.pongTime = Date.now();
- var pingDuration = Math.ceil((opts.pongTime - opts.pingTime) / 2);
- $('#pingMs').text(pingDuration+'ms');
- pingDuration = Math.min(pingDuration, 255);
- var red = pingDuration;
- var green = 255 - pingDuration;
- var blue = 0;
- var hex = rgbToHex(red, green, blue);
- $('#pingDot').css('color', '#'+hex);
-
- } else if (data == 'roundrestart') {
- opts.restarting = true;
- internalOutput('The connection has been closed because the server is restarting. Please wait while you automatically reconnect. ', 'internal');
- } else if (data == 'stopMusic') {
- $('#adminMusic').prop('src', '');
- } else {
- //Oh we're actually being sent data instead of an instruction
- var dataJ;
- try {
- dataJ = $.parseJSON(data);
- } catch (e) {
- //But...incorrect :sadtrombone:
- window.onerror('JSON: '+e+'. '+data, 'browserOutput.html', 327);
- return;
- }
- data = dataJ;
-
- if (data.clientData) {
- if (opts.restarting) {
- opts.restarting = false;
- $('.connectionClosed.restarting:not(.restored)').addClass('restored').text('The round restarted and you successfully reconnected!');
- }
- if (!data.clientData.ckey && !data.clientData.ip && !data.clientData.compid) {
- //TODO: Call shutdown perhaps
- return;
- } else {
- handleClientData(data.clientData.ckey, data.clientData.ip, data.clientData.compid);
- }
- sendVolumeUpdate();
- } else if (data.adminMusic) {
- if (typeof data.adminMusic === 'string') {
- var adminMusic = byondDecode(data.adminMusic);
- var bindLoadedData = false;
- adminMusic = adminMusic.match(/https?:\/\/\S+/) || '';
- if (data.musicRate) {
- var newRate = Number(data.musicRate);
- if(newRate) {
- $('#adminMusic').prop('defaultPlaybackRate', newRate);
- }
- } else {
- $('#adminMusic').prop('defaultPlaybackRate', 1.0);
- }
- if (data.musicSeek) {
- opts.musicStartAt = Number(data.musicSeek) || 0;
- bindLoadedData = true;
- } else {
- opts.musicStartAt = 0;
- }
- if (data.musicHalt) {
- opts.musicEndAt = Number(data.musicHalt) || null;
- bindLoadedData = true;
- }
- if (bindLoadedData) {
- $('#adminMusic').one('loadeddata', adminMusicLoadedData);
- }
- $('#adminMusic').prop('src', adminMusic);
- $('#adminMusic').trigger("play");
- }
- } else if (data.syncRegex) {
- for (var i in data.syncRegex) {
-
- var regexData = data.syncRegex[i];
- var regexName = regexData[0];
- var regexFlags = regexData[1];
- var regexReplaced = regexData[2];
-
- replaceRegexes[i] = [new RegExp(regexName, regexFlags), regexReplaced];
- }
- }
- }
-}
-
-function createPopup(contents, width) {
- opts.popups++;
- $('body').append('');
-
- //Attach close popup event
- var $popup = $('#popup'+opts.popups);
- var height = $popup.outerHeight();
- $popup.css({'height': height+'px', 'margin': '-'+(height/2)+'px 0 0 -'+(width/2)+'px'});
-
- $popup.on('click', '.close', function(e) {
- e.preventDefault();
- $popup.remove();
- });
-}
-
-function toggleWasd(state) {
- opts.wasd = (state == 'on' ? true : false);
-}
-
-function sendVolumeUpdate() {
- opts.volumeUpdating = false;
- if(opts.updatedVolume) {
- runByond('?_src_=chat&proc=setMusicVolume¶m[volume]='+opts.updatedVolume);
- }
-}
-
-function adminMusicEndCheck(event) {
- if (opts.musicEndAt) {
- if ($('#adminMusic').prop('currentTime') >= opts.musicEndAt) {
- $('#adminMusic').off(event);
- $('#adminMusic').trigger('pause');
- $('#adminMusic').prop('src', '');
- }
- } else {
- $('#adminMusic').off(event);
- }
-}
-
-function adminMusicLoadedData(event) {
- if (opts.musicStartAt && ($('#adminMusic').prop('duration') === Infinity || (opts.musicStartAt <= $('#adminMusic').prop('duration'))) ) {
- $('#adminMusic').prop('currentTime', opts.musicStartAt);
- }
- if (opts.musicEndAt) {
- $('#adminMusic').on('timeupdate', adminMusicEndCheck);
- }
-}
-
-function subSlideUp() {
- $(this).removeClass('scroll');
- $(this).css('height', '');
-}
-
-function startSubLoop() {
- if (opts.selectedSubLoop) {
- clearInterval(opts.selectedSubLoop);
- }
- return setInterval(function() {
- if (!opts.suppressSubClose && $selectedSub.is(':visible')) {
- $selectedSub.slideUp('fast', subSlideUp);
- clearInterval(opts.selectedSubLoop);
- }
- }, 5000); //every 5 seconds
-}
-
-function handleToggleClick($sub, $toggle) {
- if ($selectedSub !== $sub && $selectedSub.is(':visible')) {
- $selectedSub.slideUp('fast', subSlideUp);
- }
- $selectedSub = $sub
- if ($selectedSub.is(':visible')) {
- $selectedSub.slideUp('fast', subSlideUp);
- clearInterval(opts.selectedSubLoop);
- } else {
- $selectedSub.slideDown('fast', function() {
- var windowHeight = $(window).height();
- var toggleHeight = $toggle.outerHeight();
- var priorSubHeight = $selectedSub.outerHeight();
- var newSubHeight = windowHeight - toggleHeight;
- $(this).height(newSubHeight);
- if (priorSubHeight > (windowHeight - toggleHeight)) {
- $(this).addClass('scroll');
- }
- });
- opts.selectedSubLoop = startSubLoop();
- }
-}
-
-/*****************************************
-*
-* DOM READY
-*
-******************************************/
-
-if (typeof $ === 'undefined') {
- var div = document.getElementById('loading').childNodes[1];
- div += 'ERROR: Jquery did not load.'; -} - -$(function() { - $messages = $('#messages'); - $subOptions = $('#subOptions'); - $subAudio = $('#subAudio'); - $selectedSub = $subOptions; - - //Hey look it's a controller loop! - setInterval(function() { - if (opts.lastPang + opts.pangLimit < Date.now() && !opts.restarting) { //Every pingLimit - if (!opts.noResponse) { //Only actually append a message if the previous ping didn't also fail (to prevent spam) - opts.noResponse = true; - opts.noResponseCount++; - internalOutput(' You are either AFK, experiencing lag or the connection has closed. ', 'internal');
- }
- } else if (opts.noResponse) { //Previous ping attempt failed ohno
- $('.connectionClosed[data-count="'+opts.noResponseCount+'"]:not(.restored)').addClass('restored').text('Your connection has been restored (probably)!');
- opts.noResponse = false;
- }
- }, 2000); //2 seconds
-
-
- /*****************************************
- *
- * LOAD SAVED CONFIG
- *
- ******************************************/
- var savedConfig = {
- fontsize: getCookie('fontsize'), //no need for compatabiliy, cookie name is the same
- lineheight: getCookie('lineheight'),
- 'spingDisabled': getCookie('pingdisabled'),
- 'shighlightTerms': getCookie('highlightterms'),
- 'shighlightColor': getCookie('highlightcolor'),
- 'smusicVolume': getCookie('musicVolume'),
- 'smessagecombining': getCookie('messagecombining'),
- 'sdarkmode': getCookie('darkmode'),
- 'scolorPreset': getCookie('colorpreset'),
- };
-
- if (savedConfig.fontsize) {
- $messages.css('font-size', savedConfig.fontsize);
- internalOutput('Loaded font size setting of: '+savedConfig.fontsize+'', 'internal');
- }
- if (savedConfig.lineheight) {
- $("body").css('line-height', savedConfig.lineheight);
- internalOutput('Loaded line height setting of: '+savedConfig.lineheight+'', 'internal');
- }
- // if(savedConfig.sdarkmode == 'true'){
- // swap();
- // }
- if (savedConfig.scolorPreset) {
- opts.colorPreset = Number(savedConfig.scolorPreset);
- updateColorPreset();
- internalOutput('Loaded color preset of: '+colorPresets[opts.colorPreset]+'', 'internal');
- }
- if (savedConfig.spingDisabled) {
- if (savedConfig.spingDisabled == 'true') {
- opts.pingDisabled = true;
- $('#ping').hide();
- }
- internalOutput('Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+'', 'internal');
- }
- if (savedConfig.shighlightTerms) {
- var savedTerms = $.parseJSON(savedConfig.shighlightTerms).filter(function (entry) {
- return entry !== null && /\S/.test(entry);
- });
- var actualTerms = savedTerms.length != 0 ? savedTerms.join(', ') : null;
- if (actualTerms) {
- internalOutput('Loaded highlight strings of: ' + actualTerms+'', 'internal');
- opts.highlightTerms = savedTerms;
- }
- }
- if (savedConfig.shighlightColor) {
- opts.highlightColor = savedConfig.shighlightColor;
- internalOutput('Loaded highlight color of: '+savedConfig.shighlightColor+'', 'internal');
- }
- if (savedConfig.smusicVolume) {
- var newVolume = clamp(savedConfig.smusicVolume, 0, 100);
- $('#adminMusic').prop('volume', newVolume / 100);
- $('#musicVolume').val(newVolume);
- opts.updatedVolume = newVolume;
- sendVolumeUpdate();
- internalOutput('Loaded music volume of: '+savedConfig.smusicVolume+'', 'internal');
- }
- else{
- $('#adminMusic').prop('volume', opts.defaultMusicVolume / 100);
- }
-
- if (savedConfig.smessagecombining) {
- if (savedConfig.smessagecombining == 'false') {
- opts.messageCombining = false;
- } else {
- opts.messageCombining = true;
- }
- }
- (function() {
- var dataCookie = getCookie('connData');
- if (dataCookie) {
- var dataJ;
- try {
- dataJ = $.parseJSON(dataCookie);
- } catch (e) {
- window.onerror('JSON '+e+'. '+dataCookie, 'browserOutput.html', 434);
- return;
- }
- opts.clientData = dataJ;
- }
- })();
-
-
- /*****************************************
- *
- * BASE CHAT OUTPUT EVENTS
- *
- ******************************************/
-
- $('body').on('click', 'a', function(e) {
- e.preventDefault();
- });
-
- $('body').on('mousedown', function(e) {
- var $target = $(e.target);
-
- if ($contextMenu && opts.hasOwnProperty('contextMenuTarget') && opts.contextMenuTarget) {
- hideContextMenu();
- return false;
- }
-
- if ($target.is('a') || $target.parent('a').length || $target.is('input') || $target.is('textarea')) {
- opts.preventFocus = true;
- } else {
- opts.preventFocus = false;
- opts.mouseDownX = e.pageX;
- opts.mouseDownY = e.pageY;
- }
- });
-
- $messages.on('mousedown', function(e) {
- if ($selectedSub && $selectedSub.is(':visible')) {
- $selectedSub.slideUp('fast', subSlideUp);
- clearInterval(opts.selectedSubLoop);
- }
- });
-
- $('body').on('mouseup', function(e) {
- if (!opts.preventFocus &&
- (e.pageX >= opts.mouseDownX - opts.clickTolerance && e.pageX <= opts.mouseDownX + opts.clickTolerance) &&
- (e.pageY >= opts.mouseDownY - opts.clickTolerance && e.pageY <= opts.mouseDownY + opts.clickTolerance)
- ) {
- opts.mouseDownX = null;
- opts.mouseDownY = null;
- runByond('byond://winset?mapwindow.map.focus=true');
- }
- });
-
- $messages.on('click', 'a', function(e) {
- var href = $(this).attr('href');
- $(this).addClass('visited');
- if (href[0] == '?' || (href.length >= 8 && href.substring(0,8) == 'byond://')) {
- runByond(href);
- } else {
- href = escaper(href);
- runByond('?action=openLink&link='+href);
- }
- runByond('byond://winset?mapwindow.map.focus=true');
- });
-
- $('body').on('keydown', function(e) {
- if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') {
- return;
- }
- if (e.ctrlKey || e.altKey || e.shiftKey) { //Band-aid "fix" for allowing ctrl+c copy paste etc. Needs a proper fix.
- return;
- }
- runByond('byond://winset?mapwindow.map.focus=true');
- });
-
- //Mildly hacky fix for scroll issues on mob change (interface gets resized sometimes, messing up snap-scroll)
- $(window).on('resize', function(e) {
- if ($(this).height() !== opts.priorChatHeight) {
- $('body,html').scrollTop($messages.outerHeight());
- opts.priorChatHeight = $(this).height();
- }
- });
-
-
- /*****************************************
- *
- * OPTIONS INTERFACE EVENTS
- *
- ******************************************/
-
- $('body').on('click', '#newMessages', function(e) {
- var messagesHeight = $messages.outerHeight();
- $('body,html').scrollTop(messagesHeight);
- $('#newMessages').remove();
- runByond('byond://winset?mapwindow.map.focus=true');
- });
-
- $('#toggleOptions').click(function(e) {
- handleToggleClick($subOptions, $(this));
- });
- // $('#darkmodetoggle').click(function(e) {
- // swap();
- // });
- $('#toggleAudio').click(function(e) {
- handleToggleClick($subAudio, $(this));
- });
-
- $('.sub, .toggle').mouseenter(function() {
- opts.suppressSubClose = true;
- });
-
- $('.sub, .toggle').mouseleave(function() {
- opts.suppressSubClose = false;
- });
-
- $('#decreaseFont').click(function(e) {
- savedConfig.fontsize = Math.max(parseInt(savedConfig.fontsize || 13) - 1, 1) + 'px';
- $messages.css({'font-size': savedConfig.fontsize});
- setCookie('fontsize', savedConfig.fontsize, 365);
- internalOutput('Font size set to '+savedConfig.fontsize+'', 'internal');
- });
-
- $('#increaseFont').click(function(e) {
- savedConfig.fontsize = (parseInt(savedConfig.fontsize || 13) + 1) + 'px';
- $messages.css({'font-size': savedConfig.fontsize});
- setCookie('fontsize', savedConfig.fontsize, 365);
- internalOutput('Font size set to '+savedConfig.fontsize+'', 'internal');
- });
-
- $('#decreaseLineHeight').click(function(e) {
- savedConfig.lineheight = Math.max(parseFloat(savedConfig.lineheight || 1.2) - 0.1, 0.1).toFixed(1);
- $("body").css({'line-height': savedConfig.lineheight});
- setCookie('lineheight', savedConfig.lineheight, 365);
- internalOutput('Line height set to '+savedConfig.lineheight+'', 'internal');
- });
-
- $('#increaseLineHeight').click(function(e) {
- savedConfig.lineheight = (parseFloat(savedConfig.lineheight || 1.2) + 0.1).toFixed(1);
- $("body").css({'line-height': savedConfig.lineheight});
- setCookie('lineheight', savedConfig.lineheight, 365);
- internalOutput('Line height set to '+savedConfig.lineheight+'', 'internal');
- });
-
- $('#togglePing').click(function(e) {
- if (opts.pingDisabled) {
- $('#ping').slideDown('fast');
- opts.pingDisabled = false;
- } else {
- $('#ping').slideUp('fast');
- opts.pingDisabled = true;
- }
- setCookie('pingdisabled', (opts.pingDisabled ? 'true' : 'false'), 365);
- });
-
- $('#saveLog').click(function(e) {
- // Requires IE 10+ to issue download commands. Just opening a popup
- // window will cause Ctrl+S to save a blank page, ignoring innerHTML.
- if (!window.Blob) {
- output('This function is only supported on IE 10 and up. Upgrade if possible.', 'internal');
- return;
- }
-
- $.ajax({
- type: 'GET',
- url: 'browserOutput.css', // browserOutput_white.css
- success: function(styleData) {
- var blob = new Blob(['String Highlighting ' +
- '' +
- ' ';
- createPopup(popupContent, 250);
- });
-
- $('body').on('keyup', '#highlightColor', function() {
- var color = $('#highlightColor').val();
- color = color.trim();
- if (!color || color.charAt(0) != '#') return;
- $('#highlightColor').css('background-color', color);
- });
-
- $('body').on('submit', '#highlightTermForm', function(e) {
- e.preventDefault();
-
- opts.highlightTerms = [];
- for (var count = 0; count < opts.highlightLimit; count++) {
- var term = $('#highlightTermInput'+count).val();
- if (term !== null && /\S/.test(term)) {
- opts.highlightTerms.push(term.trim().toLowerCase());
- }
- }
-
- var color = $('#highlightColor').val();
- color = color.trim();
- if (color == '' || color.charAt(0) != '#') {
- opts.highlightColor = '#FFFF00';
- } else {
- opts.highlightColor = color;
- }
- var $popup = $('#highlightPopup').closest('.popup');
- $popup.remove();
-
- setCookie('highlightterms', JSON.stringify(opts.highlightTerms), 365);
- setCookie('highlightcolor', opts.highlightColor, 365);
- });
-
- $('#clearMessages').click(function() {
- $messages.empty();
- opts.messageCount = 0;
- });
-
- $('#changeColorPreset').click(function() { //CIT SPECIFIC
- opts.colorPreset = (opts.colorPreset+1) % colorPresets.length;
- updateColorPreset();
- setCookie('colorpreset', opts.colorPreset, 365);
- internalOutput('Changed color preset to: '+colorPresets[opts.colorPreset]);
- });
-
- $('#musicVolumeSpan').hover(function() {
- $('#musicVolumeText').addClass('hidden');
- $('#musicVolume').removeClass('hidden');
- }, function() {
- $('#musicVolume').addClass('hidden');
- $('#musicVolumeText').removeClass('hidden');
- });
-
- $('#musicVolume').change(function() {
- var newVolume = $('#musicVolume').val();
- newVolume = clamp(newVolume, 0, 100);
- $('#adminMusic').prop('volume', newVolume / 100);
- setCookie('musicVolume', newVolume, 365);
- opts.updatedVolume = newVolume;
- if(!opts.volumeUpdating) {
- setTimeout(sendVolumeUpdate, opts.volumeUpdateDelay);
- opts.volumeUpdating = true;
- }
- });
-
- $('#toggleCombine').click(function(e) {
- opts.messageCombining = !opts.messageCombining;
- setCookie('messagecombining', (opts.messageCombining ? 'true' : 'false'), 365);
- });
-
- $('img.icon').error(iconError);
-
-
-
-
- /*****************************************
- *
- * KICK EVERYTHING OFF
- *
- ******************************************/
-
- runByond('?_src_=chat&proc=doneLoading');
- if ($('#loading').is(':visible')) {
- $('#loading').remove();
- }
- $('#userBar').show();
- opts.priorChatHeight = $(window).height();
-});
diff --git a/code/modules/goonchat/browserassets/js/json2.min.js b/code/modules/goonchat/browserassets/js/json2.min.js
deleted file mode 100644
index d867407f26..0000000000
--- a/code/modules/goonchat/browserassets/js/json2.min.js
+++ /dev/null
@@ -1 +0,0 @@
-"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(t){return 10>t?"0"+t:t}function this_value(){return this.valueOf()}function quote(t){return rx_escapable.lastIndex=0,rx_escapable.test(t)?'"'+t.replace(rx_escapable,function(t){var e=meta[t];return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function str(t,e){var r,n,o,u,f,a=gap,i=e[t];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(t)),"function"==typeof rep&&(i=rep.call(e,t,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,f=[],"[object Array]"===Object.prototype.toString.apply(i)){for(u=i.length,r=0;u>r;r+=1)f[r]=str(r,i)||"null";return o=0===f.length?"[]":gap?"[\n"+gap+f.join(",\n"+gap)+"\n"+a+"]":"["+f.join(",")+"]",gap=a,o}if(rep&&"object"==typeof rep)for(u=rep.length,r=0;u>r;r+=1)"string"==typeof rep[r]&&(n=rep[r],o=str(n,i),o&&f.push(quote(n)+(gap?": ":":")+o));else for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(o=str(n,i),o&&f.push(quote(n)+(gap?": ":":")+o));return o=0===f.length?"{}":gap?"{\n"+gap+f.join(",\n"+gap)+"\n"+a+"}":"{"+f.join(",")+"}",gap=a,o}}var rx_one=/^[\],:{}\s]*$/,rx_two=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,rx_three=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,rx_four=/(?:^|:|,)(?:\s*\[)+/g,rx_escapable=/[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,rx_dangerous=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},Boolean.prototype.toJSON=this_value,Number.prototype.toJSON=this_value,String.prototype.toJSON=this_value);var gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(t,e,r){var n;if(gap="",indent="","number"==typeof r)for(n=0;r>n;n+=1)indent+=" ";else"string"==typeof r&&(indent=r);if(rep=e,e&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw new Error("JSON.stringify");return str("",{"":t})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){function walk(t,e){var r,n,o=t[e];if(o&&"object"==typeof o)for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(n=walk(o,r),void 0!==n?o[r]=n:delete o[r]);return reviver.call(t,e,o)}var j;if(text=String(text),rx_dangerous.lastIndex=0,rx_dangerous.test(text)&&(text=text.replace(rx_dangerous,function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})),rx_one.test(text.replace(rx_two,"@").replace(rx_three,"]").replace(rx_four,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
\ No newline at end of file
diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm
index 4561e0ae3e..573b04a296 100644
--- a/code/modules/holiday/halloween/jacqueen.dm
+++ b/code/modules/holiday/halloween/jacqueen.dm
@@ -334,8 +334,7 @@
to_chat(C, " You feel an overwhelming desire to [message]")
if(2)
visible_message("[src] waves their arms around, \"If only you had a better upbringing, your ears are now full of my singing!\"")
- var/client/C2 = C.client
- C2.chatOutput.sendMusic("https://puu.sh/ExBbv.mp4", 1)//I hope this works!
+ C.client.tgui_panel?.play_music("https://puu.sh/ExBbv.mp4")
if(3)
visible_message("[src] waves their arms around, \"You're cute little bumpkin, On your head is a pumpkin!\"")
if(C.head)
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index abf6632939..f6be9db9a2 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -103,6 +103,7 @@
throwforce = 5
throw_speed = 2
throw_range = 3
+ attack_speed = CLICK_CD_MELEE
w_class = WEIGHT_CLASS_BULKY
flags_1 = CONDUCT_1
armour_penetration = 20
@@ -125,9 +126,12 @@
playsound(src,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
return (BRUTELOSS)
-/obj/item/scythe/pre_attack(atom/A, mob/living/user, params)
+/obj/item/scythe/pre_attack(atom/A, mob/living/user, params, attackchain_flags, damage_multiplier)
+ . = ..()
+ if(. & STOP_ATTACK_PROC_CHAIN)
+ return
if(swiping || !istype(A, /obj/structure/spacevine) || get_turf(A) == get_turf(user))
- return ..()
+ return
else
var/turf/user_turf = get_turf(user)
var/dir_to_target = get_dir(user_turf, get_turf(A))
@@ -138,11 +142,12 @@
var/turf/T = get_step(user_turf, turn(dir_to_target, i))
for(var/obj/structure/spacevine/V in T)
if(user.Adjacent(V))
- melee_attack_chain(user, V)
+ melee_attack_chain(user, V, attackchain_flags = ATTACK_IGNORE_CLICKDELAY)
stam_gain += 5 //should be hitcost
swiping = FALSE
stam_gain += 2 //Initial hitcost
user.adjustStaminaLoss(-stam_gain)
+ user.DelayNextAction()
// *************************************
// Nutrient defines for hydroponics
@@ -192,4 +197,4 @@
/obj/item/reagent_containers/glass/bottle/killer/pestkiller
name = "bottle of pest spray"
desc = "Contains a pesticide."
- list_reagents = list(/datum/reagent/toxin/pestkiller = 50)
\ No newline at end of file
+ list_reagents = list(/datum/reagent/toxin/pestkiller = 50)
diff --git a/code/modules/instruments/songs/_song.dm b/code/modules/instruments/songs/_song.dm
index d842dbc003..a0d96658e6 100644
--- a/code/modules/instruments/songs/_song.dm
+++ b/code/modules/instruments/songs/_song.dm
@@ -2,6 +2,12 @@
#define MUSIC_MAXLINES 1000
#define MUSIC_MAXLINECHARS 300
+/**
+ * # Song datum
+ *
+ * These are the actual backend behind instruments.
+ * They attach to an atom and provide the editor + playback functionality.
+ */
/datum/song
/// Name of the song
var/name = "Untitled"
@@ -15,6 +21,9 @@
/// delay between notes in deciseconds
var/tempo = 5
+ /// How far we can be heard
+ var/instrument_range = 15
+
/// Are we currently playing?
var/playing = FALSE
@@ -53,17 +62,24 @@
/////////////////// Playing variables ////////////////
/**
- * Only used in synthesized playback - The chords we compiled. Non assoc list of lists:
- * list(list(key1, key2, key3..., tempo_divisor), list(key1, key2..., tempo_divisor), ...)
- * tempo_divisor always exists
- * if key1 (and so if there's no keys) doesn't exist it's a rest
+ * Build by compile_chords()
+ * Must be rebuilt on instrument switch.
* Compilation happens when we start playing and is cleared after we finish playing.
+ * Format: list of chord lists, with chordlists having (key1, key2, key3, tempodiv)
*/
var/list/compiled_chords
+ /// Current section of a long chord we're on, so we don't need to make a billion chords, one for every unit ticklag.
+ var/elapsed_delay
+ /// Amount of delay to wait before playing the next chord
+ var/delay_by
+ /// Current chord we're on.
+ var/current_chord
/// Channel as text = current volume percentage but it's 0 to 100 instead of 0 to 1.
var/list/channels_playing = list()
/// List of channels that aren't being used, as text. This is to prevent unnecessary freeing and reallocations from SSsounds/SSinstruments.
var/list/channels_idle = list()
+ /// Person playing us
+ var/mob/user_playing
//////////////////////////////////////////////////////
/// Last world.time we checked for who can hear us
@@ -72,8 +88,6 @@
var/list/hearing_mobs
/// If this is enabled, some things won't be strictly cleared when they usually are (liked compiled_chords on play stop)
var/debug_mode = FALSE
- /// Last time we processed decay
- var/last_process_decay
/// Max sound channels to occupy
var/max_sound_channels = CHANNELS_PER_INSTRUMENT
/// Current channels, so we can save a length() call.
@@ -113,7 +127,7 @@
var/cached_exponential_dropoff = 1.045
/////////////////////////////////////////////////////////////////////////
-/datum/song/New(atom/parent, list/instrument_ids)
+/datum/song/New(atom/parent, list/instrument_ids, new_range)
SSinstruments.on_song_new(src)
lines = list()
tempo = sanitize_tempo(tempo)
@@ -125,6 +139,8 @@
hearing_mobs = list()
volume = clamp(volume, min_volume, max_volume)
update_sustain()
+ if(new_range)
+ instrument_range = new_range
/datum/song/Destroy()
stop_playing()
@@ -135,12 +151,15 @@
parent = null
return ..()
+/**
+ * Checks and stores which mobs can hear us. Terminates sounds for mobs that leave our range.
+ */
/datum/song/proc/do_hearcheck()
last_hearcheck = world.time
var/list/old = hearing_mobs.Copy()
hearing_mobs.len = 0
var/turf/source = get_turf(parent)
- for(var/mob/M in get_hearers_in_view(15, source))
+ for(var/mob/M in get_hearers_in_view(instrument_range, source))
if(!(M?.client?.prefs?.toggles & SOUND_INSTRUMENTS))
continue
hearing_mobs[M] = get_dist(M, source)
@@ -148,10 +167,15 @@
for(var/i in exited)
terminate_sound_mob(i)
-/// I can either be a datum, id, or path (if the instrument has no id).
+/**
+ * Sets our instrument, caching anything necessary for faster accessing. Accepts an ID, typepath, or instantiated instrument datum.
+ */
/datum/song/proc/set_instrument(datum/instrument/I)
+ terminate_all_sounds()
+ var/old_legacy
if(using_instrument)
using_instrument.songs_using -= src
+ old_legacy = (using_instrument.instrument_flags & INSTRUMENT_LEGACY)
using_instrument = null
cached_samples = null
cached_legacy_ext = null
@@ -162,7 +186,7 @@
if(istype(I))
using_instrument = I
I.songs_using += src
- var/instrument_legacy = CHECK_BITFIELD(I.instrument_flags, INSTRUMENT_LEGACY)
+ var/instrument_legacy = (I.instrument_flags & INSTRUMENT_LEGACY)
if(instrument_legacy)
cached_legacy_ext = I.legacy_instrument_ext
cached_legacy_dir = I.legacy_instrument_path
@@ -170,23 +194,37 @@
else
cached_samples = I.samples
legacy = FALSE
+ if(isnull(old_legacy) || (old_legacy != instrument_legacy))
+ if(playing)
+ compile_chords()
-/// THIS IS A BLOCKING CALL.
+/**
+ * Attempts to start playing our song.
+ */
/datum/song/proc/start_playing(mob/user)
if(playing)
return
if(!using_instrument?.ready())
to_chat(user, "An error has occured with [src]. Please reset the instrument.")
return
+ compile_chords()
+ if(!length(compiled_chords))
+ to_chat(user, "Song is empty.")
+ return
playing = TRUE
- updateDialog()
+ updateDialog(user_playing)
//we can not afford to runtime, since we are going to be doing sound channel reservations and if we runtime it means we have a channel allocation leak.
//wrap the rest of the stuff to ensure stop_playing() is called.
- last_process_decay = world.time
+ do_hearcheck()
+ elapsed_delay = 0
+ delay_by = 0
+ current_chord = 1
+ user_playing = user
START_PROCESSING(SSinstruments, src)
- . = do_play_lines(user)
- stop_playing()
+/**
+ * Stops playing, terminating all sounds if in synthesized mode. Clears hearing_mobs.
+ */
/datum/song/proc/stop_playing()
if(!playing)
return
@@ -196,42 +234,93 @@
STOP_PROCESSING(SSinstruments, src)
terminate_all_sounds(TRUE)
hearing_mobs.len = 0
- updateDialog()
+ user_playing = null
-/// THIS IS A BLOCKING CALL.
-/datum/song/proc/do_play_lines(user)
- if(!playing)
+/**
+ * Processes our song.
+ */
+/datum/song/proc/process_song(wait)
+ if(!length(compiled_chords) || should_stop_playing(user_playing))
+ stop_playing()
return
- do_hearcheck()
- if(legacy)
- do_play_lines_legacy(user)
- else
- do_play_lines_synthesized(user)
+ var/list/chord = compiled_chords[current_chord]
+ if(++elapsed_delay >= delay_by)
+ play_chord(chord)
+ elapsed_delay = 0
+ delay_by = tempodiv_to_delay(chord[length(chord)])
+ current_chord++
+ if(current_chord > length(compiled_chords))
+ if(repeat)
+ repeat--
+ current_chord = 1
+ return
+ else
+ stop_playing()
+ return
+/**
+ * Converts a tempodiv to ticks to elapse before playing the next chord, taking into account our tempo.
+ */
+/datum/song/proc/tempodiv_to_delay(tempodiv)
+ if(!tempodiv)
+ tempodiv = 1 // no division by 0. some song converters tend to use 0 for when it wants to have no div, for whatever reason.
+ return max(1, round((tempo/tempodiv) / world.tick_lag, 1))
+
+/**
+ * Compiles chords.
+ */
+/datum/song/proc/compile_chords()
+ legacy? compile_legacy() : compile_synthesized()
+
+/**
+ * Plays a chord.
+ */
+/datum/song/proc/play_chord(list/chord)
+ // last value is timing information
+ for(var/i in 1 to (length(chord) - 1))
+ legacy? playkey_legacy(chord[i][1], chord[i][2], chord[i][3], user_playing) : playkey_synth(chord[i], user_playing)
+
+/**
+ * Checks if we should halt playback.
+ */
/datum/song/proc/should_stop_playing(mob/user)
return QDELETED(parent) || !using_instrument || !playing
+/**
+ * Sanitizes tempo to a value that makes sense and fits the current world.tick_lag.
+ */
/datum/song/proc/sanitize_tempo(new_tempo)
new_tempo = abs(new_tempo)
return clamp(round(new_tempo, world.tick_lag), world.tick_lag, 5 SECONDS)
+/**
+ * Gets our beats per minute based on our tempo.
+ */
/datum/song/proc/get_bpm()
return 600 / tempo
+/**
+ * Sets our tempo from a beats-per-minute, sanitizing it to a valid number first.
+ */
/datum/song/proc/set_bpm(bpm)
tempo = sanitize_tempo(600 / bpm)
-/// Updates the window for our user. Override in subtypes.
-/datum/song/proc/updateDialog(mob/user = usr)
+/**
+ * Updates the window for our users. Override down the line.
+ */
+/datum/song/proc/updateDialog(mob/user)
ui_interact(user)
/datum/song/process(wait)
if(!playing)
return PROCESS_KILL
- var/delay = world.time - last_process_decay
- process_decay(delay)
- last_process_decay = world.time
+ // it's expected this ticks at every world.tick_lag. if it lags, do not attempt to catch up.
+ process_song(world.tick_lag)
+ process_decay(world.tick_lag)
+/**
+ * Updates our cached linear/exponential falloff stuff, saving calculations down the line.
+ */
/datum/song/proc/update_sustain()
// Exponential is easy
cached_exponential_dropoff = sustain_exponential_dropoff
@@ -241,21 +330,33 @@
var/volume_decrease_per_decisecond = volume_diff / target_duration
cached_linear_dropoff = volume_decrease_per_decisecond
+/**
+ * Setter for setting output volume.
+ */
/datum/song/proc/set_volume(volume)
src.volume = clamp(volume, max(0, min_volume), min(100, max_volume))
update_sustain()
updateDialog()
+/**
+ * Setter for setting how low the volume has to get before a note is considered "dead" and dropped
+ */
/datum/song/proc/set_dropoff_volume(volume)
sustain_dropoff_volume = clamp(volume, INSTRUMENT_MIN_SUSTAIN_DROPOFF, 100)
update_sustain()
updateDialog()
+/**
+ * Setter for setting exponential falloff factor.
+ */
/datum/song/proc/set_exponential_drop_rate(drop)
sustain_exponential_dropoff = clamp(drop, INSTRUMENT_EXP_FALLOFF_MIN, INSTRUMENT_EXP_FALLOFF_MAX)
update_sustain()
updateDialog()
+/**
+ * Setter for setting linear falloff duration.
+ */
/datum/song/proc/set_linear_falloff_duration(duration)
sustain_linear_duration = clamp(duration, 0.1, INSTRUMENT_MAX_TOTAL_SUSTAIN)
update_sustain()
@@ -277,10 +378,8 @@
// subtype for handheld instruments, like violin
/datum/song/handheld
-/datum/song/handheld/updateDialog(mob/user = usr)
- if(user.machine != src)
- return
- parent.ui_interact(user)
+/datum/song/handheld/updateDialog(mob/user)
+ parent.ui_interact(user || usr)
/datum/song/handheld/should_stop_playing(mob/user)
. = ..()
@@ -292,10 +391,8 @@
// subtype for stationary structures, like pianos
/datum/song/stationary
-/datum/song/stationary/updateDialog(mob/user = usr)
- if(user.machine != src)
- return
- parent.ui_interact(user)
+/datum/song/stationary/updateDialog(mob/user)
+ parent.ui_interact(user || usr)
/datum/song/stationary/should_stop_playing(mob/user)
. = ..()
diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm
index 8c5171667a..e385eed142 100644
--- a/code/modules/instruments/songs/editor.dm
+++ b/code/modules/instruments/songs/editor.dm
@@ -82,7 +82,6 @@
var/datum/browser/popup = new(user, "instrument", parent?.name || "instrument", 700, 500)
popup.set_content(dat.Join(""))
- popup.set_title_image(user.browse_rsc_icon(parent.icon, parent.icon_state))
popup.open()
/datum/song/proc/ParseSong(text)
diff --git a/code/modules/instruments/songs/play_legacy.dm b/code/modules/instruments/songs/play_legacy.dm
index fa64656ebc..eee9be3cc7 100644
--- a/code/modules/instruments/songs/play_legacy.dm
+++ b/code/modules/instruments/songs/play_legacy.dm
@@ -1,48 +1,52 @@
-/// Playing legacy instruments - None of the "advanced" like sound reservations and decay are invoked.
-/datum/song/proc/do_play_lines_legacy(mob/user)
- while(repeat >= 0)
- var/cur_oct[7]
- var/cur_acc[7]
- for(var/i = 1 to 7)
- cur_oct[i] = 3
- cur_acc[i] = "n"
+/**
+ * Compiles our lines into "chords" with filenames for legacy playback. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag.
+ */
+/datum/song/proc/compile_legacy()
+ if(!length(src.lines))
+ return
+ var/list/lines = src.lines //cache for hyepr speed!
+ compiled_chords = list()
+ var/list/octaves = list(3, 3, 3, 3, 3, 3, 3)
+ var/list/accents = list("n", "n", "n", "n", "n", "n", "n")
+ for(var/line in lines)
+ var/list/chords = splittext(lowertext(line), ",")
+ for(var/chord in chords)
+ var/list/compiled_chord = list()
+ var/tempodiv = 1
+ var/list/notes_tempodiv = splittext(chord, "/")
+ var/len = length(notes_tempodiv)
+ if(len >= 2)
+ tempodiv = text2num(notes_tempodiv[2])
+ if(len) //some dunkass is going to do ,,,, to make 3 rests instead of ,/1 because there's no standardization so let's be prepared for that.
+ var/list/notes = splittext(notes_tempodiv[1], "-")
+ for(var/note in notes)
+ if(length(note) == 0)
+ continue
+ // 1-7, A-G
+ var/key = text2ascii(note) - 96
+ if((key < 1) || (key > 7))
+ continue
+ for(var/i in 2 to length(note))
+ var/oct_acc = copytext(note, i, i + 1)
+ var/num = text2num(oct_acc)
+ if(!num) //it's an accidental
+ accents[key] = oct_acc //if they misspelled it/fucked up that's on them lmao, no safety checks.
+ else //octave
+ octaves[key] = clamp(num, octave_min, octave_max)
+ compiled_chord[++compiled_chord.len] = list(key, accents[key], octaves[key])
+ compiled_chord += tempodiv //this goes last
+ if(length(compiled_chord))
+ compiled_chords[++compiled_chords.len] = compiled_chord
- for(var/line in lines)
- for(var/beat in splittext(lowertext(line), ","))
- if(should_stop_playing(user))
- return
- var/list/notes = splittext(beat, "/")
- if(length(notes)) //because some jack-butts are going to do ,,,, to symbolize 3 rests instead of something reasonable like ,/1.
- for(var/note in splittext(notes[1], "-"))
- if(length(note) == 0)
- continue
- var/cur_note = text2ascii(note) - 96
- if(cur_note < 1 || cur_note > 7)
- continue
- for(var/i=2 to length(note))
- var/ni = copytext(note,i,i+1)
- if(!text2num(ni))
- if(ni == "#" || ni == "b" || ni == "n")
- cur_acc[cur_note] = ni
- else if(ni == "s")
- cur_acc[cur_note] = "#" // so shift is never required
- else
- cur_oct[cur_note] = text2num(ni)
- playnote_legacy(cur_note, cur_acc[cur_note], cur_oct[cur_note])
- if(notes.len >= 2 && text2num(notes[2]))
- sleep(sanitize_tempo(tempo / text2num(notes[2])))
- else
- sleep(tempo)
- if(should_stop_playing(user))
- return
- repeat--
- updateDialog()
- repeat = 0
-
-// note is a number from 1-7 for A-G
-// acc is either "b", "n", or "#"
-// oct is 1-8 (or 9 for C)
-/datum/song/proc/playnote_legacy(note, acc as text, oct)
+/**
+ * Proc to play a legacy note. Just plays the sound to hearing mobs (and does hearcheck if necessary), no fancy channel/sustain/management.
+ *
+ * Arguments:
+ * * note is a number from 1-7 for A-G
+ * * acc is either "b", "n", or "#"
+ * * oct is 1-8 (or 9 for C)
+ */
+/datum/song/proc/playkey_legacy(note, acc as text, oct, mob/user)
// handle accidental -> B<>C of E<>F
if(acc == "b" && (note == 3 || note == 6)) // C or F
if(note == 3)
diff --git a/code/modules/instruments/songs/play_synthesized.dm b/code/modules/instruments/songs/play_synthesized.dm
index 5e7c5652a0..4df54f5e6b 100644
--- a/code/modules/instruments/songs/play_synthesized.dm
+++ b/code/modules/instruments/songs/play_synthesized.dm
@@ -1,27 +1,7 @@
-/datum/song/proc/do_play_lines_synthesized(mob/user)
- compile_lines()
- while(repeat >= 0)
- if(should_stop_playing(user))
- return
- var/warned = FALSE
- for(var/_chord in compiled_chords)
- if(should_stop_playing(user))
- return
- var/list/chord = _chord
- var/tempodiv = chord[chord.len]
- for(var/i in 1 to chord.len - 1)
- var/key = chord[i]
- if(!playkey_synth(key))
- if(!warned)
- warned = TRUE
- to_chat(user, "Your instrument has ran out of channels. You might be playing your song too fast or be setting sustain to too high of a value. This warning will be suppressed for the rest of this cycle.")
- sleep(sanitize_tempo(tempo / (tempodiv || 1)))
- repeat--
- updateDialog()
- repeat = 0
-
-/// C-Db2-A-A4/2,A-B#4-C/3,/4,A,A-B-C as an example
-/datum/song/proc/compile_lines()
+/**
+ * Compiles our lines into "chords" with numbers. This makes there have to be a bit of lag at the beginning of the song, but repeats will not have to parse it again, and overall playback won't be impacted by as much lag.
+ */
+/datum/song/proc/compile_synthesized()
if(!length(src.lines))
return
var/list/lines = src.lines //cache for hyepr speed!
@@ -57,10 +37,12 @@
compiled_chord += tempodiv //this goes last
if(length(compiled_chord))
compiled_chords[++compiled_chords.len] = compiled_chord
- CHECK_TICK
- return compiled_chords
-/datum/song/proc/playkey_synth(key)
+/**
+ * Plays a specific numerical key from our instrument to anyone who can hear us.
+ * Does a hearing check if enough time has passed.
+ */
+/datum/song/proc/playkey_synth(key, mob/user)
if(can_noteshift)
key = clamp(key + note_shift, key_min, key_max)
if((world.time - MUSICIAN_HEARCHECK_MINDELAY) > last_hearcheck)
@@ -83,6 +65,9 @@
M.playsound_local(get_turf(parent), null, volume, FALSE, K.frequency, INSTRUMENT_DISTANCE_NO_FALLOFF, channel, null, copy, distance_multiplier = INSTRUMENT_DISTANCE_FALLOFF_BUFF)
// Could do environment and echo later but not for now
+/**
+ * Stops all sounds we are "responsible" for. Only works in synthesized mode.
+ */
/datum/song/proc/terminate_all_sounds(clear_channels = TRUE)
for(var/i in hearing_mobs)
terminate_sound_mob(i)
@@ -93,10 +78,16 @@
using_sound_channels = 0
SSsounds.free_datum_channels(src)
+/**
+ * Stops all sounds we are responsible for in a given person. Only works in synthesized mode.
+ */
/datum/song/proc/terminate_sound_mob(mob/M)
for(var/channel in channels_playing)
M.stop_sound_channel(text2num(channel))
+/**
+ * Pops a channel we have reserved so we don't have to release and re-request them from SSsounds every time we play a note. This is faster.
+ */
/datum/song/proc/pop_channel()
if(length(channels_idle)) //just pop one off of here if we have one available
. = text2num(channels_idle[1])
@@ -108,6 +99,12 @@
if(!isnull(.))
using_sound_channels++
+/**
+ * Decays our channels and updates their volumes to mobs who can hear us.
+ *
+ * Arguments:
+ * * wait_ds - the deciseconds we should decay by. This is to compensate for any lag, as otherwise songs would get pretty nasty during high time dilation.
+ */
/datum/song/proc/process_decay(wait_ds)
var/linear_dropoff = cached_linear_dropoff * wait_ds
var/exponential_dropoff = cached_exponential_dropoff ** wait_ds
diff --git a/code/modules/language/language.dm b/code/modules/language/language.dm
index 536bf06e8d..42b439ba03 100644
--- a/code/modules/language/language.dm
+++ b/code/modules/language/language.dm
@@ -35,7 +35,7 @@
return TRUE
/datum/language/proc/get_icon()
- var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat)
+ var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat)
return sheet.icon_tag("language-[icon_state]")
/datum/language/proc/get_random_name(gender, name_count=2, syllable_count=4, syllable_divisor=2)
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index f777246453..3953f5e28c 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -66,7 +66,6 @@
dat += "\[Go Back\]Choose up to '+opts.highlightLimit+' strings that will highlight the line when they appear in chat. ' +
- '' +
- '" var/datum/browser/popup = new(user, "publiclibrary", name, 600, 400) popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() /obj/machinery/computer/libraryconsole/Topic(href, href_list) @@ -314,7 +313,6 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums var/datum/browser/popup = new(user, "library", name, 600, 400) popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() /obj/machinery/computer/libraryconsole/bookmanagement/proc/findscanner(viewrange) @@ -537,7 +535,6 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums dat += " " var/datum/browser/popup = new(user, "scanner", name, 600, 400) popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() /obj/machinery/libraryscanner/Topic(href, href_list) diff --git a/code/modules/mapping/minimaps.dm b/code/modules/mapping/minimaps.dm index 7a62e9ab44..e0eb174cb3 100644 --- a/code/modules/mapping/minimaps.dm +++ b/code/modules/mapping/minimaps.dm @@ -4,7 +4,7 @@ // The map icons var/icon/map_icon var/icon/meta_icon - + var/list/color_area_names = list() var/minx @@ -33,7 +33,7 @@ meta_icon = new('html/blank.png') map_icon.Scale(x2 - x1 + 1, y2 - y1 + 1) // arrays start at 1 meta_icon.Scale(x2 - x1 + 1, y2 - y1 + 1) - + var/list/area_to_color = list() for(var/turf/T in block(locate(x1, y1, z_level), locate(x2, y2, z_level))) var/area/A = T.loc @@ -44,7 +44,7 @@ crop_x2 = max(crop_x2, T.x) crop_y1 = min(crop_y1, T.y) crop_y2 = max(crop_y2, T.y) - + var/meta_color = area_to_color[A] if(!meta_color) meta_color = rgb(rand(0, 255), rand(0, 255), rand(0, 255)) // technically conflicts could happen but it's like very unlikely and it's not that big of a deal if one happens @@ -73,13 +73,15 @@ overlay_icon = new(map_icon) overlay_icon.Scale(16, 16) //we're done baking, now we ship it. - register_asset("minimap-[id].png", map_icon) - register_asset("minimap-[id]-meta.png", meta_icon) + if (!SSassets.cache["minimap-[id].png"]) + SSassets.transport.register_asset("minimap-[id].png", map_icon) + if (!SSassets.cache["minimap-[id]-meta.png"]) + SSassets.transport.register_asset("minimap-[id]-meta.png", meta_icon) /datum/minimap/proc/send(mob/user) if(!id) CRASH("ERROR: send called, but the minimap id is null/missing. ID: [id]") - send_asset_list(user, list("minimap-[id].png" = map_icon, "minimap-[id]-meta.png" = meta_icon)) + SSassets.transport.send_assets(user, list("minimap-[id].png" = map_icon, "minimap-[id]-meta.png" = meta_icon)) /datum/minimap_group var/list/minimaps = list() @@ -100,15 +102,17 @@ var/list/datas = list() var/list/info = list() - + for(var/i in 1 to length(minimaps))// OLD: for(var/i in 1 to length(minimaps)) var/datum/minimap/M = minimaps[i] + var/map_name = "minimap-[M.id].png" + var/meta_name = "minimap-[M.id]-meta.png" M.send(user) info += {"
-
-
+ Access ReportPrepared By: [user_id_card && user_id_card.registered_name ? user_id_card.registered_name : "Unknown"]- For: [id_card.registered_name ? id_card.registered_name : "Unregistered"] + For: [target_id_card.registered_name ? target_id_card.registered_name : "Unregistered"] - Assignment: [id_card.assignment] + Assignment: [target_id_card.assignment] Access: "} var/known_access_rights = get_all_accesses() - for(var/A in id_card.access) + for(var/A in target_id_card.access) if(A in known_access_rights) contents += " [get_access_desc(A)]" @@ -148,43 +150,40 @@ computer.visible_message("\The [computer] prints out a paper.") return TRUE if("PRG_eject") - if(!computer || !card_slot) + if(!computer || !card_slot2) return - if(id_card) - GLOB.data_core.manifest_modify(id_card.registered_name, id_card.assignment) - card_slot.try_eject(TRUE, user) + if(target_id_card) + GLOB.data_core.manifest_modify(target_id_card.registered_name, target_id_card.assignment) + return card_slot2.try_eject(user) else var/obj/item/I = user.get_active_held_item() if(istype(I, /obj/item/card/id)) - if(!user.transferItemToLoc(I, computer)) - return - card_slot.stored_card = I - playsound(computer, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - return TRUE + return card_slot2.try_insert(I) + return FALSE if("PRG_terminate") if(!computer || !authenticated) return if(minor) - if(!(id_card.assignment in head_subordinates) && id_card.assignment != "Assistant") + if(!(target_id_card.assignment in head_subordinates) && target_id_card.assignment != "Assistant") return - id_card.access -= get_all_centcom_access() + get_all_accesses() - id_card.assignment = "Unassigned" - id_card.update_label() + target_id_card.access -= get_all_centcom_access() + get_all_accesses() + target_id_card.assignment = "Unassigned" + target_id_card.update_label() playsound(computer, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return TRUE if("PRG_edit") - if(!computer || !authenticated || !id_card) + if(!computer || !authenticated || !target_id_card) return var/new_name = params["name"] if(!new_name) return - id_card.registered_name = new_name - id_card.update_label() + target_id_card.registered_name = new_name + target_id_card.update_label() playsound(computer, "terminal_type", 50, FALSE) return TRUE if("PRG_assign") - if(!computer || !authenticated || !id_card) + if(!computer || !authenticated || !target_id_card) return var/target = params["assign_target"] if(!target) @@ -193,8 +192,8 @@ if(target == "Custom") var/custom_name = params["custom_name"] if(custom_name) - id_card.assignment = custom_name - id_card.update_label() + target_id_card.assignment = custom_name + target_id_card.update_label() else if(minor && !(target in head_subordinates)) return @@ -212,10 +211,10 @@ to_chat(user, "No class exists for this job: [target]") return new_access = job.get_access() - id_card.access -= get_all_centcom_access() + get_all_accesses() - id_card.access |= new_access - id_card.assignment = target - id_card.update_label() + target_id_card.access -= get_all_centcom_access() + get_all_accesses() + target_id_card.access |= new_access + target_id_card.assignment = target + target_id_card.update_label() playsound(computer, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) return TRUE if("PRG_access") @@ -223,22 +222,22 @@ return var/access_type = text2num(params["access_target"]) if(access_type in (is_centcom ? get_all_centcom_access() : get_all_accesses())) - if(access_type in id_card.access) - id_card.access -= access_type + if(access_type in target_id_card.access) + target_id_card.access -= access_type else - id_card.access |= access_type + target_id_card.access |= access_type playsound(computer, "terminal_type", 50, FALSE) return TRUE if("PRG_grantall") if(!computer || !authenticated || minor) return - id_card.access |= (is_centcom ? get_all_centcom_access() : get_all_accesses()) + target_id_card.access |= (is_centcom ? get_all_centcom_access() : get_all_accesses()) playsound(computer, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) return TRUE if("PRG_denyall") if(!computer || !authenticated || minor) return - id_card.access.Cut() + target_id_card.access.Cut() playsound(computer, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return TRUE if("PRG_grantregion") @@ -247,7 +246,7 @@ var/region = text2num(params["region"]) if(isnull(region)) return - id_card.access |= get_region_accesses(region) + target_id_card.access |= get_region_accesses(region) playsound(computer, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) return TRUE if("PRG_denyregion") @@ -256,7 +255,7 @@ var/region = text2num(params["region"]) if(isnull(region)) return - id_card.access -= get_region_accesses(region) + target_id_card.access -= get_region_accesses(region) playsound(computer, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE) return TRUE @@ -321,17 +320,17 @@ /datum/computer_file/program/card_mod/ui_data(mob/user) var/list/data = get_header_data() - var/obj/item/computer_hardware/card_slot/card_slot + var/obj/item/computer_hardware/card_slot/card_slot2 var/obj/item/computer_hardware/printer/printer if(computer) - card_slot = computer.all_components[MC_CARD] + card_slot2 = computer.all_components[MC_CARD2] printer = computer.all_components[MC_PRINT] data["station_name"] = station_name() if(computer) - data["have_id_slot"] = !!card_slot + data["have_id_slot"] = !!(card_slot2) data["have_printer"] = !!printer else data["have_id_slot"] = FALSE @@ -340,7 +339,7 @@ data["authenticated"] = authenticated if(computer) - var/obj/item/card/id/id_card = card_slot.stored_card + var/obj/item/card/id/id_card = card_slot2.stored_card data["has_id"] = !!id_card data["id_name"] = id_card ? id_card.name : "-----" if(id_card) diff --git a/code/modules/modular_computers/file_system/programs/cargobounty.dm b/code/modules/modular_computers/file_system/programs/cargobounty.dm index d9bc65c98d..74ac44ade3 100644 --- a/code/modules/modular_computers/file_system/programs/cargobounty.dm +++ b/code/modules/modular_computers/file_system/programs/cargobounty.dm @@ -5,7 +5,6 @@ extended_desc = "A basic interface for supply personnel to check and claim bounties." requires_ntnet = TRUE transfer_access = ACCESS_CARGO - network_destination = "cargo claims interface" size = 10 tgui_id = "NtosBountyConsole" ///cooldown var for printing paper sheets. diff --git a/code/modules/modular_computers/file_system/programs/cargoship.dm b/code/modules/modular_computers/file_system/programs/cargoship.dm index 3ba08a3719..db8d6d9f82 100644 --- a/code/modules/modular_computers/file_system/programs/cargoship.dm +++ b/code/modules/modular_computers/file_system/programs/cargoship.dm @@ -1,9 +1,8 @@ /datum/computer_file/program/shipping filename = "shipping" - filedesc = "Nanotrasen Shipping Scanner" + filedesc = "GrandArk Exporter" program_icon_state = "shipping" extended_desc = "A combination printer/scanner app that enables modular computers to print barcodes for easy scanning and shipping." - network_destination = "ship scanner" size = 6 tgui_id = "NtosShipping" ///Account used for creating barcodes. diff --git a/code/modules/modular_computers/file_system/programs/crewmanifest.dm b/code/modules/modular_computers/file_system/programs/crewmanifest.dm index a1503ce3a8..4f2688d8f1 100644 --- a/code/modules/modular_computers/file_system/programs/crewmanifest.dm +++ b/code/modules/modular_computers/file_system/programs/crewmanifest.dm @@ -1,10 +1,10 @@ /datum/computer_file/program/crew_manifest - filename = "crewmani" - filedesc = "Crew Manifest" + filename = "plexagoncrew" + filedesc = "Plexagon Crew List" program_icon_state = "id" extended_desc = "Program for viewing and printing the current crew manifest" transfer_access = ACCESS_HEADS - requires_ntnet = FALSE + requires_ntnet = TRUE size = 4 tgui_id = "NtosCrewManifest" diff --git a/code/modules/modular_computers/file_system/programs/jobmanagement.dm b/code/modules/modular_computers/file_system/programs/jobmanagement.dm index bccc6e4dbe..b88b793b66 100644 --- a/code/modules/modular_computers/file_system/programs/jobmanagement.dm +++ b/code/modules/modular_computers/file_system/programs/jobmanagement.dm @@ -1,10 +1,10 @@ /datum/computer_file/program/job_management - filename = "job_manage" - filedesc = "Job Manager" + filename = "plexagoncore" + filedesc = "Plexagon HR Core" program_icon_state = "id" extended_desc = "Program for viewing and changing job slot avalibility." transfer_access = ACCESS_HEADS - requires_ntnet = 0 + requires_ntnet = TRUE size = 4 tgui_id = "NtosJobManager" diff --git a/code/modules/modular_computers/file_system/programs/ntdownloader.dm b/code/modules/modular_computers/file_system/programs/ntdownloader.dm index 6401d6207f..8fbcfd0b01 100644 --- a/code/modules/modular_computers/file_system/programs/ntdownloader.dm +++ b/code/modules/modular_computers/file_system/programs/ntdownloader.dm @@ -1,14 +1,14 @@ /datum/computer_file/program/ntnetdownload - filename = "ntndownloader" - filedesc = "Software Download Tool" + filename = "ntsoftwarehub" + filedesc = "NT Software Hub" program_icon_state = "generic" extended_desc = "This program allows downloads of software from official NT repositories" - unsendable = 1 - undeletable = 1 + unsendable = TRUE + undeletable = TRUE size = 4 - requires_ntnet = 1 + requires_ntnet = TRUE requires_ntnet_feature = NTNET_SOFTWAREDOWNLOAD - available_on_ntnet = 0 + available_on_ntnet = FALSE ui_header = "downloader_finished.gif" tgui_id = "NtosNetDownloader" @@ -125,6 +125,8 @@ if(!istype(my_computer)) return + var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD] + var/list/access = card_slot?.GetAccess() var/list/data = get_header_data() @@ -146,7 +148,7 @@ for(var/A in main_repo) var/datum/computer_file/program/P = A // Only those programs our user can run will show in the list - if(!P.can_run(user,transfer = 1) || hard_drive.find_file_by_name(P.filename)) + if(!P.can_run(user,transfer = 1, access = access) || hard_drive.find_file_by_name(P.filename)) continue all_entries.Add(list(list( "filename" = P.filename, diff --git a/code/modules/modular_computers/file_system/programs/ntmonitor.dm b/code/modules/modular_computers/file_system/programs/ntmonitor.dm index 7d6d89f32c..bbbde14780 100644 --- a/code/modules/modular_computers/file_system/programs/ntmonitor.dm +++ b/code/modules/modular_computers/file_system/programs/ntmonitor.dm @@ -1,6 +1,6 @@ /datum/computer_file/program/ntnetmonitor - filename = "ntmonitor" - filedesc = "NTNet Diagnostics and Monitoring" + filename = "wirecarp" + filedesc = "WireCarp" //wireshark. program_icon_state = "comm_monitor" extended_desc = "This program monitors stationwide NTNet network, provides access to logging systems, and allows for configuration changes" size = 12 diff --git a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm index df9b02d8ec..f03ff3f8fd 100644 --- a/code/modules/modular_computers/file_system/programs/ntnrc_client.dm +++ b/code/modules/modular_computers/file_system/programs/ntnrc_client.dm @@ -6,7 +6,6 @@ size = 8 requires_ntnet = 1 requires_ntnet_feature = NTNET_COMMUNICATION - network_destination = "NTNRC server" ui_header = "ntnrc_idle.gif" available_on_ntnet = 1 tgui_id = "NtosNetChat" diff --git a/code/modules/modular_computers/file_system/programs/powermonitor.dm b/code/modules/modular_computers/file_system/programs/powermonitor.dm index bd11474858..e87a731a40 100644 --- a/code/modules/modular_computers/file_system/programs/powermonitor.dm +++ b/code/modules/modular_computers/file_system/programs/powermonitor.dm @@ -1,15 +1,14 @@ //normal computer version is located in code\modules\power\monitor.dm, /obj/machinery/computer/monitor /datum/computer_file/program/power_monitor - filename = "powermonitor" - filedesc = "Power Monitor" + filename = "ampcheck" + filedesc = "AmpCheck" program_icon_state = "power_monitor" extended_desc = "This program connects to sensors around the station to provide information about electrical systems" ui_header = "power_norm.gif" transfer_access = ACCESS_ENGINE usage_flags = PROGRAM_CONSOLE requires_ntnet = 0 - network_destination = "power monitoring system" size = 9 tgui_id = "NtosPowerMonitor" diff --git a/code/modules/modular_computers/file_system/programs/radar.dm b/code/modules/modular_computers/file_system/programs/radar.dm index 9b0e09ef99..216365d6ea 100644 --- a/code/modules/modular_computers/file_system/programs/radar.dm +++ b/code/modules/modular_computers/file_system/programs/radar.dm @@ -7,7 +7,6 @@ transfer_access = null available_on_ntnet = FALSE usage_flags = PROGRAM_LAPTOP | PROGRAM_TABLET - network_destination = "tracking program" size = 5 tgui_id = "NtosRadar" ///List of trackable entities. Updated by the scan() proc. @@ -207,7 +206,7 @@ ///A program that tracks crew members via suit sensors /datum/computer_file/program/radar/lifeline - filename = "Lifeline" + filename = "lifeline" filedesc = "Lifeline" extended_desc = "This program allows for tracking of crew members via their suit sensors." requires_ntnet = TRUE @@ -252,9 +251,9 @@ //Nuke Disk Finder App// //////////////////////// -///A program that tracks crew members via suit sensors +///A program that tracks nukes and nuclear accessories /datum/computer_file/program/radar/fission360 - filename = "Fission360" + filename = "fission360" filedesc = "Fission360" program_icon_state = "radarsyndicate" extended_desc = "This program allows for tracking of nuclear authorization disks and warheads." @@ -276,8 +275,6 @@ objects = list() for(var/i in GLOB.nuke_list) var/obj/machinery/nuclearbomb/nuke = i - if(!trackable(nuke)) - continue var/list/nukeinfo = list( ref = REF(nuke), @@ -285,9 +282,8 @@ ) objects += list(nukeinfo) var/obj/item/disk/nuclear/disk = locate() in GLOB.poi_list - if(trackable(disk)) - var/list/nukeinfo = list( - ref = REF(disk), - name = disk.name, - ) - objects += list(nukeinfo) + var/list/nukeinfo = list( + ref = REF(disk), + name = "Nuke Auth. Disk", + ) + objects += list(nukeinfo) diff --git a/code/modules/modular_computers/file_system/programs/robocontrol.dm b/code/modules/modular_computers/file_system/programs/robocontrol.dm index 8644ce09b4..c0b82b9c95 100644 --- a/code/modules/modular_computers/file_system/programs/robocontrol.dm +++ b/code/modules/modular_computers/file_system/programs/robocontrol.dm @@ -1,12 +1,11 @@ /datum/computer_file/program/robocontrol - filename = "robocontrol" - filedesc = "Bot Remote Controller" + filename = "botkeeper" + filedesc = "Botkeeper" program_icon_state = "robot" extended_desc = "A remote controller used for giving basic commands to non-sentient robots." transfer_access = ACCESS_ROBOTICS requires_ntnet = TRUE - network_destination = "robotics control network" size = 12 tgui_id = "NtosRoboControl" ///Number of simple robots on-station. @@ -78,7 +77,7 @@ return if(id_card) GLOB.data_core.manifest_modify(id_card.registered_name, id_card.assignment) - card_slot.try_eject(TRUE, current_user) + card_slot.try_eject(current_user) else playsound(get_turf(ui_host()) , 'sound/machines/buzz-sigh.ogg', 25, FALSE) return diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index 32ad102871..e4cf590930 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -1,12 +1,11 @@ /datum/computer_file/program/supermatter_monitor - filename = "smmonitor" - filedesc = "Supermatter Monitoring" + filename = "ntcims" + filedesc = "NT CIMS" ui_header = "smmon_0.gif" program_icon_state = "smmon_0" - extended_desc = "This program connects to specially calibrated supermatter sensors to provide information on the status of supermatter-based engines." + extended_desc = "Crystal Integrity Monitoring System, connects to specially calibrated supermatter sensors to provide information on the status of supermatter-based engines." requires_ntnet = TRUE transfer_access = ACCESS_CONSTRUCTION - network_destination = "supermatter monitoring system" size = 5 tgui_id = "NtosSupermatterMonitor" var/last_status = SUPERMATTER_INACTIVE diff --git a/code/modules/modular_computers/hardware/_hardware.dm b/code/modules/modular_computers/hardware/_hardware.dm index b33442f99b..81555340b2 100644 --- a/code/modules/modular_computers/hardware/_hardware.dm +++ b/code/modules/modular_computers/hardware/_hardware.dm @@ -10,9 +10,11 @@ // Computer that holds this hardware, if any. var/power_usage = 0 // If the hardware uses extra power, change this. - var/enabled = 1 // If the hardware is turned off set this to 0. - var/critical = 0 // Prevent disabling for important component, like the CPU. - var/can_install = 1 // Prevents direct installation of removable media. + var/enabled = TRUE // If the hardware is turned off set this to 0. + var/critical = FALSE // Prevent disabling for important component, like the CPU. + var/can_install = TRUE // Prevents direct installation of removable media. + var/expansion_hw = FALSE // Hardware that fits into expansion bays. + var/removable = TRUE // Whether the hardware is removable or not. var/damage = 0 // Current damage level var/max_damage = 100 // Maximal damage level. var/damage_malfunction = 20 // "Malfunction" threshold. When damage exceeds this value the hardware piece will semi-randomly fail and do !!FUN!! things @@ -20,7 +22,7 @@ var/malfunction_probability = 10// Chance of malfunction when the component is damaged var/device_type -/obj/item/computer_hardware/New(var/obj/L) +/obj/item/computer_hardware/New(obj/L) ..() pixel_x = rand(-8, 8) pixel_y = rand(-8, 8) @@ -56,7 +58,7 @@ return TRUE // Called on multitool click, prints diagnostic information to the user. -/obj/item/computer_hardware/proc/diagnostics(var/mob/user) +/obj/item/computer_hardware/proc/diagnostics(mob/user) to_chat(user, "Hardware Integrity Test... (Corruption: [damage]/[max_damage]) [damage > damage_failure ? "FAIL" : damage > damage_malfunction ? "WARN" : "PASS"]") // Handles damage checks @@ -73,7 +75,7 @@ return TRUE // Good to go. -/obj/item/computer_hardware/examine(var/mob/user) +/obj/item/computer_hardware/examine(mob/user) . = ..() if(damage > damage_failure) . += "It seems to be severely damaged!" diff --git a/code/modules/modular_computers/hardware/ai_slot.dm b/code/modules/modular_computers/hardware/ai_slot.dm index 0ad157afcb..c874d786a0 100644 --- a/code/modules/modular_computers/hardware/ai_slot.dm +++ b/code/modules/modular_computers/hardware/ai_slot.dm @@ -5,6 +5,7 @@ icon_state = "card_mini" w_class = WEIGHT_CLASS_SMALL device_type = MC_AI + expansion_hw = TRUE var/obj/item/aicard/stored_card = null var/locked = FALSE @@ -19,12 +20,6 @@ if(stored_card) . += "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it." -/obj/item/computer_hardware/ai_slot/on_install(obj/item/modular_computer/M, mob/living/user = null) - M.add_verb(device_type) - -/obj/item/computer_hardware/ai_slot/on_remove(obj/item/modular_computer/M, mob/living/user = null) - M.remove_verb(device_type) - /obj/item/computer_hardware/ai_slot/try_insert(obj/item/I, mob/living/user = null) if(!holder) return FALSE @@ -44,7 +39,7 @@ return TRUE -/obj/item/computer_hardware/ai_slot/try_eject(slot=0,mob/living/user = null,forced = 0) +/obj/item/computer_hardware/ai_slot/try_eject(mob/living/user = null,forced = FALSE) if(!stored_card) to_chat(user, "There is no card in \the [src].") return FALSE diff --git a/code/modules/modular_computers/hardware/battery_module.dm b/code/modules/modular_computers/hardware/battery_module.dm index 6e3193abfd..0668248315 100644 --- a/code/modules/modular_computers/hardware/battery_module.dm +++ b/code/modules/modular_computers/hardware/battery_module.dm @@ -21,7 +21,7 @@ /obj/item/computer_hardware/battery/handle_atom_del(atom/A) if(A == battery) - try_eject(0, null, TRUE) + try_eject(forced = TRUE) . = ..() /obj/item/computer_hardware/battery/try_insert(obj/item/I, mob/living/user = null) @@ -48,7 +48,7 @@ return TRUE -/obj/item/computer_hardware/battery/try_eject(slot=0, mob/living/user = null, forced = 0) +/obj/item/computer_hardware/battery/try_eject(mob/living/user = null, forced = FALSE) if(!battery) to_chat(user, "There is no power cell connected to \the [src].") return FALSE diff --git a/code/modules/modular_computers/hardware/card_slot.dm b/code/modules/modular_computers/hardware/card_slot.dm index 18b423a42e..c243bf7db1 100644 --- a/code/modules/modular_computers/hardware/card_slot.dm +++ b/code/modules/modular_computers/hardware/card_slot.dm @@ -7,13 +7,10 @@ device_type = MC_CARD var/obj/item/card/id/stored_card = null - var/obj/item/card/id/stored_card2 = null /obj/item/computer_hardware/card_slot/handle_atom_del(atom/A) if(A == stored_card) - try_eject(1, null, TRUE) - if(A == stored_card2) - try_eject(2, null, TRUE) + try_eject(null, TRUE) . = ..() /obj/item/computer_hardware/card_slot/Destroy() @@ -21,37 +18,25 @@ return ..() /obj/item/computer_hardware/card_slot/GetAccess() - if(stored_card && stored_card2) // Best of both worlds - return (stored_card.GetAccess() | stored_card2.GetAccess()) - else if(stored_card) - return stored_card.GetAccess() - else if(stored_card2) - return stored_card2.GetAccess() - return ..() + var/list/total_access + if(stored_card) + total_access = stored_card.GetAccess() + var/obj/item/computer_hardware/card_slot/card_slot2 = holder?.all_components[MC_CARD2] //Best of both worlds + if(card_slot2?.stored_card) + total_access |= card_slot2.stored_card.GetAccess() + return total_access /obj/item/computer_hardware/card_slot/GetID() if(stored_card) return stored_card - else if(stored_card2) - return stored_card2 return ..() /obj/item/computer_hardware/card_slot/RemoveID() if(stored_card) . = stored_card - if(!try_eject(1)) + if(!try_eject()) return null return - if(stored_card2) - . = stored_card2 - if(!try_eject(2)) - return null - -/obj/item/computer_hardware/card_slot/on_install(obj/item/modular_computer/M, mob/living/user = null) - M.add_verb(device_type) - -/obj/item/computer_hardware/card_slot/on_remove(obj/item/modular_computer/M, mob/living/user = null) - M.remove_verb(device_type) /obj/item/computer_hardware/card_slot/try_insert(obj/item/I, mob/living/user = null) if(!holder) @@ -60,8 +45,7 @@ if(!istype(I, /obj/item/card/id)) return FALSE - if(stored_card && stored_card2) - to_chat(user, "You try to insert \the [I] into \the [src], but its slots are occupied.") + if(stored_card) return FALSE if(user) if(!user.transferItemToLoc(I, src)) @@ -69,11 +53,8 @@ else I.forceMove(src) - if(!stored_card) - stored_card = I - else - stored_card2 = I - to_chat(user, "You insert \the [I] into \the [src].") + stored_card = I + to_chat(user, "You insert \the [I] into \the [expansion_hw ? "secondary":"primary"] [src].") playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -82,53 +63,58 @@ return TRUE -/obj/item/computer_hardware/card_slot/try_eject(slot=0, mob/living/user = null, forced = 0) - if(!stored_card && !stored_card2) +/obj/item/computer_hardware/card_slot/try_eject(mob/living/user = null, forced = FALSE) + if(!stored_card) to_chat(user, "There are no cards in \the [src].") return FALSE - var/ejected = 0 - if(stored_card && (!slot || slot == 1)) - if(user) - user.put_in_hands(stored_card) - else - stored_card.forceMove(drop_location()) - stored_card = null - ejected++ + if(user) + user.put_in_hands(stored_card) + else + stored_card.forceMove(drop_location()) + stored_card = null - if(stored_card2 && (!slot || slot == 2)) - if(user) - user.put_in_hands(stored_card2) - else - stored_card2.forceMove(drop_location()) - stored_card2 = null - ejected++ + if(holder) + if(holder.active_program) + holder.active_program.event_idremoved(0) - if(ejected) - if(holder) - if(holder.active_program) - holder.active_program.event_idremoved(0, slot) - - for(var/I in holder.idle_threads) - var/datum/computer_file/program/P = I - P.event_idremoved(1, slot) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - H.sec_hud_set_ID() - to_chat(user, "You remove the card[ejected>1 ? "s" : ""] from \the [src].") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) - return TRUE - return FALSE + for(var/p in holder.idle_threads) + var/datum/computer_file/program/computer_program = p + computer_program.event_idremoved(1) + if(ishuman(user)) + var/mob/living/carbon/human/human_user = user + human_user.sec_hud_set_ID() + to_chat(user, "You remove the card from \the [src].") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + return TRUE /obj/item/computer_hardware/card_slot/attackby(obj/item/I, mob/living/user) if(..()) return if(I.tool_behaviour == TOOL_SCREWDRIVER) - to_chat(user, "You press down on the manual eject button with \the [I].") - try_eject(0,user) - return + if(stored_card) + to_chat(user, "You press down on the manual eject button with \the [I].") + try_eject(user) + return + swap_slot() + to_chat(user, "You adjust the connecter to fit into [expansion_hw ? "an expansion bay" : "the primary ID bay"].") + +/** + *Swaps the card_slot hardware between using the dedicated card slot bay on a computer, and using an expansion bay. +*/ +/obj/item/computer_hardware/card_slot/proc/swap_slot() + expansion_hw = !expansion_hw + if(expansion_hw) + device_type = MC_CARD2 + else + device_type = MC_CARD /obj/item/computer_hardware/card_slot/examine(mob/user) . = ..() - if(stored_card || stored_card2) + . += "The connector is set to fit into [expansion_hw ? "an expansion bay" : "a computer's primary ID bay"], but can be adjusted with a screwdriver." + if(stored_card) . += "There appears to be something loaded in the card slots." + +/obj/item/computer_hardware/card_slot/secondary + device_type = MC_CARD2 + expansion_hw = TRUE diff --git a/code/modules/modular_computers/hardware/hard_drive.dm b/code/modules/modular_computers/hardware/hard_drive.dm index b8b9624388..e5c133de20 100644 --- a/code/modules/modular_computers/hardware/hard_drive.dm +++ b/code/modules/modular_computers/hardware/hard_drive.dm @@ -22,14 +22,14 @@ . = ..() . += "It has [max_capacity] GQ of storage capacity." -/obj/item/computer_hardware/hard_drive/diagnostics(var/mob/user) +/obj/item/computer_hardware/hard_drive/diagnostics(mob/user) ..() // 999 is a byond limit that is in place. It's unlikely someone will reach that many files anyway, since you would sooner run out of space. to_chat(user, "NT-NFS File Table Status: [stored_files.len]/999") to_chat(user, "Storage capacity: [used_capacity]/[max_capacity]GQ") // Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. -/obj/item/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F) +/obj/item/computer_hardware/hard_drive/proc/store_file(datum/computer_file/F) if(!F || !istype(F)) return 0 @@ -52,7 +52,7 @@ return 1 // Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks. -/obj/item/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F) +/obj/item/computer_hardware/hard_drive/proc/remove_file(datum/computer_file/F) if(!F || !istype(F)) return 0 @@ -78,7 +78,7 @@ used_capacity = total_size // Checks whether file can be stored on the hard drive. We can only store unique files, so this checks whether we wouldn't get a duplicity by adding a file. -/obj/item/computer_hardware/hard_drive/proc/can_store_file(var/datum/computer_file/F) +/obj/item/computer_hardware/hard_drive/proc/can_store_file(datum/computer_file/F) if(!F || !istype(F)) return 0 @@ -101,7 +101,7 @@ // Tries to find the file by filename. Returns null on failure -/obj/item/computer_hardware/hard_drive/proc/find_file_by_name(var/filename) +/obj/item/computer_hardware/hard_drive/proc/find_file_by_name(filename) if(!check_functionality()) return null diff --git a/code/modules/modular_computers/hardware/network_card.dm b/code/modules/modular_computers/hardware/network_card.dm index fe1b1879cb..04bf494fe4 100644 --- a/code/modules/modular_computers/hardware/network_card.dm +++ b/code/modules/modular_computers/hardware/network_card.dm @@ -11,7 +11,7 @@ device_type = MC_NET var/static/ntnet_card_uid = 1 -/obj/item/computer_hardware/network_card/diagnostics(var/mob/user) +/obj/item/computer_hardware/network_card/diagnostics(mob/user) ..() to_chat(user, "NIX Unique ID: [identification_id]") to_chat(user, "NIX User Tag: [identification_string]") @@ -22,7 +22,7 @@ if(ethernet) to_chat(user, "OpenEth (Physical Connection) - Physical network connection port") -/obj/item/computer_hardware/network_card/New(var/l) +/obj/item/computer_hardware/network_card/New(l) ..() identification_id = ntnet_card_uid++ @@ -31,7 +31,7 @@ return "[identification_string] (NID [identification_id])" // 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection -/obj/item/computer_hardware/network_card/proc/get_signal(var/specific_action = 0) +/obj/item/computer_hardware/network_card/proc/get_signal(specific_action = 0) if(!holder) // Hardware is not installed in anything. No signal. How did this even get called? return 0 diff --git a/code/modules/modular_computers/hardware/portable_disk.dm b/code/modules/modular_computers/hardware/portable_disk.dm index b5a957be04..89b0382e86 100644 --- a/code/modules/modular_computers/hardware/portable_disk.dm +++ b/code/modules/modular_computers/hardware/portable_disk.dm @@ -8,12 +8,8 @@ max_capacity = 16 device_type = MC_SDD -/obj/item/computer_hardware/hard_drive/portable/on_install(obj/item/modular_computer/M, mob/living/user = null) - M.add_verb(device_type) - -/obj/item/computer_hardware/hard_drive/portable/on_remove(obj/item/modular_computer/M, mob/living/user = null) - ..() - M.remove_verb(device_type) +/obj/item/computer_hardware/hard_drive/portable/on_remove(obj/item/modular_computer/MC, mob/user) + return //this is a floppy disk, let's not shut the computer down when it gets pulled out. /obj/item/computer_hardware/hard_drive/portable/install_default_programs() return // Empty by default diff --git a/code/modules/modular_computers/hardware/printer.dm b/code/modules/modular_computers/hardware/printer.dm index ebe40c1922..3bd5946435 100644 --- a/code/modules/modular_computers/hardware/printer.dm +++ b/code/modules/modular_computers/hardware/printer.dm @@ -5,6 +5,7 @@ icon_state = "printer" w_class = WEIGHT_CLASS_NORMAL device_type = MC_PRINT + expansion_hw = TRUE var/stored_paper = 20 var/max_paper = 30 diff --git a/code/modules/modular_computers/hardware/sensor_package.dm b/code/modules/modular_computers/hardware/sensor_package.dm new file mode 100644 index 0000000000..c0363bc809 --- /dev/null +++ b/code/modules/modular_computers/hardware/sensor_package.dm @@ -0,0 +1,8 @@ +//This item doesn't do much on its own, but is required by apps such as AtmoZphere. +/obj/item/computer_hardware/sensorpackage + name = "sensor package" + desc = "An integrated sensor package allowing a computer to take readings from the environment. Required by certain programs." + icon_state = "servo" + w_class = WEIGHT_CLASS_TINY + device_type = MC_SENSORS + expansion_hw = TRUE diff --git a/code/modules/modular_computers/laptop_vendor.dm b/code/modules/modular_computers/laptop_vendor.dm index a8d30bad21..83bb057d66 100644 --- a/code/modules/modular_computers/laptop_vendor.dm +++ b/code/modules/modular_computers/laptop_vendor.dm @@ -52,6 +52,7 @@ var/obj/item/computer_hardware/battery/battery_module = null if(fabricate) fabricated_laptop = new /obj/item/modular_computer/laptop/buildable(src) + fabricated_laptop.install_component(new /obj/item/computer_hardware/card_slot) fabricated_laptop.install_component(new /obj/item/computer_hardware/battery) battery_module = fabricated_laptop.all_components[MC_CELL] total_price = 99 @@ -107,7 +108,7 @@ if(dev_card) total_price += 199 if(fabricate) - fabricated_laptop.install_component(new /obj/item/computer_hardware/card_slot) + fabricated_laptop.install_component(new /obj/item/computer_hardware/card_slot/secondary) return total_price else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this. @@ -116,6 +117,7 @@ fabricated_tablet = new(src) fabricated_tablet.install_component(new /obj/item/computer_hardware/battery) fabricated_tablet.install_component(new /obj/item/computer_hardware/processor_unit/small) + fabricated_tablet.install_component(new/obj/item/computer_hardware/card_slot) battery_module = fabricated_tablet.all_components[MC_CELL] total_price = 199 switch(dev_battery) @@ -154,11 +156,11 @@ if(dev_printer) total_price += 99 if(fabricate) - fabricated_tablet.install_component(new/obj/item/computer_hardware/printer) + fabricated_tablet.install_component(new/obj/item/computer_hardware/printer/mini) if(dev_card) total_price += 199 if(fabricate) - fabricated_tablet.install_component(new/obj/item/computer_hardware/card_slot) + fabricated_tablet.install_component(new/obj/item/computer_hardware/card_slot/secondary) return total_price return FALSE @@ -257,7 +259,7 @@ say("Insufficient credits on card to purchase!") return credits += target_credits - say("[target_credits] cr has been deposited from your account.") + say("[target_credits] cr have been withdrawn from your account.") return return ..() diff --git a/code/modules/newscaster/newscaster_machine.dm b/code/modules/newscaster/newscaster_machine.dm index cb2d49fc64..7e515bf0f5 100644 --- a/code/modules/newscaster/newscaster_machine.dm +++ b/code/modules/newscaster/newscaster_machine.dm @@ -95,6 +95,10 @@ GLOBAL_LIST_EMPTY(allCasters) . = ..() update_icon() +/obj/machinery/newscaster/attack_ghost(mob/dead/observer/user) + if(istype(user)) + user.read_news() + /obj/machinery/newscaster/ui_interact(mob/user) . = ..() if(ishuman(user) || issilicon(user)) @@ -336,7 +340,6 @@ GLOBAL_LIST_EMPTY(allCasters) dat+="Return" var/datum/browser/popup = new(human_or_robot_user, "newscaster_main", "Newscaster Unit #[unit_no]", 400, 600) popup.set_content(dat) - popup.set_title_image(human_or_robot_user.browse_rsc_icon(icon, icon_state)) popup.open() /obj/machinery/newscaster/Topic(href, href_list) diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm new file mode 100644 index 0000000000..dc8f172069 --- /dev/null +++ b/code/modules/paperwork/carbonpaper.dm @@ -0,0 +1,45 @@ +/obj/item/paper/carbon + name = "sheet of carbon" + icon_state = "paper_stack" + item_state = "paper" + // inhand_icon_state = "paper" + show_written_words = FALSE + var/copied = FALSE + var/iscopy = FALSE + +/obj/item/paper/carbon/update_icon_state() + if(iscopy) + icon_state = "cpaper" + else if(copied) + icon_state = "paper" + else + icon_state = "paper_stack" + if(info) + icon_state = "[icon_state]_words" + +/obj/item/paper/carbon/proc/removecopy(mob/living/user) + if(!copied) + var/obj/item/paper/carbon/C = src + var/copycontents = C.info + var/obj/item/paper/carbon/Copy = new /obj/item/paper/carbon(user.loc) + + if(info) + copycontents = replacetext(copycontents, "" + Copy.name = "Copy - [C.name]" + to_chat(user, "You tear off the carbon-copy!") + C.copied = TRUE + Copy.iscopy = TRUE + Copy.update_icon_state() + C.update_icon_state() + user.put_in_hands(Copy) + else + to_chat(user, "There are no more carbon copies attached to this paper!") + +/obj/item/paper/carbon/on_attack_hand(mob/living/user) + if(loc == user && user.is_holding(src)) + removecopy(user) + return + return ..() diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 1a93661c76..5b576a2438 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -3,6 +3,8 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "clipboard" item_state = "clipboard" + // inhand_icon_state = "clipboard" + // worn_icon_state = "clipboard" throwforce = 0 w_class = WEIGHT_CLASS_SMALL throw_speed = 3 @@ -34,7 +36,6 @@ . += "clipboard_pen" . += "clipboard_over" - /obj/item/clipboard/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/paper)) if(!user.transferItemToLoc(W, src)) @@ -92,14 +93,14 @@ to_chat(usr, "You slot [W] into [src].") if(href_list["write"]) - var/obj/item/P = locate(href_list["write"]) - if(istype(P) && P.loc == src) + var/obj/item/P = locate(href_list["write"]) in src + if(istype(P)) if(usr.get_active_held_item()) P.attackby(usr.get_active_held_item(), usr) if(href_list["remove"]) - var/obj/item/P = locate(href_list["remove"]) - if(istype(P) && P.loc == src) + var/obj/item/P = locate(href_list["remove"]) in src + if(istype(P)) P.forceMove(usr.loc) usr.put_in_hands(P) if(P == toppaper) @@ -111,13 +112,13 @@ toppaper = null if(href_list["read"]) - var/obj/item/paper/P = locate(href_list["read"]) - if(istype(P) && P.loc == src) + var/obj/item/paper/P = locate(href_list["read"]) in src + if(istype(P)) usr.examinate(P) if(href_list["top"]) - var/obj/item/P = locate(href_list["top"]) - if(istype(P) && P.loc == src) + var/obj/item/P = locate(href_list["top"]) in src + if(istype(P)) toppaper = P to_chat(usr, "You move [P.name] to the top.") diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index b8f2c95762..390cd0cf83 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -35,7 +35,7 @@ . = ..() if(mapload) for(var/obj/item/I in loc) - if(istype(I, /obj/item/paper) || istype(I, /obj/item/folder) || istype(I, /obj/item/photo)) + if(I.w_class < WEIGHT_CLASS_NORMAL) //there probably shouldn't be anything placed ontop of filing cabinets in a map that isn't meant to go in them I.forceMove(src) /obj/structure/filingcabinet/deconstruct(disassembled = TRUE) @@ -46,7 +46,12 @@ qdel(src) /obj/structure/filingcabinet/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/paper) || istype(P, /obj/item/folder) || istype(P, /obj/item/photo) || istype(P, /obj/item/documents)) + if(P.tool_behaviour == TOOL_WRENCH && user.a_intent != INTENT_HELP) + to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") + if(P.use_tool(src, user, 20, volume=50)) + to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") + anchored = !anchored + else if(P.w_class < WEIGHT_CLASS_NORMAL) if(!user.transferItemToLoc(P, src)) return to_chat(user, "You put [P] in [src].") @@ -54,11 +59,6 @@ sleep(5) icon_state = initial(icon_state) updateUsrDialog() - else if(istype(P, /obj/item/wrench)) - to_chat(user, "You begin to [anchored ? "unwrench" : "wrench"] [src].") - if(P.use_tool(src, user, 20, volume=50)) - to_chat(user, "You successfully [anchored ? "unwrench" : "wrench"] [src].") - anchored = !anchored else if(user.a_intent != INTENT_HARM) to_chat(user, "You can't put [P] in [src]!") else @@ -67,9 +67,6 @@ /obj/structure/filingcabinet/ui_interact(mob/user) . = ..() - if(isobserver(user)) - return - if(contents.len <= 0) to_chat(user, "[src] is empty.") return @@ -100,16 +97,17 @@ to_chat(user, "You find nothing in [src].") /obj/structure/filingcabinet/Topic(href, href_list) + if(!usr.canUseTopic(src, BE_CLOSE, ismonkey(usr))) + return if(href_list["retrieve"]) usr << browse("", "window=filingcabinet") // Close the menu - var/obj/item/P = locate(href_list["retrieve"])//contents[retrieveindex] - if(istype(P) && P.loc == src && in_range(src, usr)) + var/obj/item/P = locate(href_list["retrieve"]) in src //contents[retrieveindex] + if(istype(P) && in_range(src, usr)) usr.put_in_hands(P) updateUsrDialog() icon_state = "[initial(icon_state)]-open" - sleep(5) - icon_state = initial(icon_state) + addtimer(VARSET_CALLBACK(src, icon_state, initial(icon_state)), 5) /* @@ -170,6 +168,7 @@ virgin = 0 //tabbing here is correct- it's possible for people to try and use it //before the records have been generated, so we do this inside the loop. +//ATTACK HAND IGNORING PARENT RETURN VALUE /obj/structure/filingcabinet/medical/on_attack_hand() populate() . = ..() diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index c32afab342..305099d115 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -33,7 +33,10 @@ if(contents.len) . += "folder_paper" + /obj/item/folder/attackby(obj/item/W, mob/user, params) + if(burn_paper_product_attackby_check(W, user)) + return if(istype(W, /obj/item/paper) || istype(W, /obj/item/photo) || istype(W, /obj/item/documents)) if(!user.transferItemToLoc(W, src)) return @@ -43,11 +46,14 @@ if(!user.is_literate()) to_chat(user, "You scribble illegibly on the cover of [src]!") return + var/inputvalue = stripped_input(user, "What would you like to label the folder?", "Folder Labelling", "", MAX_NAME_LEN) + if(!inputvalue) return + if(user.canUseTopic(src, BE_CLOSE)) - name = "folder - '[inputvalue]'" + name = "folder[(inputvalue ? " - '[inputvalue]'" : null)]" /obj/item/folder/Destroy() @@ -76,14 +82,14 @@ if(usr.contents.Find(src)) if(href_list["remove"]) - var/obj/item/I = locate(href_list["remove"]) - if(istype(I) && I.loc == src) + var/obj/item/I = locate(href_list["remove"]) in src + if(istype(I)) I.forceMove(usr.loc) usr.put_in_hands(I) if(href_list["read"]) - var/obj/item/I = locate(href_list["read"]) - if(istype(I) && I.loc == src) + var/obj/item/I = locate(href_list["read"]) in src + if(istype(I)) usr.examinate(I) //Update everything diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index d054e5ff12..da9fdc4ca4 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -1,9 +1,10 @@ /obj/item/hand_labeler name = "hand labeler" - desc = "A combined label printer and applicator in a portable device, designed to be easy to operate and use." + desc = "A combined label printer, applicator, and remover, all in a single portable device. Designed to be easy to operate and use." icon = 'icons/obj/bureaucracy.dmi' icon_state = "labeler0" item_state = "flight" + // inhand_icon_state = "flight" var/label = null var/labels_left = 30 var/mode = 0 @@ -55,9 +56,10 @@ to_chat(user, "You can't label creatures!") // use a collar return - user.visible_message("[user] labels [A] as [label].", \ - "You label [A] as [label].") - A.name = "[A.name] ([label])" + user.visible_message("[user] labels [A] with \"[label]\".", \ + "You label [A] with \"[label]\".") + A.AddComponent(/datum/component/label, label) + // playsound(A, 'sound/items/handling/component_pickup.ogg', 20, TRUE) labels_left-- @@ -90,7 +92,9 @@ name = "cyborg-hand labeler" /obj/item/hand_labeler/borg/afterattack(atom/A, mob/user, proximity) - . = ..(A, user, proximity) + . = ..() + if(!proximity) + return if(!iscyborg(user)) return @@ -114,6 +118,7 @@ desc = "A roll of paper. Use it on a hand labeler to refill it." icon_state = "labeler_refill" item_state = "electropack" + // inhand_icon_state = "electropack" lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' w_class = WEIGHT_CLASS_TINY diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 5d842ef11a..20ec678e45 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -11,41 +11,6 @@ #define MODE_WRITING 1 #define MODE_STAMPING 2 -/** - * This is a custom ui state. All it really does is keep track of pen - * being used and if they are editing it or not. This way we can keep - * the data with the ui rather than on the paper - */ -/datum/ui_state/default/paper_state - /// What edit mode we are in and who is - /// writing on it right now - var/edit_mode = MODE_READING - /// Setup for writing to a sheet - var/pen_color = "black" - var/pen_font = "" - var/is_crayon = FALSE - /// Setup for stamping a sheet - // Why not the stamp obj? I have no idea - // what happens to states out of scope so - // don't want to put instances in this - var/stamp_icon_state = "" - var/stamp_name = "" - var/stamp_class = "" - -/datum/ui_state/default/paper_state/proc/copy_from(datum/ui_state/default/paper_state/from) - switch(from.edit_mode) - if(MODE_READING) - edit_mode = MODE_READING - if(MODE_WRITING) - edit_mode = MODE_WRITING - pen_color = from.pen_color - pen_font = from.pen_font - is_crayon = from.is_crayon - if(MODE_STAMPING) - edit_mode = MODE_STAMPING - stamp_icon_state = from.stamp_icon_state - stamp_class = from.stamp_class - stamp_name = from.stamp_name /** * Paper is now using markdown (like in github pull notes) for ALL rendering @@ -58,6 +23,9 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper" item_state = "paper" + // inhand_icon_state = "paper" + // worn_icon_state = "paper" + // custom_fire_overlay = "paper_onfire_overlay" throwforce = 0 w_class = WEIGHT_CLASS_TINY throw_range = 1 @@ -80,34 +48,19 @@ var/list/stamps /// Positioning for the stamp in tgui var/list/stamped /// Overlay info - /// This REALLY should be a componenet. Basicly used during, april fools - /// to honk at you - var/rigged = 0 - var/spam_flag = 0 - var/contact_poison // Reagent ID to transfer on contact var/contact_poison_volume = 0 - // Ok, so WHY are we caching the ui's? - // Since we are not using autoupdate we - // need some way to update the ui's of - // other people looking at it and if - // its been updated. Yes yes, lame - // but canot be helped. However by - // doing it this way, we can see - // live updates and have multipule - // people look at it - var/list/viewing_ui = list() - /// When the sheet can be "filled out" /// This is an associated list var/list/form_fields = list() var/field_counter = 1 /obj/item/paper/Destroy() - close_all_ui() stamps = null stamped = null + form_fields = null + stamped = null . = ..() /** @@ -162,7 +115,7 @@ set category = "Object" set src in usr - if(usr.incapacitated() || !usr.is_literate()) + if(!usr.can_read(src) || usr.incapacitated(TRUE, TRUE) || (isobserver(usr) && !IsAdminGhost(usr))) return if(ishuman(usr)) var/mob/living/carbon/human/H = usr @@ -180,18 +133,6 @@ user.visible_message("[user] scratches a grid on [user.p_their()] wrist with the paper! It looks like [user.p_theyre()] trying to commit sudoku...") return (BRUTELOSS) -/// ONLY USED FOR APRIL FOOLS -/obj/item/paper/proc/reset_spamflag() - spam_flag = FALSE - -/obj/item/paper/attack_self(mob/user) - if(rigged && (SSevents.holidays && SSevents.holidays[APRIL_FOOLS])) - if(!spam_flag) - spam_flag = TRUE - playsound(loc, 'sound/items/bikehorn.ogg', 50, TRUE) - addtimer(CALLBACK(src, .proc/reset_spamflag), 20) - . = ..() - /obj/item/paper/proc/clearpaper() info = "" stamps = null @@ -199,28 +140,39 @@ cut_overlays() update_icon_state() -/obj/item/paper/examine_more(mob/user) - ui_interact(user) - return list("You try to read [src]...") +/obj/item/paper/examine(mob/user) + . = ..() + if(!in_range(user, src) && !isobserver(user)) + . += "You're too far away to read it!" + return + if(user.can_read(src)) + ui_interact(user) + return + . += "You cannot read it!" + +/obj/item/paper/ui_status(mob/user,/datum/ui_state/state) + // Are we on fire? Hard ot read if so + if(resistance_flags & ON_FIRE) + return UI_CLOSE + if(!in_range(user,src)) + return UI_CLOSE + if(user.incapacitated(TRUE, TRUE) || (isobserver(user) && !IsAdminGhost(user))) + return UI_UPDATE + // Even harder to read if your blind...braile? humm + // .. or if you cannot read + if(!user.can_read(src)) + return UI_CLOSE + if(in_contents_of(/obj/machinery/door/airlock)) + return UI_INTERACTIVE + return ..() + + /obj/item/paper/can_interact(mob/user) - if(!..()) - return FALSE - // Are we on fire? Hard ot read if so - if(resistance_flags & ON_FIRE) - return FALSE - // Even harder to read if your blind...braile? humm - if(user.is_blind()) - return FALSE - // checks if the user can read. - return user.can_read(src) + if(in_contents_of(/obj/machinery/door/airlock)) + return TRUE + return ..() -/** - * This creates the ui, since we are using a custom state but not much else - * just makes it easyer to make it. - */ -/obj/item/paper/proc/create_ui(mob/user, datum/ui_state/default/paper_state/state) - ui_interact(user, state = state) /obj/item/proc/burn_paper_product_attackby_check(obj/item/I, mob/living/user, bypass_clumsy) var/ignition_message = I.ignition_effect(src, user) @@ -244,49 +196,22 @@ /obj/item/paper/attackby(obj/item/P, mob/living/user, params) if(burn_paper_product_attackby_check(P, user)) - close_all_ui() + SStgui.close_uis(src) return if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) if(length(info) >= MAX_PAPER_LENGTH) // Sheet must have less than 1000 charaters to_chat(user, "This sheet of paper is full!") return - - var/datum/ui_state/default/paper_state/state = new - state.edit_mode = MODE_WRITING - // should a crayon be in the same subtype as a pen? How about a brush or charcoal? - // TODO: Convert all writing stuff to one type, /obj/item/art_tool maybe? - state.is_crayon = istype(P, /obj/item/toy/crayon); - if(state.is_crayon) - var/obj/item/toy/crayon/PEN = P - state.pen_font = CRAYON_FONT - state.pen_color = PEN.paint_color - else - var/obj/item/pen/PEN = P - state.pen_font = PEN.font - state.pen_color = PEN.colour - - create_ui(user, state) + ui_interact(user) return else if(istype(P, /obj/item/stamp)) - - var/datum/ui_state/default/paper_state/state = new - state.edit_mode = MODE_STAMPING // we are read only becausse the sheet is full - state.stamp_icon_state = P.icon_state - state.stamp_name = P.name - - var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/paper) - state.stamp_class = sheet.icon_class_name(P.icon_state) - to_chat(user, "You ready your stamp over the paper! ") - - create_ui(user, state) + ui_interact(user) return /// Normaly you just stamp, you don't need to read the thing else // cut paper? the sky is the limit! - var/datum/ui_state/default/paper_state/state = new - state.edit_mode = MODE_READING - create_ui(user, state) // The other ui will be created with just read mode outside of this + ui_interact(user) // The other ui will be created with just read mode outside of this return ..() @@ -301,68 +226,64 @@ get_asset_datum(/datum/asset/spritesheet/simple/paper), ) -/obj/item/paper/ui_interact(mob/user, datum/tgui/ui, - datum/ui_state/default/paper_state/state) - // Update the state - ui = ui || SStgui.get_open_ui(user, src) - if(ui && state) - var/datum/ui_state/default/paper_state/current_state = ui.state - current_state.copy_from(state) +/obj/item/paper/ui_interact(mob/user, datum/tgui/ui) // Update the UI ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "PaperSheet", name) - state = new - ui.set_state(state) - ui.set_autoupdate(FALSE) - viewing_ui[user] = ui ui.open() -/obj/item/paper/ui_close(mob/user) - /// close the editing window and change the mode - viewing_ui[user] = null - . = ..() -// Again, we have to do this as autoupdate is off -/obj/item/paper/proc/update_all_ui() - for(var/datum/tgui/ui in viewing_ui) - ui.process(force = TRUE) +/obj/item/paper/ui_static_data(mob/user) + . = list() + .["text"] = info + .["max_length"] = MAX_PAPER_LENGTH + .["paper_color"] = !color || color == "white" ? "#FFFFFF" : color // color might not be set + .["paper_state"] = icon_state /// TODO: show the sheet will bloodied or crinkling? + .["stamps"] = stamps + -// Again, we have to do this as autoupdate is off -/obj/item/paper/proc/close_all_ui() - for(var/datum/tgui/ui in viewing_ui) - ui.close() - viewing_ui = list() /obj/item/paper/ui_data(mob/user) var/list/data = list() - - var/datum/tgui/ui = viewing_ui[user] - var/datum/ui_state/default/paper_state/state = ui.state - - // Should all this go in static data and just do a forced update? - data["text"] = info - data["max_length"] = MAX_PAPER_LENGTH - data["paper_state"] = icon_state /// TODO: show the sheet will bloodied or crinkling? - data["paper_color"] = !color || color == "white" ? "#FFFFFF" : color // color might not be set - data["stamps"] = stamps - - data["edit_mode"] = state.edit_mode - data["edit_usr"] = "[ui.user]"; - - // pen info for editing - data["is_crayon"] = state.is_crayon - data["pen_font"] = state.pen_font - data["pen_color"] = state.pen_color - // stamping info for..stamping - data["stamp_class"] = state.stamp_class - + var/obj/O = user.get_active_held_item() + if(istype(O, /obj/item/toy/crayon)) + var/obj/item/toy/crayon/PEN = O + data["pen_font"] = CRAYON_FONT + data["pen_color"] = PEN.paint_color + data["edit_mode"] = MODE_WRITING + data["is_crayon"] = TRUE + data["stamp_class"] = "FAKE" + data["stamp_icon_state"] = "FAKE" + else if(istype(O, /obj/item/pen)) + var/obj/item/pen/PEN = O + data["pen_font"] = PEN.font + data["pen_color"] = PEN.colour + data["edit_mode"] = MODE_WRITING + data["is_crayon"] = FALSE + data["stamp_class"] = "FAKE" + data["stamp_icon_state"] = "FAKE" + else if(istype(O, /obj/item/stamp)) + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/simple/paper) + data["stamp_icon_state"] = O.icon_state + data["stamp_class"] = sheet.icon_class_name(O.icon_state) + data["edit_mode"] = MODE_STAMPING + data["pen_font"] = "FAKE" + data["pen_color"] = "FAKE" + data["is_crayon"] = FALSE + else + data["edit_mode"] = MODE_READING + data["pen_font"] = "FAKE" + data["pen_color"] = "FAKE" + data["is_crayon"] = FALSE + data["stamp_icon_state"] = "FAKE" + data["stamp_class"] = "FAKE" data["field_counter"] = field_counter data["form_fields"] = form_fields return data -/obj/item/paper/ui_act(action, params, datum/tgui/ui, datum/ui_state/default/paper_state/state) +/obj/item/paper/ui_act(action, params,datum/tgui/ui) if(..()) return switch(action) @@ -370,34 +291,33 @@ var/stamp_x = text2num(params["x"]) var/stamp_y = text2num(params["y"]) var/stamp_r = text2num(params["r"]) // rotation in degrees - + var/stamp_icon_state = params["stamp_icon_state"] + var/stamp_class = params["stamp_class"] if (isnull(stamps)) - stamps = new/list() + stamps = list() if(stamps.len < MAX_PAPER_STAMPS) // I hate byond when dealing with freaking lists - stamps += list(list(state.stamp_class, stamp_x, stamp_y,stamp_r)) /// WHHHHY + stamps[++stamps.len] = list(stamp_class, stamp_x, stamp_y, stamp_r) /// WHHHHY /// This does the overlay stuff if (isnull(stamped)) - stamped = new/list() + stamped = list() if(stamped.len < MAX_PAPER_STAMPS_OVERLAYS) - var/mutable_appearance/stampoverlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[state.stamp_icon_state]") + var/mutable_appearance/stampoverlay = mutable_appearance('icons/obj/bureaucracy.dmi', "paper_[stamp_icon_state]") stampoverlay.pixel_x = rand(-2, 2) stampoverlay.pixel_y = rand(-3, 2) add_overlay(stampoverlay) - LAZYADD(stamped, state.stamp_icon_state) + LAZYADD(stamped, stamp_icon_state) - ui.user.visible_message("[ui.user] stamps [src] with [state.stamp_name]!", "You stamp [src] with [state.stamp_name]!") + update_static_data(usr,ui) + ui.user.visible_message("[ui.user] stamps [src] with [stamp_class]!", "You stamp [src] with [stamp_class]!") else to_chat(usr, pick("You try to stamp but you miss!", "There is no where else you can stamp!")) - - update_all_ui() . = TRUE if("save") var/in_paper = params["text"] var/paper_len = length(in_paper) - var/list/fields = params["form_fields"] field_counter = params["field_counter"] ? text2num(params["field_counter"]) : field_counter if(paper_len > MAX_PAPER_LENGTH) @@ -413,14 +333,10 @@ if(info != in_paper) to_chat(ui.user, "You have added to your paper masterpiece!"); info = in_paper - - for(var/key in fields) - form_fields[key] = fields[key]; + update_static_data(usr,ui) - update_all_ui() update_icon() - . = TRUE /** diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index 3937720f74..a3b9b23141 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -26,11 +26,11 @@ var/obj/item/bodypart/BP = C.get_bodypart(BODY_ZONE_HEAD) if(BP) BP.drop_limb() - playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1) + playsound(loc, pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg'),50, TRUE, -1) return (BRUTELOSS) else user.visible_message("[user] repeatedly bashes [src.name] against [user.p_their()] head! It looks like [user.p_theyre()] trying to commit suicide!") - playsound(loc, 'sound/items/gavel.ogg', 50, 1, -1) + playsound(loc, 'sound/items/gavel.ogg', 50, TRUE, -1) return (BRUTELOSS) @@ -42,11 +42,12 @@ if(storedpaper) . += "paper" + /obj/item/papercutter/attackby(obj/item/P, mob/user, params) if(istype(P, /obj/item/paper) && !storedpaper) if(!user.transferItemToLoc(P, src)) return - playsound(loc, "pageturn", 60, 1) + playsound(loc, "pageturn", 60, TRUE) to_chat(user, "You place [P] in [src].") storedpaper = P update_icon() @@ -59,17 +60,17 @@ storedcutter = P update_icon() return - if(istype(P, /obj/item/screwdriver) && storedcutter) + if(P.tool_behaviour == TOOL_SCREWDRIVER && storedcutter) P.play_tool_sound(src) to_chat(user, "[storedcutter] has been [cuttersecured ? "unsecured" : "secured"].") cuttersecured = !cuttersecured return ..() -/obj/item/papercutter/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) +/obj/item/papercutter/on_attack_hand(mob/user) add_fingerprint(user) if(!storedcutter) - to_chat(user, "The cutting blade is gone! You can't use [src] now.") + to_chat(user, "The cutting blade is gone! You can't use [src] now.") return if(!cuttersecured) @@ -79,7 +80,7 @@ update_icon() if(storedpaper) - playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1) + playsound(src.loc, 'sound/weapons/slash.ogg', 50, TRUE) to_chat(user, "You neatly cut [storedpaper].") storedpaper = null qdel(storedpaper) @@ -88,6 +89,7 @@ update_icon() /obj/item/papercutter/MouseDrop(atom/over_object) + . = ..() var/mob/M = usr if(M.incapacitated() || !Adjacent(M)) return @@ -98,10 +100,6 @@ else if(istype(over_object, /obj/screen/inventory/hand)) var/obj/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) - - else - . = ..() - add_fingerprint(M) /obj/item/paperslip @@ -112,6 +110,12 @@ resistance_flags = FLAMMABLE max_integrity = 50 +/obj/item/paperslip/attackby(obj/item/I, mob/living/user, params) + if(burn_paper_product_attackby_check(I, user)) + return + return ..() + + /obj/item/paperslip/Initialize() . = ..() pixel_x = rand(-5, 5) @@ -124,5 +128,6 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "cutterblade" item_state = "knife" + // inhand_icon_state = "knife" lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi' diff --git a/code/modules/paperwork/paper_premade.dm b/code/modules/paperwork/paper_premade.dm index 414026924a..5d6d3d45e8 100644 --- a/code/modules/paperwork/paper_premade.dm +++ b/code/modules/paperwork/paper_premade.dm @@ -4,53 +4,22 @@ /obj/item/paper/fluff/sop name = "paper- 'Standard Operating Procedure'" - info = {" -Alert Levels: -* Blue - Emergency - * Caused by fire - * Caused by manual interaction - * Action: Close all fire doors. These can only be opened by resetting the alarm -* Red- Ejection/Self Destruct - * Caused by module operating computer. - * Action: After the specified time the module will eject completely. -Engine Maintenance Instructions: -1. Shut off ignition systems: -2. Activate internal power -3. Activate orbital balance matrix -4. Remove volatile liquids from area -5. Wear a fire suit -6. After Decontaminate Visit medical examiner -Toxin Laboratory Procedure: -1. Wear a gas mask regardless -2. Get an oxygen tank. -3. Activate internal atmosphere -4. After Decontaminate Visit medical examiner -Disaster Procedure: -Fire: -1. Activate sector fire alarm. -2. Move to a safe area. -3. Get a fire suit -* After: - 1. Assess Damage - 2. Repair damages - 3. If needed, Evacuate -Meteor Shower: -1. Activate fire alarm -2. Move to the back of ship -* After - 1. Repair damage - 2. If needed, Evacuate -Accidental Reentry: -1. Activate fire alarms in front of ship. -2. Move volatile matter to a fire proof area! -3. Get a fire suit. -4. Stay secure until an emergency ship arrives. -5. If ship does not arrive-Evacuate to a nearby safe area! -"}; + info = "Alert Levels: \nBlue- Emergency \n\t1. Caused by fire \n\t2. Caused by manual interaction \n\tAction: \n\t\tClose all fire doors. These can only be opened by resetting the alarm \nRed- Ejection/Self-Destruct \n\t1. Caused by module operating computer. \n\tAction: \n\t\tAfter the specified time the module will eject completely. \n \nEngine Maintenance Instructions: \n\tShut off ignition systems: \n\tActivate internal power \n\tActivate orbital balance matrix \n\tRemove volatile liquids from area \n\tWear a fire suit \n \n\tAfter \n\t\tDecontaminate \n\t\tVisit medical examiner \n \nToxin Laboratory Procedure: \n\tWear a gas mask regardless \n\tGet an oxygen tank. \n\tActivate internal atmosphere \n \n\tAfter \n\t\tDecontaminate \n\t\tVisit medical examiner \n \nDisaster Procedure: \n\tFire: \n\t\tActivate sector fire alarm. \n\t\tMove to a safe area. \n\t\tGet a fire suit \n\t\tAfter: \n\t\t\tAssess Damage \n\t\t\tRepair damages \n\t\t\tIf needed, Evacuate \n\tMeteor Shower: \n\t\tActivate fire alarm \n\t\tMove to the back of ship \n\t\tAfter \n\t\t\tRepair damage \n\t\t\tIf needed, Evacuate \n\tAccidental Reentry: \n\t\tActivate fire alarms in front of ship. \n\t\tMove volatile matter to a fire proof area! \n\t\tGet a fire suit. \n\t\tStay secure until an emergency ship arrives. \n \n\t\tIf ship does not arrive- \n\t\t\tEvacuate to a nearby safe area!" /obj/item/paper/fluff/shuttles/daniel info = "i love daniel daniel is my best friend you are tearing me apart elise" +/obj/item/paper/fluff/jobs/prisoner/letter + name = "letter from home" + info = {"Dearest sweetheart, + It is truly saddening you must spend your time locked up in an awful prison on that dangerous station. I have spoken to your lawyer who will attempt to appeal to the judge so your sentence may hopefully be reduced. + Regardless, I just want you to understand that all of us out here still love you, and want to see you released safely some day! I know that prison can be a very vicious place, so please promise us you'll avoid getting into any fights or trouble, okay? + We all care for your safety deeply, and could not live with ourselves if you ended up getting hurt. We've scheduled a visit to see you, and with any luck, hopefully our request will be granted soon. + Anyways, please do your best to make it by in that place, and never forget we'll be always here for you, no matter if we're separated. + + Please stay safe, + -Love, Your Dearest"} + //////////// Job guides n' fluff @@ -90,13 +59,46 @@ Accidental Reentry: name = "paper- 'Chemical Information'" info = "Known Onboard Toxins: \n\tGrade A Semi-Liquid Plasma: \n\t\tHighly poisonous. You cannot sustain concentrations above 15 units. \n\t\tA gas mask fails to filter plasma after 50 units. \n\t\tWill attempt to diffuse like a gas. \n\t\tFiltered by scrubbers. \n\t\tThere is a bottled version which is very different \n\t\t\tfrom the version found in canisters! \n \n\t\tWARNING: Highly Flammable. Keep away from heat sources \n\t\texcept in an enclosed fire area! \n\t\tWARNING: It is a crime to use this without authorization. \nKnown Onboard Anti-Toxin: \n\tAnti-Toxin Type 01P: Works against Grade A Plasma. \n\t\tBest if injected directly into bloodstream. \n\t\tA full injection is in every regular Med-Kit. \n\t\tSpecial toxin Kits hold around 7. \n \nKnown Onboard Chemicals (other): \n\tRejuvenation T#001: \n\t\tEven 1 unit injected directly into the bloodstream \n\t\t\twill cure unconscious and sleep toxins. \n\t\tIf administered to a dying patient it will prevent \n\t\t\tfurther damage for about units*3 seconds. \n\t\t\tit will not cure them or allow them to be cured. \n\t\tIt can be administered to a non-dying patient \n\t\t\tbut the chemicals disappear just as fast. \n\tMorphine T#054: \n\t\t5 units will induce precisely 1 minute of sleep. \n\t\t\tThe effect are cumulative. \n\t\tWARNING: It is a crime to use this without authorization" +/obj/item/paper/fluff/jobs/medical/hippocratic + name = "paper- 'Hippocratic Oath'" + info = {"I swear to fulfill, to the best of my ability and judgment, this covenant: + + I will respect the hard-won scientific gains of those physicians in whose steps I walk, + and gladly share such knowledge as is mine with those who are to follow. + + I will apply, for the benefit of the sick, all measures that are required, + avoiding those twin traps of overtreatment and therapeutic nihilism. + + I will remember that there is art to medicine as well as science, + and that warmth, sympathy, and understanding may outweigh the surgeon's knife or the chemist's drug. + + I will not be ashamed to say "I know not," + nor will I fail to call in my colleagues when the skills of another are needed for a patient's recovery. + + I will respect the privacy of my patients, for their problems are not disclosed to me that the world may know. Most especially must I tread with care in matters of life and death. + If it is given me to save a life, all thanks. But it may also be within my power to take a life; + this awesome responsibility must be faced with great humbleness and awareness of my own frailty. Above all, I must not play at God. + + I will remember that I do not treat a fever chart, a cancerous growth, but a sick human being, whose illness may affect the person's family and economic stability. + My responsibility includes these related problems, if I am to care adequately for the sick. + + I will prevent disease whenever I can, for prevention is preferable to cure. + + I will remember that I remain a member of society, with special obligations to all my fellow human beings, + those sound of mind and body as well as the infirm. + + If I do not violate this oath, may I enjoy life and art, respected while I live and remembered with affection thereafter. + May I always act so as to preserve the finest traditions of my calling and may I long experience the joy of healing those who seek my help. + "} + /* * Stations */ +////////// cogstation. /obj/item/paper/guides/cogstation/job_changes name = "MEMO: Job Changes" - info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires: \n \n- Scientists are to have access to chemistry in order to reach the MedSci router. \n \n- Chemists should at the very least be provided with an encryption key for the Science channel, if not basic access to the Research department at large. \n- Roboticists are to have basic Medical and Morgue access. \n- Engineers and Atmospheric Technicians are to have Warehouse and Mining access. \n- The Cook should not have Morgue access \n- The Clown and Mime are to have Maintenance access. This is necessary due to the location of their offices. \n \nGenerated by Organic Resources Bot #2053" + info = "To ensure minimal employee downtime, please take note of the following changes to select professions that CogStation specifically requires: \n \n- Engineers and Atmospheric Technicians are to have Warehouse and Mining access. \n- The Cook should not have Morgue access. \n- The Clown and Mime are to have Maintenance access. This is necessary due to the location of their offices. \n \nGenerated by Organic Resources Bot #2053" /obj/item/paper/guides/cogstation/letter_sec name = "To future Security personnel" @@ -104,7 +106,7 @@ Accidental Reentry: /obj/item/paper/guides/cogstation/disposals name = "Regarding the disposal system:" - info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin. \n \n- WHITE/GRAY STRIPES is for DELIVERIES. \n- RED STRIPES is for CORPSES. \n- EVERYTHING ELSE is for TRASH, barring a few exceptions that should be labeled as such. \n \nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly. \n \n-C. Donnelly Architectural Analyst" + info = "As you might have noticed, this station has far more disposal pipes than you may expect from your average Nanotrasen research facility. Part of the reason for this is specialization - mail, trash, even corpses have their own disposal systems. Unfortunately, the convenient color-coding was lost in translocation and we've had to compensate by marking the area around each bin. \n \n- WHITE/GRAY STRIPES are for DELIVERIES. \n- RED STRIPES are for CORPSES. \n- EVERYTHING ELSE is for TRASH, barring a few exceptions that should be labeled as such. \n \nIdeally the station won't sustain any heavy structural damage during your time here but if it does, or someone decides to tamper with/sabotage this system, you'll be forgiven if you can't put it back together perfectly. \n \n-C. Donnelly Architectural Analyst" /obj/item/paper/guides/cogstation/janitor name = "a quick tip" @@ -128,7 +130,7 @@ Accidental Reentry: /obj/item/paper/guides/cogstation/letter_eng name = "To future Engineering staff:" - info = "I'm not gonna sugarcoat this. Compared to other departments, you might have your work cut out for you. CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running. \n \n If there's any good news, it's your time to shine if you know how to run a thermo-electric generator. That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you might be able to run a singularity or tesla engine east of mining, but it won't have any sort of shielding out there. \n \nYou still have three solar arrays to work with, two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities the air system is a bit different than you'd expect, but fortunately you should have the atmos techs this station needed a long time ago. The disposal network is significantly more complicated, yet more capable. I've already elaborated on it, so I'll let you find and read my write-up for that. As for the routing system, it's just begging to get hit by a stray meteor so consider other utilities a higher priority. \n \nGood luck. You're gonna need it. \n \n-C. Donnelly Architectural Analyst" + info = "I'm not gonna sugarcoat this. Compared to other departments, you might have your work cut out for you. CogStation is an entirely different beast than your standard Box, but everyone's still gonna expect you to keep the place running. \n \n If there's any good news, it's your time to shine if you know how to run a thermo-electric generator. That's what this station runs on, and that isn't likely to change anytime soon. If it's absolutely critical you might be able to run a singularity or tesla engine east of mining, but it won't have any sort of protection out there. \n \nYou still have three solar arrays to work with, two of them being on each end of the starboard side. The port side array will need you to either get access from a head of staff or security, unless you want to spacewalk around the whole station. Don't be afraid to ask the latter - they're there for you, after all. As for other utilities the air system is a bit different than you'd expect, but fortunately you should have the atmos techs this station needed a long time ago. The disposal network is significantly more complicated, yet more capable. I've already elaborated on it, so I'll let you find and read my write-up for that. As for the routing system, it's just begging to get hit by a stray meteor so consider other utilities a higher priority. \n \nGood luck. You're gonna need it. \n \n-C. Donnelly Architectural Analyst" /obj/item/paper/guides/cogstation/letter_atmos name = "To future Atmospheric Technicians:" @@ -140,15 +142,15 @@ Accidental Reentry: /obj/item/paper/guides/cogstation/letter_hos name = "To the future HoS" - info = "I'm gonna be rather disappointed if CentCom doesn't brief you about this station, but if they don't I wrote up another letter for your department that should cover it pretty well. Make sure your officers read it if they aren't up to speed. \n \nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. Use it only as a last resort - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it. \n -LC" + info = "I'm gonna be rather disappointed if Central Command doesn't brief you about this station, but if they don't I wrote up another letter for your department that should cover it pretty well. Make sure your officers read it if they aren't up to speed. \n \nSomething you in particular should know is that if someone's getting to be too much to handle, the boys and I have constructed a 'discount transfer centre' just behind the router. Use it only as a last resort - the walls may be reinforced but they're still thin, and you'll have big trouble on your hands if the AI or any cyborgs find out about it. \n -LC" /obj/item/paper/guides/cogstation/letter_supp name = "To future Supply Staff:" - info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of. \n \nEngineeringwill have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there. \n \nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours. \n \nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly. \n \n-C. Donnelly \nArchitectural Analyst" + info = "Cargo, move freight. Miners, don't die. Your jobs are pretty straightforward, which is likely why they originally fell under Engineering on this station as opposed to their own department. Although we've considerably readjusted this part of the station to accommodate you, there are potential differences you should be aware of. \n \nEngineeringwill have access to some of your department, namely the warehouse and mining dock. Mining operations on this station were originally asteroid-based, hence the catwalk into the great beyond. Although you won't need to worry about being space-worthy due to a newly installed shuttle dock, they might need to get out there. \n \nYou'll have all your usual means of shipping out goods, but the disposal network is more complex with a separate line for mail and trash. It also isn't fully space-proofed, meanin it may not be the best choice for livestock, monkey cubes, or clowns. I've left another note that explains this in detail, but know trash is the janitor's responsibility, not yours. \n \nThe biggest difference has to be this station's router system, which allows departments to ship goods between themselves. Even if the belts aren't working properly they'll still have their own request consoles, so you'll want to check for orders regularly. \n \n-C. Donnelly \nArchitectural Analyst" -/obj/item/paper/fluff/cogstation/sleepers - name = "Re: Sleepers?" - info = "Yes, the sleepers are meant to be publicly accessible. Policies in this station's original location encouraged crew to visit the clinic or treat themselves when it came to minor injuries. \n \nThis is no excuse for you not to do your jobs. You may wish to keep an eye on the sleepers as to ensure they're being used responsibly. Remember, allowing an overdose to happen under your watch isn't much different from administering that overdose yourself. \n \n- Dr. Halley" +/obj/item/paper/guides/cogstation/letter_med + name = "Re: Future Medical Staff" + info = "With this station nearing approval for regular use, I've been told to consolidate anything noteworthy about its general medical department into a single document. As you may be able to guess, this is that document. \n \n- First, you should know a medical clinic is present in the civilian (starboard bow) wing. If you have personnel to spare, it's recommended you have someone staff it - that way people with minor injuries can report there instead of clogging up the research wing. \n \n- Despite recent renovations to bring this station in line with regional policy, you'll still find the robotics lab directly adjacent to your department. I advise you take full advantage of this, whether it's requesting prosthetics in advance or harvesting organs from those who have undergone more...permanent procedures. \n \n- Lastly, please make a habit of checking the morgue on a regular basis. Thanks to the Corpse Disposal Network (or CDN for short), you may find the station's deceased delivered directly to you. Some may be employees capable of being revived - more information can be found in the morgue itself. \n \n- Dr. Halley" /obj/item/paper/fluff/cogstation/cloner name = "Re: Issue with the cloner?" @@ -172,7 +174,7 @@ Accidental Reentry: /obj/item/paper/fluff/cogstation/letter_chap name = "A message from the DHDA" - info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination. \nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated. \n \nSoulstone Obelisk \n \nDepartment of Higher-Dimensional Affairs" + info = "Regardless of what the name leads you to believe, CogStation is neither Ratvarian in origin nor designed by members of this so-called 'clock cult'. Despite a potential common enemy and instances of exhibiting peaceful behavior, their beliefs have been labeled 'Heretical' by the Department of Higher-Dimensional Affairs and following them is grounds for immediate termination. \nAs the station's designated Chaplain, it is advised you correct anyone who claims this station and/or its designers are Ratvarian. While they are most likely misinformed or 'joking around', untruths gain credibility the more they are repeated. \n \nSoulstone Obelisk \n \nDepartment of Higher-Dimensional Affairs" /obj/item/paper/fluff/cogstation/cluwne name = "Mysterious Note" @@ -184,7 +186,7 @@ Accidental Reentry: /obj/item/paper/fluff/cogstation/eva name = "MEMO: Spacesuits" - info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department. \n \n-Generated by Organic Resources Bot #2053" + info = "As a Head of Personnel, you may be familiar with crew members requesting EVA access, particularly when there is an absence of credible threats on the station. While it is your decision to grant or deny access unless overriden by your superior(s), you should be aware of an abundance of spacesuits on this station. While intended for emergencies, these suits are cheaper to replace. You may find it beneficial to direct aspiring 'space explorers' towards finding one of these suits instead, although it is advised you order replacement suits in advance through the cargo department. \n \nGenerated by Organic Resources Bot #2053" /obj/item/paper/fluff/cogstation/chemists name = "Re: Scientists?!" @@ -214,9 +216,9 @@ Accidental Reentry: name = "ROUTER STATUS: LIMITED" info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. Cargo and the recycler are the only points currently accepting deliveries from here, although manual input from the routing depot is currently required. \n \n-C. Donnelly \n \nArchitectural Analyst" -/obj/item/paper/fluff/cogstation/router_cargo - name = "ROUTER STATUS: VERY LIMITED" - info = "Currently, this router cannot receive deliveries from the Airbridge, MedSci, Security, or Service Routers. It is not yet capable of making deliveries, beyond sending items to the recycler. \n \n-C. Donnelly \n \nArchitectural Analyst" +/obj/item/paper/fluff/cogstation/mulebot + name = "MEMO: MULEbots" + info = "As you may know, MULEbots have been coded to minimize travel distance for maximum efficiency. In the case of this station, that may include travelling through depressurized areas exposed to space. Please bear this in mind before using them to transport living tissue. \n \nGenerated by Organic Resources Bot #2053" /////////// CentCom diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 28cb5ffae9..b8bbd0a30e 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper_bin1" item_state = "sheet-metal" + // inhand_icon_state = "sheet-metal" lefthand_file = 'icons/mob/inhands/misc/sheets_lefthand.dmi' righthand_file = 'icons/mob/inhands/misc/sheets_righthand.dmi' throwforce = 0 @@ -43,6 +44,7 @@ ..() /obj/item/paper_bin/MouseDrop(atom/over_object) + . = ..() var/mob/living/M = usr if(!istype(M) || M.incapacitated() || !Adjacent(M)) return @@ -54,17 +56,18 @@ var/obj/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) - else - . = ..() - add_fingerprint(M) /obj/item/paper_bin/attack_paw(mob/user) return attack_hand(user) -/obj/item/paper_bin/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - if(user.lying) - return +//ATTACK HAND IGNORING PARENT RETURN VALUE +/obj/item/paper_bin/on_attack_hand(mob/user) + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_PICKUP)) + return + // user.changeNext_move(CLICK_CD_MELEE) if(bin_pen) var/obj/item/pen/P = bin_pen P.add_fingerprint(user) @@ -85,8 +88,8 @@ P = new papertype(src) if(SSevents.holidays && SSevents.holidays[APRIL_FOOLS]) if(prob(30)) - P.info = "*HONK HONK HONK HONK HONK HONK HONK HOOOOOOOOOOOOOOOOOOOOOONK*\n*APRIL FOOLS*\n" - P.rigged = 1 + P.info = "HONK HONK HONK HONK HONK HONK HONK HOOOOOOOOOOOOOOOOOOOOOONK APRIL FOOLS" + P.AddComponent(/datum/component/honkspam) P.add_fingerprint(user) P.forceMove(user.loc) @@ -148,8 +151,7 @@ papertype = /obj/item/paper/natural resistance_flags = FLAMMABLE -/obj/item/paper_bin/bundlenatural/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - ..() +/obj/item/paper_bin/bundlenatural/on_attack_hand(mob/user) if(total_paper < 1) qdel(src) @@ -173,3 +175,9 @@ qdel(src) else ..() + +/obj/item/paper_bin/carbon + name = "carbon paper bin" + desc = "Contains all the paper you'll ever need, in duplicate!" + icon_state = "paper_bin_carbon" + papertype = /obj/item/paper/carbon diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index c6a1ee1389..53fe886d65 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -1,9 +1,9 @@ - /obj/item/paperplane name = "paper plane" desc = "Paper, folded in the shape of a plane." icon = 'icons/obj/bureaucracy.dmi' icon_state = "paperplane" + // custom_fire_overlay = "paperplane_onfire" throw_range = 7 throw_speed = 1 throwforce = 0 @@ -11,7 +11,7 @@ resistance_flags = FLAMMABLE max_integrity = 50 - var/hit_probability = 2//% + var/hit_probability = 2 //% var/obj/item/paper/internalPaper /obj/item/paperplane/origami @@ -41,6 +41,13 @@ qdel(src) return ..() +/obj/item/paperplane/Exited(atom/movable/AM, atom/newLoc) + . = ..() + if (AM == internalPaper) + internalPaper = null + if(!QDELETED(src)) + qdel(src) + /obj/item/paperplane/Destroy() QDEL_NULL(internalPaper) return ..() @@ -71,31 +78,19 @@ user.put_in_hands(internal_paper_tmp) /obj/item/paperplane/attackby(obj/item/P, mob/living/carbon/human/user, params) - ..() + if(burn_paper_product_attackby_check(P, user)) + return if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) - to_chat(user, "You should unfold [src] before changing it.") + to_chat(user, "You should unfold [src] before changing it!") return else if(istype(P, /obj/item/stamp)) //we don't randomize stamps on a paperplane internalPaper.attackby(P, user) //spoofed attack to update internal paper. update_icon() + add_fingerprint(user) + return - else if(P.get_temperature()) - if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10)) - user.visible_message("[user] accidentally ignites [user.p_them()]self!", \ - "You miss [src] and accidentally light yourself on fire!") - user.dropItemToGround(P) - user.adjust_fire_stacks(1) - user.IgniteMob() - return - - if(!(in_range(user, src))) //to prevent issues as a result of telepathically lighting a paper - return - user.dropItemToGround(src) - user.visible_message("[user] lights [src] ablaze with [P]!", "You light [src] on fire!") - fire_act() - - add_fingerprint(user) + return ..() /obj/item/paperplane/throw_at(atom/target, range, speed, mob/thrower, spin=FALSE, diagonals_first = FALSE, datum/callback/callback) @@ -112,26 +107,28 @@ if(..() || !ishuman(hit_atom))//if the plane is caught or it hits a nonhuman return var/mob/living/carbon/human/H = hit_atom + var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) if(prob(hit_probability)) if(H.is_eyes_covered()) return - var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES) - visible_message("\The [src] hits [H] in the eye!") + visible_message("\The [src] hits [H] in the eye[eyes ? "" : " socket"]!") H.adjust_blurriness(6) - if(eyes) - eyes.applyOrganDamage(rand(6,8)) + eyes?.applyOrganDamage(rand(6,8)) H.DefaultCombatKnockdown(40) H.emote("scream") - /obj/item/paper/examine(mob/user) . = ..() . += "Alt-click [src] to fold it into a paper plane." /obj/item/paper/AltClick(mob/living/carbon/user, obj/item/I) - . = ..() - if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user), NO_TK)) + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) return + if(istype(src, /obj/item/paper/carbon)) + var/obj/item/paper/carbon/Carbon = src + if(!Carbon.iscopy && !Carbon.copied) + to_chat(user, "Take off the carbon copy first.") + return to_chat(user, "You fold [src] into the shape of a plane!") user.temporarilyRemoveItemFromInventory(src) var/obj/item/paperplane/plane_type = /obj/item/paperplane @@ -142,4 +139,3 @@ I = new plane_type(user, src) user.put_in_hands(I) - return TRUE diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 91b8a6719b..13890ae69e 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -16,6 +16,8 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "pen" item_state = "pen" + // inhand_icon_state = "pen" + // worn_icon_state = "pen" slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_EARS throwforce = 0 w_class = WEIGHT_CLASS_TINY @@ -76,6 +78,22 @@ icon_state = "pen-fountain" font = FOUNTAIN_PEN_FONT +/obj/item/pen/charcoal + name = "charcoal stylus" + desc = "It's just a wooden stick with some compressed ash on the end. At least it can write." + icon_state = "pen-charcoal" + colour = "dimgray" + font = CHARCOAL_FONT + custom_materials = null + grind_results = list(/datum/reagent/ash = 5, /datum/reagent/cellulose = 10) + +/datum/crafting_recipe/charcoal_stylus + name = "Charcoal Stylus" + result = /obj/item/pen/charcoal + reqs = list(/obj/item/stack/sheet/mineral/wood = 1, /datum/reagent/ash = 30) + time = 30 + category = CAT_PRIMAL + /obj/item/pen/fountain/captain name = "captain's fountain pen" desc = "It's an expensive Oak fountain pen. The nib is quite sharp." @@ -93,6 +111,7 @@ "Black and Silver" = "pen-fountain-b", "Command Blue" = "pen-fountain-cb" ) + embedding = list("embed_chance" = 75) /obj/item/pen/fountain/captain/Initialize() . = ..() @@ -139,20 +158,18 @@ if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE)) return if(oldname == input) - to_chat(user, "You changed \the [O.name] to... well... \the [O.name].") + to_chat(user, "You changed \the [O.name] to... well... \the [O.name].") else O.name = input - to_chat(user, "\The [oldname] has been successfully been renamed to \the [input].") + to_chat(user, "\The [oldname] has been successfully been renamed to \the [input].") O.renamedByPlayer = TRUE - log_game("[user] [key_name(user)] has renamed [O] to [input]") if(penchoice == "Change description") - var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 2048) + var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 100) if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE)) return O.desc = input - to_chat(user, "You have successfully changed \the [O.name]'s description.") - log_game("[user] [key_name(user)] has changed [O]'s description to to [input]") + to_chat(user, "You have successfully changed \the [O.name]'s description.") /* * Sleepypens @@ -181,9 +198,10 @@ */ /obj/item/pen/edagger attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") //these wont show up if the pen is off + // attack_verb_continuous = list("slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") //these won't show up if the pen is off + // attack_verb_simple = list("slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") sharpness = SHARP_EDGED var/on = FALSE - embedding = list(embed_chance = EMBED_CHANCE) /obj/item/pen/edagger/ComponentInitialize() . = ..() @@ -193,29 +211,38 @@ /obj/item/pen/edagger/get_sharpness() return on * sharpness +/obj/item/pen/edagger/suicide_act(mob/user) + . = BRUTELOSS + if(on) + user.visible_message("[user] forcefully rams the pen into their mouth!") + else + user.visible_message("[user] is holding a pen up to their mouth! It looks like [user.p_theyre()] trying to commit suicide!") + attack_self(user) + /obj/item/pen/edagger/attack_self(mob/living/user) if(on) on = FALSE force = initial(force) + throw_speed = initial(throw_speed) w_class = initial(w_class) name = initial(name) hitsound = initial(hitsound) - embedding = null + embedding = list(embed_chance = EMBED_CHANCE) throwforce = initial(throwforce) - playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) + playsound(user, 'sound/weapons/saberoff.ogg', 5, TRUE) to_chat(user, "[src] can now be concealed.") - updateEmbedding() else on = TRUE force = 18 + throw_speed = 4 w_class = WEIGHT_CLASS_NORMAL name = "energy dagger" hitsound = 'sound/weapons/blade1.ogg' - embedding = list(embed_chance = 100, fall_chance = 0) //rule of cool + embedding = list(embed_chance = 100) //rule of cool throwforce = 35 - playsound(user, 'sound/weapons/saberon.ogg', 5, 1) + playsound(user, 'sound/weapons/saberon.ogg', 5, TRUE) to_chat(user, "[src] is now active.") - updateEmbedding() + updateEmbedding() update_icon() /obj/item/pen/edagger/update_icon_state() @@ -235,6 +262,8 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "digging_pen" item_state = "pen" + // inhand_icon_state = "pen" + // worn_icon_state = "pen" force = 3 w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron=10, /datum/material/diamond=100, /datum/material/titanium = 10) diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 0b1f3bb01d..38029b5d4c 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -1,12 +1,20 @@ -/* Photocopiers! - * Contains: - * Photocopier - * Toner Cartridge - */ -/* - * Photocopier - */ +/// For use with the `color_mode` var. Photos will be printed in greyscale while the var has this value. +#define PHOTO_GREYSCALE "Greyscale" +/// For use with the `color_mode` var. Photos will be printed in full color while the var has this value. +#define PHOTO_COLOR "Color" + +/// How much toner is used for making a copy of a paper. +#define PAPER_TONER_USE 0.125 +/// How much toner is used for making a copy of a photo. +#define PHOTO_TONER_USE 0.625 +/// How much toner is used for making a copy of a document. +#define DOCUMENT_TONER_USE 0.75 +/// How much toner is used for making a copy of an ass. +#define ASS_TONER_USE 0.625 +/// The maximum amount of copies you can make with one press of the copy button. +#define MAX_COPIES_AT_ONCE 10 + /obj/machinery/photocopier name = "photocopier" desc = "Used to copy important documents and anatomy studies." @@ -19,183 +27,316 @@ power_channel = EQUIP max_integrity = 300 integrity_failure = 0.33 - var/obj/item/paper/copy = null //what's in the copier! - var/obj/item/photo/photocopy = null - var/obj/item/documents/doccopy = null - var/copies = 1 //how many copies to print! - var/toner = 40 //how much toner is left! woooooo~ - var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier! - var/greytoggle = "Greyscale" - var/mob/living/ass //i can't believe i didn't write a stupid-ass comment about this var when i first coded asscopy. + /// A reference to an `/obj/item/paper` inside the copier, if one is inserted. Otherwise null. + var/obj/item/paper/paper_copy + /// A reference to an `/obj/item/photo` inside the copier, if one is inserted. Otherwise null. + var/obj/item/photo/photo_copy + /// A reference to an `/obj/item/documents` inside the copier, if one is inserted. Otherwise null. + var/obj/item/documents/document_copy + /// A reference to a mob on top of the photocopier trying to copy their ass. Null if there is no mob. + var/mob/living/ass + /// A reference to the toner cartridge that's inserted into the copier. Null if there is no cartridge. + var/obj/item/toner/toner_cartridge + /// How many copies will be printed with one click of the "copy" button. + var/num_copies = 1 + /// Used with photos. Determines if the copied photo will be in greyscale or color. + var/color_mode = PHOTO_COLOR + /// Indicates whether the printer is currently busy copying or not. var/busy = FALSE -/obj/machinery/photocopier/ui_interact(mob/user) +/obj/machinery/photocopier/Initialize() . = ..() - var/list/dat = list("Photocopier ") - if(copy || photocopy || doccopy || (ass && (ass.loc == src.loc))) - dat += "Remove Paper " - if(toner) - dat += "Copy " - dat += "Printing: [copies] copies." - dat += "- " - dat += "+ " - if(photocopy) - dat += "Printing in [greytoggle] " - else if(toner) - dat += "Please insert paper to copy. " - if(isAI(user)) - dat += "Print photo from database " - dat += "Current toner level: [toner]" - if(!toner) - dat +=" Please insert a new toner cartridge!" - user << browse(dat.Join(""), "window=copier") - onclose(user, "copier") + //AddComponent(/datum/component/payment, 5, SSeconomy.get_dep_account(ACCOUNT_CIV), PAYMENT_CLINICAL) + toner_cartridge = new(src) -/obj/machinery/photocopier/Topic(href, href_list) +/obj/machinery/photocopier/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Photocopier") + ui.open() + +/obj/machinery/photocopier/ui_data(mob/user) + var/list/data = list() + data["has_item"] = !copier_empty() + data["num_copies"] = num_copies + + if(photo_copy) + data["is_photo"] = TRUE + data["color_mode"] = color_mode + + if(isAI(user)) + data["isAI"] = TRUE + data["can_AI_print"] = toner_cartridge ? toner_cartridge.charges >= PHOTO_TONER_USE : FALSE + else + data["isAI"] = FALSE + + if(toner_cartridge) + data["has_toner"] = TRUE + data["current_toner"] = toner_cartridge.charges + data["max_toner"] = toner_cartridge.max_charges + data["has_enough_toner"] = has_enough_toner() + else + data["has_toner"] = FALSE + data["has_enough_toner"] = FALSE + + return data + +/obj/machinery/photocopier/ui_act(action, list/params) if(..()) return - if(href_list["copy"]) - if(copy) - for(var/i = 0, i < copies, i++) - if(toner > 0 && !busy && copy) - var/copy_as_paper = 1 - if(istype(copy, /obj/item/paper/contract/employment)) - var/obj/item/paper/contract/employment/E = copy - var/obj/item/paper/contract/employment/C = new /obj/item/paper/contract/employment (loc, E.target.current) - if(C) - copy_as_paper = 0 - if(copy_as_paper) - var/obj/item/paper/c = new /obj/item/paper (loc) - if(length(copy.info) > 0) //Only print and add content if the copied doc has words on it - if(toner > 10) //lots of toner, make it dark - c.info = "" - else //no toner? shitty copies for you! - c.info = "" - var/copied = copy.info - copied = replacetext(copied, "" - c.name = copy.name - c.update_icon() - c.stamps = copy.stamps - if(copy.stamped) - c.stamped = copy.stamped.Copy() - c.copy_overlays(copy, TRUE) - toner-- - busy = TRUE - addtimer(CALLBACK(src, .proc/reset_busy), 1.5 SECONDS) - else - break - updateUsrDialog() - else if(photocopy) - for(var/i = 0, i < copies, i++) - if(toner >= 5 && !busy && photocopy) //Was set to = 0, but if there was say 3 toner left and this ran, you would get -2 which would be weird for ink - new /obj/item/photo (loc, photocopy.picture.Copy(greytoggle == "Greyscale"? TRUE : FALSE)) - busy = TRUE - addtimer(CALLBACK(src, .proc/reset_busy), 1.5 SECONDS) - else - break - else if(doccopy) - for(var/i = 0, i < copies, i++) - if(toner > 5 && !busy && doccopy) - new /obj/item/documents/photocopy(loc, doccopy) - toner-= 6 // the sprite shows 6 papers, yes I checked - busy = TRUE - addtimer(CALLBACK(src, .proc/reset_busy), 1.5 SECONDS) - else - break - updateUsrDialog() - else if(ass) //ASS COPY. By Miauw - for(var/i = 0, i < copies, i++) - var/icon/temp_img - if(ishuman(ass) && (ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) || ass.get_item_by_slot(ITEM_SLOT_OCLOTHING))) - to_chat(usr, "You feel kind of silly, copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "[ass.p_their()]"] clothes on." ) - break - else if(toner >= 5 && !busy && check_ass()) //You have to be sitting on the copier and either be a xeno or a human without clothes on. - if(isalienadult(ass) || istype(ass, /mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro. - temp_img = icon('icons/ass/assalien.png') - else if(ishuman(ass)) //Suit checks are in check_ass - temp_img = icon(ass.gender == FEMALE ? 'icons/ass/assfemale.png' : 'icons/ass/assmale.png') - else if(isdrone(ass)) //Drones are hot - temp_img = icon('icons/ass/assdrone.png') - else - break - busy = TRUE - sleep(15) - var/obj/item/photo/p = new /obj/item/photo (loc) - var/datum/picture/toEmbed = new(name = "[ass]'s Ass", desc = "You see [ass]'s ass on the photo.", image = temp_img) - p.pixel_x = rand(-10, 10) - p.pixel_y = rand(-10, 10) - toEmbed.psize_x = 128 - toEmbed.psize_y = 128 - p.set_picture(toEmbed, TRUE, TRUE) - toner -= 5 - busy = FALSE - else - break - updateUsrDialog() - else if(href_list["remove"]) - if(copy) - remove_photocopy(copy, usr) - copy = null - else if(photocopy) - remove_photocopy(photocopy, usr) - photocopy = null - else if(doccopy) - remove_photocopy(doccopy, usr) - doccopy = null - else if(check_ass()) - to_chat(ass, "You feel a slight pressure on your ass.") - updateUsrDialog() - else if(href_list["min"]) - if(copies > 1) - copies-- - updateUsrDialog() - else if(href_list["add"]) - if(copies < maxcopies) - copies++ - updateUsrDialog() - else if(href_list["aipic"]) - if(!isAI(usr)) - return - if(toner >= 5 && !busy) + + switch(action) + // Copying paper, photos, documents and asses. + if("make_copy") + if(busy) + to_chat(usr, "[src] is currently busy copying something. Please wait until it is finished.") + return FALSE + if(paper_copy) + if(!length(paper_copy.info)) + to_chat(usr, "An error message flashes across [src]'s screen: \"The supplied paper is blank. Aborting.\"") + return FALSE + // Basic paper + if(istype(paper_copy, /obj/item/paper)) + do_copy_loop(CALLBACK(src, .proc/make_paper_copy), usr) + return TRUE + // Devil contract paper. + if(istype(paper_copy, /obj/item/paper/contract/employment)) + do_copy_loop(CALLBACK(src, .proc/make_devil_paper_copy), usr) + return TRUE + // Copying photo. + if(photo_copy) + do_copy_loop(CALLBACK(src, .proc/make_photo_copy), usr) + return TRUE + // Copying Documents. + if(document_copy) + do_copy_loop(CALLBACK(src, .proc/make_document_copy), usr) + return TRUE + // ASS COPY. By Miauw + if(ass) + do_copy_loop(CALLBACK(src, .proc/make_ass_copy), usr) + return TRUE + + // Remove the paper/photo/document from the photocopier. + if("remove") + if(paper_copy) + remove_photocopy(paper_copy, usr) + paper_copy = null + else if(photo_copy) + remove_photocopy(photo_copy, usr) + photo_copy = null + else if(document_copy) + remove_photocopy(document_copy, usr) + document_copy = null + else if(check_ass()) + to_chat(ass, "You feel a slight pressure on your ass.") + return TRUE + + // AI printing photos from their saved images. + if("ai_photo") + if(busy) + to_chat(usr, "[src] is currently busy copying something. Please wait until it is finished.") + return FALSE var/mob/living/silicon/ai/tempAI = usr - if(tempAI.aicamera.stored.len == 0) - to_chat(usr, "No images saved") + if(!length(tempAI.aicamera.stored)) + to_chat(usr, "No images saved.") return var/datum/picture/selection = tempAI.aicamera.selectpicture(usr) - var/obj/item/photo/photo = new(loc, selection) - photo.pixel_x = rand(-10, 10) - photo.pixel_y = rand(-10, 10) - toner -= 5 //AI prints color pictures only, thus they can do it more efficiently - busy = TRUE - addtimer(CALLBACK(src, .proc/reset_busy), 1.5 SECONDS) - updateUsrDialog() - else if(href_list["colortoggle"]) - if(greytoggle == "Greyscale") - greytoggle = "Color" - else - greytoggle = "Greyscale" - updateUsrDialog() + var/obj/item/photo/photo = new(loc, selection) // AI prints color photos only. + give_pixel_offset(photo) + toner_cartridge.charges -= PHOTO_TONER_USE + return TRUE + // Switch between greyscale and color photos + if("color_mode") + if(params["mode"] in list(PHOTO_GREYSCALE, PHOTO_COLOR)) + color_mode = params["mode"] + return TRUE + + // Remove the toner cartridge from the copier. + if("remove_toner") + if(issilicon(usr) || (ishuman(usr) && !usr.put_in_hands(toner_cartridge))) + toner_cartridge.forceMove(drop_location()) + toner_cartridge = null + return TRUE + + // Set the number of copies to be printed with 1 click of the "copy" button. + if("set_copies") + num_copies = clamp(text2num(params["num_copies"]), 1, MAX_COPIES_AT_ONCE) + return TRUE + +/** + * Determines if the photocopier has enough toner to create `num_copies` amount of copies of the currently inserted item. + */ +/obj/machinery/photocopier/proc/has_enough_toner() + if(paper_copy) + return toner_cartridge.charges >= (PAPER_TONER_USE * num_copies) + else if(document_copy) + return toner_cartridge.charges >= (DOCUMENT_TONER_USE * num_copies) + else if(photo_copy) + return toner_cartridge.charges >= (PHOTO_TONER_USE * num_copies) + else if(ass) + return toner_cartridge.charges >= (ASS_TONER_USE * num_copies) + return FALSE + +/** + * Will invoke the passed in `copy_cb` callback in 1 second intervals, and charge the user 5 credits for each copy made. + * + * Arguments: + * * copy_cb - a callback for which proc to call. Should only be one of the `make_x_copy()` procs, such as `make_paper_copy()`. + * * user - the mob who clicked copy. + */ +/obj/machinery/photocopier/proc/do_copy_loop(datum/callback/copy_cb, mob/user) + busy = TRUE + var/i + for(i in 1 to num_copies) + //if(attempt_charge(src, user) & COMPONENT_OBJ_CANCEL_CHARGE) + // break + addtimer(copy_cb, i SECONDS) + addtimer(CALLBACK(src, .proc/reset_busy), i SECONDS) + +/** + * Sets busy to `FALSE`. Created as a proc so it can be used in callbacks. + */ /obj/machinery/photocopier/proc/reset_busy() busy = FALSE - updateUsrDialog() -/obj/machinery/photocopier/proc/do_insertion(obj/item/O, mob/user) - O.forceMove(src) - to_chat(user, "You insert [O] into [src].") +/** + * Gives items a random x and y pixel offset, between -10 and 10 for each. + * + * This is done that when someone prints multiple papers, we dont have them all appear to be stacked in the same exact location. + * + * Arguments: + * * copied_item - The paper, document, or photo that was just spawned on top of the printer. + */ +/obj/machinery/photocopier/proc/give_pixel_offset(obj/item/copied_item) + copied_item.pixel_x = rand(-10, 10) + copied_item.pixel_y = rand(-10, 10) + +/** + * Handles the copying of devil contract paper. Transfers all the text, stamps and so on from the old paper, to the copy. + * + * Checks first if `paper_copy` exists. Since this proc is called from a timer, it's possible that it was removed. + * Does not check if it has enough toner because devil contracts cost no toner to print. + */ +/obj/machinery/photocopier/proc/make_devil_paper_copy() + if(!paper_copy) + return + var/obj/item/paper/contract/employment/E = paper_copy + var/obj/item/paper/contract/employment/C = new(loc, E.target.current) + give_pixel_offset(C) + +/** + * Handles the copying of paper. Transfers all the text, stamps and so on from the old paper, to the copy. + * + * Checks first if `paper_copy` exists. Since this proc is called from a timer, it's possible that it was removed. + */ +/obj/machinery/photocopier/proc/make_paper_copy() + if(!paper_copy) + return + var/obj/item/paper/copied_paper = new(loc) + give_pixel_offset(copied_paper) + if(toner_cartridge.charges > 10) // Lots of toner, make it dark. + copied_paper.info = "" + else // No toner? shitty copies for you! + copied_paper.info = "" + + var/copied_info = paper_copy.info + copied_info = replacetext(copied_info, "" + copied_paper.name = paper_copy.name + copied_paper.update_icon() + copied_paper.stamps = paper_copy.stamps + if(paper_copy.stamped) + copied_paper.stamped = paper_copy.stamped.Copy() + copied_paper.copy_overlays(paper_copy, TRUE) + toner_cartridge.charges -= PAPER_TONER_USE + +/** + * Handles the copying of photos, which can be printed in either color or greyscale. + * + * Checks first if `photo_copy` exists. Since this proc is called from a timer, it's possible that it was removed. + */ +/obj/machinery/photocopier/proc/make_photo_copy() + if(!photo_copy) + return + var/obj/item/photo/copied_pic = new(loc, photo_copy.picture.Copy(color_mode == PHOTO_GREYSCALE ? TRUE : FALSE)) + give_pixel_offset(copied_pic) + toner_cartridge.charges -= PHOTO_TONER_USE + +/** + * Handles the copying of documents. + * + * Checks first if `document_copy` exists. Since this proc is called from a timer, it's possible that it was removed. + */ +/obj/machinery/photocopier/proc/make_document_copy() + if(!document_copy) + return + var/obj/item/documents/photocopy/copied_doc = new(loc, document_copy) + give_pixel_offset(copied_doc) + toner_cartridge.charges -= DOCUMENT_TONER_USE + +/** + * Handles the copying of an ass photo. + * + * Calls `check_ass()` first to make sure that `ass` exists, among other conditions. Since this proc is called from a timer, it's possible that it was removed. + * Additionally checks that the mob has their clothes off. + */ +/obj/machinery/photocopier/proc/make_ass_copy() + if(!check_ass()) + return + if(ishuman(ass)) //(ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) || ass.get_item_by_slot(ITEM_SLOT_OCLOTHING))) + var/mob/living/carbon/C = ass //have to typecast to this, is_groin_exposed is carbon level + if(C.is_groin_exposed()) + to_chat(usr, "You feel kind of silly, copying [ass == usr ? "your" : ass][ass == usr ? "" : "\'s"] ass with [ass == usr ? "your" : "[ass.p_their()]"] clothes on." ) + return + + var/icon/temp_img + if(isalienadult(ass) || istype(ass, /mob/living/simple_animal/hostile/alien)) //Xenos have their own asses, thanks to Pybro. + temp_img = icon('icons/ass/assalien.png') + else if(ishuman(ass)) //Suit checks are after check_ass + temp_img = icon(ass.gender == FEMALE ? 'icons/ass/assfemale.png' : 'icons/ass/assmale.png') + else if(isdrone(ass)) //Drones are hot + temp_img = icon('icons/ass/assdrone.png') + + var/obj/item/photo/copied_ass = new /obj/item/photo(loc) + var/datum/picture/toEmbed = new(name = "[ass]'s Ass", desc = "You see [ass]'s ass on the photo.", image = temp_img) + give_pixel_offset(copied_ass) + toEmbed.psize_x = 128 + toEmbed.psize_y = 128 + copied_ass.set_picture(toEmbed, TRUE, TRUE) + toner_cartridge.charges -= ASS_TONER_USE + +/** + * Inserts the item into the copier. Called in `attackby()` after a human mob clicked on the copier with a paper, photo, or document. + * + * Arugments: + * * object - the object that got inserted. + * * user - the mob that inserted the object. + */ +/obj/machinery/photocopier/proc/do_insertion(obj/item/object, mob/user) + object.forceMove(src) + to_chat(user, "You insert [object] into [src].") flick("photocopier1", src) - updateUsrDialog() -/obj/machinery/photocopier/proc/remove_photocopy(obj/item/O, mob/user) +/** + * Called when someone hits the "remove item" button on the copier UI. + * + * If the user is a silicon, it drops the object at the location of the copier. If the user is not a silicon, it tries to put the object in their hands first. + * Sets `busy` to `FALSE` because if the inserted item is removed, the copier should halt copying. + * + * Arguments: + * * object - the item we're trying to remove. + * * user - the user removing the item. + */ +/obj/machinery/photocopier/proc/remove_photocopy(obj/item/object, mob/user) if(!issilicon(user)) //surprised this check didn't exist before, putting stuff in AI's hand is bad - O.forceMove(user.loc) - user.put_in_hands(O) + object.forceMove(user.loc) + user.put_in_hands(object) else - O.forceMove(drop_location()) - to_chat(user, "You take [O] out of [src].") + object.forceMove(drop_location()) + to_chat(user, "You take [object] out of [src]. [busy ? "The [src] comes to a halt." : ""]") /obj/machinery/photocopier/attackby(obj/item/O, mob/user, params) if(default_unfasten_wrench(user, O)) @@ -210,7 +351,7 @@ else if(!user.temporarilyRemoveItemFromInventory(O)) return - copy = O + paper_copy = O do_insertion(O, user) else to_chat(user, "There is already something in [src]!") @@ -219,7 +360,7 @@ if(copier_empty()) if(!user.temporarilyRemoveItemFromInventory(O)) return - photocopy = O + photo_copy = O do_insertion(O, user) else to_chat(user, "There is already something in [src]!") @@ -228,38 +369,35 @@ if(copier_empty()) if(!user.temporarilyRemoveItemFromInventory(O)) return - doccopy = O + document_copy = O do_insertion(O, user) else to_chat(user, "There is already something in [src]!") else if(istype(O, /obj/item/toner)) - if(toner <= 0) - if(!user.temporarilyRemoveItemFromInventory(O)) - return - qdel(O) - toner = 40 - to_chat(user, "You insert [O] into [src].") - updateUsrDialog() - else - to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner.") + if(toner_cartridge) + to_chat(user, "[src] already has a toner cartridge inserted. Remove that one first.") + return + O.forceMove(src) + toner_cartridge = O + to_chat(user, "You insert [O] into [src].") else if(istype(O, /obj/item/areaeditor/blueprints)) - to_chat(user, "The Blueprint is too large to put into the copier. You need to find something else to record the document") + to_chat(user, "The Blueprint is too large to put into the copier. You need to find something else to record the document.") else return ..() /obj/machinery/photocopier/obj_break(damage_flag) . = ..() - if(. && toner > 0) + if(. && toner_cartridge.charges) new /obj/effect/decal/cleanable/oil(get_turf(src)) - toner = 0 + toner_cartridge.charges = 0 /obj/machinery/photocopier/MouseDrop_T(mob/target, mob/user) check_ass() //Just to make sure that you can re-drag somebody onto it after they moved off. - if (!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.canUseTopic(src, BE_CLOSE) || target == ass || copier_blocked()) + if(!istype(target) || target.anchored || target.buckled || !Adjacent(target) || !user.canUseTopic(src, BE_CLOSE) || target == ass || copier_blocked()) return - src.add_fingerprint(user) + add_fingerprint(user) if(target == user) user.visible_message("[user] starts climbing onto the photocopier!", "You start climbing onto the photocopier...") else @@ -277,49 +415,63 @@ target.forceMove(drop_location()) ass = target - if(photocopy) - photocopy.forceMove(drop_location()) - visible_message("[photocopy] is shoved out of the way by [ass]!") - photocopy = null + if(photo_copy) + photo_copy.forceMove(drop_location()) + visible_message("[photo_copy] is shoved out of the way by [ass]!") + photo_copy = null - else if(copy) - copy.forceMove(drop_location()) - visible_message("[copy] is shoved out of the way by [ass]!") - copy = null - updateUsrDialog() + else if(paper_copy) + paper_copy.forceMove(drop_location()) + visible_message("[paper_copy] is shoved out of the way by [ass]!") + paper_copy = null + else if(document_copy) + document_copy.forceMove(drop_location()) + visible_message("[document_copy] is shoved out of the way by [ass]!") + document_copy = null + +/obj/machinery/photocopier/Exited(atom/movable/AM, atom/newloc) + check_ass() // There was potentially a person sitting on the copier, check if they're still there. + return ..() + +/** + * Checks the living mob `ass` exists and its location is the same as the photocopier. + * + * Returns FALSE if `ass` doesn't exist or is not at the copier's location. Returns TRUE otherwise. + */ /obj/machinery/photocopier/proc/check_ass() //I'm not sure wether I made this proc because it's good form or because of the name. if(!ass) - return 0 - if(ass.loc != src.loc) + return FALSE + if(ass.loc != loc) ass = null - updateUsrDialog() - return 0 - else if(ishuman(ass)) - if(!ass.get_item_by_slot(ITEM_SLOT_ICLOTHING) && !ass.get_item_by_slot(ITEM_SLOT_OCLOTHING)) - return 1 - else - return 0 - else - return 1 + return FALSE + return TRUE +/** + * Checks if the copier is deleted, or has something dense at its location. Called in `MouseDrop_T()` + */ /obj/machinery/photocopier/proc/copier_blocked() if(QDELETED(src)) return if(loc.density) - return 1 + return TRUE for(var/atom/movable/AM in loc) if(AM == src) continue if(AM.density) - return 1 - return 0 + return TRUE + return FALSE +/** + * Checks if there is an item inserted into the copier or a mob sitting on top of it. + * + * Return `FALSE` is the copier has something inside of it. Returns `TRUE` if it doesn't. + */ /obj/machinery/photocopier/proc/copier_empty() - if(copy || photocopy || check_ass()) - return 0 + if(paper_copy || photo_copy || document_copy || check_ass()) + return FALSE else - return 1 + return TRUE /* * Toner cartridge @@ -343,3 +495,11 @@ desc = "Why would ANYONE need THIS MUCH TONER?" charges = 200 max_charges = 200 + +#undef PHOTO_GREYSCALE +#undef PHOTO_COLOR +#undef PAPER_TONER_USE +#undef PHOTO_TONER_USE +#undef DOCUMENT_TONER_USE +#undef ASS_TONER_USE +#undef MAX_COPIES_AT_ONCE diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index 241dde13a8..104f70bfdf 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "stamp-ok" item_state = "stamp" + // inhand_icon_state = "stamp" throwforce = 0 w_class = WEIGHT_CLASS_TINY throw_speed = 3 @@ -11,6 +12,8 @@ custom_materials = list(/datum/material/iron=60) pressure_resistance = 2 attack_verb = list("stamped") + // attack_verb_continuous = list("stamps") + // attack_verb_simple = list("stamp") /obj/item/stamp/suicide_act(mob/user) user.visible_message("[user] stamps 'VOID' on [user.p_their()] forehead, then promptly falls over, dead.") @@ -66,5 +69,25 @@ icon_state = "stamp-clown" dye_color = DYE_CLOWN +/obj/item/stamp/mime + name = "mime's rubber stamp" + icon_state = "stamp-mime" + dye_color = DYE_MIME + +/obj/item/stamp/chap + name = "chaplain's rubber stamp" + icon_state = "stamp-chap" + dye_color = DYE_CHAP + +/obj/item/stamp/centcom + name = "CentCom rubber stamp" + icon_state = "stamp-centcom" + dye_color = DYE_CENTCOM + +/obj/item/stamp/syndicate + name = "Syndicate rubber stamp" + icon_state = "stamp-syndicate" + dye_color = DYE_SYNDICATE + /obj/item/stamp/attack_paw(mob/user) return attack_hand(user) diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm new file mode 100644 index 0000000000..e46ed64971 --- /dev/null +++ b/code/modules/paperwork/ticketmachine.dm @@ -0,0 +1,231 @@ +//Bureaucracy machine! +//Simply set this up in the hopline and you can serve people based on ticket numbers + +/obj/machinery/ticket_machine + name = "ticket machine" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "ticketmachine" + desc = "A marvel of bureaucratic engineering encased in an efficient plastic shell. It can be refilled with a hand labeler refill roll and linked to buttons with a multitool." + density = FALSE + maptext_height = 26 + maptext_width = 32 + maptext_x = 7 + maptext_y = 10 + layer = HIGH_OBJ_LAYER + var/ticket_number = 0 //Increment the ticket number whenever the HOP presses his button + var/current_number = 0 //What ticket number are we currently serving? + var/max_number = 100 //At this point, you need to refill it. + var/cooldown = 50 + var/ready = TRUE + var/id = "ticket_machine_default" //For buttons + var/list/ticket_holders = list() + var/list/obj/item/ticket_machine_ticket/tickets = list() + +/obj/machinery/ticket_machine/multitool_act(mob/living/user, obj/item/I) + if(!multitool_check_buffer(user, I)) //make sure it has a data buffer + return + var/obj/item/multitool/M = I + M.buffer = src + to_chat(user, "You store linkage information in [I]'s buffer.") + return TRUE + +/obj/machinery/ticket_machine/emag_act(mob/user) //Emag the ticket machine to dispense burning tickets, as well as randomize its number to destroy the HoP's mind. + if(obj_flags & EMAGGED) + return + to_chat(user, "You overload [src]'s bureaucratic logic circuitry to its MAXIMUM setting.") + ticket_number = rand(0,max_number) + current_number = ticket_number + obj_flags |= EMAGGED + if(tickets.len) + for(var/obj/item/ticket_machine_ticket/ticket in tickets) + ticket.audible_message("\the [ticket] disperses!") + qdel(ticket) + tickets.Cut() + update_icon() + +/obj/machinery/ticket_machine/Initialize() + . = ..() + update_icon() + +/obj/machinery/ticket_machine/proc/increment() + if(current_number > ticket_number) + return + if(current_number && !(obj_flags & EMAGGED) && tickets[current_number]) + tickets[current_number].audible_message("\the [tickets[current_number]] disperses!") + qdel(tickets[current_number]) + if(current_number < ticket_number) + current_number ++ //Increment the one we're serving. + playsound(src, 'sound/misc/announce_dig.ogg', 50, FALSE) + say("Now serving ticket #[current_number]!") + if(!(obj_flags & EMAGGED) && tickets[current_number]) + tickets[current_number].audible_message("\the [tickets[current_number]] vibrates!") + update_icon() //Update our icon here rather than when they take a ticket to show the current ticket number being served + +/obj/machinery/button/ticket_machine + name = "increment ticket counter" + desc = "Use this button after you've served someone to tell the next person to come forward." + device_type = /obj/item/assembly/control/ticket_machine + req_access = list() + id = "ticket_machine_default" + +/obj/machinery/button/ticket_machine/Initialize() + . = ..() + if(device) + var/obj/item/assembly/control/ticket_machine/ours = device + ours.id = id + +/obj/machinery/button/ticket_machine/multitool_act(mob/living/user, obj/item/I) + . = ..() + if(I.tool_behaviour == TOOL_MULTITOOL) + var/obj/item/multitool/M = I + if(M.buffer && !istype(M.buffer, /obj/machinery/ticket_machine)) + return + var/obj/item/assembly/control/ticket_machine/controller = device + controller.linked = M.buffer + id = null + controller.id = null + to_chat(user, "You've linked [src] to [controller.linked].") + +/obj/item/assembly/control/ticket_machine + name = "ticket machine controller" + desc = "A remote controller for the HoP's ticket machine." + var/obj/machinery/ticket_machine/linked //To whom are we linked? + +/obj/item/assembly/control/ticket_machine/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/item/assembly/control/ticket_machine/LateInitialize() + find_machine() + +/obj/item/assembly/control/ticket_machine/proc/find_machine() //Locate the one to which we're linked + for(var/obj/machinery/ticket_machine/ticketsplease in GLOB.machines) + if(ticketsplease.id == id) + linked = ticketsplease + if(linked) + return TRUE + else + return FALSE + +/obj/item/assembly/control/ticket_machine/activate() + if(cooldown) + return + if(!linked) + return + cooldown = TRUE + linked.increment() + addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 10) + +/obj/machinery/ticket_machine/update_icon() + switch(ticket_number) //Gives you an idea of how many tickets are left + if(0 to 49) + icon_state = "ticketmachine_100" + if(50 to 99) + icon_state = "ticketmachine_50" + if(100) + icon_state = "ticketmachine_0" + handle_maptext() + +/obj/machinery/ticket_machine/proc/handle_maptext() + switch(ticket_number) //This is here to handle maptext offsets so that the numbers align. + if(0 to 9) + maptext_x = 13 + if(10 to 99) + maptext_x = 10 + if(100) + maptext_x = 8 + maptext = "[current_number]" //Finally, apply the maptext + +/obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, params) + ..() + if(istype(I, /obj/item/hand_labeler_refill)) + if(!(ticket_number >= max_number)) + to_chat(user, "[src] refuses [I]! There [max_number-ticket_number==1 ? "is" : "are"] still [max_number-ticket_number] ticket\s left!") + return + to_chat(user, "You start to refill [src]'s ticket holder (doing this will reset its ticket count!).") + if(do_after(user, 30, target = src)) + to_chat(user, "You insert [I] into [src] as it whirs nondescriptly.") + qdel(I) + ticket_number = 0 + current_number = 0 + if(tickets.len) + for(var/obj/item/ticket_machine_ticket/ticket in tickets) + ticket.audible_message("\the [ticket] disperses!") + qdel(ticket) + tickets.Cut() + max_number = initial(max_number) + update_icon() + return + +/obj/machinery/ticket_machine/proc/reset_cooldown() + ready = TRUE + +/obj/machinery/ticket_machine/attack_hand(mob/living/carbon/user) + . = ..() + if(!ready) + to_chat(user,"You press the button, but nothing happens...") + return + if(ticket_number >= max_number) + to_chat(user,"Ticket supply depleted, please refill this unit with a hand labeller refill cartridge!") + return + if((user in ticket_holders) && !(obj_flags & EMAGGED)) + to_chat(user, "You already have a ticket!") + return + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 100, FALSE) + ticket_number ++ + to_chat(user, "You take a ticket from [src], looks like you're ticket number #[ticket_number]...") + var/obj/item/ticket_machine_ticket/theirticket = new /obj/item/ticket_machine_ticket(get_turf(src)) + theirticket.name = "Ticket #[ticket_number]" + theirticket.maptext = "[ticket_number]" + theirticket.saved_maptext = "[ticket_number]" + theirticket.ticket_number = ticket_number + theirticket.source = src + theirticket.owner = user + user.put_in_hands(theirticket) + ticket_holders += user + tickets += theirticket + if(obj_flags & EMAGGED) //Emag the machine to destroy the HOP's life. + ready = FALSE + addtimer(CALLBACK(src, .proc/reset_cooldown), cooldown)//Small cooldown to prevent piles of flaming tickets + theirticket.fire_act() + user.dropItemToGround(theirticket) + user.adjust_fire_stacks(1) + user.IgniteMob() + return + +/obj/item/ticket_machine_ticket + name = "Ticket" + desc = "A ticket which shows your place in the Head of Personnel's line. Made from Nanotrasen patented NanoPaper®. Though solid, its form seems to shimmer slightly. Feels (and burns) just like the real thing." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "ticket" + maptext_x = 7 + maptext_y = 10 + w_class = WEIGHT_CLASS_TINY + resistance_flags = FLAMMABLE + max_integrity = 50 + var/saved_maptext = null + var/mob/living/carbon/owner + var/obj/machinery/ticket_machine/source + var/ticket_number + +/obj/item/ticket_machine_ticket/attack_hand(mob/user) + . = ..() + maptext = saved_maptext //For some reason, storage code removes all maptext off objs, this stops its number from being wiped off when taken out of storage. + +/obj/item/ticket_machine_ticket/attackby(obj/item/P, mob/living/carbon/human/user, params) //Stolen from papercode + if(burn_paper_product_attackby_check(P, user)) + return + + return ..() + +/obj/item/paper/extinguish() + ..() + update_icon() + +/obj/item/ticket_machine_ticket/Destroy() + if(owner && source) + source.ticket_holders -= owner + source.tickets[ticket_number] = null + owner = null + source = null + return ..() diff --git a/code/modules/photography/_pictures.dm b/code/modules/photography/_pictures.dm index f667e18f47..6f85cdb3a6 100644 --- a/code/modules/photography/_pictures.dm +++ b/code/modules/photography/_pictures.dm @@ -30,16 +30,16 @@ if(autogenerate_icon && !picture_icon && picture_image) regenerate_small_icon() -/datum/picture/proc/get_small_icon() +/datum/picture/proc/get_small_icon(iconstate) if(!picture_icon) - regenerate_small_icon() + regenerate_small_icon(iconstate) return picture_icon -/datum/picture/proc/regenerate_small_icon() +/datum/picture/proc/regenerate_small_icon(iconstate) if(!picture_image) return var/icon/small_img = icon(picture_image) - var/icon/ic = icon('icons/obj/items_and_weapons.dmi', "photo") + var/icon/ic = icon('icons/obj/items_and_weapons.dmi', iconstate ? iconstate :"photo") small_img.Scale(8, 8) ic.Blend(small_img,ICON_OVERLAY, 13, 13) picture_icon = ic diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm index 5c78709e9b..c363c549de 100644 --- a/code/modules/photography/photos/photo.dm +++ b/code/modules/photography/photos/photo.dm @@ -35,23 +35,23 @@ /obj/item/photo/update_icon_state() if(!istype(picture) || !picture.picture_image) return - var/icon/I = picture.get_small_icon() + var/icon/I = picture.get_small_icon(initial(icon_state)) if(I) icon = I /obj/item/photo/suicide_act(mob/living/carbon/user) user.visible_message("[user] is taking one last look at \the [src]! It looks like [user.p_theyre()] giving in to death!")//when you wanna look at photo of waifu one last time before you die... if (user.gender == MALE) - playsound(user, 'sound/voice/human/manlaugh1.ogg', 50, 1)//EVERY TIME I DO IT MAKES ME LAUGH + playsound(user, 'sound/voice/human/manlaugh1.ogg', 50, TRUE)//EVERY TIME I DO IT MAKES ME LAUGH else if (user.gender == FEMALE) - playsound(user, 'sound/voice/human/womanlaugh.ogg', 50, 1) + playsound(user, 'sound/voice/human/womanlaugh.ogg', 50, TRUE) return OXYLOSS /obj/item/photo/attack_self(mob/user) user.examinate(src) /obj/item/photo/attackby(obj/item/P, mob/user, params) - if(try_burn(P, user)) + if(burn_paper_product_attackby_check(P, user)) return if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon)) if(!user.is_literate()) @@ -60,31 +60,13 @@ var/txt = stripped_input(user, "What would you like to write on the back?", "Photo Writing", "", 128) if(txt && user.canUseTopic(src, BE_CLOSE)) scribble = txt - ..() - -/obj/item/photo/proc/try_burn(obj/item/I, mob/living/user) - var/ignition_message = I.ignition_effect(src, user) - if(!ignition_message) - return - . = TRUE - if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(10) && Adjacent(user)) - user.visible_message("[user] accidentally ignites [user.p_them()]self!", \ - "You miss [src] and accidentally light yourself on fire!") - if(user.is_holding(I)) //checking if they're holding it in case TK is involved - user.dropItemToGround(I) - user.adjust_fire_stacks(1) - user.IgniteMob() - return - - if(user.is_holding(src)) //no TK shit here. - user.dropItemToGround(src) - user.visible_message(ignition_message) - add_fingerprint(user) - fire_act(I.get_temperature()) + else + return ..() /obj/item/photo/examine(mob/user) . = ..() - if(in_range(src, user)) + + if(in_range(src, user) || isobserver(user)) show(user) else . += "You need to get closer to get a good look at this photo!" diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 54b1362518..93fd9fe3d9 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -66,7 +66,7 @@ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) var/heat = energy_transfer*(1-efficiency) - lastgen += LOGISTIC_FUNCTION(1000000,0.0034,delta_temperature,2000) + lastgen += LOGISTIC_FUNCTION(1250000,0.0001,delta_temperature,50000) hot_air.set_temperature(hot_air.return_temperature() - energy_transfer/hot_air_heat_capacity) cold_air.set_temperature(cold_air.return_temperature() + heat/cold_air_heat_capacity) @@ -139,7 +139,6 @@ . = ..() var/datum/browser/popup = new(user, "teg", "Thermo-Electric Generator", 460, 300) popup.set_content(get_menu()) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) popup.open() /obj/machinery/power/generator/Topic(href, href_list) diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index eb80548441..be24ea0fef 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -160,6 +160,14 @@ buckle_lying = FALSE buckle_requires_restraints = TRUE +/obj/machinery/power/grounding_rod/Initialize() + GLOB.grounding_rods |= src + return ..() + +/obj/machinery/power/grounding_rod/Destroy() + GLOB.grounding_rods.Remove(src) + return ..() + /obj/machinery/power/grounding_rod/default_unfasten_wrench(mob/user, obj/item/I, time = 20) . = ..() if(. == SUCCESSFUL_UNFASTEN) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 06e5d27f6d..89c5aa3316 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -31,6 +31,7 @@ var/produced_power var/energy_to_raise = 32 var/energy_to_lower = -20 + var/obj/machinery/power/grounding_rod/rodtarget /obj/singularity/energy_ball/Initialize(mapload, starting_energy = 50, is_miniball = FALSE) miniball = is_miniball @@ -60,11 +61,12 @@ return //don't annnounce miniballs ..() - /obj/singularity/energy_ball/process() if(!orbiting) handle_energy() + determine_containment() + move_the_basket_ball(4 + orbiting_balls.len * 1.5) playsound(src.loc, 'sound/magic/lightningbolt.ogg', 100, TRUE, extrarange = 30) @@ -87,12 +89,19 @@ if(orbiting_balls.len) . += "There are [orbiting_balls.len] mini-balls orbiting it." - /obj/singularity/energy_ball/proc/move_the_basket_ball(var/move_amount) //we face the last thing we zapped, so this lets us favor that direction a bit var/move_bias = pick(GLOB.alldirs) + var/move_dir + for(var/rod in GLOB.grounding_rods) // grounding rods pull the tesla ball, picks the nearest one + if(!rodtarget || get_dist(src,rod)
+
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 88aef958e8..ff80f736e1 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -27072,3 +27072,137 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: three new items are in the loadout for all donators
zeroisthebiggay:
- rscadd: contraband black evening gloves in kinkvend
+2020-08-25:
+ Hatterhat:
+ - rscadd: Insidious combat gloves have been replaced by insidious guerilla gloves.
+ They're generally the same, except now you can tackle with them.
+ Literallynotpickles:
+ - tweak: You can now equip handheld crew monitors on all medical-related winter
+ coats.
+ Putnam3145:
+ - tweak: vore now ejects occupants on death
+ raspy-on-osu:
+ - tweak: Thermoelectric Generator power output
+ timothyteakettle:
+ - tweak: I.P.Cs now short their circuits when expressing emotion, causing sparks
+ to appear around them.
+2020-08-26:
+ ancientpower:
+ - tweak: Ghosts can read newscasters by clicking on them.
+ silicons:
+ - balance: hierophant vortex blasts now have 50% armor penetration vs mecha
+ - balance: ventcrawling now kicks off every attached/buckled mob, even for non humans.
+2020-08-27:
+ silicons:
+ - tweak: eyebeam lighting can only have 128 maximum HSV saturation now.
+ - balance: no more shotgun stripper clips in boxes.
+ - balance: goliath tentacles now do 20 damage to mechs at 25% ap
+ timothyteakettle:
+ - tweak: changing your character's gender won't randomize its hairstyle and facial
+ hairstyle now
+2020-08-28:
+ EmeraldSundisk:
+ - rscadd: Adds more paper to the library
+ - rscadd: The law office now has a desk window
+ - tweak: Expands most of CogStation's exterior airlocks. Slightly adjusts surrounding
+ areas to accommodate this.
+ - tweak: Updates some of CogStation's paperwork
+ - tweak: The rat in the morgue turned themselves into a possum. Funniest shit I've
+ ever seen.
+ - bugfix: Adjusts some area designations so cameras should receive power properly
+ - bugfix: Cleans up an errant decal
+ Hatterhat:
+ - tweak: Traitor holoparasites can now only be bought once, because apparently you
+ can only have one active holopara.
+ - balance: PDA bombs can now only be bought once per uplink.
+ lolman360:
+ - rscadd: atmos = radiation = chemistry.
+ shellspeed1:
+ - rscadd: Adds slow mode for iv drips
+ timothyteakettle:
+ - rscadd: an ancient game over a thousand years old has re-emerged among crewmembers
+ - rock paper scissors
+ - tweak: customization features appear in alphabetical order where necessary
+ - tweak: bokken do two more stamina damage now
+ - rscadd: you can now choose a body sprite as an anthromorph or anthromorphic insect,
+ and can choose from aquatic/avian and apid respectively (and obviously back
+ to the defaults too)
+2020-08-30:
+ raspy-on-osu:
+ - rscadd: new explosion echoes
+ - tweak: explosion echo range
+ - soundadd: 5 new explosion related sounds
+2020-08-31:
+ Arturlang:
+ - tweak: Slimes can now damage structures, don't leave them unfed!
+ Chiirno:
+ - bugfix: Moves pill_bottles/dice to box/dice on CogStation.
+ Couls, ported by NecromancerAnne:
+ - code_imp: cleans up mech backstabbing code
+ DeltaFire15:
+ - rscdel: teleport-to-ark ability of the eminence, commented out
+ - rscadd: teleport-to-obelisk ability for the eminence
+ Detective-Google:
+ - tweak: plasmamen have no more slowdown
+ - rscadd: object reskins now use very nice and cool radials
+ EmeraldSundisk:
+ - rscadd: Adds a pool to MetaStation
+ - tweak: Slight readjustments to the surrounding area
+ - bugfix: Fixes a handful of external airlocks
+ ForrestWick:
+ - balance: removes wall walking boots from nukie uplink
+ - tweak: removes wall walking boots from nukie uplink
+ Ghommie:
+ - bugfix: e-gun overlays and some floor decals should have been fixed.
+ LetterN:
+ - rscadd: tgchat
+ Lynxless:
+ - tweak: Changed anatomic panacea into a direct buff, instead of a chem injection
+ - balance: Changed the values of anatomic panacea
+ - imageadd: Added a new icon for panacea's buff alert
+ Putnam3145:
+ - tweak: Pref for genital/vore examine text
+ - bugfix: Fixed a couple events having ghost roles eligible.
+ - balance: 'Buffed slaughter demon: gets stronger as it eats people'
+ - balance: 'Nerfed slaughter demon: no longer permanently round-removes all who
+ are eaten by it, instead releasing their now-heartless bodies'
+ - bugfix: Dynamic storytellers now calculate property weights properly.
+ Sonic121x:
+ - bugfix: Fix the four type of new tea that will stuck inside your vein.
+ - rscadd: drinking glass sprite for those tea.
+ kappa-sama:
+ - balance: miners can no longer acquire funny antag item
+ lolman360:
+ - bugfix: shuttle engine/heater sprites now face the right way
+ raspy-on-osu:
+ - tweak: TEG power output
+ - tweak: tesla movement priorities
+ - rscadd: tesla counterplay
+ - rscadd: tesla containment check (containment variable now usable)
+ silicons:
+ - bugfix: brooms now sweep objects on MOVABLE_PRE_MOVE rather than MOVABLE_MOVED
+ - balance: firedoors no longer automatically open on touch when there's no pressure
+ differences.
+ timothyteakettle:
+ - tweak: buzz, buzz2 and ping are now all unrestricted emotes and can be used by
+ anyone
+ - imagedel: the drake credit and pickle credit sprites have been removed
+ - refactor: tongue speech handling is now done by accent datums
+ zeroisthebiggay:
+ - rscdel: waffleco
+2020-09-01:
+ BlueWildrose:
+ - bugfix: fixed slimes starting off hungry
+2020-09-02:
+ Putnam3145:
+ - code_imp: Added a unit test for character saving.
+ - balance: Plastitanium rapier no longer silently sleeps with no chance at counterplay
+ when used by pacifists.
+ - bugfix: Fusion scan is now actually useful.
+ Tupinambis:
+ - tweak: moved the dakis, genital growth pills, and genital autosurgeons out of
+ the maintenance loot table and into kinkmates.
+ raspy-on-osu:
+ - bugfix: pyroclastic anomaly client spam
+ timothyteakettle:
+ - rscadd: you can hide your ckey now from the roundend report
diff --git a/html/changelogs/AutoChangeLog-pr-13225.yml b/html/changelogs/AutoChangeLog-pr-13225.yml
deleted file mode 100644
index d185917e7f..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13225.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "raspy-on-osu"
-delete-after: True
-changes:
- - tweak: "Thermoelectric Generator power output"
diff --git a/html/changelogs/AutoChangeLog-pr-13238.yml b/html/changelogs/AutoChangeLog-pr-13238.yml
deleted file mode 100644
index 8e3d2c148b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13238.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - rscadd: "Insidious combat gloves have been replaced by insidious guerilla gloves. They're generally the same, except now you can tackle with them."
diff --git a/html/changelogs/AutoChangeLog-pr-13240.yml b/html/changelogs/AutoChangeLog-pr-13240.yml
deleted file mode 100644
index 396515c90e..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13240.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - tweak: "I.P.Cs now short their circuits when expressing emotion, causing sparks to appear around them."
diff --git a/html/changelogs/AutoChangeLog-pr-13241.yml b/html/changelogs/AutoChangeLog-pr-13241.yml
deleted file mode 100644
index f11a9408b3..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13241.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Putnam3145"
-delete-after: True
-changes:
- - tweak: "vore now ejects occupants on death"
diff --git a/html/changelogs/AutoChangeLog-pr-13242.yml b/html/changelogs/AutoChangeLog-pr-13242.yml
deleted file mode 100644
index 0cfcdf183b..0000000000
--- a/html/changelogs/AutoChangeLog-pr-13242.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Literallynotpickles"
-delete-after: True
-changes:
- - tweak: "You can now equip handheld crew monitors on all medical-related winter coats."
diff --git a/code/modules/goonchat/browserassets/js/jquery.min.js b/html/jquery.min.js
similarity index 100%
rename from code/modules/goonchat/browserassets/js/jquery.min.js
rename to html/jquery.min.js
diff --git a/icons/mob/32x64.dmi b/icons/mob/32x64.dmi
index cddf9599b4..79a4c8a7fd 100644
Binary files a/icons/mob/32x64.dmi and b/icons/mob/32x64.dmi differ
diff --git a/icons/mob/cyborg/drakemech.dmi b/icons/mob/cyborg/drakemech.dmi
index 6a4845d983..a9c47b2b78 100644
Binary files a/icons/mob/cyborg/drakemech.dmi and b/icons/mob/cyborg/drakemech.dmi differ
diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi
index 916686e63f..60978d55a2 100644
Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index 989ec8049c..794074bfe4 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index 30c23601a5..4ced910193 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/icons/mob/wings.dmi b/icons/mob/wings.dmi
index ace37b1f17..4523403344 100644
Binary files a/icons/mob/wings.dmi and b/icons/mob/wings.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 95ae326f1e..b778a9d1a2 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index cd12f4a457..14eb973e25 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/crates.dmi b/icons/obj/crates.dmi
index a1bc443efb..9b42188f5e 100644
Binary files a/icons/obj/crates.dmi and b/icons/obj/crates.dmi differ
diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi
index d0be1113ee..9067a4beca 100644
Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 5962e7522d..008618199a 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/stamp_icons/font.png b/icons/stamp_icons/font.png
new file mode 100644
index 0000000000..4297937696
Binary files /dev/null and b/icons/stamp_icons/font.png differ
diff --git a/icons/stamp_icons/large_stamp-cap.png b/icons/stamp_icons/large_stamp-cap.png
index 7f7ce460a4..19883563b2 100644
Binary files a/icons/stamp_icons/large_stamp-cap.png and b/icons/stamp_icons/large_stamp-cap.png differ
diff --git a/icons/stamp_icons/large_stamp-ce.png b/icons/stamp_icons/large_stamp-ce.png
index 189db310cf..d07f70c4d5 100644
Binary files a/icons/stamp_icons/large_stamp-ce.png and b/icons/stamp_icons/large_stamp-ce.png differ
diff --git a/icons/stamp_icons/large_stamp-centcom.png b/icons/stamp_icons/large_stamp-centcom.png
new file mode 100644
index 0000000000..6250cbff88
Binary files /dev/null and b/icons/stamp_icons/large_stamp-centcom.png differ
diff --git a/icons/stamp_icons/large_stamp-chap.png b/icons/stamp_icons/large_stamp-chap.png
new file mode 100644
index 0000000000..2586c13bad
Binary files /dev/null and b/icons/stamp_icons/large_stamp-chap.png differ
diff --git a/icons/stamp_icons/large_stamp-clown.png b/icons/stamp_icons/large_stamp-clown.png
index 5abbff7113..d606870507 100644
Binary files a/icons/stamp_icons/large_stamp-clown.png and b/icons/stamp_icons/large_stamp-clown.png differ
diff --git a/icons/stamp_icons/large_stamp-cmo.png b/icons/stamp_icons/large_stamp-cmo.png
index eb004be621..bac4c7b2f9 100644
Binary files a/icons/stamp_icons/large_stamp-cmo.png and b/icons/stamp_icons/large_stamp-cmo.png differ
diff --git a/icons/stamp_icons/large_stamp-deny.png b/icons/stamp_icons/large_stamp-deny.png
index 7c216fce48..1c7f416597 100644
Binary files a/icons/stamp_icons/large_stamp-deny.png and b/icons/stamp_icons/large_stamp-deny.png differ
diff --git a/icons/stamp_icons/large_stamp-hop.png b/icons/stamp_icons/large_stamp-hop.png
index 3f9aa4a76f..1447d58a87 100644
Binary files a/icons/stamp_icons/large_stamp-hop.png and b/icons/stamp_icons/large_stamp-hop.png differ
diff --git a/icons/stamp_icons/large_stamp-hos.png b/icons/stamp_icons/large_stamp-hos.png
index 67b69d7503..bd59590975 100644
Binary files a/icons/stamp_icons/large_stamp-hos.png and b/icons/stamp_icons/large_stamp-hos.png differ
diff --git a/icons/stamp_icons/large_stamp-law.png b/icons/stamp_icons/large_stamp-law.png
index d6d77eee9b..aee5aa3fbc 100644
Binary files a/icons/stamp_icons/large_stamp-law.png and b/icons/stamp_icons/large_stamp-law.png differ
diff --git a/icons/stamp_icons/large_stamp-mime.png b/icons/stamp_icons/large_stamp-mime.png
new file mode 100644
index 0000000000..c9a0143439
Binary files /dev/null and b/icons/stamp_icons/large_stamp-mime.png differ
diff --git a/icons/stamp_icons/large_stamp-ok.png b/icons/stamp_icons/large_stamp-ok.png
index e568ae0921..b40d3e3f1b 100644
Binary files a/icons/stamp_icons/large_stamp-ok.png and b/icons/stamp_icons/large_stamp-ok.png differ
diff --git a/icons/stamp_icons/large_stamp-qm.png b/icons/stamp_icons/large_stamp-qm.png
index ea863078b4..4ba31b3741 100644
Binary files a/icons/stamp_icons/large_stamp-qm.png and b/icons/stamp_icons/large_stamp-qm.png differ
diff --git a/icons/stamp_icons/large_stamp-rd.png b/icons/stamp_icons/large_stamp-rd.png
index 35479e805f..a9e7ad040b 100644
Binary files a/icons/stamp_icons/large_stamp-rd.png and b/icons/stamp_icons/large_stamp-rd.png differ
diff --git a/icons/stamp_icons/large_stamp-syndicate.png b/icons/stamp_icons/large_stamp-syndicate.png
new file mode 100644
index 0000000000..68f17d8f5e
Binary files /dev/null and b/icons/stamp_icons/large_stamp-syndicate.png differ
diff --git a/icons/turf/shuttle.dmi b/icons/turf/shuttle.dmi
index 985b9991a0..fbca824f47 100644
Binary files a/icons/turf/shuttle.dmi and b/icons/turf/shuttle.dmi differ
diff --git a/interface/interface.dm b/interface/interface.dm
index 2b33ebb5e8..2aece7cb6c 100644
--- a/interface/interface.dm
+++ b/interface/interface.dm
@@ -71,7 +71,7 @@
return
var/static/issue_template = file2text(".github/ISSUE_TEMPLATE.md")
var/servername = CONFIG_GET(string/servername)
- var/url_params = "Reporting client version: [byond_version]\n\n[issue_template]"
+ var/url_params = "Reporting client version: [byond_version].[byond_build]\n\n[issue_template]"
if(GLOB.round_id || servername)
url_params = "Issue reported from [GLOB.round_id ? " Round ID: [GLOB.round_id][servername ? " ([servername])" : ""]" : servername]\n\n[url_params]"
DIRECT_OUTPUT(src, link("[githuburl]/issues/new?body=[url_encode(url_params)]"))
@@ -79,151 +79,13 @@
to_chat(src, "The Github URL is not set in the server configuration.")
return
-/client/verb/hotkeys_help()
- set name = "hotkeys-help"
- set category = "OOC"
-
- var/adminhotkeys = {"
-Admin:
-\tF3 = asay
-\tF5 = Aghost (admin-ghost)
-\tF6 = player-panel
-\tF7 = Buildmode
-\tF8 = Invisimin
-\tCtrl+F8 = Stealthmin
-"}
-
- mob.hotkey_help()
-
- if(holder)
- to_chat(src, adminhotkeys)
-
/client/verb/changelog()
set name = "Changelog"
set category = "OOC"
- var/datum/asset/changelog = get_asset_datum(/datum/asset/simple/changelog)
+ var/datum/asset/simple/namespaced/changelog = get_asset_datum(/datum/asset/simple/namespaced/changelog)
changelog.send(src)
- src << browse('html/changelog.html', "window=changes;size=675x650")
+ src << browse(changelog.get_htmlloader("changelog.html"), "window=changes;size=675x650")
if(prefs.lastchangelog != GLOB.changelog_hash)
prefs.lastchangelog = GLOB.changelog_hash
prefs.save_preferences()
winset(src, "infowindow.changelog", "font-style=;")
-
-
-/mob/proc/hotkey_help()
- var/hotkey_mode = {"
-Hotkey-Mode: (hotkey-mode must be on)
-\tTAB = toggle hotkey-mode
-\ta = left
-\ts = down
-\td = right
-\tw = up
-\tq = drop
-\te = equip
-\tr = throw
-\tm = me
-\tt = say
-\to = OOC
-\tb = resist
-\tv = rest
-\th = stop pulling
-\tx = swap-hand
-\tz = activate held object (or y)
-\tShift+e = Put held item into belt or take out most recent item added to belt.
-\tShift+b = Put held item into backpack or take out most recent item added to backpack.
-\tf = cycle-intents-left
-\tg = cycle-intents-right
-\t1 = help-intent
-\t2 = disarm-intent
-\t3 = grab-intent
-\t4 = harm-intent
-\tNumpad = Body target selection (Press 8 repeatedly for Head->Eyes->Mouth)
-\tAlt(HOLD) = Alter movement intent
-"}
-
- var/other = {"
-Any-Mode: (hotkey doesn't need to be on)
-\tCtrl+a = left
-\tCtrl+s = down
-\tCtrl+d = right
-\tCtrl+w = up
-\tCtrl+q = drop
-\tCtrl+e = equip
-\tCtrl+r = throw
-\tCtrl+b = resist
-\tCtrl+h = stop pulling
-\tCtrl+o = OOC
-\tCtrl+x = swap-hand
-\tCtrl+z = activate held object (or Ctrl+y)
-\tCtrl+f = cycle-intents-left
-\tCtrl+g = cycle-intents-right
-\tCtrl+1 = help-intent
-\tCtrl+2 = disarm-intent
-\tCtrl+3 = grab-intent
-\tCtrl+4 = harm-intent
-\tCtrl+'+/-' OR
-\tShift+Mousewheel = Ghost zoom in/out
-\tDEL = stop pulling
-\tINS = cycle-intents-right
-\tHOME = drop
-\tPGUP = swap-hand
-\tPGDN = activate held object
-\tEND = throw
-\tCtrl+Numpad = Body target selection (Press 8 repeatedly for Head->Eyes->Mouth)
-"}
-
- to_chat(src, hotkey_mode)
- to_chat(src, other)
-
-/mob/living/silicon/robot/hotkey_help()
- //h = talk-wheel has a nonsense tag in it because \th is an escape sequence in BYOND.
- var/hotkey_mode = {"
-Hotkey-Mode: (hotkey-mode must be on)
-\tTAB = toggle hotkey-mode
-\ta = left
-\ts = down
-\td = right
-\tw = up
-\tq = unequip active module
-\tv = rest
-\th = stop pulling
-\tm = me
-\tt = say
-\to = OOC
-\tx = cycle active modules
-\tb = resist
-\tz = activate held object (or y)
-\tf = cycle-intents-left
-\tg = cycle-intents-right
-\t1 = activate module 1
-\t2 = activate module 2
-\t3 = activate module 3
-\t4 = toggle intents
-"}
-
- var/other = {"
-Any-Mode: (hotkey doesn't need to be on)
-\tCtrl+a = left
-\tCtrl+s = down
-\tCtrl+d = right
-\tCtrl+w = up
-\tCtrl+q = unequip active module
-\tCtrl+x = cycle active modules
-\tCtrl+b = resist
-\tCtrl+h = stop pulling
-\tCtrl+o = OOC
-\tCtrl+z = activate held object (or Ctrl+y)
-\tCtrl+f = cycle-intents-left
-\tCtrl+g = cycle-intents-right
-\tCtrl+1 = activate module 1
-\tCtrl+2 = activate module 2
-\tCtrl+3 = activate module 3
-\tCtrl+4 = toggle intents
-\tDEL = stop pulling
-\tINS = toggle intents
-\tPGUP = cycle active modules
-\tPGDN = activate held object
-"}
-
- to_chat(src, hotkey_mode)
- to_chat(src, other)
diff --git a/interface/menu.dm b/interface/menu.dm
index 3c881656da..976abb16b3 100644
--- a/interface/menu.dm
+++ b/interface/menu.dm
@@ -63,7 +63,6 @@ GLOBAL_LIST_EMPTY(menulist)
return
M.Set_checked(src, verbpath)
-
/datum/verbs/menu/Icon/Load_checked(client/C) //So we can be lazy, we invoke the "checked" menu item on menu load.
var/procpath/verbpath = Get_checked(C)
if (!verbpath || !(verbpath in typesof("[type]/verb")))
@@ -115,4 +114,3 @@ GLOBAL_LIST_EMPTY(menulist)
/datum/verbs/menu/Icon/Scaling/verb/BL()
set name = "@.winset \"mapwindow.map.zoom-mode=blur\""
set desc = "Bilinear"
-
diff --git a/interface/skin.dmf b/interface/skin.dmf
index 0f64bc89da..d7e461eadd 100644
--- a/interface/skin.dmf
+++ b/interface/skin.dmf
@@ -2,21 +2,21 @@ macro "default"
menu "menu"
- elem
+ elem
name = "&File"
command = ""
saved-params = "is-checked"
- elem
+ elem
name = "&Quick screenshot\tF2"
command = ".screenshot auto"
category = "&File"
saved-params = "is-checked"
- elem
+ elem
name = "&Save screenshot as...\tShift+F2"
command = ".screenshot"
category = "&File"
saved-params = "is-checked"
- elem
+ elem
name = ""
command = ""
category = "&File"
@@ -26,27 +26,26 @@ menu "menu"
command = ".reconnect"
category = "&File"
saved-params = "is-checked"
- elem
+ elem
name = "&Quit\tAlt-F4"
command = ".quit"
category = "&File"
saved-params = "is-checked"
- elem
+ elem
name = "&Help"
command = ""
saved-params = "is-checked"
- elem
+ elem
name = "&Admin Help\tF1"
command = "adminhelp"
category = "&Help"
saved-params = "is-checked"
- elem
+ elem
name = "&Hotkeys"
command = "hotkeys-help"
category = "&Help"
saved-params = "is-checked"
-
window "mainwindow"
elem "mainwindow"
type = MAIN
@@ -54,7 +53,6 @@ window "mainwindow"
size = 640x440
anchor1 = none
anchor2 = none
- background-color = #242424
is-default = true
saved-params = "pos;size;is-minimized;is-maximized"
icon = 'icons\\ss13_64.png'
@@ -62,23 +60,20 @@ window "mainwindow"
menu = "menu"
elem "split"
type = CHILD
- pos = 0,0
+ pos = 3,0
size = 637x440
anchor1 = 0,0
anchor2 = 100,100
- background-color = #272727
saved-params = "splitter"
left = "mapwindow"
right = "infowindow"
is-vert = true
- splitter = 75
elem "asset_cache_browser"
type = BROWSER
pos = 0,0
size = 200x200
anchor1 = none
anchor2 = none
- background-color = #272727
is-visible = false
auto-format = false
saved-params = ""
@@ -88,23 +83,18 @@ window "mainwindow"
size = 999x999
anchor1 = none
anchor2 = none
- background-color = #272727
is-visible = false
saved-params = ""
window "mapwindow"
elem "mapwindow"
type = MAIN
- pos = 418,0
+ pos = 0,0
size = 1024x1024
anchor1 = none
anchor2 = none
- background-color = none
saved-params = "pos;size;is-minimized;is-maximized"
- statusbar = false
is-pane = true
- outer-size = 684x617
- inner-size = 662x561
elem "map"
type = MAP
pos = 0,0
@@ -113,10 +103,9 @@ window "mapwindow"
anchor2 = 100,100
font-family = "Arial"
font-size = 7
+ text-color = none
is-default = true
- saved-params = "icon-size"
- zoom-mode = distort
- style = ".center { text-align: center; }\n.maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; }\n.command_headset { font-weight: bold;\tfont-size: 8px; } .small { font-size: 6px; }\n.big { font-size: 8px; }\n.reallybig { font-size: 8px; }\n.extremelybig { font-size: 8px; }\n.greentext { color: #00ff00; font-size: 7px; }\n.redtext { color: #ff0000; font-size: 7px; }\n.clown { color: #ff69bf; font-size: 7px; font-weight: bold; }\n.his_grace { color: #15d512; }\n.hypnophrase { color: #0d0d0d; font-weight: bold; }\n.yell { font-weight: bold; }\n.italics { font-size: 6px; }"
+ style=".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .command_headset { font-weight: bold; font-size: 8px; } .small { font-size: 6px; } .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .greentext { color: #00FF00; font-size: 7px; } .redtext { color: #FF0000; font-size: 7px; } .clown { color: #FF69Bf; font-size: 7px; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-size: 6px; }"
window "infowindow"
elem "infowindow"
@@ -125,7 +114,6 @@ window "infowindow"
size = 640x480
anchor1 = none
anchor2 = none
- background-color = #242424
saved-params = "pos;size;is-minimized;is-maximized"
is-pane = true
elem "info"
@@ -134,7 +122,6 @@ window "infowindow"
size = 640x445
anchor1 = 0,0
anchor2 = 100,100
- background-color = #272727
saved-params = "splitter"
left = "statwindow"
right = "outputwindow"
@@ -145,8 +132,6 @@ window "infowindow"
size = 104x20
anchor1 = 3,0
anchor2 = 19,0
- text-color = #e0e0e0
- background-color = #40628a
saved-params = "is-checked"
text = "Changelog"
command = "changelog"
@@ -156,8 +141,6 @@ window "infowindow"
size = 100x20
anchor1 = 19,0
anchor2 = 34,0
- text-color = #e0e0e0
- background-color = #40628a
saved-params = "is-checked"
text = "Rules"
command = "rules"
@@ -167,8 +150,6 @@ window "infowindow"
size = 100x20
anchor1 = 34,0
anchor2 = 50,0
- text-color = #e0e0e0
- background-color = #40628a
saved-params = "is-checked"
text = "Wiki"
command = "wiki"
@@ -178,8 +159,6 @@ window "infowindow"
size = 100x20
anchor1 = 50,0
anchor2 = 66,0
- text-color = #e0e0e0
- background-color = #40628a
saved-params = "is-checked"
text = "Forum"
command = "forum"
@@ -189,10 +168,8 @@ window "infowindow"
size = 100x20
anchor1 = 66,0
anchor2 = 81,0
- text-color = #e0e0e0
- background-color = #40628a
saved-params = "is-checked"
- text = "GitHub"
+ text = "Github"
command = "github"
elem "report-issue"
type = BUTTON
@@ -200,9 +177,6 @@ window "infowindow"
size = 100x20
anchor1 = 81,0
anchor2 = 97,0
- font-size = 8
- text-color = #e0e0e0
- background-color = #a92c2c
saved-params = "is-checked"
text = "Report Issue"
command = "report-issue"
@@ -214,13 +188,7 @@ window "outputwindow"
size = 640x480
anchor1 = none
anchor2 = none
- background-color = #272727
saved-params = "pos;size;is-minimized;is-maximized"
- titlebar = false
- statusbar = false
- can-close = false
- can-minimize = false
- can-resize = false
is-pane = true
elem "input"
type = INPUT
@@ -232,17 +200,15 @@ window "outputwindow"
is-default = true
border = sunken
saved-params = "command"
- elem "say"
+ elem "saybutton"
type = BUTTON
pos = 600,460
size = 37x20
anchor1 = 100,100
anchor2 = none
- text-color = #e0e0e0
- background-color = #272727
saved-params = "is-checked"
text = "Chat"
- command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\""
+ command = ".winset \"saybutton.is-checked=true ? input.command=\"!say \\\"\" : input.command=\""
is-flat = true
button-type = pushbox
elem "browseroutput"
@@ -251,7 +217,7 @@ window "outputwindow"
size = 640x456
anchor1 = 0,0
anchor2 = 100,100
- background-color = #272727
+ background-color = #ffffff
is-visible = false
is-disabled = true
saved-params = ""
@@ -262,40 +228,26 @@ window "outputwindow"
size = 640x456
anchor1 = 0,0
anchor2 = 100,100
- text-color = #e0e0e0
- background-color = #272727
is-default = true
saved-params = ""
-window "statwindow"
- elem "statwindow"
+window "popupwindow"
+ elem "popupwindow"
type = MAIN
pos = 281,0
- size = 640x480
+ size = 120x120
anchor1 = none
anchor2 = none
- background-color = #242424
+ background-color = none
+ is-visible = false
saved-params = "pos;size;is-minimized;is-maximized"
- is-pane = true
- elem "stat"
- type = INFO
- pos = 0,0
- size = 640x480
- anchor1 = 0,0
- anchor2 = 100,100
- text-color = #e0e0e0
- background-color = #272727
- is-default = true
- saved-params = ""
- tab-text-color = #e0e0e0
- tab-background-color = #242424
- prefix-color = #e0e0e0
- suffix-color = #e0e0e0
+ statusbar = false
+ can-resize = false
window "preferences_window"
elem "preferences_window"
type = MAIN
- pos = 372,0
+ pos = 281,0
size = 1280x1000
anchor1 = none
anchor2 = none
@@ -318,3 +270,21 @@ window "preferences_window"
right-click = true
saved-params = "zoom;letterbox;zoom-mode"
+window "statwindow"
+ elem "statwindow"
+ type = MAIN
+ pos = 281,0
+ size = 640x480
+ anchor1 = none
+ anchor2 = none
+ saved-params = "pos;size;is-minimized;is-maximized"
+ is-pane = true
+ elem "stat"
+ type = INFO
+ pos = 0,0
+ size = 640x480
+ anchor1 = 0,0
+ anchor2 = 100,100
+ is-default = true
+ saved-params = ""
+
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index 9c35ddb75f..f375fea88f 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -2,7 +2,7 @@
/// !!!!!!!!!!HEY LISTEN!!!!!!!!!!!!!!!!!!!!!!!!
/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-// If you modify this file you ALSO need to modify code/modules/goonchat/browserAssets/browserOutput.css
+// If you modify this file you ALSO need to modify code/modules/goonchat/browserAssets/browserOutput.css and browserOutput_white.css
// BUT you have to use PX font sizes with are on a x8 scale of these font sizes
// Sample font-size: DM: 8 CSS: 64px
@@ -26,18 +26,24 @@ em {font-style: normal; font-weight: bold;}
.prefix { font-weight: bold;}
.ooc { font-weight: bold;}
+.looc {color: #6699CC; font-weight: bold;}
+.antagooc {color: #b8002e; font-weight: bold;}
.adminobserverooc {color: #0099cc; font-weight: bold;}
.adminooc {color: #700038; font-weight: bold;}
.adminobserver {color: #996600; font-weight: bold;}
+.adminsay {color: #FF4500; font-weight: bold;}
.admin {color: #386aff; font-weight: bold;}
+.mentorsay {color: #E236D8; font-weight: bold;}
+.mentorsay_admin {color: #8A2BE2; font-weight: bold;}
+
.name { font-weight: bold;}
.say {}
.deadsay {color: #5c00e6;}
-.binarysay {color: #20c20e; background-color: #000000; display: block;}
-.binarysay a {color: #00ff00;}
+.binarysay {color: #20c20e; background-color: #000000; display: block;}
+.binarysay a {color: #00ff00;}
.binarysay a:active, .binarysay a:visited {color: #88ff88;}
.radio {color: #008000;}
.sciradio {color: #993399;}
@@ -50,8 +56,8 @@ em {font-style: normal; font-weight: bold;}
.syndradio {color: #6d3f40;}
.centcomradio {color: #686868;}
.aiprivradio {color: #ff00ff;}
-.redteamradio {color: #ff0000;}
-.blueteamradio {color: #0000ff;}
+.redteamradio {color: #ff0000;}
+.blueteamradio {color: #0000ff;}
.yell { font-weight: bold;}
@@ -65,13 +71,13 @@ h1.alert, h2.alert {color: #000000;}
.disarm {color: #990000;}
.passive {color: #660000;}
-.userdanger {color: #ff0000; font-weight: bold; font-size: 3;}
+.userdanger {color: #ff0000; font-weight: bold; font-size: 3;}
.danger {color: #ff0000; font-weight: bold;}
.tinydanger {color: #ff0000; font-size: 85%;}
.smalldanger {color: #ff0000; font-size: 90%;}
.warning {color: #ff0000; font-style: italic;}
.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
-.announce {color: #228b22; font-weight: bold;}
+.announce {color: #228b22; font-weight: bold;}
.boldannounce {color: #ff0000; font-weight: bold;}
.greenannounce {color: #00ff00; font-weight: bold;}
.rose {color: #ff5050;}
@@ -81,29 +87,31 @@ h1.alert, h2.alert {color: #000000;}
.smallnotice {color: #000099; font-size: 90%;}
.smallnoticeital {color: #000099; font-style: italic; font-size: 90%;}
.boldnotice {color: #000099; font-weight: bold;}
+.hear {color: #000099; font-style: italic;}
.adminnotice {color: #0000ff;}
-.adminhelp {color: #ff0000; font-weight: bold;}
+.adminhelp {color: #ff0000; font-weight: bold;}
.unconscious {color: #0000ff; font-weight: bold;}
.suicide {color: #ff5050; font-style: italic;}
.green {color: #03ff39;}
-.nicegreen {color: #14a833;}
+.nicegreen {color: #14a833;}
.shadowling {color: #3b2769;}
.cult {color: #960000;}
-.cultlarge {color: #960000; font-weight: bold; font-size: 3;}
-.narsie {color: #960000; font-weight: bold; font-size: 15;}
-.narsiesmall {color: #960000; font-weight: bold; font-size: 6;}
-.colossus {color: #7F282A; font-size: 5;}
-.hierophant {color: #660099; font-weight: bold; font-style: italic;}
-.hierophant_warning {color: #660099; font-style: italic;}
+.cultlarge {color: #960000; font-weight: bold; font-size: 3;}
+.narsie {color: #960000; font-weight: bold; font-size: 15;}
+.narsiesmall {color: #960000; font-weight: bold; font-size: 6;}
+.colossus {color: #7F282A; font-size: 5;}
+.hierophant {color: #660099; font-weight: bold; font-style: italic;}
+.hierophant_warning {color: #660099; font-style: italic;}
.purple {color: #5e2d79;}
.holoparasite {color: #35333a;}
+.bounty {color: #ab6613; font-style: italic;}
.revennotice {color: #1d2953;}
.revenboldnotice {color: #1d2953; font-weight: bold;}
-.revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;}
+.revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;}
.revenminor {color: #823abb}
.revenwarning {color: #760fbb; font-style: italic;}
-.revendanger {color: #760fbb; font-weight: bold; font-size: 3;}
+.revendanger {color: #760fbb; font-weight: bold; font-size: 3;}
.umbra {color: #5000A0;}
.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;}
.umbra_large {color: #5000A0; font-size: 3; font-weight: bold; font-style: italic;}
@@ -133,8 +141,7 @@ h1.alert, h2.alert {color: #000000;}
.neovgre {color: #6E001A; font-weight: bold; font-style: italic;}
.neovgre_small {color: #6E001A;}
-.newscaster {color: #800000;}
-.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
+.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
.alien {color: #543354;}
.noticealien {color: #00c000;}
@@ -149,7 +156,7 @@ h1.alert, h2.alert {color: #000000;}
.papyrus {font-family: "Papyrus", cursive, sans-serif;}
.robot {font-family: "Courier New", cursive, sans-serif;}
-.command_headset {font-weight: bold; font-size: 3;}
+.command_headset {font-weight: bold; font-size: 3;}
.small {font-size: 1;}
.big {font-size: 3;}
.reallybig {font-size: 4;}
@@ -157,9 +164,9 @@ h1.alert, h2.alert {color: #000000;}
.greentext {color: #00FF00; font-size: 3;}
.redtext {color: #FF0000; font-size: 3;}
.yellowtext {color: #FFCC00; font-size: 3;}
-.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
-.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
-.spooky {color: #FF9100;}
+.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
+.singing {font-family: "Trebuchet MS", cursive, sans-serif; font-style: italic;}
+.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
.velvet {color: #660015; font-weight: bold; animation: velvet 5000ms infinite;}
@keyframes velvet {
0% { color: #400020; }
@@ -169,28 +176,29 @@ h1.alert, h2.alert {color: #000000;}
100% { color: #400020; }
}
-.hypnophrase {color: #3bb5d3; font-weight: bold; animation: hypnocolor 1500ms infinite;}
-@keyframes hypnocolor {
- 0% { color: #0d0d0d; }
- 25% { color: #410194; }
- 50% { color: #7f17d8; }
- 75% { color: #410194; }
- 100% { color: #3bb5d3; }
+.hypnophrase {color: #3bb5d3; font-weight: bold; animation: hypnocolor 1500ms infinite; animation-direction: alternate;}
+ @keyframes hypnocolor {
+ 0% {color: #0d0d0d;}
+ 25% {color: #410194;}
+ 50% {color: #7f17d8;}
+ 75% {color: #410194;}
+ 100% {color: #3bb5d3;}
}
-.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
+
+.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
@keyframes phobia {
- 0% { color: #0d0d0d; }
- 50% { color: #dd0000; }
- 100% { color: #0d0d0d; }
+ 0% {color: #0d0d0d;}
+ 50% {color: #dd0000;}
+ 100% {color: #0d0d0d;}
}
-.icon {height: 1em; width: auto;}
+.icon {height: 1em; width: auto;}
.memo {color: #638500; text-align: center;}
.memoedit {text-align: center; font-size: 2;}
-.abductor {color: #800080; font-style: italic;}
-.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;}
+.abductor {color: #800080; font-style: italic;}
+.mind_control {color: #A00D6F; font-size: 3; font-weight: bold; font-style: italic;}
.slime {color: #00CED1;}
.drone {color: #848482;}
.monkey {color: #975032;}
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 06783df03d..478fb41a23 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -40,12 +40,6 @@
path = /obj/item/bikehorn/airhorn
ckeywhitelist = list("kevinz000")
-/datum/gear/donator/cebusoap
- name = "Cebutris' soap"
- slot = SLOT_IN_BACKPACK
- path = /obj/item/custom/ceb_soap
- ckeywhitelist = list("cebutris")
-
/datum/gear/donator/kiaracloak
name = "Kiara's cloak"
slot = SLOT_NECK
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index bd377d6081..374312a26a 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -1,26 +1,8 @@
-
//For custom items.
// Unless there's a digitigrade version make sure you add mutantrace_variation = NONE to all clothing/under and shoes - Pooj
// Digitigrade stuff is uniform_digi.dmi and digishoes.dmi in icons/mob
-/obj/item/custom/ceb_soap
- name = "Cebutris' Soap"
- desc = "A generic bar of soap that doesn't really seem to work right."
- gender = PLURAL
- icon = 'icons/obj/custom.dmi'
- icon_state = "cebu"
- w_class = WEIGHT_CLASS_TINY
- item_flags = NOBLUDGEON
-
-/obj/item/soap/cebu //real versions, for admin shenanigans. Adminspawn only
- desc = "A bright blue bar of soap that smells of wolves"
- icon = 'icons/obj/custom.dmi'
- icon_state = "cebu"
-
-/obj/item/soap/cebu/fast //speedyquick cleaning version. Still not as fast as Syndiesoap. Adminspawn only.
- cleanspeed = 15
-
/obj/item/clothing/neck/cloak/inferno
name = "Kiara's Cloak"
desc = "The design on this seems a little too familiar."
@@ -316,7 +298,7 @@
/obj/item/clothing/neck/petcollar/naomi
name = "worn pet collar"
- desc = "a pet collar that looks well used."
+ desc = "A pet collar that looks well used."
/obj/item/clothing/neck/cloak/green
name = "Generic Green Cloak"
diff --git a/modular_citadel/code/modules/mentor/mentorsay.dm b/modular_citadel/code/modules/mentor/mentorsay.dm
index c13e3c6ef3..dc1281abe0 100644
--- a/modular_citadel/code/modules/mentor/mentorsay.dm
+++ b/modular_citadel/code/modules/mentor/mentorsay.dm
@@ -13,7 +13,7 @@
log_mentor("MSAY: [key_name(src)] : [msg]")
if(check_rights_for(src, R_ADMIN,0))
- msg = "MENTOR: [key_name(src, 0, 0)]: "
+ msg = "MENTOR: [key_name(src, 0, 0)]: "
else
- msg = "MENTOR: [key_name(src, 0, 0)]: "
- to_chat(GLOB.admins | GLOB.mentors, msg)
\ No newline at end of file
+ msg = "MENTOR: [key_name(src, 0, 0)]: "
+ to_chat(GLOB.admins | GLOB.mentors, msg, confidential = TRUE)
diff --git a/modular_citadel/code/modules/mob/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm
index e58c6bda30..3b442af1c7 100644
--- a/modular_citadel/code/modules/mob/cit_emotes.dm
+++ b/modular_citadel/code/modules/mob/cit_emotes.dm
@@ -3,10 +3,6 @@
/mob
var/nextsoundemote = 1
-//Disables the custom emote blacklist from TG that normally applies to slimes.
-/datum/emote/living/custom
- mob_type_blacklist_typecache = list(/mob/living/brain)
-
/datum/emote/living/insult
key = "insult"
key_third_person = "insults"
@@ -74,7 +70,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = TRUE
restraint_check = TRUE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/snap/run_emote(mob/living/user, params)
if(!(. = ..()))
@@ -91,7 +86,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = TRUE
restraint_check = TRUE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/snap2/run_emote(mob/living/user, params)
if(!(. = ..()))
@@ -108,7 +102,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = TRUE
restraint_check = TRUE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/snap3/run_emote(mob/living/user, params)
if(!(. = ..()))
@@ -125,7 +118,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = FALSE
restraint_check = FALSE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/awoo/run_emote(mob/living/user, params)
if(!(. = ..()))
@@ -142,7 +134,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = FALSE
restraint_check = FALSE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/nya/run_emote(mob/living/user, params)
if(!(. = ..()))
@@ -159,7 +150,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = FALSE
restraint_check = FALSE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/weh/run_emote(mob/living/user, params)
if(!(. = ..()))
@@ -176,7 +166,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = FALSE
restraint_check = FALSE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/peep/run_emote(mob/living/user, params)
if(!(. = ..()))
@@ -200,7 +189,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = FALSE
restraint_check = FALSE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/mothsqueak/run_emote(mob/living/user, params)
if(!(. = ..()))
@@ -217,7 +205,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = FALSE
restraint_check = FALSE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/merp/run_emote(mob/living/user, params)
if(!(. = ..()))
@@ -234,7 +221,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = FALSE
restraint_check = FALSE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/bark/run_emote(mob/living/user, params)
if(!(. = ..()))
@@ -252,7 +238,6 @@
emote_type = EMOTE_AUDIBLE
muzzle_ignore = FALSE
restraint_check = FALSE
- mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai)
/datum/emote/living/squish/run_emote(mob/living/user, params)
if(!(. = ..()))
diff --git a/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi b/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi
deleted file mode 100644
index c8d5ceb0a6..0000000000
Binary files a/modular_citadel/icons/mob/citadel_refs/furry_parts_greyscale.dmi and /dev/null differ
diff --git a/modular_citadel/icons/mob/mutant_bodyparts.dmi b/modular_citadel/icons/mob/mutant_bodyparts.dmi
deleted file mode 100644
index 6098dd3567..0000000000
Binary files a/modular_citadel/icons/mob/mutant_bodyparts.dmi and /dev/null differ
diff --git a/sound/effects/creak1.ogg b/sound/effects/creak1.ogg
new file mode 100644
index 0000000000..0cad4802ff
Binary files /dev/null and b/sound/effects/creak1.ogg differ
diff --git a/sound/effects/creak2.ogg b/sound/effects/creak2.ogg
new file mode 100644
index 0000000000..707bf39e33
Binary files /dev/null and b/sound/effects/creak2.ogg differ
diff --git a/sound/effects/creak3.ogg b/sound/effects/creak3.ogg
new file mode 100644
index 0000000000..88ff37a339
Binary files /dev/null and b/sound/effects/creak3.ogg differ
diff --git a/sound/effects/explosioncreak1.ogg b/sound/effects/explosioncreak1.ogg
new file mode 100644
index 0000000000..474f5febb5
Binary files /dev/null and b/sound/effects/explosioncreak1.ogg differ
diff --git a/sound/effects/explosioncreak2.ogg b/sound/effects/explosioncreak2.ogg
new file mode 100644
index 0000000000..75d323eb06
Binary files /dev/null and b/sound/effects/explosioncreak2.ogg differ
diff --git a/sound/machines/card_slide.ogg b/sound/machines/card_slide.ogg
new file mode 100644
index 0000000000..f97ed15fbf
Binary files /dev/null and b/sound/machines/card_slide.ogg differ
diff --git a/sound/machines/twobeep_high.ogg b/sound/machines/twobeep_high.ogg
new file mode 100644
index 0000000000..b97b39a4f0
Binary files /dev/null and b/sound/machines/twobeep_high.ogg differ
diff --git a/strings/traumas.json b/strings/traumas.json
index 58170bd55a..f8fed95c98 100644
--- a/strings/traumas.json
+++ b/strings/traumas.json
@@ -131,7 +131,8 @@
"@pick(semicolon)*weh",
"@pick(semicolon)My balls finally feel full, again.",
"@pick(semicolon)Assaltign a sec osficer aren't crime if ur @pick(roles)",
- ";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP"
+ ";SEC I SPILED MU JICE HELELPH HELPJ JLEP HELP",
+ "@pick(semicolon) atmos is chemistyr is radation fast air is FASTER cheemsitry and FASTER RADIATION AND FASTER DEATH!!!"
],
"mutations": [
@@ -199,7 +200,7 @@
"abdoocters",
"revinent"
],
-
+
"bug": [
"",
"IS TIS A BUG??",
@@ -207,7 +208,7 @@
"BUG!!!",
"HUE, FEATURE!!"
],
-
+
"semicolon": [
"",
";",
@@ -271,7 +272,7 @@
"arrdee",
"sek"
],
-
+
"cargo": [
"GUNS",
"HATS",
@@ -279,7 +280,7 @@
"MEMES",
"GLOWY CYSTAL"
],
-
+
"s_roles": [
"ert",
"shadowlig",
diff --git a/tgstation.dme b/tgstation.dme
index 79c4274722..e742498527 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -96,6 +96,7 @@
#include "code\__DEFINES\reagents_specific_heat.dm"
#include "code\__DEFINES\research.dm"
#include "code\__DEFINES\robots.dm"
+#include "code\__DEFINES\rockpaperscissors.dm"
#include "code\__DEFINES\role_preferences.dm"
#include "code\__DEFINES\rust_g.dm"
#include "code\__DEFINES\say.dm"
@@ -284,6 +285,7 @@
#include "code\controllers\configuration\entries\general.dm"
#include "code\controllers\configuration\entries\plushies.dm"
#include "code\controllers\configuration\entries\policy.dm"
+#include "code\controllers\configuration\entries\resources.dm"
#include "code\controllers\subsystem\acid.dm"
#include "code\controllers\subsystem\adjacent_air.dm"
#include "code\controllers\subsystem\air.dm"
@@ -327,7 +329,6 @@
#include "code\controllers\subsystem\parallax.dm"
#include "code\controllers\subsystem\pathfinder.dm"
#include "code\controllers\subsystem\persistence.dm"
-#include "code\controllers\subsystem\ping.dm"
#include "code\controllers\subsystem\profiler.dm"
#include "code\controllers\subsystem\radiation.dm"
#include "code\controllers\subsystem\radio.dm"
@@ -363,6 +364,7 @@
#include "code\controllers\subsystem\processing\status_effects.dm"
#include "code\controllers\subsystem\processing\weather.dm"
#include "code\controllers\subsystem\processing\wet_floors.dm"
+#include "code\datums\accents.dm"
#include "code\datums\action.dm"
#include "code\datums\ai_laws.dm"
#include "code\datums\armor.dm"
@@ -435,6 +437,7 @@
#include "code\datums\components\footstep.dm"
#include "code\datums\components\fried.dm"
#include "code\datums\components\gps.dm"
+#include "code\datums\components\honkspam.dm"
#include "code\datums\components\identification.dm"
#include "code\datums\components\igniter.dm"
#include "code\datums\components\infective.dm"
@@ -442,6 +445,7 @@
#include "code\datums\components\killerqueen.dm"
#include "code\datums\components\knockback.dm"
#include "code\datums\components\knockoff.dm"
+#include "code\datums\components\label.dm"
#include "code\datums\components\lifesteal.dm"
#include "code\datums\components\lockon_aiming.dm"
#include "code\datums\components\magnetic_catch.dm"
@@ -1095,6 +1099,7 @@
#include "code\game\objects\items\devices\paicard.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"
#include "code\game\objects\items\devices\polycircuit.dm"
+#include "code\game\objects\items\devices\portable_chem_mixer.dm"
#include "code\game\objects\items\devices\powersink.dm"
#include "code\game\objects\items\devices\pressureplates.dm"
#include "code\game\objects\items\devices\quantum_keycard.dm"
@@ -1706,11 +1711,12 @@
#include "code\modules\assembly\signaler.dm"
#include "code\modules\assembly\timer.dm"
#include "code\modules\assembly\voice.dm"
-#include "code\modules\asset_cache\asset_cache.dm"
#include "code\modules\asset_cache\asset_cache_client.dm"
#include "code\modules\asset_cache\asset_cache_item.dm"
#include "code\modules\asset_cache\asset_list.dm"
#include "code\modules\asset_cache\asset_list_items.dm"
+#include "code\modules\asset_cache\transports\asset_transport.dm"
+#include "code\modules\asset_cache\transports\webroot_transport.dm"
#include "code\modules\atmospherics\multiz.dm"
#include "code\modules\atmospherics\environmental\LINDA_fire.dm"
#include "code\modules\atmospherics\environmental\LINDA_system.dm"
@@ -1857,7 +1863,6 @@
#include "code\modules\client\client_colour.dm"
#include "code\modules\client\client_defines.dm"
#include "code\modules\client\client_procs.dm"
-#include "code\modules\client\darkmode.dm"
#include "code\modules\client\message.dm"
#include "code\modules\client\player_details.dm"
#include "code\modules\client\preferences.dm"
@@ -2105,7 +2110,6 @@
#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm"
#include "code\modules\games\cas.dm"
#include "code\modules\games\unum.dm"
-#include "code\modules\goonchat\browserOutput.dm"
#include "code\modules\holiday\easter.dm"
#include "code\modules\holiday\holidays.dm"
#include "code\modules\holiday\halloween\bartholomew.dm"
@@ -2776,6 +2780,7 @@
#include "code\modules\modular_computers\file_system\programs\alarm.dm"
#include "code\modules\modular_computers\file_system\programs\arcade.dm"
#include "code\modules\modular_computers\file_system\programs\atmosscan.dm"
+#include "code\modules\modular_computers\file_system\programs\borg_monitor.dm"
#include "code\modules\modular_computers\file_system\programs\card.dm"
#include "code\modules\modular_computers\file_system\programs\cargobounty.dm"
#include "code\modules\modular_computers\file_system\programs\configurator.dm"
@@ -2802,6 +2807,7 @@
#include "code\modules\modular_computers\hardware\portable_disk.dm"
#include "code\modules\modular_computers\hardware\printer.dm"
#include "code\modules\modular_computers\hardware\recharger.dm"
+#include "code\modules\modular_computers\hardware\sensor_package.dm"
#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"
#include "code\modules\movespeed\_movespeed_modifier.dm"
#include "code\modules\movespeed\modifiers\components.dm"
@@ -2846,6 +2852,7 @@
#include "code\modules\NTNet\network.dm"
#include "code\modules\NTNet\relays.dm"
#include "code\modules\NTNet\services\_service.dm"
+#include "code\modules\paperwork\carbonpaper.dm"
#include "code\modules\paperwork\clipboard.dm"
#include "code\modules\paperwork\contract.dm"
#include "code\modules\paperwork\filingcabinet.dm"
@@ -2859,6 +2866,7 @@
#include "code\modules\paperwork\pen.dm"
#include "code\modules\paperwork\photocopier.dm"
#include "code\modules\paperwork\stamps.dm"
+#include "code\modules\paperwork\ticketmachine.dm"
#include "code\modules\photography\_pictures.dm"
#include "code\modules\photography\camera\camera.dm"
#include "code\modules\photography\camera\camera_image_capturing.dm"
@@ -3424,6 +3432,7 @@
#include "code\modules\tgui\states\always.dm"
#include "code\modules\tgui\states\conscious.dm"
#include "code\modules\tgui\states\contained.dm"
+#include "code\modules\tgui\states\debug.dm"
#include "code\modules\tgui\states\deep_inventory.dm"
#include "code\modules\tgui\states\default.dm"
#include "code\modules\tgui\states\hands.dm"
@@ -3436,6 +3445,11 @@
#include "code\modules\tgui\states\physical.dm"
#include "code\modules\tgui\states\self.dm"
#include "code\modules\tgui\states\zlevel.dm"
+#include "code\modules\tgui_panel\audio.dm"
+#include "code\modules\tgui_panel\external.dm"
+#include "code\modules\tgui_panel\telemetry.dm"
+#include "code\modules\tgui_panel\tgui_panel.dm"
+#include "code\modules\tgui_panel\to_chat.dm"
#include "code\modules\tooltip\tooltip.dm"
#include "code\modules\unit_tests\_unit_tests.dm"
#include "code\modules\uplink\uplink_devices.dm"
diff --git a/tgui/.eslintrc.yml b/tgui/.eslintrc.yml
index 9fd4db9fd2..e3c3144e5b 100644
--- a/tgui/.eslintrc.yml
+++ b/tgui/.eslintrc.yml
@@ -114,7 +114,7 @@ rules:
## Require return statements to either always or never specify values
# consistent-return: error
## Enforce consistent brace style for all control statements
- curly: [error, all]
+ curly: [error, multi-line]
## Require default cases in switch statements
# default-case: error
## Enforce default parameters to be last
@@ -374,6 +374,7 @@ rules:
ignorePattern: '^(import\s.+\sfrom\s|.*require\()',
ignoreUrls: true,
ignoreRegExpLiterals: true,
+ ignoreStrings: true,
}]
## Enforce a maximum number of lines per file
# max-lines: error
diff --git a/tgui/.gitattributes b/tgui/.gitattributes
index 9382416e69..d9cdc20fbd 100644
--- a/tgui/.gitattributes
+++ b/tgui/.gitattributes
@@ -17,3 +17,4 @@ bin/tgui text eol=lf
## Treat bundles as binary and ignore them during conflicts
*.bundle.* binary merge=tgui-merge-bundle
+*.chunk.* binary merge=tgui-merge-bundle
diff --git a/tgui/bin/tgui b/tgui/bin/tgui
index 97a86159e6..5627b40413 100755
--- a/tgui/bin/tgui
+++ b/tgui/bin/tgui
@@ -67,7 +67,7 @@ task-clean() {
task-validate-build() {
cd "${base_dir}"
local diff
- diff="$(git diff packages/tgui/public/tgui.bundle.*)"
+ diff="$(git diff packages/tgui/public/*)"
if [[ -n ${diff} ]]; then
echo "Error: our build differs from the build committed into git."
echo "Please rebuild tgui."
diff --git a/tgui/docs/component-reference.md b/tgui/docs/component-reference.md
index ff1b4e7dfd..23909c639f 100644
--- a/tgui/docs/component-reference.md
+++ b/tgui/docs/component-reference.md
@@ -227,7 +227,7 @@ be truncated with an ellipsis. Be careful however, because this prop breaks
the baseline alignment.
- `title: string` - A native browser tooltip, which appears when hovering
over the button.
-- `content/children: any` - Content to render inside the button.
+- `children: any` - Content to render inside the button.
- `onClick: function` - Called when element is clicked.
### `Button.Checkbox`
@@ -389,7 +389,9 @@ to the left, and certain elements to the right:
02 September 2020+Putnam3145 updated:+
Tupinambis updated:+
raspy-on-osu updated:+
timothyteakettle updated:+
01 September 2020+BlueWildrose updated:+
31 August 2020+Arturlang updated:+
Chiirno updated:+
Couls, ported by NecromancerAnne updated:+
DeltaFire15 updated:+
Detective-Google updated:+
EmeraldSundisk updated:+
ForrestWick updated:+
Ghommie updated:+
LetterN updated:+
Lynxless updated:+
Putnam3145 updated:+
Sonic121x updated:+
kappa-sama updated:+
lolman360 updated:+
raspy-on-osu updated:+
silicons updated:+
timothyteakettle updated:+
zeroisthebiggay updated:+
30 August 2020+raspy-on-osu updated:+
28 August 2020+EmeraldSundisk updated:+
Hatterhat updated:+
lolman360 updated:+
shellspeed1 updated:+
timothyteakettle updated:+
27 August 2020+silicons updated:+
timothyteakettle updated:+
26 August 2020+ancientpower updated:+
silicons updated:+
25 August 2020+Hatterhat updated:+
Literallynotpickles updated:+
Putnam3145 updated:+
raspy-on-osu updated:+
timothyteakettle updated:+
24 August 2020MrJWhit updated:
30 June 2020-Fikou updated:-
Ghommie updated:-
Ghommie (inspired by MrDoomBringer's work on tgstation) updated:-
Ghommie (porting PRs by XTDM, coiax, MrDoomBringer) updated:-
nightred updated:-
silicons updated:-
timothyteakettle updated:-
29 June 2020-b1tt3r1n0 updated:-
timothyteakettle updated:-
28 June 2020-Detective-Google updated:-
Ghommie updated:-
Ghommie porting PRs by Qustinnus/Floyd, Willow, cacogen, nemvar, Ghilker and EOBGames (Inept) updated:-
MrJWhit updated:-
Putnam3145 updated:-
b1tt3r1n0 updated:-
timothyteakettle updated:-
27 June 2020-Detective-Google updated:-
timothyteakettle updated:-
26 June 2020-Ghommie updated:-
silicons updated:-
25 June 2020-Anonymous updated:-
Detective Google updated:-
Detective-Google updated:-
Funce updated:-
Linzolle updated:-
dapnee updated:-
24 June 2020-DeltaFire15 updated:-
Detective-Google updated:-
timothyteakettle updated:-
+ {children}
+
+ );
+};
+
+const NotificationsItem = props => {
+ const {
+ rightSlot,
+ children,
+ } = props;
+ return (
+ \n'
+ + messagesHtml
+ + ' \n'
+ + '\n'
+ + '\n';
+ // Create and send a nice blob
+ const blob = new Blob([pageHtml]);
+ const timestamp = new Date()
+ .toISOString()
+ .substring(0, 19)
+ .replace(/[-:]/g, '')
+ .replace('T', '-');
+ window.navigator.msSaveBlob(blob, `ss13-chatlog-${timestamp}.html`);
+ }
+}
+
+// Make chat renderer global so that we can continue using the same
+// instance after hot code replacement.
+if (!window.__chatRenderer__) {
+ window.__chatRenderer__ = new ChatRenderer();
+}
+
+/** @type {ChatRenderer} */
+export const chatRenderer = window.__chatRenderer__;
diff --git a/tgui/packages/tgui-panel/chat/replaceInTextNode.js b/tgui/packages/tgui-panel/chat/replaceInTextNode.js
new file mode 100644
index 0000000000..0db2b2193e
--- /dev/null
+++ b/tgui/packages/tgui-panel/chat/replaceInTextNode.js
@@ -0,0 +1,128 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+/**
+ * Replaces text matching a regular expression with a custom node.
+ */
+export const replaceInTextNode = (regex, createNode) => node => {
+ const text = node.textContent;
+ const textLength = text.length;
+ let match;
+ let lastIndex = 0;
+ let fragment;
+ let n = 0;
+ // eslint-disable-next-line no-cond-assign
+ while (match = regex.exec(text)) {
+ n += 1;
+ // Lazy init fragment
+ if (!fragment) {
+ fragment = document.createDocumentFragment();
+ }
+ const matchText = match[0];
+ const matchLength = matchText.length;
+ const matchIndex = match.index;
+ // Insert previous unmatched chunk
+ if (lastIndex < matchIndex) {
+ fragment.appendChild(document.createTextNode(
+ text.substring(lastIndex, matchIndex)));
+ }
+ lastIndex = matchIndex + matchLength;
+ // Create a wrapper node
+ fragment.appendChild(createNode(matchText));
+ }
+ if (fragment) {
+ // Insert the remaining unmatched chunk
+ if (lastIndex < textLength) {
+ fragment.appendChild(document.createTextNode(
+ text.substring(lastIndex, textLength)));
+ }
+ // Commit the fragment
+ node.parentNode.replaceChild(fragment, node);
+ }
+ return n;
+};
+
+
+// Highlight
+// --------------------------------------------------------
+
+/**
+ * Default highlight node.
+ */
+const createHighlightNode = text => {
+ const node = document.createElement('span');
+ node.setAttribute('style',
+ 'background-color:#fd4;color:#000');
+ node.textContent = text;
+ return node;
+};
+
+/**
+ * Highlights the text in the node based on the provided regular expression.
+ *
+ * @param {Node} node Node which you want to process
+ * @param {RegExp} regex Regular expression to highlight
+ * @param {(text: string) => Node} createNode Highlight node creator
+ * @returns {number} Number of matches
+ */
+export const highlightNode = (
+ node,
+ regex,
+ createNode = createHighlightNode,
+) => {
+ if (!createNode) {
+ createNode = createHighlightNode;
+ }
+ let n = 0;
+ const childNodes = node.childNodes;
+ for (let i = 0; i < childNodes.length; i++) {
+ const node = childNodes[i];
+ // Is a text node
+ if (node.nodeType === 3) {
+ n += replaceInTextNode(regex, createNode)(node);
+ }
+ else {
+ n += highlightNode(node, regex, createNode);
+ }
+ }
+ return n;
+};
+
+
+// Linkify
+// --------------------------------------------------------
+
+const URL_REGEX = /(?:(?:https?:\/\/)|(?:www\.))(?:[^ ]*?\.[^ ]*?)+[-A-Za-z0-9+&@#/%?=~_|$!:,.;()]+/ig;
+
+/**
+ * Highlights the text in the node based on the provided regular expression.
+ *
+ * @param {Node} node Node which you want to process
+ * @returns {number} Number of matches
+ */
+export const linkifyNode = node => {
+ let n = 0;
+ const childNodes = node.childNodes;
+ for (let i = 0; i < childNodes.length; i++) {
+ const node = childNodes[i];
+ const tag = String(node.nodeName).toLowerCase();
+ // Is a text node
+ if (node.nodeType === 3) {
+ n += linkifyTextNode(node);
+ }
+ else if (tag !== 'a') {
+ n += linkifyNode(node);
+ }
+ }
+ return n;
+};
+
+const linkifyTextNode = replaceInTextNode(URL_REGEX, text => {
+ const node = document.createElement('a');
+ node.href = text;
+ node.textContent = text;
+ return node;
+});
diff --git a/tgui/packages/tgui-panel/chat/selectors.js b/tgui/packages/tgui-panel/chat/selectors.js
new file mode 100644
index 0000000000..5d630f3e52
--- /dev/null
+++ b/tgui/packages/tgui-panel/chat/selectors.js
@@ -0,0 +1,21 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+import { map } from 'common/collections';
+
+export const selectChat = state => state.chat;
+
+export const selectChatPages = state => (
+ map(id => state.chat.pageById[id])(state.chat.pages)
+);
+
+export const selectCurrentChatPage = state => (
+ state.chat.pageById[state.chat.currentPage]
+);
+
+export const selectChatPageById = id => state => (
+ state.chat.pageById[id]
+);
diff --git a/tgui/packages/tgui-panel/game/actions.js b/tgui/packages/tgui-panel/game/actions.js
new file mode 100644
index 0000000000..e40014c44b
--- /dev/null
+++ b/tgui/packages/tgui-panel/game/actions.js
@@ -0,0 +1,11 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+import { createAction } from 'common/redux';
+
+export const roundRestarted = createAction('roundrestart');
+export const connectionLost = createAction('game/connectionLost');
+export const connectionRestored = createAction('game/connectionRestored');
diff --git a/tgui/packages/tgui-panel/game/constants.js b/tgui/packages/tgui-panel/game/constants.js
new file mode 100644
index 0000000000..9df3a58d29
--- /dev/null
+++ b/tgui/packages/tgui-panel/game/constants.js
@@ -0,0 +1,7 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+export const CONNECTION_LOST_AFTER = 15000;
diff --git a/tgui/packages/tgui-panel/game/hooks.js b/tgui/packages/tgui-panel/game/hooks.js
new file mode 100644
index 0000000000..e9567b916b
--- /dev/null
+++ b/tgui/packages/tgui-panel/game/hooks.js
@@ -0,0 +1,12 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+import { useSelector } from 'common/redux';
+import { selectGame } from './selectors';
+
+export const useGame = context => {
+ return useSelector(context, selectGame);
+};
diff --git a/tgui/packages/tgui-panel/game/index.js b/tgui/packages/tgui-panel/game/index.js
new file mode 100644
index 0000000000..3cca2e6557
--- /dev/null
+++ b/tgui/packages/tgui-panel/game/index.js
@@ -0,0 +1,9 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+export { useGame } from './hooks';
+export { gameMiddleware } from './middleware';
+export { gameReducer } from './reducer';
diff --git a/tgui/packages/tgui-panel/game/middleware.js b/tgui/packages/tgui-panel/game/middleware.js
new file mode 100644
index 0000000000..854369dc54
--- /dev/null
+++ b/tgui/packages/tgui-panel/game/middleware.js
@@ -0,0 +1,48 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+import { pingSuccess } from '../ping/actions';
+import { connectionLost, connectionRestored, roundRestarted } from './actions';
+import { selectGame } from './selectors';
+import { CONNECTION_LOST_AFTER } from './constants';
+
+const withTimestamp = action => ({
+ ...action,
+ meta: {
+ ...action.meta,
+ now: Date.now(),
+ },
+});
+
+export const gameMiddleware = store => {
+ let lastPingedAt;
+ setInterval(() => {
+ const state = store.getState();
+ if (!state) {
+ return;
+ }
+ const game = selectGame(state);
+ const pingsAreFailing = lastPingedAt
+ && Date.now() >= lastPingedAt + CONNECTION_LOST_AFTER;
+ if (!game.connectionLostAt && pingsAreFailing) {
+ store.dispatch(withTimestamp(connectionLost()));
+ }
+ if (game.connectionLostAt && !pingsAreFailing) {
+ store.dispatch(withTimestamp(connectionRestored()));
+ }
+ }, 1000);
+ return next => action => {
+ const { type, payload, meta } = action;
+ if (type === pingSuccess.type) {
+ lastPingedAt = meta.now;
+ return next(action);
+ }
+ if (type === roundRestarted.type) {
+ return next(withTimestamp(action));
+ }
+ return next(action);
+ };
+};
diff --git a/tgui/packages/tgui-panel/game/reducer.js b/tgui/packages/tgui-panel/game/reducer.js
new file mode 100644
index 0000000000..97535524c5
--- /dev/null
+++ b/tgui/packages/tgui-panel/game/reducer.js
@@ -0,0 +1,39 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+import { connectionLost } from './actions';
+import { connectionRestored } from './actions';
+
+const initialState = {
+ // TODO: This is where round info should be.
+ roundId: null,
+ roundTime: null,
+ roundRestartedAt: null,
+ connectionLostAt: null,
+};
+
+export const gameReducer = (state = initialState, action) => {
+ const { type, payload, meta } = action;
+ if (type === 'roundrestart') {
+ return {
+ ...state,
+ roundRestartedAt: meta.now,
+ };
+ }
+ if (type === connectionLost.type) {
+ return {
+ ...state,
+ connectionLostAt: meta.now,
+ };
+ }
+ if (type === connectionRestored.type) {
+ return {
+ ...state,
+ connectionLostAt: null,
+ };
+ }
+ return state;
+};
diff --git a/tgui/packages/tgui-panel/game/selectors.js b/tgui/packages/tgui-panel/game/selectors.js
new file mode 100644
index 0000000000..dc2d7040f9
--- /dev/null
+++ b/tgui/packages/tgui-panel/game/selectors.js
@@ -0,0 +1,7 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+export const selectGame = state => state.game;
diff --git a/tgui/packages/tgui-panel/index.js b/tgui/packages/tgui-panel/index.js
new file mode 100644
index 0000000000..6dbf5fe8f8
--- /dev/null
+++ b/tgui/packages/tgui-panel/index.js
@@ -0,0 +1,136 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+// Polyfills
+import 'core-js/es';
+import 'core-js/web/immediate';
+import 'core-js/web/queue-microtask';
+import 'core-js/web/timers';
+import 'regenerator-runtime/runtime';
+import 'tgui-polyfill/html5shiv';
+import 'tgui-polyfill/ie8';
+import 'tgui-polyfill/dom4';
+import 'tgui-polyfill/css-om';
+import 'tgui-polyfill/inferno';
+
+// Themes
+import './styles/main.scss';
+import './styles/themes/light.scss';
+
+import { perf } from 'common/perf';
+import { combineReducers } from 'common/redux';
+import { setupHotReloading } from 'tgui-dev-server/link/client';
+import { setupGlobalEvents } from 'tgui/events';
+import { captureExternalLinks } from 'tgui/links';
+import { createRenderer } from 'tgui/renderer';
+import { configureStore, StoreProvider } from 'tgui/store';
+import { audioMiddleware, audioReducer } from './audio';
+import { chatMiddleware, chatReducer } from './chat';
+import { gameMiddleware, gameReducer } from './game';
+import { setupPanelFocusHacks } from './panelFocus';
+import { pingMiddleware, pingReducer } from './ping';
+import { settingsMiddleware, settingsReducer } from './settings';
+import { telemetryMiddleware } from './telemetry';
+
+perf.mark('inception', window.performance?.timing?.navigationStart);
+perf.mark('init');
+
+const store = configureStore({
+ reducer: combineReducers({
+ audio: audioReducer,
+ chat: chatReducer,
+ game: gameReducer,
+ ping: pingReducer,
+ settings: settingsReducer,
+ }),
+ middleware: {
+ pre: [
+ chatMiddleware,
+ pingMiddleware,
+ telemetryMiddleware,
+ settingsMiddleware,
+ audioMiddleware,
+ gameMiddleware,
+ ],
+ },
+});
+
+const renderApp = createRenderer(() => {
+ const { Panel } = require('./Panel');
+ return (
+
+
+ );
+};
diff --git a/tgui/packages/tgui-panel/ping/actions.js b/tgui/packages/tgui-panel/ping/actions.js
new file mode 100644
index 0000000000..ba3582f131
--- /dev/null
+++ b/tgui/packages/tgui-panel/ping/actions.js
@@ -0,0 +1,25 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+import { createAction } from 'common/redux';
+
+export const pingSuccess = createAction(
+ 'ping/success',
+ ping => {
+ const now = Date.now();
+ const roundtrip = (now - ping.sentAt) * 0.5;
+ return {
+ payload: {
+ lastId: ping.id,
+ roundtrip,
+ },
+ meta: { now },
+ };
+ }
+);
+
+export const pingFail = createAction('ping/fail');
+export const pingReply = createAction('ping/reply');
diff --git a/tgui/packages/tgui-panel/ping/constants.js b/tgui/packages/tgui-panel/ping/constants.js
new file mode 100644
index 0000000000..5d9a0472c5
--- /dev/null
+++ b/tgui/packages/tgui-panel/ping/constants.js
@@ -0,0 +1,12 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+export const PING_INTERVAL = 2500;
+export const PING_TIMEOUT = 2000;
+export const PING_MAX_FAILS = 3;
+export const PING_QUEUE_SIZE = 8;
+export const PING_ROUNDTRIP_BEST = 50;
+export const PING_ROUNDTRIP_WORST = 200;
diff --git a/tgui/packages/tgui-panel/ping/index.js b/tgui/packages/tgui-panel/ping/index.js
new file mode 100644
index 0000000000..1bbbe3ed34
--- /dev/null
+++ b/tgui/packages/tgui-panel/ping/index.js
@@ -0,0 +1,9 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+export { pingMiddleware } from './middleware';
+export { PingIndicator } from './PingIndicator';
+export { pingReducer } from './reducer';
diff --git a/tgui/packages/tgui-panel/ping/middleware.js b/tgui/packages/tgui-panel/ping/middleware.js
new file mode 100644
index 0000000000..fdd8410957
--- /dev/null
+++ b/tgui/packages/tgui-panel/ping/middleware.js
@@ -0,0 +1,50 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+import { sendMessage } from 'tgui/backend';
+import { pingFail, pingSuccess } from './actions';
+import { PING_INTERVAL, PING_QUEUE_SIZE, PING_TIMEOUT } from './constants';
+
+export const pingMiddleware = store => {
+ let initialized = false;
+ let index = 0;
+ const pings = [];
+ const sendPing = () => {
+ for (let i = 0; i < PING_QUEUE_SIZE; i++) {
+ const ping = pings[i];
+ if (ping && Date.now() - ping.sentAt > PING_TIMEOUT) {
+ pings[i] = null;
+ store.dispatch(pingFail());
+ }
+ }
+ const ping = { index, sentAt: Date.now() };
+ pings[index] = ping;
+ sendMessage({
+ type: 'ping',
+ payload: { index },
+ });
+ index = (index + 1) % PING_QUEUE_SIZE;
+ };
+ return next => action => {
+ const { type, payload } = action;
+ if (!initialized) {
+ initialized = true;
+ setInterval(sendPing, PING_INTERVAL);
+ sendPing();
+ }
+ if (type === 'pingReply') {
+ const { index } = payload;
+ const ping = pings[index];
+ // Received a timed out ping
+ if (!ping) {
+ return;
+ }
+ pings[index] = null;
+ return next(pingSuccess(ping));
+ }
+ return next(action);
+ };
+};
diff --git a/tgui/packages/tgui-panel/ping/reducer.js b/tgui/packages/tgui-panel/ping/reducer.js
new file mode 100644
index 0000000000..22d146f8b8
--- /dev/null
+++ b/tgui/packages/tgui-panel/ping/reducer.js
@@ -0,0 +1,42 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+import { clamp01, scale } from 'common/math';
+import { pingFail, pingSuccess } from './actions';
+import { PING_MAX_FAILS, PING_ROUNDTRIP_BEST, PING_ROUNDTRIP_WORST } from './constants';
+
+export const pingReducer = (state = {}, action) => {
+ const { type, payload } = action;
+ if (type === pingSuccess.type) {
+ const { roundtrip } = payload;
+ const prevRoundtrip = state.roundtripAvg || roundtrip;
+ const roundtripAvg = Math.round(prevRoundtrip * 0.4 + roundtrip * 0.6);
+ const networkQuality = 1 - scale(roundtripAvg,
+ PING_ROUNDTRIP_BEST, PING_ROUNDTRIP_WORST);
+ return {
+ roundtrip,
+ roundtripAvg,
+ failCount: 0,
+ networkQuality,
+ };
+ }
+ if (type === pingFail.type) {
+ const { failCount = 0 } = state;
+ const networkQuality = clamp01(state.networkQuality
+ - failCount / PING_MAX_FAILS);
+ const nextState = {
+ ...state,
+ failCount: failCount + 1,
+ networkQuality,
+ };
+ if (failCount > PING_MAX_FAILS) {
+ nextState.roundtrip = undefined;
+ nextState.roundtripAvg = undefined;
+ }
+ return nextState;
+ }
+ return state;
+};
diff --git a/tgui/packages/tgui-panel/ping/selectors.js b/tgui/packages/tgui-panel/ping/selectors.js
new file mode 100644
index 0000000000..cfbe95c2f3
--- /dev/null
+++ b/tgui/packages/tgui-panel/ping/selectors.js
@@ -0,0 +1,7 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+export const selectPing = state => state.ping;
diff --git a/tgui/packages/tgui-panel/settings/SettingsPanel.js b/tgui/packages/tgui-panel/settings/SettingsPanel.js
new file mode 100644
index 0000000000..7a4c81c2da
--- /dev/null
+++ b/tgui/packages/tgui-panel/settings/SettingsPanel.js
@@ -0,0 +1,142 @@
+/**
+ * @file
+ * @copyright 2020 Aleksej Komarov
+ * @license MIT
+ */
+
+import { toFixed } from 'common/math';
+import { useDispatch, useSelector } from 'common/redux';
+import { Box, Button, ColorBox, Divider, Dropdown, Flex, Input, LabeledList, NumberInput, Section, Tabs, TextArea } from 'tgui/components';
+import { ChatPageSettings } from '../chat';
+import { rebuildChat, saveChatToDisk } from '../chat/actions';
+import { THEMES } from '../themes';
+import { changeSettingsTab, updateSettings } from './actions';
+import { SETTINGS_TABS } from './constants';
+import { selectActiveTab, selectSettings } from './selectors';
+
+export const SettingsPanel = (props, context) => {
+ const activeTab = useSelector(context, selectActiveTab);
+ const dispatch = useDispatch(context);
+ return (
+ {
if (e.keyCode === 13) {
- const value = clamp(e.target.value, minValue, maxValue);
+ const value = clamp(
+ parseFloat(e.target.value),
+ minValue,
+ maxValue);
+ if (Number.isNaN(value)) {
+ this.setState({
+ editing: false,
+ });
+ return;
+ }
this.setState({
editing: false,
value,
diff --git a/tgui/packages/tgui/components/Dropdown.js b/tgui/packages/tgui/components/Dropdown.js
index 67b12c3b38..adbb13de5b 100644
--- a/tgui/packages/tgui/components/Dropdown.js
+++ b/tgui/packages/tgui/components/Dropdown.js
@@ -49,14 +49,14 @@ export class Dropdown extends Component {
buildMenu() {
const { options = [] } = this.props;
const ops = options.map(option => (
-
);
};
@@ -37,20 +37,42 @@ const Tab = props => {
const {
className,
selected,
- altSelection,
+ color,
+ icon,
+ leftSlot,
+ rightSlot,
+ children,
...rest
} = props;
return (
-
+ {...computeBoxProps(rest)}>
+ {canRender(leftSlot) && (
+ {
this.setSelected(option);
}}>
{option}
-
+
));
return ops.length ? ops : 'No Options Found';
}
diff --git a/tgui/packages/tgui/components/Flex.js b/tgui/packages/tgui/components/Flex.js
index 02d2fac314..2477f4c502 100644
--- a/tgui/packages/tgui/components/Flex.js
+++ b/tgui/packages/tgui/components/Flex.js
@@ -50,6 +50,7 @@ Flex.defaultHooks = pureComponentHooks;
export const computeFlexItemProps = props => {
const {
className,
+ style,
grow,
order,
shrink,
@@ -63,10 +64,11 @@ export const computeFlexItemProps = props => {
className: classes([
'Flex__item',
Byond.IS_LTE_IE10 && 'Flex__item--iefix',
+ Byond.IS_LTE_IE10 && grow > 0 && 'Flex__item--iefix--grow',
className,
]),
style: {
- ...rest.style,
+ ...style,
'flex-grow': grow,
'flex-shrink': shrink,
'flex-basis': unit(basis),
diff --git a/tgui/packages/tgui/components/Input.js b/tgui/packages/tgui/components/Input.js
index 623fa92bb4..b0c5f3f0cb 100644
--- a/tgui/packages/tgui/components/Input.js
+++ b/tgui/packages/tgui/components/Input.js
@@ -4,16 +4,16 @@
* @license MIT
*/
-import { classes, isFalsy } from 'common/react';
+import { classes } from 'common/react';
import { Component, createRef } from 'inferno';
import { Box } from './Box';
+import { KEY_ESCAPE, KEY_ENTER } from 'common/keycodes';
-const toInputValue = value => {
- if (isFalsy(value)) {
- return '';
- }
- return value;
-};
+export const toInputValue = value => (
+ typeof value !== 'number' && typeof value !== 'string'
+ ? ''
+ : String(value)
+);
export class Input extends Component {
constructor() {
@@ -50,7 +50,7 @@ export class Input extends Component {
};
this.handleKeyDown = e => {
const { onInput, onChange, onEnter } = this.props;
- if (e.keyCode === 13) {
+ if (e.keyCode === KEY_ENTER) {
this.setEditing(false);
if (onChange) {
onChange(e, e.target.value);
@@ -68,7 +68,7 @@ export class Input extends Component {
}
return;
}
- if (e.keyCode === 27) {
+ if (e.keyCode === KEY_ESCAPE) {
this.setEditing(false);
e.target.value = toInputValue(this.props.value);
e.target.blur();
@@ -83,7 +83,6 @@ export class Input extends Component {
if (input) {
input.value = toInputValue(nextValue);
}
-
if (this.props.autoFocus) {
setTimeout(() => input.focus(), 1);
}
@@ -120,6 +119,7 @@ export class Input extends Component {
const {
className,
fluid,
+ monospace,
...rest
} = boxProps;
return (
@@ -127,6 +127,7 @@ export class Input extends Component {
className={classes([
'Input',
fluid && 'Input--fluid',
+ monospace && 'Input--monospace',
className,
])}
{...rest}>
diff --git a/tgui/packages/tgui/components/Knob.js b/tgui/packages/tgui/components/Knob.js
index 4861e71bf3..c165df46fd 100644
--- a/tgui/packages/tgui/components/Knob.js
+++ b/tgui/packages/tgui/components/Knob.js
@@ -37,7 +37,7 @@ export const Knob = props => {
fillValue,
color,
ranges = {},
- size,
+ size = 1,
bipolar,
children,
...rest
@@ -91,7 +91,7 @@ export const Knob = props => {
])}
{...computeBoxProps({
style: {
- 'font-size': size + 'rem',
+ 'font-size': size + 'em',
...style,
},
...rest,
diff --git a/tgui/packages/tgui/components/NumberInput.js b/tgui/packages/tgui/components/NumberInput.js
index cba6f5025e..306772c8a5 100644
--- a/tgui/packages/tgui/components/NumberInput.js
+++ b/tgui/packages/tgui/components/NumberInput.js
@@ -10,6 +10,8 @@ import { Component, createRef } from 'inferno';
import { AnimatedNumber } from './AnimatedNumber';
import { Box } from './Box';
+const DEFAULT_UPDATE_RATE = 400;
+
export class NumberInput extends Component {
constructor(props) {
super(props);
@@ -64,7 +66,7 @@ export class NumberInput extends Component {
if (dragging && onDrag) {
onDrag(e, value);
}
- }, 500);
+ }, this.props.updateRate || DEFAULT_UPDATE_RATE);
document.addEventListener('mousemove', this.handleDragMove);
document.addEventListener('mouseup', this.handleDragEnd);
};
@@ -215,7 +217,16 @@ export class NumberInput extends Component {
if (!editing) {
return;
}
- const value = clamp(e.target.value, minValue, maxValue);
+ const value = clamp(
+ parseFloat(e.target.value),
+ minValue,
+ maxValue);
+ if (Number.isNaN(value)) {
+ this.setState({
+ editing: false,
+ });
+ return;
+ }
this.setState({
editing: false,
value,
@@ -230,7 +241,16 @@ export class NumberInput extends Component {
}}
onKeyDown={e => {
if (e.keyCode === 13) {
- const value = clamp(e.target.value, minValue, maxValue);
+ const value = clamp(
+ parseFloat(e.target.value),
+ minValue,
+ maxValue);
+ if (Number.isNaN(value)) {
+ this.setState({
+ editing: false,
+ });
+ return;
+ }
this.setState({
editing: false,
value,
diff --git a/tgui/packages/tgui/components/Section.js b/tgui/packages/tgui/components/Section.js
index af59bc4022..a1c78a0f67 100644
--- a/tgui/packages/tgui/components/Section.js
+++ b/tgui/packages/tgui/components/Section.js
@@ -4,48 +4,75 @@
* @license MIT
*/
-import { classes, isFalsy, pureComponentHooks } from 'common/react';
+import { canRender, classes } from 'common/react';
+import { Component, createRef } from 'inferno';
+import { addScrollableNode, removeScrollableNode } from '../events';
import { computeBoxClassName, computeBoxProps } from './Box';
-export const Section = props => {
- const {
- className,
- title,
- level = 1,
- buttons,
- fill,
- children,
- ...rest
- } = props;
- const hasTitle = !isFalsy(title) || !isFalsy(buttons);
- const hasContent = !isFalsy(children);
- return (
-
- {hasTitle && (
-
- );
-};
+export class Section extends Component {
+ constructor(props) {
+ super(props);
+ this.ref = createRef();
+ this.scrollable = props.scrollable;
+ }
-Section.defaultHooks = pureComponentHooks;
+ componentDidMount() {
+ if (this.scrollable) {
+ addScrollableNode(this.ref.current);
+ }
+ }
+
+ componentWillUnmount() {
+ if (this.scrollable) {
+ removeScrollableNode(this.ref.current);
+ }
+ }
+
+ render() {
+ const {
+ className,
+ title,
+ level = 1,
+ buttons,
+ fill,
+ fitted,
+ scrollable,
+ children,
+ ...rest
+ } = this.props;
+ const hasTitle = canRender(title) || canRender(buttons);
+ const hasContent = canRender(children);
+ return (
+
-
- {title}
-
-
- )}
- {hasContent && (
-
- {buttons}
-
-
- {children}
-
- )}
-
+ {hasTitle && (
+
+ );
+ }
+}
diff --git a/tgui/packages/tgui/components/Tabs.js b/tgui/packages/tgui/components/Tabs.js
index be5485d12f..359b00d359 100644
--- a/tgui/packages/tgui/components/Tabs.js
+++ b/tgui/packages/tgui/components/Tabs.js
@@ -4,14 +4,15 @@
* @license MIT
*/
-import { classes } from 'common/react';
+import { canRender, classes } from 'common/react';
import { computeBoxClassName, computeBoxProps } from './Box';
-import { Button } from './Button';
+import { Icon } from './Icon';
export const Tabs = props => {
const {
className,
vertical,
+ fluid,
children,
...rest
} = props;
@@ -22,13 +23,12 @@ export const Tabs = props => {
vertical
? 'Tabs--vertical'
: 'Tabs--horizontal',
+ fluid && 'Tabs--fluid',
className,
computeBoxClassName(rest),
])}
{...computeBoxProps(rest)}>
-
+
+ {title}
+
+
+ )}
+ {fitted && children
+ || hasContent && (
+
+ {buttons}
+
+
+ {children}
+
+ )}
+
- {children}
-
+ {children}
+ {leftSlot}
+
+ ) || !!icon && (
+
+
+ )}
+
+ {children}
+
+ {canRender(rightSlot) && (
+
+ {rightSlot}
+
+ )}
+
);
};
diff --git a/tgui/packages/tgui/components/TextArea.js b/tgui/packages/tgui/components/TextArea.js
index 9495b4f26a..d9d752912d 100644
--- a/tgui/packages/tgui/components/TextArea.js
+++ b/tgui/packages/tgui/components/TextArea.js
@@ -1,23 +1,15 @@
/**
* @file
* @copyright 2020 Aleksej Komarov
- * @author Original Aleksej Komarov
- * @author Changes Warlockd (https://github.com/warlockd)
+ * @author Warlockd
* @license MIT
*/
-
-import { classes, isFalsy } from 'common/react';
+import { classes } from 'common/react';
import { Component, createRef } from 'inferno';
import { Box } from './Box';
-
-
-const toInputValue = value => {
- if (isFalsy(value)) {
- return '';
- }
- return value;
-};
+import { toInputValue } from './Input';
+import { KEY_ESCAPE } from 'common/keycodes';
export class TextArea extends Component {
constructor(props, context) {
@@ -30,15 +22,6 @@ export class TextArea extends Component {
const {
dontUseTabForIndent = false,
} = props;
- // found this hack that expands the text area without
- // having to hard set rows all the time
- // there has GOT to be a better way though
- this.autoresize = () => {
- if (this.fillerRef && this.textareaRef) {
- // this.fillerRef.current.innerHTML =
- // this.textareaRef.current.value.replace(/\n/g, ''); - } - }; this.handleOnInput = e => { const { editing } = this.state; const { onInput } = this.props; @@ -48,7 +31,6 @@ export class TextArea extends Component { if (onInput) { onInput(e, e.target.value); } - this.autoresize(); }; this.handleOnChange = e => { const { editing } = this.state; @@ -59,7 +41,6 @@ export class TextArea extends Component { if (onChange) { onChange(e, e.target.value); } - this.autoresize(); }; this.handleKeyPress = e => { const { editing } = this.state; @@ -70,11 +51,16 @@ export class TextArea extends Component { if (onKeyPress) { onKeyPress(e, e.target.value); } - this.autoresize(); }; this.handleKeyDown = e => { const { editing } = this.state; const { onKeyDown } = this.props; + if (e.keyCode === KEY_ESCAPE) { + this.setEditing(false); + e.target.value = toInputValue(this.props.value); + e.target.blur(); + return; + } if (!editing) { this.setEditing(true); } @@ -82,19 +68,17 @@ export class TextArea extends Component { const keyCode = e.keyCode || e.which; if (keyCode === 9) { e.preventDefault(); - const s = e.target.selectionStart; - e.target.value - = e.target.value.substring(0, e.target.selectionStart) - + "\t" - + e.target.value.substring(e.target.selectionEnd); - e.target.selectionEnd = s +1; + const { value, selectionStart, selectionEnd } = e.target; + e.target.value = ( + value.substring(0, selectionStart) + "\t" + + value.substring(selectionEnd) + ); + e.target.selectionEnd = selectionStart + 1; } } - if (onKeyDown) { onKeyDown(e, e.target.value); } - this.autoresize(); }; this.handleFocus = e => { const { editing } = this.state; @@ -119,7 +103,6 @@ export class TextArea extends Component { const input = this.textareaRef.current; if (input) { input.value = toInputValue(nextValue); - this.autoresize(); } } @@ -130,18 +113,18 @@ export class TextArea extends Component { const input = this.textareaRef.current; if (input && !editing && prevValue !== nextValue) { input.value = toInputValue(nextValue); - this.autoresize(); } } setEditing(editing) { this.setState({ editing }); } + getValue() { return this.textareaRef.current && this.textareaRef.current.value; } + render() { - const { props } = this; // Input only props const { onChange, @@ -167,12 +150,9 @@ export class TextArea extends Component { 'TextArea', fluid && 'TextArea--fluid', className, - ])} {...rest}> - |