diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 3b1daafc62..699ab8ffa2 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -1,3 +1,3 @@
-[Directions]: # (Include the Round ID from the Status panel or retrieve it from https://atlantaned.space/newSS13tools/round.php ! If you believe the issue to be caused by a testmerge [OOC tab -> Show Server Revision], report it in the pull request's comment section instead. Explain your issue in detail, including the steps to reproduce it.)
+[Directions]: # (INCLUDE THE ROUND ID from the Status panel or retrieve it from https://atlantaned.space/newSS13tools/round.php ! If you believe the issue to be caused by a test merge [OOC tab -> Show Server Revision], report it in the pull request's comment section instead. Explain your issue in detail, including the steps to reproduce it.)
[For Admins]: # (Oddities induced by var-edits and other admin tools are not necessarily bugs. Verify that your issues occur under regular circumstances before reporting them.)
diff --git a/.gitignore b/.gitignore
index 9744499e37..3b85a6ec30 100644
--- a/.gitignore
+++ b/.gitignore
@@ -192,6 +192,7 @@ Temporary Items
#Visual studio stuff
*.vscode/*
+tools/MapAtmosFixer/MapAtmosFixer/obj/x86/Debug/MapAtmosFixer.csproj.CoreCompileInputs.cache
#GitHub Atom
.atom-build.json
diff --git a/.travis.yml b/.travis.yml
index 35fec579bf..07b63ab3aa 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,5 +1,8 @@
language: generic
sudo: false
+branches:
+ except:
+ - ___TGS3TempBranch
env:
global:
- BYOND_MAJOR="511"
diff --git a/_maps/RandomZLevels/beach.dmm b/_maps/RandomZLevels/beach.dmm
index db2cce8fb7..fb9c5e73c2 100644
--- a/_maps/RandomZLevels/beach.dmm
+++ b/_maps/RandomZLevels/beach.dmm
@@ -163,7 +163,7 @@
death = 0;
desc = "Looks secure.";
flavour_text = "You are a bartender for the beach!";
- icon = 'icons/obj/cryogenic2.dmi';
+ icon = 'icons/obj/machines/sleeper.dmi';
icon_state = "sleeper";
mob_name = "Jerry Thomas";
name = "bartenders cryosleeper";
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index eade14e21e..d2d6386ef9 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -32247,10 +32247,12 @@
/obj/machinery/light_switch{
pixel_x = 27
},
-/obj/machinery/photocopier,
/obj/machinery/light/small{
dir = 4
},
+/obj/structure/easel,
+/obj/item/canvas/twentythreeXtwentythree,
+/obj/item/canvas/twentythreeXtwentythree,
/turf/open/floor/plasteel,
/area/storage/art)
"boP" = (
@@ -101206,7 +101208,7 @@ bzE
bLk
bML
bue
-bMQ
+bzE
bRj
bSB
bPR
diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm
index 49d03878bb..30d3b8b4cc 100644
--- a/_maps/map_files/OmegaStation/OmegaStation.dmm
+++ b/_maps/map_files/OmegaStation/OmegaStation.dmm
@@ -654,6 +654,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/bridge)
"abl" = (
@@ -667,6 +670,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/bridge)
"abm" = (
@@ -708,6 +714,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/bridge)
"abr" = (
@@ -730,6 +739,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/bridge)
"abs" = (
@@ -1267,6 +1279,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"acx" = (
@@ -1289,6 +1304,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"acz" = (
@@ -1342,6 +1360,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered{
name = "Asteroid"
@@ -1508,6 +1529,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/bridge)
"acX" = (
@@ -1607,6 +1631,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/bridge)
"ade" = (
@@ -2038,6 +2065,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/heads/hop)
"adW" = (
@@ -2265,6 +2295,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/detectives_office)
"aes" = (
@@ -2313,6 +2346,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/heads/captain/private)
"aex" = (
@@ -2634,6 +2670,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"aeX" = (
@@ -2666,6 +2705,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/ruin/unpowered{
name = "Asteroid"
@@ -2737,6 +2779,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/fore)
"afj" = (
@@ -2922,6 +2967,9 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/heads/hop)
"afw" = (
@@ -3197,6 +3245,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/fore)
"afX" = (
@@ -3521,6 +3572,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"agC" = (
@@ -3744,6 +3798,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/heads/captain/private)
"agV" = (
@@ -4376,6 +4433,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"aie" = (
@@ -4528,6 +4588,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"ais" = (
@@ -4546,6 +4609,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"ait" = (
@@ -4578,6 +4644,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/detectives_office)
"aiw" = (
@@ -4602,6 +4671,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/fore)
"aiy" = (
@@ -4618,6 +4690,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/bridge)
"aiz" = (
@@ -4649,6 +4724,10 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
+/obj/effect/turf_decal/stripes/line,
/turf/open/floor/plasteel/vault{
dir = 8
},
@@ -4671,6 +4750,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/bridge)
"aiD" = (
@@ -4714,6 +4796,9 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/fore)
"aiI" = (
@@ -5052,6 +5137,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"ajo" = (
@@ -5197,6 +5285,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"ajB" = (
@@ -5673,6 +5764,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"akr" = (
@@ -6032,6 +6126,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"akV" = (
@@ -6132,6 +6229,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"alf" = (
@@ -6155,6 +6255,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/teleporter)
"alj" = (
@@ -6170,6 +6273,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/teleporter)
"alk" = (
@@ -6302,6 +6408,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"alx" = (
@@ -6314,6 +6423,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/ai_monitored/storage/eva)
"aly" = (
@@ -6464,6 +6576,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"alL" = (
@@ -7193,6 +7308,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"anl" = (
@@ -7204,6 +7322,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"anm" = (
@@ -7237,6 +7358,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/quartermaster/storage)
"anp" = (
@@ -7459,6 +7583,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"anI" = (
@@ -7470,6 +7597,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"anJ" = (
@@ -7479,6 +7609,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"anK" = (
@@ -7489,6 +7622,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"anL" = (
@@ -7559,6 +7695,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"anS" = (
@@ -7569,6 +7708,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"anT" = (
@@ -7580,6 +7722,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"anU" = (
@@ -7672,6 +7817,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aoc" = (
@@ -7893,6 +8041,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"aoy" = (
@@ -7930,6 +8081,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"aoB" = (
@@ -8135,6 +8289,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/central)
"aoT" = (
@@ -8235,6 +8392,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"apc" = (
@@ -8315,6 +8475,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
"apj" = (
@@ -8358,6 +8521,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/quartermaster/miningdock)
"apn" = (
@@ -8381,6 +8547,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel/white,
/area/shuttle/mining)
"apq" = (
@@ -8424,6 +8593,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel/white,
/area/shuttle/mining)
"apu" = (
@@ -8470,6 +8642,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"apy" = (
@@ -8536,6 +8711,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"apD" = (
@@ -8576,6 +8754,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"apG" = (
@@ -8723,6 +8904,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/central)
"apT" = (
@@ -9336,6 +9520,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/bar/atrium)
"ard" = (
@@ -9346,6 +9533,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/bar/atrium)
"are" = (
@@ -9357,6 +9547,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/bar/atrium)
"arf" = (
@@ -9378,6 +9571,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/central)
"arh" = (
@@ -9742,6 +9938,9 @@
/obj/structure/cable/white{
icon_state = "2-4"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"arH" = (
@@ -9812,6 +10011,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"arM" = (
@@ -9960,6 +10162,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/central)
"arX" = (
@@ -10498,6 +10703,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/storage/primary)
"asV" = (
@@ -10612,6 +10820,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/central)
"ath" = (
@@ -10691,6 +10902,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"atr" = (
@@ -10874,6 +11088,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/brig)
"atM" = (
@@ -10911,6 +11128,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/storage/primary)
"atP" = (
@@ -11465,6 +11685,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"auN" = (
@@ -11915,6 +12138,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"avL" = (
@@ -12265,6 +12491,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/bar/atrium)
"awt" = (
@@ -12317,6 +12546,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/central)
"awx" = (
@@ -12478,6 +12710,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/fore)
"awN" = (
@@ -12502,6 +12737,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"awP" = (
@@ -13820,6 +14058,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"azE" = (
@@ -13963,6 +14204,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"azT" = (
@@ -14039,6 +14283,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/shuttle/escape)
"aAd" = (
@@ -14208,6 +14455,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"aAv" = (
@@ -14280,6 +14530,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"aAE" = (
@@ -14349,6 +14602,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/theatre)
"aAN" = (
@@ -14440,6 +14696,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/central)
"aAU" = (
@@ -14573,6 +14832,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"aBi" = (
@@ -14588,6 +14850,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"aBk" = (
@@ -14866,6 +15131,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"aBN" = (
@@ -15021,6 +15289,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
"aCe" = (
@@ -15112,6 +15383,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"aCm" = (
@@ -15145,6 +15419,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/shuttle/escape)
"aCr" = (
@@ -15352,6 +15629,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"aCJ" = (
@@ -15600,6 +15880,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"aDj" = (
@@ -15623,7 +15906,13 @@
turf_type = /turf/open/space;
width = 30
},
-/turf/open/floor/plating,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"aDk" = (
/obj/effect/turf_decal/delivery,
@@ -15689,6 +15978,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/atmos)
"aDu" = (
@@ -15864,6 +16156,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/theatre)
"aDO" = (
@@ -16332,6 +16627,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aEI" = (
@@ -16598,6 +16896,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/central)
"aFg" = (
@@ -16644,6 +16945,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"aFk" = (
@@ -16903,6 +17207,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aFJ" = (
@@ -17054,6 +17361,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"aGa" = (
@@ -17111,6 +17421,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aGi" = (
@@ -17148,6 +17461,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aGl" = (
@@ -17183,6 +17499,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aGo" = (
@@ -17841,6 +18160,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aHy" = (
@@ -17953,6 +18275,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/central)
"aHG" = (
@@ -18062,6 +18387,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/central)
"aHP" = (
@@ -18126,6 +18454,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
"aHX" = (
@@ -18462,6 +18793,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/central)
"aID" = (
@@ -18731,6 +19065,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"aJf" = (
@@ -19105,6 +19442,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/central)
"aJN" = (
@@ -19317,6 +19657,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/shuttle/escape)
"aKn" = (
@@ -19332,6 +19675,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/shuttle/escape)
"aKp" = (
@@ -19364,6 +19710,9 @@
/obj/structure/cable{
icon_state = "1-4"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"aKt" = (
@@ -19435,6 +19784,9 @@
dir = 8
},
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/gravity_generator)
"aKy" = (
@@ -19541,6 +19893,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/engine/engineering)
"aKI" = (
@@ -19884,6 +20239,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"aLw" = (
@@ -20369,6 +20727,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/central)
"aMw" = (
@@ -20519,6 +20880,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/tcommsat/server)
"aMM" = (
@@ -20940,6 +21304,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/bar/atrium)
"aNz" = (
@@ -20951,6 +21318,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/crew_quarters/bar/atrium)
"aNA" = (
@@ -21297,6 +21667,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/janitor)
"aOg" = (
@@ -21311,6 +21684,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port/central)
"aOh" = (
@@ -21327,6 +21703,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hydroponics)
"aOj" = (
@@ -21408,6 +21787,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/central)
"aOv" = (
@@ -21615,6 +21997,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"aOO" = (
@@ -21707,6 +22092,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aOV" = (
@@ -21847,6 +22235,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aPe" = (
@@ -22369,6 +22760,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aQd" = (
@@ -22636,6 +23030,9 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{
dir = 4
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel/grimy,
/area/tcommsat/server)
"aQJ" = (
@@ -22766,6 +23163,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/library)
"aQZ" = (
@@ -22780,6 +23180,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/library)
"aRa" = (
@@ -22806,6 +23209,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/medical/morgue)
"aRe" = (
@@ -22907,6 +23313,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/research)
"aRv" = (
@@ -22919,6 +23328,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/research)
"aRx" = (
@@ -22935,6 +23347,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"aRy" = (
@@ -22956,6 +23371,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"aRB" = (
@@ -23330,6 +23748,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"aSu" = (
@@ -23510,6 +23931,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel/vault/telecomms{
dir = 5
},
@@ -23974,6 +24398,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/science/research)
"aTP" = (
@@ -24002,6 +24429,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"aTR" = (
@@ -24577,6 +25007,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
"aVg" = (
@@ -24807,6 +25240,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"aVH" = (
@@ -25319,6 +25755,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
"aWM" = (
@@ -25340,6 +25779,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/medical/chemistry)
"aWO" = (
@@ -25455,6 +25897,10 @@
name = "Server Access";
req_access_txt = "30"
},
+/obj/effect/turf_decal/stripes/line,
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel/vault{
dir = 8
},
@@ -25667,6 +26113,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/science/research)
"aXy" = (
@@ -25762,6 +26211,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/science/research)
"aXG" = (
@@ -25848,6 +26300,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"aXO" = (
@@ -26040,6 +26495,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/science/research)
"aYi" = (
@@ -26201,6 +26659,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"aYv" = (
@@ -26360,7 +26821,10 @@
req_access_txt = "5"
},
/obj/effect/turf_decal/stripes/line{
- dir = 2
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
@@ -26442,6 +26906,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
"aYU" = (
@@ -26507,6 +26974,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/robotics/mechbay)
"aZe" = (
@@ -26696,6 +27166,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"aZB" = (
@@ -26757,7 +27230,10 @@
dir = 4
},
/obj/effect/turf_decal/stripes/line{
- dir = 2
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
},
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
@@ -26874,6 +27350,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
"aZQ" = (
@@ -27116,6 +27595,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"bao" = (
@@ -27427,6 +27909,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/science/robotics/mechbay)
"baS" = (
@@ -27646,6 +28131,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"bbp" = (
@@ -27723,6 +28211,9 @@
dir = 8
},
/obj/effect/landmark/event_spawn,
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/checkpoint)
"bby" = (
@@ -27857,6 +28348,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/science/robotics/lab)
"bbJ" = (
@@ -27959,6 +28453,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"bbV" = (
@@ -27984,6 +28481,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"bbX" = (
@@ -28007,6 +28507,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"bca" = (
@@ -28112,6 +28615,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
"bcl" = (
@@ -28184,6 +28690,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/science/robotics/mechbay)
"bct" = (
@@ -28481,6 +28990,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/security/checkpoint)
"bde" = (
@@ -28565,6 +29077,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/science/robotics/mechbay)
"bdl" = (
@@ -28714,6 +29229,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"bdB" = (
@@ -28904,6 +29422,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/medical/medbay/zone3)
"bdU" = (
@@ -29291,6 +29812,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"beE" = (
@@ -29310,6 +29834,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"beG" = (
@@ -29380,6 +29907,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/research)
"beN" = (
@@ -29398,6 +29928,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/research)
"beO" = (
@@ -29420,6 +29953,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"beQ" = (
@@ -29591,6 +30127,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/security/checkpoint)
"bfg" = (
@@ -29619,6 +30158,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard)
"bfj" = (
@@ -29837,6 +30379,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"bfC" = (
@@ -29889,6 +30434,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"bfI" = (
@@ -29982,6 +30530,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bfR" = (
@@ -30004,6 +30555,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bfS" = (
@@ -30462,6 +31016,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/maintenance/port)
"bgP" = (
@@ -30490,6 +31047,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bgS" = (
@@ -30504,6 +31064,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bgT" = (
@@ -30527,6 +31090,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bgX" = (
@@ -30792,6 +31358,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/chapel/main)
"bhz" = (
@@ -31378,6 +31947,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/chapel/main)
"biI" = (
@@ -31422,6 +31994,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/chapel/main)
"biN" = (
@@ -31526,6 +32101,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"biV" = (
@@ -31539,6 +32117,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"biW" = (
@@ -31760,7 +32341,12 @@
/obj/machinery/atmospherics/pipe/simple/general/hidden{
dir = 4
},
-/obj/effect/turf_decal/stripes/end,
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/science/xenobiology)
"bjw" = (
@@ -32203,6 +32789,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bki" = (
@@ -32218,6 +32807,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"bkk" = (
@@ -32583,6 +33175,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 2
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/primary/central)
"blh" = (
@@ -32887,6 +33482,9 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"blM" = (
@@ -32932,13 +33530,16 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"blZ" = (
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"bmb" = (
-/obj/machinery/atmospherics/components/unary/vent_scrubber,
+/obj/machinery/atmospherics/components/unary/vent_scrubber/on,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"bmh" = (
@@ -33040,6 +33641,9 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"bsC" = (
@@ -33110,6 +33714,9 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"bsO" = (
@@ -33187,6 +33794,9 @@
/obj/structure/cable/white{
icon_state = "1-2"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 1
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"bsY" = (
@@ -33204,6 +33814,12 @@
/obj/structure/cable/white{
icon_state = "4-8"
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
+/obj/effect/turf_decal/stripes/line{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/exit)
"bta" = (
@@ -33276,6 +33892,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"btl" = (
@@ -33286,6 +33905,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/hallway/secondary/entry)
"buy" = (
@@ -33969,6 +34591,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/fore)
"byk" = (
@@ -33991,6 +34616,9 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
+/obj/effect/turf_decal/stripes/line{
+ dir = 4
+ },
/turf/open/floor/plasteel,
/area/maintenance/starboard/fore)
"bym" = (
diff --git a/_maps/shuttles/emergency_discoinferno.dmm b/_maps/shuttles/emergency_discoinferno.dmm
new file mode 100644
index 0000000000..ec42f163f1
--- /dev/null
+++ b/_maps/shuttles/emergency_discoinferno.dmm
@@ -0,0 +1,497 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"b" = (
+/turf/closed/wall/mineral/plastitanium,
+/area/shuttle/escape)
+"c" = (
+/obj/effect/spawner/structure/window/plasma/reinforced,
+/turf/open/floor/plasteel/elevatorshaft,
+/area/shuttle/escape)
+"d" = (
+/obj/structure/table/wood,
+/obj/item/device/flashlight/lamp/green,
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"e" = (
+/obj/structure/chair/comfy/brown{
+ dir = 1
+ },
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"f" = (
+/obj/machinery/computer/emergency_shuttle,
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"g" = (
+/obj/structure/table/wood,
+/obj/item/storage/fancy/cigarettes/cigars/havana,
+/obj/item/lighter{
+ pixel_x = -4;
+ pixel_y = 6
+ },
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"h" = (
+/obj/machinery/computer/atmos_alert{
+ dir = 4
+ },
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"i" = (
+/obj/structure/chair/comfy/brown{
+ dir = 8
+ },
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"j" = (
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"k" = (
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"l" = (
+/obj/machinery/computer/security{
+ dir = 8
+ },
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"m" = (
+/obj/machinery/computer/crew{
+ dir = 4
+ },
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"n" = (
+/obj/structure/table/wood/poker,
+/obj/item/storage/box/drinkingglasses,
+/obj/item/reagent_containers/food/drinks/bottle/whiskey,
+/obj/machinery/light,
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"o" = (
+/obj/machinery/computer/communications{
+ dir = 8
+ },
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"p" = (
+/obj/machinery/door/airlock/gold{
+ req_access_txt = "19"
+ },
+/turf/open/floor/mineral/gold,
+/area/shuttle/escape)
+"q" = (
+/obj/structure/statue/plasma/scientist{
+ anchored = 1;
+ oreAmount = 50
+ },
+/turf/open/floor/light/colour_cycle,
+/area/shuttle/escape)
+"r" = (
+/turf/open/floor/mineral/plasma,
+/area/shuttle/escape)
+"s" = (
+/turf/open/floor/mineral/silver,
+/area/shuttle/escape)
+"t" = (
+/turf/open/floor/light/colour_cycle,
+/area/shuttle/escape)
+"u" = (
+/obj/docking_port/mobile/emergency{
+ name = "Disco Inferno";
+ timid = 1
+ },
+/obj/machinery/door/airlock/gold{
+ armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100);
+ heat_proof = 1;
+ resistance_flags = 2
+ },
+/turf/open/floor/mineral/plasma,
+/area/shuttle/escape)
+"v" = (
+/obj/machinery/disco{
+ anchored = 1;
+ req_access = null
+ },
+/turf/open/floor/light/colour_cycle,
+/area/shuttle/escape)
+"w" = (
+/obj/machinery/door/airlock/gold,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"x" = (
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"y" = (
+/turf/open/floor/carpet,
+/area/shuttle/escape)
+"z" = (
+/obj/structure/chair/comfy/brown{
+ dir = 2
+ },
+/turf/open/floor/carpet,
+/area/shuttle/escape)
+"A" = (
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/drinks/bottle/cognac,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"B" = (
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"C" = (
+/obj/machinery/computer/slot_machine,
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"D" = (
+/obj/structure/chair/comfy/brown{
+ dir = 8
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"E" = (
+/obj/structure/chair/comfy/brown{
+ dir = 4
+ },
+/turf/open/floor/carpet,
+/area/shuttle/escape)
+"F" = (
+/obj/structure/table/wood/poker,
+/obj/item/toy/cards/deck,
+/turf/open/floor/carpet,
+/area/shuttle/escape)
+"G" = (
+/obj/structure/chair/comfy/brown{
+ dir = 8
+ },
+/turf/open/floor/carpet,
+/area/shuttle/escape)
+"H" = (
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass,
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass,
+/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass,
+/obj/machinery/light{
+ dir = 4
+ },
+/obj/item/coin/plasma,
+/obj/item/coin/plasma,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"I" = (
+/obj/machinery/computer/slot_machine{
+ dir = 3
+ },
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"J" = (
+/obj/structure/chair/comfy/brown{
+ dir = 1
+ },
+/turf/open/floor/carpet,
+/area/shuttle/escape)
+"K" = (
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/drinks/bottle/absinthe,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"L" = (
+/obj/structure/table/wood/fancy,
+/obj/item/reagent_containers/food/drinks/bottle/lizardwine,
+/turf/open/floor/wood,
+/area/shuttle/escape)
+"M" = (
+/obj/structure/shuttle/engine/heater,
+/obj/structure/window/plasma/reinforced{
+ dir = 1
+ },
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"N" = (
+/obj/structure/shuttle/engine/propulsion,
+/turf/open/floor/plating/airless,
+/area/shuttle/escape)
+"O" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/escape)
+"P" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/escape)
+"Q" = (
+/turf/closed/wall/mineral/plastitanium/nodiagonal,
+/area/shuttle/escape)
+
+(1,1,1) = {"
+a
+a
+a
+a
+b
+b
+b
+c
+b
+u
+b
+c
+c
+c
+b
+O
+b
+w
+b
+c
+b
+a
+"}
+(2,1,1) = {"
+a
+b
+b
+b
+O
+q
+r
+r
+r
+r
+j
+r
+r
+r
+r
+q
+c
+x
+C
+I
+b
+b
+"}
+(3,1,1) = {"
+b
+b
+h
+m
+c
+r
+r
+r
+r
+s
+j
+s
+r
+r
+r
+r
+c
+x
+D
+D
+M
+N
+"}
+(4,1,1) = {"
+c
+d
+i
+i
+c
+r
+r
+r
+j
+j
+t
+j
+j
+r
+r
+r
+c
+x
+x
+x
+M
+N
+"}
+(5,1,1) = {"
+c
+e
+j
+j
+c
+r
+r
+s
+j
+t
+t
+t
+j
+s
+r
+r
+c
+y
+E
+y
+M
+N
+"}
+(6,1,1) = {"
+c
+f
+j
+n
+c
+r
+j
+j
+t
+t
+v
+t
+t
+j
+j
+r
+c
+z
+F
+J
+M
+N
+"}
+(7,1,1) = {"
+c
+e
+j
+j
+p
+r
+r
+s
+j
+t
+t
+t
+j
+s
+r
+r
+c
+y
+G
+y
+M
+N
+"}
+(8,1,1) = {"
+c
+g
+k
+k
+c
+r
+r
+r
+j
+j
+t
+j
+j
+r
+r
+r
+c
+x
+x
+x
+M
+N
+"}
+(9,1,1) = {"
+b
+b
+l
+o
+c
+r
+r
+r
+r
+s
+j
+s
+r
+r
+r
+r
+c
+A
+x
+K
+M
+N
+"}
+(10,1,1) = {"
+a
+b
+b
+b
+O
+q
+r
+r
+r
+r
+j
+r
+r
+r
+r
+q
+c
+B
+H
+L
+b
+b
+"}
+(11,1,1) = {"
+a
+a
+a
+a
+b
+b
+b
+c
+b
+b
+b
+c
+c
+c
+b
+b
+b
+c
+b
+c
+b
+a
+"}
diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm
index 4a50214bb7..7da895a593 100644
--- a/code/__DEFINES/components.dm
+++ b/code/__DEFINES/components.dm
@@ -10,11 +10,6 @@
#define COMPONENT_DUPE_ALLOWED 1 //duplicates allowed
#define COMPONENT_DUPE_UNIQUE 2 //new component is deleted
-// Signal return value flags
-// The other defines are under the signal they're used in
-
-#define COMPONENT_ACTIVATED 1 // call parent.ComponentActivated(comp) and component.AfterComponentActivated()
-
// All signals. Format:
// When the signal is called: (signal arguments)
@@ -28,7 +23,7 @@
// /atom signals
#define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params)
- #define COMPONENT_NO_AFTERATTACK 2 //Return this in response if you don't want afterattack to be called
+ #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called
#define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human)
#define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob)
#define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (/atom/movable, /atom)
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 55b29e64a5..f5cb701290 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -490,3 +490,7 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE
#define FRIENDLY_SPAWN 2
#define RIDING_OFFSET_ALL "ALL"
+
+//Fullscreen overlay resolution in tiles.
+#define FULLSCREEN_OVERLAY_RESOLUTION_X 15
+#define FULLSCREEN_OVERLAY_RESOLUTION_Y 15
diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm
index 6866c024e2..8b93c8e38f 100644
--- a/code/__DEFINES/sound.dm
+++ b/code/__DEFINES/sound.dm
@@ -20,7 +20,7 @@
#define SOUND_MINIMUM_PRESSURE 10
-#define FALLOFF_SOUNDS 0.5
+#define FALLOFF_SOUNDS 1
//Ambience types
diff --git a/code/__DEFINES/time.dm b/code/__DEFINES/time.dm
index 987d52e0cd..8bc4d039f6 100644
--- a/code/__DEFINES/time.dm
+++ b/code/__DEFINES/time.dm
@@ -22,6 +22,6 @@ When using time2text(), please use "DDD" to find the weekday. Refrain from using
#define TICKS *world.tick_lag
-#define DS2TICKS(DS) (DS/world.tick_lag)
+#define DS2TICKS(DS) ((DS)/world.tick_lag)
-#define TICKS2DS(T) (T TICKS)
\ No newline at end of file
+#define TICKS2DS(T) ((T) TICKS)
\ No newline at end of file
diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm
index c8163f980a..631214de98 100644
--- a/code/__HELPERS/_lists.dm
+++ b/code/__HELPERS/_lists.dm
@@ -9,6 +9,16 @@
* Misc
*/
+#define LAZYINITLIST(L) if (!L) L = list()
+#define UNSETEMPTY(L) if (L && !L.len) L = null
+#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } }
+#define LAZYADD(L, I) if(!L) { L = list(); } L += I;
+#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null)
+#define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V;
+#define LAZYLEN(L) length(L)
+#define LAZYCLEARLIST(L) if(L) L.Cut()
+#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
+
//Returns a list in plain english as a string
/proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
var/total = input.len
@@ -32,7 +42,7 @@
//Returns list element or null. Should prevent "index out of bounds" error.
/proc/listgetindex(list/L, index)
- if(istype(L))
+ if(LAZYLEN(L))
if(isnum(index) && IsInteger(index))
if(IsInRange(index,1,L.len))
return L[index]
@@ -42,7 +52,7 @@
//Return either pick(list) or null if list is not of type /list or is empty
/proc/safepick(list/L)
- if(istype(L) && L.len)
+ if(LAZYLEN(L))
return pick(L)
//Checks if the list is empty
@@ -53,7 +63,7 @@
//Checks for specific types in a list
/proc/is_type_in_list(atom/A, list/L)
- if(!L || !L.len || !A)
+ if(!LAZYLEN(L) || !A)
return FALSE
for(var/type in L)
if(istype(A, type))
@@ -62,7 +72,7 @@
//Checks for specific types in specifically structured (Assoc "type" = TRUE) lists ('typecaches')
/proc/is_type_in_typecache(atom/A, list/L)
- if(!L || !L.len || !A)
+ if(!LAZYLEN(L) || !A)
return FALSE
if(ispath(A))
@@ -72,7 +82,7 @@
//Checks for a string in a list
/proc/is_string_in_list(string, list/L)
- if(!L || !L.len || !string)
+ if(!LAZYLEN(L) || !string)
return
for(var/V in L)
if(string == V)
@@ -81,7 +91,7 @@
//Removes a string from a list
/proc/remove_strings_from_list(string, list/L)
- if(!L || !L.len || !string)
+ if(!LAZYLEN(L) || !string)
return
for(var/V in L)
if(V == string)
@@ -486,16 +496,6 @@
//Picks from the list, with some safeties, and returns the "default" arg if it fails
#define DEFAULTPICK(L, default) ((islist(L) && length(L)) ? pick(L) : default)
-#define LAZYINITLIST(L) if (!L) L = list()
-#define UNSETEMPTY(L) if (L && !L.len) L = null
-#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } }
-#define LAZYADD(L, I) if(!L) { L = list(); } L += I;
-#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null)
-#define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V;
-#define LAZYLEN(L) length(L)
-#define LAZYCLEARLIST(L) if(L) L.Cut()
-#define SANITIZE_LIST(L) ( islist(L) ? L : list() )
-
/* Definining a counter as a series of key -> numeric value entries
* All these procs modify in place.
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index 57fe0559fa..0e1c1c3979 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -326,25 +326,6 @@
return M
return null
-// Will return a list of active candidates. It increases the buffer 5 times until it finds a candidate which is active within the buffer.
-
-/proc/get_candidates(be_special_type, afk_bracket = CONFIG_GET(number/inactivity_period), jobbanType)
- var/list/candidates = list()
- // Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000))
- var/afk_period = CONFIG_GET(number/afk_period)
- while(!candidates.len && afk_bracket < afk_period)
- for(var/mob/dead/observer/G in GLOB.player_list)
- if(G.client != null)
- if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
- if(!G.client.is_afk(afk_bracket) && (be_special_type in G.client.prefs.be_special))
- if (jobbanType)
- if(!(jobban_isbanned(G, jobbanType) || jobban_isbanned(G, "Syndicate")))
- candidates += G.client
- else
- candidates += G.client
- afk_bracket += 600 // Add a minute to the bracket, for every attempt
- return candidates
-
/proc/considered_alive(datum/mind/M, enforce_human = TRUE)
if(M && M.current)
if(enforce_human)
diff --git a/code/__HELPERS/maths.dm b/code/__HELPERS/maths.dm
index f1c901ab9a..9b071d0143 100644
--- a/code/__HELPERS/maths.dm
+++ b/code/__HELPERS/maths.dm
@@ -192,15 +192,17 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4,
/proc/mouse_angle_from_client(client/client)
var/list/mouse_control = params2list(client.mouseParams)
- if(mouse_control["screen-loc"])
+ if(mouse_control["screen-loc"] && client)
var/list/screen_loc_params = splittext(mouse_control["screen-loc"], ",")
var/list/screen_loc_X = splittext(screen_loc_params[1],":")
var/list/screen_loc_Y = splittext(screen_loc_params[2],":")
var/x = (text2num(screen_loc_X[1]) * 32 + text2num(screen_loc_X[2]) - 32)
var/y = (text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32)
- var/screenview = (client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths
- var/ox = round(screenview/2) - client.pixel_x //"origin" x
- var/oy = round(screenview/2) - client.pixel_y //"origin" y
+ var/list/screenview = getviewsize(client)
+ var/screenviewX = screenview[1] * world.icon_size
+ var/screenviewY = screenview[2] * world.icon_size
+ var/ox = round(screenviewX/2) - client.pixel_x //"origin" x
+ var/oy = round(screenviewY/2) - client.pixel_y //"origin" y
var/angle = NORM_ROT(Atan2(y - oy, x - ox))
return angle
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 5e266fdaa2..6fb7b08611 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -353,9 +353,8 @@ Turf and target are separate in case you want to teleport some distance from a t
var/M = E/(SPEED_OF_LIGHT_SQ)
return M
-//Takes the value of energy used/produced/ect.
-//Returns a text value of that number in W, kW, MW, or GW.
-/proc/DisplayPower(var/powerused)
+// Format a power value in W, kW, MW, or GW.
+/proc/DisplayPower(powerused)
if(powerused < 1000) //Less than a kW
return "[powerused] W"
else if(powerused < 1000000) //Less than a MW
@@ -364,6 +363,21 @@ Turf and target are separate in case you want to teleport some distance from a t
return "[round((powerused * 0.000001),0.001)] MW"
return "[round((powerused * 0.000000001),0.0001)] GW"
+// Format an energy value in J, kJ, MJ, or GJ. 1W = 1J/s.
+/proc/DisplayEnergy(units)
+ // APCs process every (SSmachines.wait * 0.1) seconds, and turn 1 W of
+ // excess power into GLOB.CELLRATE energy units when charging cells.
+ // With the current configuration of wait=20 and CELLRATE=0.002, this
+ // means that one unit is 1 kJ.
+ units *= SSmachines.wait * 0.1 / GLOB.CELLRATE
+ if (units < 1000) // Less than a kJ
+ return "[round(units, 0.1)] J"
+ else if (units < 1000000) // Less than a MJ
+ return "[round(units * 0.001, 0.01)] kJ"
+ else if (units < 1000000000) // Less than a GJ
+ return "[round(units * 0.000001, 0.001)] MJ"
+ return "[round(units * 0.000000001, 0.0001)] GJ"
+
/proc/key_name(whom, include_link = null, include_name = 1)
var/mob/M
var/client/C
diff --git a/code/__HELPERS/view.dm b/code/__HELPERS/view.dm
new file mode 100644
index 0000000000..85819a5ef0
--- /dev/null
+++ b/code/__HELPERS/view.dm
@@ -0,0 +1,12 @@
+/proc/getviewsize(view)
+ var/viewX
+ var/viewY
+ if(isnum(view))
+ var/totalviewrange = 1 + 2 * view
+ viewX = totalviewrange
+ viewY = totalviewrange
+ else
+ var/list/viewrangelist = splittext(view,"x")
+ viewX = text2num(viewrangelist[1])
+ viewY = text2num(viewrangelist[2])
+ return list(viewX, viewY)
\ No newline at end of file
diff --git a/code/_globalvars/configuration.dm b/code/_globalvars/configuration.dm
index 391744e34c..8ecf572ea7 100644
--- a/code/_globalvars/configuration.dm
+++ b/code/_globalvars/configuration.dm
@@ -35,4 +35,3 @@ GLOBAL_PROTECT(MAX_EX_FLASH_RANGE)
GLOBAL_VAR_INIT(MAX_EX_FLAME_RANGE, 14)
GLOBAL_PROTECT(MAX_EX_FLAME_RANGE)
GLOBAL_VAR_INIT(DYN_EX_SCALE, 0.5)
-
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index c9e97726b3..0cc24607f4 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -440,20 +440,20 @@
mouse_opacity = MOUSE_OPACITY_OPAQUE
screen_loc = "CENTER"
-/obj/screen/click_catcher/proc/UpdateGreed(view_size_x = 7, view_size_y = 7)
+/obj/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15)
var/icon/newicon = icon('icons/mob/screen_gen.dmi', "flash")
- if(view_size_x > 16 || view_size_y > 16)
- newicon.Scale((16 * 2 + 1) * world.icon_size,(16 * 2 + 1) * world.icon_size)
+ if(view_size_x > 32 || view_size_y > 32)
+ newicon.Scale(16 * world.icon_size,16 * world.icon_size)
icon = newicon
- var/tx = view_size_x/16
- var/ty = view_size_y/16
+ var/tx = ((view_size_x - 1)*0.5)/16
+ var/ty = ((view_size_y - 1)*0.5)/16
var/matrix/M = new
M.Scale(tx, ty)
transform = M
screen_loc = "CENTER-16,CENTER-16"
else
- screen_loc = "CENTER-[view_size_x],CENTER-[view_size_y]"
- newicon.Scale((view_size_x * 2 + 1) * world.icon_size,(view_size_y * 2 + 1) * world.icon_size)
+ screen_loc = "CENTER-[(view_size_x-1)*0.5],CENTER-[(view_size_y-1)*0.5]"
+ newicon.Scale(view_size_x * world.icon_size,view_size_y * world.icon_size)
icon = newicon
/obj/screen/click_catcher/Click(location, control, params)
diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm
index 58f0fb18a2..2047225589 100644
--- a/code/_onclick/hud/fullscreen.dm
+++ b/code/_onclick/hud/fullscreen.dm
@@ -16,9 +16,9 @@
if (client && screen.should_show_to(src))
client.screen += screen
if (screen.screen_loc == "CENTER-7,CENTER-7" && screen.view != client.view)
- var/scale = (1 + 2 * client.view) / 15
+ var/list/actualview = getviewsize(client.view)
screen.view = client.view
- screen.transform = matrix(scale, 0, 0, 0, scale, 0)
+ screen.transform = matrix(actualview[1]/FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2]/FULLSCREEN_OVERLAY_RESOLUTION_Y, 0)
return screen
diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm
index a9971895a7..ff38107bfb 100755
--- a/code/_onclick/hud/parallax.dm
+++ b/code/_onclick/hud/parallax.dm
@@ -255,11 +255,13 @@
/obj/screen/parallax_layer/proc/update_o(view)
if (!view)
view = world.view
-
- var/count = Ceiling(view/(480/world.icon_size))+1
+
+ var/list/viewscales = getviewsize(view)
+ var/countx = Ceiling((viewscales[1]/2)/(480/world.icon_size))+1
+ var/county = Ceiling((viewscales[2]/2)/(480/world.icon_size))+1
var/list/new_overlays = new
- for(var/x in -count to count)
- for(var/y in -count to count)
+ for(var/x in -countx to countx)
+ for(var/y in -county to county)
if(x == 0 && y == 0)
continue
var/mutable_appearance/texture_overlay = mutable_appearance(icon, icon_state)
diff --git a/code/citadel/cit_weapons.dm b/code/citadel/cit_weapons.dm
index c709fe90e9..b661294ae7 100644
--- a/code/citadel/cit_weapons.dm
+++ b/code/citadel/cit_weapons.dm
@@ -11,7 +11,7 @@
attack_verb = list("poked", "jabbed", "hit")
light_color = "#37FFF7"
var/light_brightness = 3
- actions_types = list(/datum/action/item_action/pick_color)
+ actions_types = list()
/obj/item/toy/sword/cx/attack_self(mob/user)
active = !( active )
@@ -57,18 +57,21 @@
var/mob/M = loc
M.update_inv_hands()
-/obj/item/toy/sword/cx/ui_action_click(mob/user, var/datum/action/A)
- if(istype(A, /datum/action/item_action/pick_color))
- if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
- var/energy_color_input = input(usr,"Choose Energy Color") as color|null
- if(energy_color_input)
- light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
- update_icon()
- update_light()
- A.UpdateButtonIcon()
+/obj/item/toy/sword/cx/AltClick(mob/living/user)
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!in_range(src, user))
+ return
+ if(user.incapacitated() || !istype(user) || !in_range(src, user))
+ return
- else
- ..()
+ if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"Choose Energy Color") as color|null
+ if(energy_color_input)
+ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+ update_light()
/obj/item/toy/sword/cx/worn_overlays(isinhands, icon_file)
. = ..()
@@ -79,7 +82,21 @@
. += blade_inhand
/obj/item/toy/sword/cx/attackby(obj/item/W, mob/living/user, params)
- return //NO MORE MAKING DUAL ESWORDS
+ if(istype(W, /obj/item/toy/sword/cx))
+ if((W.flags_1 & NODROP_1) || (flags_1 & NODROP_1))
+ to_chat(user, "\the [flags_1 & NODROP_1 ? src : W] is stuck to your hand, you can't attach it to \the [flags_1 & NODROP_1 ? W : src]!")
+ return
+ else
+ to_chat(user, "You combine the two plastic swords, making a single supermassive toy! You're fake-cool.")
+ new /obj/item/twohanded/hypereutactic/toy(user.loc)
+ qdel(W)
+ qdel(src)
+ else
+ return ..()
+
+/obj/item/toy/sword/cx/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to recolor it.")
/*///autolathe memes/// I really need to stop doing this and find a proper way of adding in my toys
@@ -124,7 +141,7 @@
origin_tech = "combat=3;magnets=4"
block_chance = 60
light_color = "#37FFF7"
- actions_types = list(/datum/action/item_action/pick_color)
+ actions_types = list()
/obj/item/melee/transforming/energy/sword/cx/transform_weapon(mob/living/user, supress_message_text)
active = !active //I'd use a ..() here but it'd inherit from the regular esword's proc instead, so SPAGHETTI CODE
@@ -152,9 +169,6 @@
update_icon()
transform_messages(user, supress_message_text)
add_fingerprint(user)
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
return TRUE
/obj/item/melee/transforming/energy/sword/cx/transform_messages(mob/living/user, supress_message_text)
@@ -181,18 +195,25 @@
var/mob/M = loc
M.update_inv_hands()
-/obj/item/melee/transforming/energy/sword/cx/ui_action_click(mob/user, var/datum/action/A)
- if(istype(A, /datum/action/item_action/pick_color))
- if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
- var/energy_color_input = input(usr,"Choose Energy Color") as color|null
- if(energy_color_input)
- light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
- update_icon()
- update_light()
- A.UpdateButtonIcon()
+/obj/item/melee/transforming/energy/sword/cx/AltClick(mob/living/user)
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!in_range(src, user))
+ return
+ if(user.incapacitated() || !istype(user) || !in_range(src, user))
+ return
- else
- ..()
+ if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"Choose Energy Color") as color|null
+ if(energy_color_input)
+ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+ update_light()
+
+/obj/item/melee/transforming/energy/sword/cx/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to recolor it.")
/obj/item/melee/transforming/energy/sword/cx/worn_overlays(isinhands, icon_file)
. = ..()
diff --git a/code/citadel/custom_loadout/custom_items.dm b/code/citadel/custom_loadout/custom_items.dm
index 2c18198344..108e50b07a 100644
--- a/code/citadel/custom_loadout/custom_items.dm
+++ b/code/citadel/custom_loadout/custom_items.dm
@@ -231,7 +231,5 @@
icon_state = "vermillion-i"
item_state = "vermillion-w"
body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
+ icon = 'icons/obj/custom.dmi'
icon_override = 'icons/obj/custom.dmi'
-
-
-
diff --git a/code/controllers/configuration/entries/config.dm b/code/controllers/configuration/entries/config.dm
index d7dc0ff84d..37081c15dd 100644
--- a/code/controllers/configuration/entries/config.dm
+++ b/code/controllers/configuration/entries/config.dm
@@ -208,9 +208,9 @@ CONFIG_DEF(string/panic_server_name)
/datum/config_entry/string/panic_server_name/ValidateAndSet(str_val)
return str_val != "\[Put the name here\]" && ..()
-CONFIG_DEF(string/panic_address) //Reconnect a player this linked server if this server isn't accepting new players
+CONFIG_DEF(string/panic_server_address) //Reconnect a player this linked server if this server isn't accepting new players
-/datum/config_entry/string/panic_address/ValidateAndSet(str_val)
+/datum/config_entry/string/panic_server_address/ValidateAndSet(str_val)
return str_val != "byond://address:port" && ..()
CONFIG_DEF(string/invoke_youtubedl)
@@ -377,7 +377,7 @@ CONFIG_TWEAK(number/mc_tick_rate/ValidateAndSet(str_val))
CONFIG_DEF(flag/resume_after_initializations)
-CONFIG_TWEAK(flag/ValidateAndSet(str_val))
+CONFIG_TWEAK(flag/resume_after_initializations/ValidateAndSet(str_val))
. = ..()
if(. && Master.current_runlevel)
world.sleep_offline = !value
@@ -385,3 +385,6 @@ CONFIG_TWEAK(flag/ValidateAndSet(str_val))
CONFIG_DEF(number/rounds_until_hard_restart)
value = -1
min_val = 0
+
+CONFIG_DEF(string/default_view)
+ value = "15x15"
diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm
index 1b58d86db2..b04d7845f5 100644
--- a/code/controllers/configuration/entries/game_options.dm
+++ b/code/controllers/configuration/entries/game_options.dm
@@ -263,4 +263,4 @@ CONFIG_DEF(number/emergency_shuttle_autocall_threshold)
max_val = 1
integer = FALSE
-CONFIG_DEF(flag/ic_printing)
\ No newline at end of file
+CONFIG_DEF(flag/ic_printing)
diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm
index 3a0f3cff24..104f463c8b 100644
--- a/code/controllers/subsystem/blackbox.dm
+++ b/code/controllers/subsystem/blackbox.dm
@@ -39,9 +39,9 @@ SUBSYSTEM_DEF(blackbox)
sealed = SSblackbox.sealed
//no touchie
-/datum/controller/subsystem/blackbox/can_vv_get(var_name)
+/datum/controller/subsystem/blackbox/vv_get_var(var_name)
if(var_name == "feedback")
- return FALSE
+ return debug_variable(var_name, deepCopyList(feedback), 0, src)
return ..()
/datum/controller/subsystem/blackbox/vv_edit_var(var_name, var_value)
@@ -218,6 +218,8 @@ Versioning
FV.json["data"]["[pos]"] = list() //in 512 "pos" can be replaced with "[FV.json["data"].len+1]"
for(var/i in data)
FV.json["data"]["[pos]"]["[i]"] = "[data[i]]" //and here with "[FV.json["data"].len]"
+ else
+ CRASH("Invalid feedback key_type: [key_type]")
/datum/controller/subsystem/blackbox/proc/record_feedback_recurse_list(list/L, list/key_list, increment, depth = 1)
if(depth == key_list.len)
diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm
index 43585a5896..cb5a86bd75 100644
--- a/code/controllers/subsystem/server_maint.dm
+++ b/code/controllers/subsystem/server_maint.dm
@@ -55,5 +55,8 @@ SUBSYSTEM_DEF(server_maint)
co.ehjax_send(data = "roundrestart")
if(server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
C << link("byond://[server]")
+ if(SERVER_TOOLS_PRESENT)
+ SSblackbox.record_feedback("text", "server_tools", 1, SERVER_TOOLS_VERSION)
+ SSblackbox.record_feedback("text", "server_tools_api", 1, SERVER_TOOLS_API_VERSION)
#undef PING_BUFFER_TIME
diff --git a/code/controllers/subsystem/timer.dm b/code/controllers/subsystem/timer.dm
index 3a2ca82bcd..f24068dbff 100644
--- a/code/controllers/subsystem/timer.dm
+++ b/code/controllers/subsystem/timer.dm
@@ -1,5 +1,6 @@
#define BUCKET_LEN (world.fps*1*60) //how many ticks should we keep in the bucket. (1 minutes worth)
-#define BUCKET_POS(timer) (round((timer.timeToRun - SStimer.head_offset) / world.tick_lag) + 1)
+#define BUCKET_POS(timer) ((round((timer.timeToRun - SStimer.head_offset) / world.tick_lag) % BUCKET_LEN) + 1)
+#define TIMER_MAX (world.time + TICKS2DS(min(BUCKET_LEN-(SStimer.practical_offset-DS2TICKS(world.time - SStimer.head_offset))-1, BUCKET_LEN-1)))
#define TIMER_ID_MAX (2**24) //max float with integer precision
SUBSYSTEM_DEF(timer)
@@ -9,11 +10,11 @@ SUBSYSTEM_DEF(timer)
flags = SS_TICKER|SS_NO_INIT
- var/list/datum/timedevent/processing = list()
+ var/list/datum/timedevent/second_queue = list() //awe, yes, you've had first queue, but what about second queue?
var/list/hashes = list()
var/head_offset = 0 //world.time of the first entry in the the bucket.
- var/practical_offset = 0 //index of the first non-empty item in the bucket.
+ var/practical_offset = 1 //index of the first non-empty item in the bucket.
var/bucket_resolution = 0 //world.tick_lag the bucket was designed for
var/bucket_count = 0 //how many timers are in the buckets
@@ -27,13 +28,19 @@ SUBSYSTEM_DEF(timer)
var/static/last_invoke_warning = 0
var/static/bucket_auto_reset = TRUE
+/datum/controller/subsystem/timer/PreInit()
+ bucket_list.len = BUCKET_LEN
+ head_offset = world.time
+ bucket_resolution = world.tick_lag
+
/datum/controller/subsystem/timer/stat_entry(msg)
- ..("B:[bucket_count] P:[length(processing)] H:[length(hashes)] C:[length(clienttime_timers)]")
+ ..("B:[bucket_count] P:[length(second_queue)] H:[length(hashes)] C:[length(clienttime_timers)] S:[length(timer_id_dict)]")
/datum/controller/subsystem/timer/fire(resumed = FALSE)
var/lit = last_invoke_tick
var/last_check = world.time - TIMER_NO_INVOKE_WARNING
var/list/bucket_list = src.bucket_list
+
if(!bucket_count)
last_invoke_tick = world.time
@@ -60,50 +67,62 @@ SUBSYSTEM_DEF(timer)
bucket_node = bucket_node.next
anti_loop_check--
while(bucket_node && bucket_node != bucket_head && anti_loop_check)
- log_world("Active timers in the processing queue:")
- for(var/I in processing)
+ log_world("Active timers in the second_queue queue:")
+ for(var/I in second_queue)
log_world(get_timer_debug_string(I))
- while(length(clienttime_timers))
- var/datum/timedevent/ctime_timer = clienttime_timers[clienttime_timers.len]
- if (ctime_timer.timeToRun <= REALTIMEOFDAY)
- --clienttime_timers.len
- var/datum/callback/callBack = ctime_timer.callBack
- ctime_timer.spent = REALTIMEOFDAY
- callBack.InvokeAsync()
- qdel(ctime_timer)
- else
- break //None of the rest are ready to run
+ var/next_clienttime_timer_index = 0
+ var/len = length(clienttime_timers)
+
+ for (next_clienttime_timer_index in 1 to len)
if (MC_TICK_CHECK)
- return
+ next_clienttime_timer_index--
+ break
+ var/datum/timedevent/ctime_timer = clienttime_timers[next_clienttime_timer_index]
+ if (ctime_timer.timeToRun > REALTIMEOFDAY)
+ next_clienttime_timer_index--
+ break
+
+ var/datum/callback/callBack = ctime_timer.callBack
+ if (!callBack)
+ clienttime_timers.Cut(next_clienttime_timer_index,next_clienttime_timer_index+1)
+ CRASH("Invalid timer: [get_timer_debug_string(ctime_timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset], REALTIMEOFDAY: [REALTIMEOFDAY]")
+
+ ctime_timer.spent = REALTIMEOFDAY
+ callBack.InvokeAsync()
+ qdel(ctime_timer)
+
+
+ if (next_clienttime_timer_index)
+ clienttime_timers.Cut(1,next_clienttime_timer_index+1)
+
+ if (MC_TICK_CHECK)
+ return
var/static/list/spent = list()
var/static/datum/timedevent/timer
- var/static/datum/timedevent/head
+ if (practical_offset > BUCKET_LEN)
+ head_offset += TICKS2DS(BUCKET_LEN)
+ practical_offset = 1
+ resumed = FALSE
- if (practical_offset > BUCKET_LEN || (!resumed && length(bucket_list) != BUCKET_LEN || world.tick_lag != bucket_resolution))
- shift_buckets()
+ if ((length(bucket_list) != BUCKET_LEN) || (world.tick_lag != bucket_resolution))
+ reset_buckets()
bucket_list = src.bucket_list
resumed = FALSE
if (!resumed)
timer = null
- head = null
- while (practical_offset <= BUCKET_LEN && head_offset + (practical_offset*world.tick_lag) <= world.time && !MC_TICK_CHECK)
+ while (practical_offset <= BUCKET_LEN && head_offset + (practical_offset*world.tick_lag) <= world.time)
+ var/datum/timedevent/head = bucket_list[practical_offset]
if (!timer || !head || timer == head)
head = bucket_list[practical_offset]
- if (!head)
- practical_offset++
- if (MC_TICK_CHECK)
- break
- continue
timer = head
- do
+ while (timer)
var/datum/callback/callBack = timer.callBack
if (!callBack)
- qdel(timer)
bucket_resolution = null //force bucket recreation
CRASH("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]")
@@ -113,15 +132,68 @@ SUBSYSTEM_DEF(timer)
callBack.InvokeAsync()
last_invoke_tick = world.time
- timer = timer.next
-
if (MC_TICK_CHECK)
return
- while (timer && timer != head)
- timer = null
+
+ timer = timer.next
+ if (timer == head)
+ break
+
+
bucket_list[practical_offset++] = null
- if (MC_TICK_CHECK)
- return
+
+ //we freed up a bucket, lets see if anything in second_queue needs to be shifted to that bucket.
+ var/i = 0
+ var/L = length(second_queue)
+ for (i in 1 to L)
+ timer = second_queue[i]
+ if (timer.timeToRun >= TIMER_MAX)
+ i--
+ break
+
+ if (timer.timeToRun < head_offset)
+ bucket_resolution = null //force bucket recreation
+ CRASH("[i] Invalid timer state: Timer in long run queue with a time to run less then head_offset. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]")
+
+ if (timer.callBack && !timer.spent)
+ timer.callBack.InvokeAsync()
+ spent += timer
+ bucket_count++
+ else if(!QDELETED(timer))
+ qdel(timer)
+ continue
+
+ if (timer.timeToRun < head_offset + TICKS2DS(practical_offset))
+ bucket_resolution = null //force bucket recreation
+ CRASH("[i] Invalid timer state: Timer in long run queue that would require a backtrack to transfer to short run queue. [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]")
+ if (timer.callBack && !timer.spent)
+ timer.callBack.InvokeAsync()
+ spent += timer
+ bucket_count++
+ else if(!QDELETED(timer))
+ qdel(timer)
+ continue
+
+ bucket_count++
+ var/bucket_pos = max(1, BUCKET_POS(timer))
+
+ var/datum/timedevent/bucket_head = bucket_list[bucket_pos]
+ if (!bucket_head)
+ bucket_list[bucket_pos] = timer
+ timer.next = null
+ timer.prev = null
+ continue
+
+ if (!bucket_head.prev)
+ bucket_head.prev = bucket_head
+ timer.next = bucket_head
+ timer.prev = bucket_head.prev
+ timer.next.prev = timer
+ timer.prev.next = timer
+ if (i)
+ second_queue.Cut(1, i+1)
+
+ timer = null
bucket_count -= length(spent)
@@ -141,7 +213,7 @@ SUBSYSTEM_DEF(timer)
if(!TE.callBack)
. += ", NO CALLBACK"
-/datum/controller/subsystem/timer/proc/shift_buckets()
+/datum/controller/subsystem/timer/proc/reset_buckets()
var/list/bucket_list = src.bucket_list
var/list/alltimers = list()
//collect the timers currently in the bucket
@@ -162,7 +234,7 @@ SUBSYSTEM_DEF(timer)
head_offset = world.time
bucket_resolution = world.tick_lag
- alltimers += processing
+ alltimers += second_queue
if (!length(alltimers))
return
@@ -173,22 +245,26 @@ SUBSYSTEM_DEF(timer)
if (head.timeToRun < head_offset)
head_offset = head.timeToRun
- var/list/timers_to_remove = list()
-
- for (var/thing in alltimers)
- var/datum/timedevent/timer = thing
+ var/new_bucket_count
+ var/i = 1
+ for (i in 1 to length(alltimers))
+ var/datum/timedevent/timer = alltimers[1]
if (!timer)
- timers_to_remove += timer
continue
var/bucket_pos = BUCKET_POS(timer)
- if (bucket_pos > BUCKET_LEN)
+ if (timer.timeToRun >= TIMER_MAX)
+ i--
break
- timers_to_remove += timer //remove it from the big list once we are done
+
if (!timer.callBack || timer.spent)
+ WARNING("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]")
+ if (timer.callBack)
+ qdel(timer)
continue
- bucket_count++
+
+ new_bucket_count++
var/datum/timedevent/bucket_head = bucket_list[bucket_pos]
if (!bucket_head)
bucket_list[bucket_pos] = timer
@@ -202,12 +278,14 @@ SUBSYSTEM_DEF(timer)
timer.prev = bucket_head.prev
timer.next.prev = timer
timer.prev.next = timer
-
- processing = (alltimers - timers_to_remove)
+ if (i)
+ alltimers.Cut(1, i+1)
+ second_queue = alltimers
+ bucket_count = new_bucket_count
/datum/controller/subsystem/timer/Recover()
- processing |= SStimer.processing
+ second_queue |= SStimer.second_queue
hashes |= SStimer.hashes
timer_id_dict |= SStimer.timer_id_dict
bucket_list |= SStimer.bucket_list
@@ -224,8 +302,6 @@ SUBSYSTEM_DEF(timer)
var/datum/timedevent/next
var/datum/timedevent/prev
- var/static/nextid = 1
-
/datum/timedevent/New(datum/callback/callBack, timeToRun, flags, hash)
id = TIMER_ID_NULL
src.callBack = callBack
@@ -235,56 +311,65 @@ SUBSYSTEM_DEF(timer)
if (flags & TIMER_UNIQUE)
SStimer.hashes[hash] = src
+
if (flags & TIMER_STOPPABLE)
- do
- if (nextid >= TIMER_ID_MAX)
- nextid = 1
- id = nextid++
- while(SStimer.timer_id_dict["timerid" + num2text(id, 8)])
- SStimer.timer_id_dict["timerid" + num2text(id, 8)] = src
+ id = GUID()
+ SStimer.timer_id_dict[id] = src
- name = "Timer: " + num2text(id, 8) + ", TTR: [timeToRun], Flags: [jointext(bitfield2list(flags, list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT")), ", ")], callBack: [REF(callBack)], callBack.object: [callBack.object][REF(callBack.object)]([getcallingtype()]), callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""])"
+ name = "Timer: [id] (\ref[src]), TTR: [timeToRun], Flags: [jointext(bitfield2list(flags, list("TIMER_UNIQUE", "TIMER_OVERRIDE", "TIMER_CLIENT_TIME", "TIMER_STOPPABLE", "TIMER_NO_HASH_WAIT")), ", ")], callBack: \ref[callBack], callBack.object: [callBack.object]\ref[callBack.object]([getcallingtype()]), callBack.delegate:[callBack.delegate]([callBack.arguments ? callBack.arguments.Join(", ") : ""])"
- if (spent)
- CRASH("HOLY JESUS. WHAT IS THAT? WHAT THE FUCK IS THAT?")
+ if ((timeToRun < world.time || timeToRun < SStimer.head_offset) && !(flags & TIMER_CLIENT_TIME))
+ CRASH("Invalid timer state: Timer created that would require a backtrack to run (addtimer would never let this happen): [SStimer.get_timer_debug_string(src)]")
if (callBack.object != GLOBAL_PROC)
LAZYADD(callBack.object.active_timers, src)
+
+ var/list/L
+
if (flags & TIMER_CLIENT_TIME)
- //sorted insert
- var/list/ctts = SStimer.clienttime_timers
- var/cttl = length(ctts)
+ L = SStimer.clienttime_timers
+ else if (timeToRun >= TIMER_MAX)
+ L = SStimer.second_queue
+
+
+ if (L)
+ //binary search sorted insert
+ var/cttl = length(L)
if(cttl)
- var/datum/timedevent/Last = ctts[cttl]
- if(Last.timeToRun >= timeToRun)
- ctts += src
- else
- for(var/i in cttl to 1 step -1)
- var/datum/timedevent/E = ctts[i]
- if(E.timeToRun <= timeToRun)
- ctts.Insert(i, src)
- break
+ var/left = 1
+ var/right = cttl
+ var/mid = (left+right) >> 1 //rounded divide by two for hedgehogs
+
+ var/datum/timedevent/item
+ while (left < right)
+ item = L[mid]
+ if (item.timeToRun <= timeToRun)
+ left = mid+1
+ else
+ right = mid
+ mid = (left+right) >> 1
+
+ item = L[mid]
+ mid = item.timeToRun > timeToRun ? mid : mid+1
+ L.Insert(mid, src)
+
else
- ctts += src
+ L += src
return
//get the list of buckets
var/list/bucket_list = SStimer.bucket_list
+
//calculate our place in the bucket list
var/bucket_pos = BUCKET_POS(src)
- //we are too far aways from needing to run to be in the bucket list, shift_buckets() will handle us.
- if (bucket_pos > length(bucket_list))
- SStimer.processing += src
- return
+
//get the bucket for our tick
var/datum/timedevent/bucket_head = bucket_list[bucket_pos]
SStimer.bucket_count++
//empty bucket, we will just add ourselves
if (!bucket_head)
bucket_list[bucket_pos] = src
- if (bucket_pos < SStimer.practical_offset)
- SStimer.practical_offset = bucket_pos
return
//other wise, lets do a simplified linked list add.
if (!bucket_head.prev)
@@ -296,10 +381,9 @@ SUBSYSTEM_DEF(timer)
/datum/timedevent/Destroy()
..()
- if (flags & TIMER_UNIQUE)
+ if (flags & TIMER_UNIQUE && hash)
SStimer.hashes -= hash
-
if (callBack && callBack.object && callBack.object != GLOBAL_PROC && callBack.object.active_timers)
callBack.object.active_timers -= src
UNSETEMPTY(callBack.object.active_timers)
@@ -307,13 +391,33 @@ SUBSYSTEM_DEF(timer)
callBack = null
if (flags & TIMER_STOPPABLE)
- SStimer.timer_id_dict -= "timerid" + num2text(id, 8)
+ SStimer.timer_id_dict -= id
if (flags & TIMER_CLIENT_TIME)
- SStimer.clienttime_timers -= src
+ if (!spent)
+ spent = world.time
+ SStimer.clienttime_timers -= src
return QDEL_HINT_IWILLGC
if (!spent)
+ spent = world.time
+ var/bucketpos = BUCKET_POS(src)
+ var/datum/timedevent/buckethead
+ var/list/bucket_list = SStimer.bucket_list
+ if (bucketpos > 0)
+ buckethead = bucket_list[bucketpos]
+
+ if (buckethead == src)
+ bucket_list[bucketpos] = next
+ SStimer.bucket_count--
+ else if (timeToRun < TIMER_MAX || next || prev)
+ SStimer.bucket_count--
+ else
+ var/l = length(SStimer.second_queue)
+ SStimer.second_queue -= src
+ if (l == length(SStimer.second_queue))
+ SStimer.bucket_count--
+
if (prev == next && next)
next.prev = null
prev.next = null
@@ -322,19 +426,6 @@ SUBSYSTEM_DEF(timer)
prev.next = next
if (next)
next.prev = prev
-
- var/bucketpos = BUCKET_POS(src)
- var/datum/timedevent/buckethead
- var/list/bucket_list = SStimer.bucket_list
-
- if (bucketpos > 0 && bucketpos <= length(bucket_list))
- buckethead = bucket_list[bucketpos]
- SStimer.bucket_count--
- else
- SStimer.processing -= src
-
- if (buckethead == src)
- bucket_list[bucketpos] = next
else
if (prev && prev.next == src)
prev.next = next
@@ -351,9 +442,16 @@ SUBSYSTEM_DEF(timer)
else
. = "[callBack.object.type]"
-/proc/addtimer(datum/callback/callback, wait, flags)
+/proc/addtimer(datum/callback/callback, wait = 0, flags = 0)
if (!callback)
- return
+ CRASH("addtimer called without a callback")
+
+ if (wait < 0)
+ stack_trace("Addtimer called with a negitive wait. Converting to 0")
+
+ //alot of things add short timers on themselves in their destroy, we ignore those cases
+ if (wait >= 1 && callback && callback.object && callback.object != GLOBAL_PROC && QDELETED(callback.object))
+ stack_trace("Add timer called with a callback assigned to a qdeleted object")
wait = max(wait, 0)
@@ -374,11 +472,10 @@ SUBSYSTEM_DEF(timer)
var/datum/timedevent/hash_timer = SStimer.hashes[hash]
if(hash_timer)
if (hash_timer.spent) //it's pending deletion, pretend it doesn't exist.
- hash_timer.hash = null
- SStimer.hashes -= hash
+ hash_timer.hash = null //but keep it from accidentally deleting us
else
-
if (flags & TIMER_OVERRIDE)
+ hash_timer.hash = null //no need having it delete it's hash if we are going to replace it
qdel(hash_timer)
else
if (hash_timer.flags & TIMER_STOPPABLE)
@@ -403,7 +500,7 @@ SUBSYSTEM_DEF(timer)
qdel(id)
return TRUE
//id is string
- var/datum/timedevent/timer = SStimer.timer_id_dict["timerid[id]"]
+ var/datum/timedevent/timer = SStimer.timer_id_dict[id]
if (timer && !timer.spent)
qdel(timer)
return TRUE
@@ -412,3 +509,5 @@ SUBSYSTEM_DEF(timer)
#undef BUCKET_LEN
#undef BUCKET_POS
+#undef TIMER_MAX
+#undef TIMER_ID_MAX
\ No newline at end of file
diff --git a/code/datums/antagonists/wizard.dm b/code/datums/antagonists/wizard.dm
index 740e7e156e..e1e6dc09c8 100644
--- a/code/datums/antagonists/wizard.dm
+++ b/code/datums/antagonists/wizard.dm
@@ -71,7 +71,7 @@
var/datum/objective/escape/escape_objective = new
escape_objective.owner = owner
objectives += escape_objective
-
+
if(31 to 60)
var/datum/objective/steal/steal_objective = new
steal_objective.owner = owner
@@ -103,8 +103,8 @@
if (!(locate(/datum/objective/hijack) in owner.objectives))
var/datum/objective/hijack/hijack_objective = new
hijack_objective.owner = owner
- objectives += hijack_objective
-
+ objectives += hijack_objective
+
for(var/datum/objective/O in objectives)
owner.objectives += O
@@ -128,7 +128,7 @@
if(H.age < wiz_age)
H.age = wiz_age
H.equipOutfit(outfit_type)
-
+
/datum/antagonist/wizard/greet()
to_chat(owner, "You are the Space Wizard!")
to_chat(owner, "The Space Wizards Federation has given you the following tasks:")
@@ -204,11 +204,11 @@
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/forcewall(null))
H.put_in_hands(new /obj/item/gun/magic/staff/healing(H))
to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned livesaving survival spells. You are able to cast charge and forcewall.")
- if(APPRENTICE_HEALING)
+ if(APPRENTICE_ROBELESS)
owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/mind_transfer(null))
to_chat(owner, "Your service has not gone unrewarded, however. Studying under [master.current.real_name], you have learned stealthy, robeless spells. You are able to cast knock and mindswap.")
-
+
/datum/antagonist/wizard/apprentice/create_objectives()
var/datum/objective/protect/new_objective = new /datum/objective/protect
new_objective.owner = owner
@@ -221,6 +221,7 @@
/datum/antagonist/wizard/apprentice/imposter
name = "Wizard Imposter"
allow_rename = FALSE
+ move_to_lair = FALSE
/datum/antagonist/wizard/apprentice/imposter/greet()
to_chat(owner, "You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!")
@@ -266,7 +267,7 @@
/datum/antagonist/wizard/academy/equip_wizard()
. = ..()
-
+
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt)
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile)
owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball)
@@ -274,7 +275,7 @@
var/mob/living/M = owner.current
if(!istype(M))
return
-
+
var/obj/item/implant/exile/Implant = new/obj/item/implant/exile(M)
Implant.implant(M)
diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm
index e346f60bff..c54376d787 100644
--- a/code/datums/components/_component.dm
+++ b/code/datums/components/_component.dm
@@ -14,13 +14,13 @@
if(!isnum(dupe_mode))
qdel(src)
CRASH("[type]: Invalid dupe_mode!")
- if(dupe_type && !ispath(dupe_type))
+ var/dt = dupe_type
+ if(dt && !ispath(dt))
qdel(src)
CRASH("[type]: Invalid dupe_type!")
parent = P
- var/list/arguments = args.Copy()
- arguments.Cut(1, 2)
+ var/list/arguments = args.Copy(2)
if(Initialize(arglist(arguments)) == COMPONENT_INCOMPATIBLE)
qdel(src, TRUE, TRUE)
return
@@ -142,10 +142,6 @@
/datum/component/proc/OnTransfer(datum/new_parent)
return
-/datum/component/proc/AfterComponentActivated()
- set waitfor = FALSE
- return
-
/datum/component/proc/_GetInverseTypeList(our_type = type)
#if DM_VERSION >= 513
#warning 512 is definitely stable now, remove the old code
@@ -167,8 +163,7 @@
var/list/comps = datum_components
if(!comps)
return NONE
- var/list/arguments = args.Copy()
- arguments.Cut(1, 2)
+ var/list/arguments = args.Copy(2)
var/target = comps[/datum/component]
if(!length(target))
var/datum/component/C = target
@@ -177,28 +172,16 @@
var/datum/callback/CB = C.signal_procs[sigtype]
if(!CB)
return NONE
- . = CB.InvokeAsync(arglist(arguments))
- if(. & COMPONENT_ACTIVATED)
- ComponentActivated(C)
- C.AfterComponentActivated()
- else
- . = NONE
- for(var/I in target)
- var/datum/component/C = I
- if(!C.enabled)
- continue
- var/datum/callback/CB = C.signal_procs[sigtype]
- if(!CB)
- continue
- var/retval = CB.InvokeAsync(arglist(arguments))
- . |= retval
- if(retval & COMPONENT_ACTIVATED)
- ComponentActivated(C)
- C.AfterComponentActivated()
-
-/datum/proc/ComponentActivated(datum/component/C)
- set waitfor = FALSE
- return
+ return CB.InvokeAsync(arglist(arguments))
+ . = NONE
+ for(var/I in target)
+ var/datum/component/C = I
+ if(!C.enabled)
+ continue
+ var/datum/callback/CB = C.signal_procs[sigtype]
+ if(!CB)
+ continue
+ . |= CB.InvokeAsync(arglist(arguments))
/datum/proc/GetComponent(c_type)
var/list/dc = datum_components
diff --git a/code/datums/components/archaeology.dm b/code/datums/components/archaeology.dm
index 05a56952b6..6fb2b67051 100644
--- a/code/datums/components/archaeology.dm
+++ b/code/datums/components/archaeology.dm
@@ -3,10 +3,12 @@
var/list/archdrops
var/prob2drop
var/dug
+ var/datum/callback/callback
-/datum/component/archaeology/Initialize(_prob2drop, list/_archdrops = list())
+/datum/component/archaeology/Initialize(_prob2drop, list/_archdrops = list(), datum/callback/_callback)
prob2drop = Clamp(_prob2drop, 0, 100)
archdrops = _archdrops
+ callback = _callback
RegisterSignal(COMSIG_PARENT_ATTACKBY,.proc/Dig)
RegisterSignal(COMSIG_ATOM_EX_ACT, .proc/BombDig)
RegisterSignal(COMSIG_ATOM_SING_PULL, .proc/SingDig)
@@ -67,6 +69,8 @@
if(OT.slowdown) //Things like snow slow you down until you dig them.
OT.slowdown = 0
dug = TRUE
+ if(callback)
+ callback.Invoke()
/datum/component/archaeology/proc/SingDig(S, current_size)
switch(current_size)
diff --git a/code/datums/components/infective.dm b/code/datums/components/infective.dm
index 5b2232b8a9..521d9ece2c 100644
--- a/code/datums/components/infective.dm
+++ b/code/datums/components/infective.dm
@@ -9,5 +9,4 @@
var/mob/living/carbon/victim = AM
if(istype(victim))
for(var/datum/disease/D in diseases)
- victim.ContactContractDisease(D, "feet")
- return COMPONENT_ACTIVATED
\ No newline at end of file
+ victim.ContactContractDisease(D, "feet")
\ No newline at end of file
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index ec9ac1d1e6..b33cee4059 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -16,20 +16,19 @@
var/list/materials
var/show_on_examine
var/list/allowed_typecache
- var/last_inserted_type
var/last_inserted_id
- var/last_amount_inserted
- var/last_insert_success
var/precise_insertion = FALSE
var/datum/callback/precondition
+ var/datum/callback/after_insert
-/datum/component/material_container/Initialize(list/mat_list, max_amt = 0, _show_on_examine = FALSE, list/allowed_types, datum/callback/_precondition)
+/datum/component/material_container/Initialize(list/mat_list, max_amt = 0, _show_on_examine = FALSE, list/allowed_types, datum/callback/_precondition, datum/callback/_after_insert)
materials = list()
max_amount = max(0, max_amt)
show_on_examine = _show_on_examine
if(allowed_types)
allowed_typecache = typecacheof(allowed_types)
precondition = _precondition
+ after_insert = _after_insert
RegisterSignal(COMSIG_PARENT_ATTACKBY, .proc/OnAttackBy)
RegisterSignal(COMSIG_PARENT_EXAMINE, .proc/OnExamine)
@@ -57,10 +56,9 @@
if((I.flags_2 & (HOLOGRAM_2 | NO_MAT_REDEMPTION_2)) || (tc && !is_type_in_typecache(I, tc)))
to_chat(user, "[parent] won't accept [I]!")
return
- . = COMPONENT_ACTIVATED | COMPONENT_NO_AFTERATTACK
- last_insert_success = FALSE
+ . = COMPONENT_NO_AFTERATTACK
var/datum/callback/pc = precondition
- if(pc && !pc.Invoke())
+ if(pc && !pc.Invoke(user))
return
var/material_amount = get_item_material_amount(I)
if(!material_amount)
@@ -69,11 +67,12 @@
if(!has_space(material_amount))
to_chat(user, "[parent] is full. Please remove metal or glass from [parent] in order to insert more.")
return
- INVOKE_ASYNC(src, .proc/user_insert, I, user)
+ user_insert(I, user)
/datum/component/material_container/proc/user_insert(obj/item/I, mob/living/user)
var/requested_amount
- if(istype(I, /obj/item/stack) && precise_insertion)
+ var/Itype = I.type
+ if(ispath(Itype, /obj/item/stack) && precise_insertion)
var/atom/current_parent = parent
requested_amount = input(user, "How much do you want to insert?", "Inserting sheets") as num|null
if(isnull(requested_amount) || (requested_amount <= 0))
@@ -85,7 +84,6 @@
return
var/inserted = insert_item(I, stack_amt = requested_amount)
if(inserted)
- last_insert_success = TRUE
if(istype(I, /obj/item/stack))
to_chat(user, "You insert [inserted] sheet[inserted>1 ? "s" : ""] into [parent].")
if(!QDELETED(I))
@@ -93,6 +91,8 @@
else
to_chat(user, "You insert a material total of [inserted] into [parent].")
qdel(I)
+ if(after_insert)
+ after_insert.Invoke(Itype, last_inserted_id, inserted)
else
user.put_in_active_hand(I)
@@ -132,9 +132,7 @@
return FALSE
last_inserted_id = insert_materials(S,amt)
- last_inserted_type = S.type
S.use(amt)
- last_amount_inserted = amt
return amt
/datum/component/material_container/proc/insert_item(obj/item/I, multiplier = 1, stack_amt)
@@ -148,8 +146,6 @@
return FALSE
last_inserted_id = insert_materials(I, multiplier)
- last_inserted_type = I.type
- last_amount_inserted = material_amount
return material_amount
/datum/component/material_container/proc/insert_materials(obj/item/I, multiplier = 1) //for internal usage only
diff --git a/code/datums/components/riding.dm b/code/datums/components/riding.dm
index 9ce1a4b844..e21db3e094 100644
--- a/code/datums/components/riding.dm
+++ b/code/datums/components/riding.dm
@@ -131,7 +131,7 @@
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 0
if(buckled_mob.client)
- buckled_mob.client.change_view(world.view)
+ buckled_mob.client.change_view(CONFIG_GET(string/default_view))
//MOVEMENT
/datum/component/riding/proc/turf_check(turf/next, turf/current)
diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm
index c174ba5ecb..24cb22020d 100644
--- a/code/datums/components/slippery.dm
+++ b/code/datums/components/slippery.dm
@@ -1,18 +1,15 @@
/datum/component/slippery
var/intensity
var/lube_flags
- var/mob/slip_victim
+ var/datum/callback/callback
-/datum/component/slippery/Initialize(_intensity, _lube_flags = NONE)
+/datum/component/slippery/Initialize(_intensity, _lube_flags = NONE, datum/callback/_callback)
intensity = max(_intensity, 0)
lube_flags = _lube_flags
+ callback = _callback
RegisterSignal(list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED), .proc/Slip)
/datum/component/slippery/proc/Slip(atom/movable/AM)
var/mob/victim = AM
- if(istype(victim) && !victim.is_flying() && victim.slip(intensity, parent, lube_flags))
- slip_victim = victim
- return COMPONENT_ACTIVATED
-
-/datum/component/slippery/AfterComponentActivated()
- slip_victim = null
+ if(istype(victim) && !victim.is_flying() && victim.slip(intensity, parent, lube_flags) && callback)
+ callback.Invoke(victim)
diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
index a3f510f0dd..562311180d 100644
--- a/code/datums/looping_sounds/machinery_sounds.dm
+++ b/code/datums/looping_sounds/machinery_sounds.dm
@@ -4,7 +4,7 @@
mid_sounds = list('sound/machines/shower/shower_mid1.ogg'=1,'sound/machines/shower/shower_mid2.ogg'=1,'sound/machines/shower/shower_mid3.ogg'=1)
mid_length = 10
end_sound = 'sound/machines/shower/shower_end.ogg'
- volume = 25
+ volume = 20
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm
index 6aa1c48d8a..e372d5c0b2 100644
--- a/code/datums/saymode.dm
+++ b/code/datums/saymode.dm
@@ -109,4 +109,4 @@
var/mob/living/silicon/ai/AI = user
AI.holopad_talk(message, language)
return FALSE
- return FALSE
\ No newline at end of file
+ return TRUE
diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm
index 1ec392a5b2..1a0c19f5ab 100644
--- a/code/datums/shuttles.dm
+++ b/code/datums/shuttles.dm
@@ -94,7 +94,13 @@
admin_notes = "Due to the limited space for non paying crew, this shuttle may cause a riot."
credit_cost = 10000
-
+/datum/map_template/shuttle/emergency/discoinferno
+ suffix = "discoinferno"
+ name = "Disco Inferno"
+ description = "The glorious results of centuries of plasma research done by Nanotrasen employees. This is the reason why you are here. Get on and dance like you're on fire, burn baby burn!"
+ admin_notes = "Flaming hot."
+ credit_cost = 10000
+
/datum/map_template/shuttle/emergency/arena
suffix = "arena"
name = "The Arena"
diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm
index c3296175fb..c5e3d25375 100644
--- a/code/game/area/Space_Station_13_areas.dm
+++ b/code/game/area/Space_Station_13_areas.dm
@@ -171,6 +171,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
/area/maintenance/department/science/xenobiology
name = "Xenobiology Maintenance"
icon_state = "xenomaint"
+ xenobiology_compatible = TRUE
//Maintenance - Generic
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index 17f75fc336..28209558d7 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -61,6 +61,7 @@
var/list/cameras
var/list/firealarms
var/firedoors_last_closed_on = 0
+ var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default?
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 6c467bc53b..b7d377fb61 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -37,7 +37,7 @@
GLOB._preloader.load(src)
var/do_initialize = SSatoms.initialized
- if(do_initialize > INITIALIZATION_INSSATOMS)
+ if(do_initialize != INITIALIZATION_INSSATOMS)
args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD
if(SSatoms.InitAtom(src, args))
//we were deleted
@@ -57,9 +57,7 @@
//Note: the following functions don't call the base for optimization and must copypasta:
// /turf/Initialize
// /turf/open/space/Initialize
-// /mob/dead/new_player/Initialize
-//Do also note that this proc always runs in New for /mob/dead
/atom/proc/Initialize(mapload, ...)
if(initialized)
stack_trace("Warning: [src]([type]) initialized multiple times!")
diff --git a/code/game/gamemodes/miniantags/borer/borer_event.dm b/code/game/gamemodes/miniantags/borer/borer_event.dm
index 6875a97db5..567adddf53 100644
--- a/code/game/gamemodes/miniantags/borer/borer_event.dm
+++ b/code/game/gamemodes/miniantags/borer/borer_event.dm
@@ -1,8 +1,8 @@
/datum/round_event_control/borer
name = "Borer"
typepath = /datum/round_event/borer
- weight = 10 //Default weight
- max_occurrences = 1
+ weight = 0
+ max_occurrences = 0
min_players = 20 //10 is MINIMUM needed, but this is not a gamemode that does well in lowpop
earliest_start = 24000 //40 min, double default timer
diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
index c7a09bb387..c401dfea52 100644
--- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
+++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm
@@ -254,6 +254,9 @@
if(T.type == /turf/closed/wall/r_wall && prob(10))
new /obj/effect/temp_visual/revenant(T)
T.ChangeTurf(/turf/closed/wall/r_wall/rust)
+ for(var/obj/effect/decal/cleanable/salt/salt in T)
+ new /obj/effect/temp_visual/revenant(T)
+ qdel(salt)
for(var/obj/structure/closet/closet in T.contents)
closet.open()
for(var/obj/structure/bodycontainer/corpseholder in T)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 9354bd73ae..61a5d7271d 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -1,6 +1,6 @@
/obj/machinery/sleep_console
name = "sleeper console"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "console"
density = FALSE
anchored = TRUE
@@ -8,7 +8,7 @@
/obj/machinery/sleeper
name = "sleeper"
desc = "An enclosed machine used to stabilize and heal patients."
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
density = FALSE
anchored = TRUE
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index d783be292e..9ce42f580c 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -46,7 +46,7 @@
)
/obj/machinery/autolathe/Initialize()
- AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS))
+ AddComponent(/datum/component/material_container, list(MAT_METAL, MAT_GLASS), 0, FALSE, null, null, CALLBACK(src, .proc/AfterMaterialInsert))
. = ..()
wires = new /datum/wires/autolathe(src)
@@ -124,23 +124,17 @@
return ..()
-/obj/machinery/mecha_part_fabricator/ComponentActivated(datum/component/C)
- ..()
- if(istype(C, /datum/component/material_container))
- var/datum/component/material_container/M = C
- if(!M.last_insert_success)
- return
- var/lit = M.last_inserted_type
- if(ispath(lit, /obj/item/ore/bluespace_crystal))
- use_power(max(500,M.last_amount_inserted/10))
- else
- switch(M.last_inserted_id)
- if (MAT_METAL)
- flick("autolathe_o",src)//plays metal insertion animation
- if (MAT_GLASS)
- flick("autolathe_r",src)//plays glass insertion animation
- use_power(M.last_amount_inserted*100)
- updateUsrDialog()
+/obj/machinery/autolathe/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted)
+ if(ispath(type_inserted, /obj/item/ore/bluespace_crystal))
+ use_power(max(500, amount_inserted / 10))
+ else
+ switch(id_inserted)
+ if (MAT_METAL)
+ flick("autolathe_o",src)//plays metal insertion animation
+ if (MAT_GLASS)
+ flick("autolathe_r",src)//plays glass insertion animation
+ use_power(amount_inserted * 100)
+ updateUsrDialog()
/obj/machinery/autolathe/Topic(href, href_list)
if(..())
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 23bfc72f87..af1a168a3b 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -5,7 +5,7 @@
/obj/machinery/camera
name = "security camera"
desc = "It's used to monitor rooms."
- icon = 'icons/obj/monitors.dmi'
+ icon = 'icons/obj/machines/camera.dmi'
icon_state = "camera"
use_power = ACTIVE_POWER_USE
idle_power_usage = 5
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 1424944633..952011d595 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -1,7 +1,7 @@
/obj/item/wallframe/camera
name = "camera assembly"
desc = "The basic construction for Nanotrasen-Always-Watching-You cameras."
- icon = 'icons/obj/monitors.dmi'
+ icon = 'icons/obj/machines/camera.dmi'
icon_state = "cameracase"
materials = list(MAT_METAL=400, MAT_GLASS=250)
result_path = /obj/structure/camera_assembly
@@ -10,7 +10,7 @@
/obj/structure/camera_assembly
name = "camera assembly"
desc = "The basic construction for Nanotrasen-Always-Watching-You cameras."
- icon = 'icons/obj/monitors.dmi'
+ icon = 'icons/obj/machines/camera.dmi'
icon_state = "camera1"
max_integrity = 150
// Motion, EMP-Proof, X-Ray
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 9b35f06acc..4cd7e7f0fe 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -13,7 +13,7 @@
name = "cloning pod"
desc = "An electronically-lockable pod for growing organic tissue."
density = TRUE
- icon = 'icons/obj/cloning.dmi'
+ icon = 'icons/obj/machines/cloning.dmi'
icon_state = "pod_0"
req_access = list(ACCESS_CLONING) //FOR PREMATURE UNLOCKING.
verb_say = "states"
diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm
index aa644eb738..cbdc28883f 100644
--- a/code/game/machinery/computer/apc_control.dm
+++ b/code/game/machinery/computer/apc_control.dm
@@ -66,7 +66,7 @@
if(result_filters["Responsive"] && !APC.aidisabled)
continue
dat += "[A]
\
- Charge: [DisplayPower(APC.cell.charge)] / [DisplayPower(APC.cell.maxcharge)] ([round((APC.cell.charge / APC.cell.maxcharge) * 100)]%)
\
+ Charge: [DisplayEnergy(APC.cell.charge)] / [DisplayEnergy(APC.cell.maxcharge)] ([round((APC.cell.charge / APC.cell.maxcharge) * 100)]%)
\
Area: [APC.area]
\
[APC.aidisabled || APC.panel_open ? "APC does not respond to interface query." : "APC responds to interface query."]
"
dat += "Check Logs
"
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index 780b7ac1f2..d1189ff8b8 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -1,7 +1,7 @@
/obj/machinery/dna_scannernew
name = "\improper DNA scanner"
desc = "It scans DNA structures."
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/cloning.dmi'
icon_state = "scanner"
density = TRUE
anchored = TRUE
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index ad746d089f..edb5529840 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -22,7 +22,7 @@
layer = BELOW_OPEN_DOOR_LAYER
closingLayer = CLOSED_FIREDOOR_LAYER
assemblytype = /obj/structure/firelock_frame
- armor = list(melee = 30, bullet = 30, laser = 20, energy = 20, bomb = 10, bio = 100, rad = 100, fire = 95, acid = 70)
+ armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 95, "acid" = 70)
var/boltslocked = TRUE
var/list/affecting_areas
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index d3825b9afe..53c0b746bd 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -2,7 +2,7 @@
/obj/machinery/suit_storage_unit
name = "suit storage unit"
desc = "An industrial unit made to hold space suits. It comes with a built-in UV cauterization mechanism. A small warning label advises that organic matter should not be placed into the unit."
- icon = 'icons/obj/suitstorage.dmi'
+ icon = 'icons/obj/machines/suit_storage.dmi'
icon_state = "close"
anchored = TRUE
density = TRUE
@@ -210,7 +210,7 @@
mob_occupant.adjustFireLoss(rand(20, 36))
else
mob_occupant.adjustFireLoss(rand(10, 16))
- mob_occupant.emote("scream")
+ mob_occupant.emote("scream")
addtimer(CALLBACK(src, .proc/cook), 50)
else
uv_cycles = initial(uv_cycles)
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index db7d359ffb..eb51703642 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -138,7 +138,7 @@
if(isnull(amount))
amount = 0
- var/atom/temp = new typepath(null)
+ var/atom/temp = typepath
var/datum/data/vending_product/R = new /datum/data/vending_product()
R.product_name = initial(temp.name)
R.product_path = typepath
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index ebac3fb6d2..1099095b46 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -32,7 +32,7 @@
/obj/item/mecha_parts/mecha_equipment/medical/sleeper
name = "mounted sleeper"
desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves."
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
origin_tech = "engineering=3;biotech=3;plasmatech=2"
energy_drain = 20
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index be0f596ced..59aad6154f 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -34,13 +34,14 @@
"Misc"
)
+ var/datum/component/material_container/materials
+
/obj/machinery/mecha_part_fabricator/Initialize()
- var/datum/component/material_container/materials = AddComponent(/datum/component/material_container,
- list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),
- FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready))
- materials.precise_insertion = TRUE
- . = ..()
- files = new /datum/research(src) //Setup the research data holder.
+ materials = AddComponent(/datum/component/material_container,
+ list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
+ FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
+ materials.precise_insertion = TRUE
+ return ..()
/obj/machinery/mecha_part_fabricator/RefreshParts()
var/T = 0
@@ -415,16 +416,11 @@
materials.retrieve_all()
..()
-/obj/machinery/mecha_part_fabricator/ComponentActivated(datum/component/C)
- ..()
- if(istype(C, /datum/component/material_container))
- var/datum/component/material_container/M = C
- if(!M.last_insert_success)
- return
- var/stack_name = material2name(M.last_inserted_id)
- add_overlay("fab-load-[stack_name]")
- addtimer(CALLBACK(src, /atom/proc/cut_overlay, "fab-load-[stack_name]"), 10)
- updateUsrDialog()
+/obj/machinery/mecha_part_fabricator/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted)
+ var/stack_name = material2name(id_inserted)
+ add_overlay("fab-load-[stack_name]")
+ addtimer(CALLBACK(src, /atom/proc/cut_overlay, "fab-load-[stack_name]"), 10)
+ updateUsrDialog()
/obj/machinery/mecha_part_fabricator/attackby(obj/item/W, mob/user, params)
if(default_deconstruction_screwdriver(user, "fab-o", "fab-idle", W))
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 10d4638eb0..ba41609fca 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -970,7 +970,7 @@
setDir(dir_in)
if(L && L.client)
- L.client.change_view(world.view)
+ L.client.change_view(CONFIG_GET(string/default_view))
zoom_mode = 0
/////////////////////////
@@ -1042,4 +1042,4 @@ GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013???
/obj/mecha/update_remote_sight(mob/living/user)
if(occupant_sight_flags)
if(user == occupant)
- user.sight |= occupant_sight_flags
\ No newline at end of file
+ user.sight |= occupant_sight_flags
diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm
index ec6bd6e471..480c24b87f 100644
--- a/code/game/mecha/mecha_actions.dm
+++ b/code/game/mecha/mecha_actions.dm
@@ -244,7 +244,7 @@
owner.client.change_view(12)
SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50))
else
- owner.client.change_view(world.view) //world.view - default mob view size
+ owner.client.change_view(CONFIG_GET(string/default_view)) //world.view - default mob view size
UpdateButtonIcon()
/datum/action/innate/mecha/mech_switch_damtype
diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm
index 4f2db14fa6..b1a4a9f6f8 100644
--- a/code/game/objects/items/devices/PDA/PDA_types.dm
+++ b/code/game/objects/items/devices/PDA/PDA_types.dm
@@ -10,16 +10,11 @@
/obj/item/device/pda/clown/Initialize()
. = ..()
- AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING)
+ AddComponent(/datum/component/slippery, 120, NO_SLIP_WHEN_WALKING, CALLBACK(src, .proc/AfterSlip))
-/obj/item/device/pda/clown/ComponentActivated(datum/component/C)
- ..()
- var/datum/component/slippery/S = C
- if(!istype(S))
- return
- var/mob/living/carbon/human/M = S.slip_victim
- if (istype(M) && (M.real_name != src.owner))
- slipvictims |= M
+/obj/item/device/pda/clown/proc/AfterSlip(mob/living/carbon/human/M)
+ if (istype(M) && (M.real_name != owner))
+ slipvictims |=M
var/obj/item/cartridge/virus/clown/cart = cartridge
if(istype(cart) && cart.charges < 5)
cart.charges++
diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm
index 204a1f81d9..7f9a53557c 100644
--- a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm
+++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm
@@ -30,7 +30,7 @@
to_chat(R, "You need a power cell installed for that.")
return
if(!R.cell.use(circuit_cost))
- to_chat(R, "You don't have the power for that (you need [DisplayPower(circuit_cost)].)")
+ to_chat(R, "You don't have the energy for that (you need [DisplayEnergy(circuit_cost)].)")
return
if(recharging)
to_chat(R, "[src] needs some time to recharge first.")
diff --git a/code/game/objects/items/implants/implantuplink.dm b/code/game/objects/items/implants/implantuplink.dm
index 5022d7043f..d1d5adf4b5 100644
--- a/code/game/objects/items/implants/implantuplink.dm
+++ b/code/game/objects/items/implants/implantuplink.dm
@@ -34,6 +34,7 @@
/obj/item/implant/uplink/activate()
GET_COMPONENT(hidden_uplink, /datum/component/uplink)
if(hidden_uplink)
+ hidden_uplink.locked = FALSE
hidden_uplink.interact(usr)
/obj/item/implanter/uplink
diff --git a/code/game/objects/items/inducer.dm b/code/game/objects/items/inducer.dm
index e720644055..a2d69764c5 100644
--- a/code/game/objects/items/inducer.dm
+++ b/code/game/objects/items/inducer.dm
@@ -162,7 +162,7 @@
/obj/item/inducer/examine(mob/living/M)
..()
if(cell)
- to_chat(M, "Its display shows: [DisplayPower(cell.charge)].")
+ to_chat(M, "Its display shows: [DisplayEnergy(cell.charge)].")
else
to_chat(M,"Its display is dark.")
if(opened)
diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
new file mode 100644
index 0000000000..dfec9ca2b8
--- /dev/null
+++ b/code/game/objects/items/pet_carrier.dm
@@ -0,0 +1,194 @@
+#define pet_carrier_full(carrier) carrier.occupants.len >= carrier.max_occupants || carrier.occupant_weight >= carrier.max_occupant_weight
+
+//Used to transport little animals without having to drag them across the station.
+//Comes with a handy lock to prevent them from running off.
+/obj/item/pet_carrier
+ name = "pet carrier"
+ desc = "A big white-and-blue pet carrier. Good for carrying meat to the chef cute animals around."
+ icon = 'icons/obj/pet_carrier.dmi'
+ icon_state = "pet_carrier_open"
+ item_state = "pet_carrier"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+ force = 5
+ attack_verb = list("bashed", "carried")
+ w_class = WEIGHT_CLASS_BULKY
+ throw_speed = 2
+ throw_range = 3
+ materials = list(MAT_METAL = 7500, MAT_GLASS = 100)
+ var/open = TRUE
+ var/locked = FALSE
+ var/list/occupants = list()
+ var/occupant_weight = 0
+ var/max_occupants = 3 //Hard-cap so you can't have infinite mice or something in one carrier
+ var/max_occupant_weight = MOB_SIZE_SMALL //This is calculated from the mob sizes of occupants
+
+/obj/item/pet_carrier/Destroy()
+ if(occupants.len)
+ for(var/V in occupants)
+ remove_occupant(V)
+ return ..()
+
+/obj/item/pet_carrier/Exited(atom/movable/occupant)
+ if(occupant in occupants && isliving(occupant))
+ var/mob/living/L = occupant
+ occupants -= occupant
+ occupant_weight -= L.mob_size
+
+/obj/item/pet_carrier/handle_atom_del(atom/A)
+ if(A in occupants && isliving(A))
+ var/mob/living/L = A
+ occupants -= L
+ occupant_weight -= L.mob_size
+ ..()
+
+/obj/item/pet_carrier/examine(mob/user)
+ ..()
+ if(occupants.len)
+ for(var/V in occupants)
+ var/mob/living/L = V
+ to_chat(user, "It has [L] inside.")
+ else
+ to_chat(user, "It has nothing inside.")
+ if(user.canUseTopic(src))
+ to_chat(user, "Activate it in your hand to [open ? "close" : "open"] its door.")
+ if(!open)
+ to_chat(user, "Alt-click to [locked ? "unlock" : "lock"] its door.")
+
+/obj/item/pet_carrier/attack_self(mob/living/user)
+ if(open)
+ to_chat(user, "You close [src]'s door.")
+ playsound(user, 'sound/effects/bin_close.ogg', 50, TRUE)
+ open = FALSE
+ else
+ if(locked)
+ to_chat(user, "[src] is locked!")
+ return
+ to_chat(user, "You open [src]'s door.")
+ playsound(user, 'sound/effects/bin_open.ogg', 50, TRUE)
+ open = TRUE
+ update_icon()
+
+/obj/item/pet_carrier/AltClick(mob/living/user)
+ if(open)
+ return
+ locked = !locked
+ to_chat(user, "You flip the lock switch [locked ? "down" : "up"].")
+ if(locked)
+ playsound(user, 'sound/machines/boltsdown.ogg', 30, TRUE)
+ else
+ playsound(user, 'sound/machines/boltsup.ogg', 30, TRUE)
+ update_icon()
+
+/obj/item/pet_carrier/attack(mob/living/target, mob/living/user)
+ if(user.a_intent == INTENT_HARM)
+ return ..()
+ if(!open)
+ to_chat(user, "You need to open [src]'s door!")
+ return
+ if(target.mob_size > max_occupant_weight)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ if(iscatperson(H))
+ to_chat(user, "You'd need a lot of catnip and treats, plus maybe a laser pointer, for that to work.")
+ else
+ to_chat(user, "Humans, generally, do not fit into pet carriers.")
+ else
+ to_chat(user, "You get the feeling [target] isn't meant for a [name].")
+ return
+ if(user == target)
+ to_chat(user, "Why would you ever do that?")
+ return
+ load_occupant(user, target)
+
+/obj/item/pet_carrier/relaymove(mob/living/user, direction)
+ if(open)
+ loc.visible_message("[user] climbs out of [src]!", \
+ "[user] jumps out of [src]!")
+ remove_occupant(user)
+ return
+ else if(!locked)
+ loc.visible_message("[user] pushes open the door to [src]!", \
+ "[user] pushes open the door of [src]!")
+ open = TRUE
+ update_icon()
+ return
+ else if(user.client)
+ container_resist(user)
+
+/obj/item/pet_carrier/container_resist(mob/living/user)
+ user.changeNext_move(CLICK_CD_BREAKOUT)
+ user.last_special = world.time + CLICK_CD_BREAKOUT
+ if(user.mob_size <= MOB_SIZE_SMALL)
+ to_chat(user, "You poke a limb through [src]'s bars and start fumbling for the lock switch... (This will take some time.)")
+ to_chat(loc, "You see [user] reach through the bars and fumble for the lock switch!")
+ if(!do_after(user, rand(300, 400), target = user) || open || !locked || !user in occupants)
+ return
+ loc.visible_message("[user] flips the lock switch on [src] by reaching through!", ignored_mob = user)
+ to_chat(user, "Bingo! The lock pops open!")
+ locked = FALSE
+ playsound(src, 'sound/machines/boltsup.ogg', 30, TRUE)
+ update_icon()
+ else
+ loc.visible_message("[src] starts rattling as something pushes against the door!", ignored_mob = user)
+ to_chat(user, "You start pushing out of [src]... (This will take about 20 seconds.)")
+ if(!do_after(user, 200, target = user) || open || !locked || !user in occupants)
+ return
+ loc.visible_message("[user] shoves out of [src]!", ignored_mob = user)
+ to_chat(user, "You shove open [src]'s door against the lock's resistance and fall out!")
+ locked = FALSE
+ open = TRUE
+ update_icon()
+ remove_occupant(user)
+
+/obj/item/pet_carrier/update_icon()
+ cut_overlay("unlocked")
+ cut_overlay("locked")
+ if(open)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "pet_carrier_[!occupants.len ? "closed" : "occupied"]"
+ add_overlay("[locked ? "" : "un"]locked")
+
+/obj/item/pet_carrier/MouseDrop(atom/over_atom)
+ if(isopenturf(over_atom) && usr.Adjacent(over_atom) && open && occupants.len)
+ usr.visible_message("[usr] unloads [src].", \
+ "You unload [src] onto [over_atom].")
+ for(var/V in occupants)
+ remove_occupant(V, over_atom)
+
+/obj/item/pet_carrier/proc/load_occupant(mob/living/user, mob/living/target)
+ if(pet_carrier_full(src))
+ to_chat(user, "[src] is already carrying too much!")
+ return
+ user.visible_message("[user] starts loading [target] into [src].", \
+ "You start loading [target] into [src]...", ignored_mob = target)
+ to_chat(target, "[user] starts loading you into their [name]!")
+ if(!do_mob(user, target, 30))
+ return
+ if(target in occupants)
+ return
+ if(pet_carrier_full(src)) //Run the checks again, just in case
+ to_chat(user, "[src] is already carrying too much!")
+ return
+ user.visible_message("[user] loads [target] into [src]!", \
+ "You load [target] into [src].", ignored_mob = target)
+ to_chat(target, "[user] loads you into their [name]!")
+ add_occupant(target)
+
+/obj/item/pet_carrier/proc/add_occupant(mob/living/occupant)
+ if(occupant in occupants || !istype(occupant))
+ return
+ occupant.forceMove(src)
+ occupants += occupant
+ occupant_weight += occupant.mob_size
+
+/obj/item/pet_carrier/proc/remove_occupant(mob/living/occupant, turf/new_turf)
+ if(!occupant in occupants || !istype(occupant))
+ return
+ occupant.forceMove(new_turf ? new_turf : drop_location())
+ occupants -= occupant
+ occupant_weight -= occupant.mob_size
+ occupant.setDir(SOUTH)
+
+#undef pet_carrier_full
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index 0351fdc596..5402abdfee 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -73,6 +73,7 @@
new /obj/item/device/autosurgeon/cmo(src)
new /obj/item/door_remote/chief_medical_officer(src)
new /obj/item/clothing/neck/petcollar(src)
+ new /obj/item/pet_carrier(src)
/obj/structure/closet/secure_closet/animal
name = "animal control"
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 3cb3edb8c2..7f36acaae9 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -12,6 +12,7 @@
new /obj/item/storage/backpack/satchel/cap(src)
new /obj/item/clothing/neck/cloak/cap(src)
new /obj/item/clothing/neck/petcollar(src)
+ new /obj/item/pet_carrier(src)
new /obj/item/storage/backpack/duffelbag/captain(src)
new /obj/item/clothing/head/crown/fancy(src)
new /obj/item/clothing/suit/captunic(src)
@@ -53,6 +54,7 @@
new /obj/item/restraints/handcuffs/cable/zipties(src)
new /obj/item/gun/energy/e_gun/cx(src)
new /obj/item/clothing/neck/petcollar(src)
+ new /obj/item/pet_carrier(src)
new /obj/item/door_remote/civillian(src)
/obj/structure/closet/secure_closet/hos
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index a151406ef3..7dcd8c107a 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -33,7 +33,7 @@
/obj/structure/fluff/empty_sleeper //Empty sleepers are created by a good few ghost roles in lavaland.
name = "empty sleeper"
desc = "An open sleeper. It looks as though it would be awaiting another patient, were it not broken."
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper-open"
/obj/structure/fluff/empty_sleeper/nanotrasen
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 9a2798eacc..fe6a8c69c2 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -76,7 +76,7 @@
name = "timeless prison"
desc = "Although this stasis pod looks medicinal, it seems as though it's meant to preserve something for a very long time."
mob_name = "a penitent exile"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
@@ -259,7 +259,7 @@
name = "prisoner containment sleeper"
desc = "A sleeper designed to put its occupant into a deep coma, unbreakable until the sleeper turns off. This one's glass is cracked and you can see a pale, sleeping face staring out."
mob_name = "an escaped prisoner"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper_s"
outfit = /datum/outfit/lavalandprisoner
roundstart = FALSE
@@ -296,7 +296,7 @@
name = "staff sleeper"
desc = "A sleeper designed for long-term stasis between guest visits."
mob_name = "hotel staff member"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper_s"
objectives = "Cater to visiting guests with your fellow staff. Do not leave your assigned hotel and always remember: The customer is always right!"
death = FALSE
@@ -393,7 +393,7 @@
name = "Syndicate Operative"
roundstart = FALSE
death = FALSE
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper_s"
id_access_list = list(ACCESS_SYNDICATE)
outfit = /datum/outfit/syndicate_empty
@@ -461,7 +461,7 @@
name = "old cryogenics pod"
desc = "A humming cryo pod. You can barely recognise a security uniform underneath the built up ice. The machine is attempting to wake up its occupant."
mob_name = "a security officer"
- icon = 'icons/obj/cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
@@ -485,7 +485,7 @@
name = "old cryogenics pod"
desc = "A humming cryo pod. You can barely recognise an engineering uniform underneath the built up ice. The machine is attempting to wake up its occupant."
mob_name = "an engineer"
- icon = 'icons/obj/cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
@@ -509,7 +509,7 @@
name = "old cryogenics pod"
desc = "A humming cryo pod. You can barely recognise a science uniform underneath the built up ice. The machine is attempting to wake up its occupant."
mob_name = "a scientist"
- icon = 'icons/obj/cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
@@ -535,7 +535,7 @@
name = "space pirate sleeper"
desc = "A cryo sleeper smelling faintly of rum."
random = TRUE
- icon = 'icons/obj/cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
mob_name = "a space pirate"
mob_species = /datum/species/human
@@ -561,7 +561,7 @@
/obj/effect/mob_spawn/human/pirate/Destroy()
new/obj/structure/showcase/machinery/oldpod/used(drop_location())
return ..()
-
+
/obj/effect/mob_spawn/human/pirate/captain
rank = "Captain"
outfit = /datum/outfit/pirate/space/captain
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 45aa4a0889..009bbcd70e 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -26,7 +26,7 @@
update_icon()
/obj/structure/grille/update_icon()
- if(QDELETED(src))
+ if(QDELETED(src) || broken)
return
var/ratio = obj_integrity / max_integrity
diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm
index 669abb792a..ceef3ef0c0 100644
--- a/code/game/objects/structures/manned_turret.dm
+++ b/code/game/objects/structures/manned_turret.dm
@@ -37,7 +37,7 @@
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 0
if(buckled_mob.client)
- buckled_mob.client.change_view(world.view)
+ buckled_mob.client.change_view(CONFIG_GET(string/default_view))
anchored = FALSE
. = ..()
STOP_PROCESSING(SSfastprocess, src)
diff --git a/code/game/objects/structures/showcase.dm b/code/game/objects/structures/showcase.dm
index 85a557a657..0aa447ca58 100644
--- a/code/game/objects/structures/showcase.dm
+++ b/code/game/objects/structures/showcase.dm
@@ -36,13 +36,13 @@
/obj/structure/showcase/horrific_experiment
name = "horrific experiment"
desc = "Some sort of pod filled with blood and viscera. You swear you can see it moving..."
- icon = 'icons/obj/cloning.dmi'
+ icon = 'icons/obj/machines/cloning.dmi'
icon_state = "pod_g"
/obj/structure/showcase/machinery/oldpod
name = "damaged cryogenic pod"
desc = "A damaged cryogenic pod long since lost to time, including its former occupant..."
- icon = 'icons/obj/cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper-open"
/obj/structure/showcase/machinery/oldpod/used
@@ -83,7 +83,7 @@
/obj/structure/showcase/machinery/cloning_pod
name = "cloning pod exhibit"
desc = "Signs describe how cloning pods like these ensure that every Nanotrasen employee can carry out their contracts in full, even in the unlikely event of their catastrophic death. Hopefully they aren't all made of cardboard, like this one."
- icon = 'icons/obj/cloning.dmi'
+ icon = 'icons/obj/machines/cloning.dmi'
icon_state = "pod_0"
/obj/structure/showcase/perfect_employee
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 231a346f2e..8e66fba95f 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -10,7 +10,7 @@
// Looping through the player list has the added bonus of working for mobs inside containers
var/sound/S = sound(get_sfx(soundin))
- var/maxdistance = (world.view + extrarange) * 3
+ var/maxdistance = (world.view + extrarange)
var/list/listeners = GLOB.player_list
if(!ignore_walls) //these sounds don't carry through walls
listeners = listeners & hearers(maxdistance,turf_source)
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index ae6aa0cb2d..5d83d677de 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -275,17 +275,12 @@
else
qdel(GetComponent(/datum/component/slippery))
return
- var/datum/component/slippery/S = LoadComponent(/datum/component/slippery)
+ var/datum/component/slippery/S = LoadComponent(/datum/component/slippery, NONE, CALLBACK(src, .proc/AfterSlip))
S.intensity = intensity
S.lube_flags = lube_flags
-/turf/open/ComponentActivated(datum/component/C)
- ..()
- var/datum/component/slippery/S = C
- if(!istype(S))
- return
+/turf/open/proc/AfterSlip(mob/living/L)
if(wet == TURF_WET_LUBE)
- var/mob/living/L = S.slip_victim
L.confused = max(L.confused, 8)
/turf/open/proc/MakeDry(wet_setting = TURF_WET_WATER)
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index abbf83a164..b2ab28dcae 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -87,6 +87,9 @@
/turf/open/floor/plating/asteroid/basalt/Initialize()
. = ..()
set_basalt_light(src)
+ GET_COMPONENT(arch, /datum/component/archaeology)
+ ASSERT(isnull(arch.callback))
+ arch.callback = CALLBACK(src, /atom/proc/set_light, 0)
/proc/set_basalt_light(turf/open/floor/B)
switch(B.icon_state)
@@ -95,12 +98,6 @@
if("basalt5", "basalt9")
B.set_light(1.4, 0.6, LIGHT_COLOR_LAVA) //barely anything!
-/turf/open/floor/plating/asteroid/basalt/ComponentActivated(datum/component/C)
- ..()
- if(istype(C, /datum/component/archaeology))
- set_light(0)
-
-
///////Surface. The surface is warm, but survivable without a suit. Internals are required. The floors break to chasms, which drop you into the underground.
/turf/open/floor/plating/asteroid/basalt/lava_land_surface
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 6d8db55ad8..337bb051a8 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -1,3 +1,5 @@
+#define MAX_DENT_DECALS 15
+
/turf/closed/wall
name = "wall"
desc = "A huge chunk of metal used to separate rooms."
@@ -297,6 +299,9 @@
return FALSE
/turf/closed/wall/proc/add_dent(denttype, x=rand(-8, 8), y=rand(-8, 8))
+ if(LAZYLEN(dent_decals) >= MAX_DENT_DECALS)
+ return
+
var/mutable_appearance/decal = pick(dent_decal_list[denttype])
decal.pixel_x = x
decal.pixel_y = y
@@ -304,3 +309,5 @@
cut_overlay(dent_decals)
LAZYADD(dent_decals, decal)
add_overlay(dent_decals)
+
+#undef MAX_DENT_DECALS
diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm
index 429e917e36..1ef8a71cb4 100644
--- a/code/modules/VR/vr_sleeper.dm
+++ b/code/modules/VR/vr_sleeper.dm
@@ -5,7 +5,7 @@
/obj/machinery/vr_sleeper
name = "virtual reality sleeper"
desc = "A sleeper modified to alter the subconscious state of the user, allowing them to visit virtual worlds."
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
state_open = TRUE
anchored = TRUE
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 01ae5d4dc3..2e12f53608 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -111,7 +111,7 @@
//get message text, limit it's length.and clean/escape html
if(!msg)
msg = input(src,"Message:", "Private message to [key_name(recipient, 0, 0)]") as text|null
-
+ msg = trim(msg)
if(!msg)
return
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index bf12b3eb66..51fab684d1 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -651,10 +651,10 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Change View Range"
set desc = "switches between 1x and custom views"
- if(view == world.view)
+ if(view == CONFIG_GET(string/default_view))
change_view(input("Select view range:", "FUCK YE", 7) in list(1,2,3,4,5,6,7,8,9,10,11,12,13,14,128))
else
- change_view(world.view)
+ change_view(CONFIG_GET(string/default_view))
log_admin("[key_name(usr)] changed their view range to [view].")
//message_admins("\blue [key_name_admin(usr)] changed their view range to [view].") //why? removed by order of XSI
diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
index 5ef9469295..f2d1a241f2 100644
--- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
+++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm
@@ -7,7 +7,7 @@
//list of open turfs adjacent to us
var/list/atmos_adjacent_turfs
//bitfield of dirs in which we are superconducitng
- var/atmos_supeconductivity = 0
+ var/atmos_supeconductivity = NONE
//used to determine whether we should archive
var/archived_cycle = 0
@@ -25,8 +25,7 @@
var/pressure_direction = 0
var/datum/excited_group/excited_group
- var/excited = 0
- var/recently_active = 0
+ var/excited = FALSE
var/datum/gas_mixture/turf/air
var/obj/effect/hotspot/active_hotspot
@@ -54,10 +53,10 @@
/turf/open/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air
if(!giver)
- return 0
+ return FALSE
air.merge(giver)
update_visuals()
- return 1
+ return TRUE
/turf/open/remove_air(amount)
var/datum/gas_mixture/ours = return_air()
@@ -83,7 +82,7 @@
/turf/temperature_expose()
if(temperature > heat_capacity)
- to_be_destroyed = 1
+ to_be_destroyed = TRUE
/turf/proc/archive()
temperature_archived = temperature
@@ -102,7 +101,7 @@
#if DM_VERSION >= 513
#warning 512 is stable now for sure, remove the old code
#endif
-
+
#if DM_VERSION >= 512
if (atmos_overlay_types)
for(var/overlay in atmos_overlay_types-new_overlay_types) //doesn't remove overlays that would only be added
@@ -175,64 +174,48 @@
for(var/t in adjacent_turfs)
var/turf/open/enemy_tile = t
- if(fire_count > enemy_tile.current_cycle)
- enemy_tile.archive()
+ if(fire_count <= enemy_tile.current_cycle)
+ continue
+ enemy_tile.archive()
- /******************* GROUP HANDLING START *****************************************************************/
+ /******************* GROUP HANDLING START *****************************************************************/
- var/should_share_air = FALSE
- var/datum/gas_mixture/enemy_air = enemy_tile.air
- if(enemy_tile.excited)
- //cache for sanic speed
- var/datum/excited_group/enemy_excited_group = enemy_tile.excited_group
- if(our_excited_group)
- if(enemy_excited_group)
- if(our_excited_group != enemy_excited_group)
- //combine groups (this also handles updating the excited_group var of all involved turfs)
- our_excited_group.merge_groups(enemy_excited_group)
- our_excited_group = excited_group //update our cache
- should_share_air = TRUE
- else
- if((recently_active == 1 && enemy_tile.recently_active == 1) || our_air.compare(enemy_air))
- our_excited_group.add_turf(enemy_tile) //add enemy to our group
- should_share_air = TRUE
+ var/should_share_air = FALSE
+ var/datum/gas_mixture/enemy_air = enemy_tile.air
+
+ //cache for sanic speed
+ var/datum/excited_group/enemy_excited_group = enemy_tile.excited_group
+
+ if(our_excited_group && enemy_excited_group)
+ if(our_excited_group != enemy_excited_group)
+ //combine groups (this also handles updating the excited_group var of all involved turfs)
+ our_excited_group.merge_groups(enemy_excited_group)
+ our_excited_group = excited_group //update our cache
+ should_share_air = TRUE
+
+ else if(our_air.compare(enemy_air))
+ if(!enemy_tile.excited)
+ SSair.add_to_active(enemy_tile)
+ var/datum/excited_group/EG = our_excited_group || enemy_excited_group || new
+ if(!our_excited_group)
+ EG.add_turf(src)
+ if(!enemy_excited_group)
+ EG.add_turf(enemy_tile)
+ our_excited_group = excited_group
+ should_share_air = TRUE
+
+ //air sharing
+ if(should_share_air)
+ var/difference = our_air.share(enemy_air, adjacent_turfs_length)
+ if(difference)
+ if(difference > 0)
+ consider_pressure_difference(enemy_tile, difference)
else
- if(enemy_excited_group)
- if((recently_active == 1 && enemy_tile.recently_active == 1) || our_air.compare(enemy_air))
- enemy_excited_group.add_turf(src) //join self to enemy group
- our_excited_group = excited_group //update our cache
- should_share_air = TRUE
- else
- if((recently_active == 1 && enemy_tile.recently_active == 1) || our_air.compare(enemy_air))
- var/datum/excited_group/EG = new //generate new group
- EG.add_turf(src)
- EG.add_turf(enemy_tile)
- our_excited_group = excited_group //update our cache
- should_share_air = TRUE
- else
- if(our_air.compare(enemy_air)) //compare if
- SSair.add_to_active(enemy_tile) //excite enemy
- if(our_excited_group)
- our_excited_group.add_turf(enemy_tile) //add enemy to group
- else
- var/datum/excited_group/EG = new //generate new group
- EG.add_turf(src)
- EG.add_turf(enemy_tile)
- our_excited_group = excited_group //update our cache
- should_share_air = TRUE
-
- //air sharing
- if(should_share_air)
- var/difference = our_air.share(enemy_air, adjacent_turfs_length)
- if(difference)
- if(difference > 0)
- consider_pressure_difference(enemy_tile, difference)
- else
- enemy_tile.consider_pressure_difference(src, -difference)
- LAST_SHARE_CHECK
+ enemy_tile.consider_pressure_difference(src, -difference)
+ LAST_SHARE_CHECK
- /******************* GROUP HANDLING FINISH *********************************************************************/
+ /******************* GROUP HANDLING FINISH *********************************************************************/
if (planet_atmos) //share our air with the "atmosphere" "above" the turf
var/datum/gas_mixture/G = new
@@ -250,12 +233,8 @@
update_visuals()
- var/remove = TRUE
- if(our_air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION)
- if(consider_superconductivity(starting = 1))
- remove = FALSE
-
- if ((!our_excited_group && remove) || (cached_atmos_cooldown > (EXCITED_GROUP_DISMANTLE_CYCLES * 2)))
+ if((!our_excited_group && !(our_air.temperature > MINIMUM_TEMPERATURE_START_SUPERCONDUCTION && consider_superconductivity(starting = TRUE))) \
+ || (cached_atmos_cooldown > (EXCITED_GROUP_DISMANTLE_CYCLES * 2)))
SSair.remove_from_active(src)
atmos_cooldown = cached_atmos_cooldown
@@ -279,9 +258,9 @@
var/const/PROBABILITY_OFFSET = 25
var/const/PROBABILITY_BASE_PRECENT = 75
set waitfor = 0
- . = 0
+ . = FALSE
if (!anchored && !pulledby)
- . = 1
+ . = TRUE
if (last_high_pressure_movement_air_cycle < SSair.times_fired)
var/move_prob = 100
if (pressure_resistance > 0)
@@ -304,7 +283,6 @@
/datum/excited_group/proc/add_turf(turf/open/T)
turf_list += T
T.excited_group = src
- T.recently_active = 1
reset_cooldowns()
/datum/excited_group/proc/merge_groups(datum/excited_group/E)
@@ -328,25 +306,27 @@
dismantle_cooldown = 0
//argument is so world start can clear out any turf differences quickly.
-/datum/excited_group/proc/self_breakdown(space_is_all_consuming = 0)
+/datum/excited_group/proc/self_breakdown(space_is_all_consuming = FALSE)
var/datum/gas_mixture/A = new
//make local for sanic speed
var/list/A_gases = A.gases
var/list/turf_list = src.turf_list
var/turflen = turf_list.len
- var/space_in_group = 0
+ var/space_in_group = FALSE
for(var/t in turf_list)
var/turf/open/T = t
if (space_is_all_consuming && !space_in_group && istype(T.air, /datum/gas_mixture/immutable/space))
- space_in_group = 1
+ space_in_group = TRUE
qdel(A)
- A = new/datum/gas_mixture/immutable/space()
+ A = new /datum/gas_mixture/immutable/space()
+ A_gases = A.gases //update the cache
+ break
A.merge(T.air)
for(var/id in A_gases)
- A_gases[id][MOLES] = A_gases[id][MOLES]/turflen
+ A_gases[id][MOLES] /= turflen
for(var/t in turf_list)
var/turf/open/T = t
@@ -359,8 +339,7 @@
/datum/excited_group/proc/dismantle()
for(var/t in turf_list)
var/turf/open/T = t
- T.excited = 0
- T.recently_active = 0
+ T.excited = FALSE
T.excited_group = null
SSair.active_turfs -= T
garbage_collect()
@@ -432,7 +411,7 @@
//Make sure still hot enough to continue conducting heat
if(temp < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)
SSair.active_super_conductivity -= src
- return 0
+ return FALSE
/turf/open/finish_superconduction()
//Conduct with air on my tile if I have it
@@ -442,21 +421,21 @@
/turf/proc/consider_superconductivity()
if(!thermal_conductivity)
- return 0
+ return FALSE
SSair.active_super_conductivity |= src
- return 1
+ return TRUE
/turf/open/consider_superconductivity(starting)
if(air.temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
- return 0
+ return FALSE
if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant.
- return 0
+ return FALSE
return ..()
/turf/closed/consider_superconductivity(starting)
if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION))
- return 0
+ return FALSE
return ..()
/turf/proc/radiate_to_spess() //Radiate excess tile heat to space
@@ -465,7 +444,7 @@
if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER))
var/heat = thermal_conductivity*delta_temperature* \
- (heat_capacity*700000/(heat_capacity+700000)) //700000 is the heat_capacity from a space turf, hardcoded here
+ (heat_capacity*HEAT_CAPACITY_VACUUM/(heat_capacity+HEAT_CAPACITY_VACUUM))
temperature -= heat/heat_capacity
/turf/open/proc/temperature_share_open_to_solid(turf/sharer)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index efe45f4e84..952ee0e068 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -356,6 +356,9 @@
. = TRUE
if("threshold")
var/env = params["env"]
+ if(text2path(env))
+ env = text2path(env)
+
var/name = params["var"]
var/datum/tlv/tlv = TLV[env]
if(isnull(tlv))
diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
index d7bfe1ecb8..fa336c7a34 100644
--- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
+++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm
@@ -1,7 +1,7 @@
/obj/machinery/atmospherics/components/unary/thermomachine
name = "thermomachine"
desc = "Heats or cools gas in connected pipes."
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/atmospherics/components/thermomachine.dmi'
icon_state = "freezer"
var/icon_state_on = "cold_on"
var/icon_state_open = "cold_off"
@@ -160,7 +160,6 @@
/obj/machinery/atmospherics/components/unary/thermomachine/freezer
name = "freezer"
- icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "freezer"
icon_state_on = "freezer_1"
icon_state_open = "freezer-o"
@@ -177,7 +176,6 @@
/obj/machinery/atmospherics/components/unary/thermomachine/heater
name = "heater"
- icon = 'icons/obj/Cryogenic2.dmi'
icon_state = "heater"
icon_state_on = "heater_1"
icon_state_open = "heater-o"
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 9a156d6b62..1f5df77be7 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -204,7 +204,7 @@
brute_damage = 1000
/obj/effect/mob_spawn/human/alive
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
death = FALSE
roundstart = FALSE //you could use these for alive fake humans on roundstart but this is more common scenario
@@ -243,7 +243,7 @@
mob_type = /mob/living/simple_animal/mouse
death = FALSE
roundstart = FALSE
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
/obj/effect/mob_spawn/cow
@@ -252,7 +252,7 @@
death = FALSE
roundstart = FALSE
mob_gender = FEMALE
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
// I'll work on making a list of corpses people request for maps, or that I think will be commonly used. Syndicate operatives for example.
@@ -274,7 +274,7 @@
roundstart = FALSE
random = TRUE
name = "sleeper"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
flavour_text = "You are a space doctor!"
assignedrole = "Space Doctor"
@@ -329,7 +329,7 @@
roundstart = FALSE
random = TRUE
name = "bartender sleeper"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
flavour_text = "You are a space bartender!"
assignedrole = "Space Bartender"
@@ -353,7 +353,7 @@
random = TRUE
mob_name = "Beach Bum"
name = "beach bum sleeper"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
flavour_text = "You are a beach bum!"
assignedrole = "Beach Bum"
@@ -431,7 +431,7 @@
roundstart = FALSE
mob_name = "Nanotrasen Commander"
name = "sleeper"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
flavour_text = "You are a Nanotrasen Commander!"
@@ -440,7 +440,7 @@
roundstart = FALSE
mob_name = "Private Security Officer"
name = "sleeper"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
faction = "nanotrasenprivate"
flavour_text = "You are a Nanotrasen Private Security Officer!"
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index c015d778fe..4c3b54fa0d 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -229,7 +229,7 @@
/obj/effect/mob_spawn/human/syndicatesoldier/coldres/alive
name = "sleeper"
mob_name = "Syndicate Snow Operative"
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper"
roundstart = FALSE
death = FALSE
diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm
index fa9aff7f43..b1f505a27e 100644
--- a/code/modules/awaymissions/super_secret_room.dm
+++ b/code/modules/awaymissions/super_secret_room.dm
@@ -17,6 +17,8 @@
var/list/json = json_decode(file2text(json_file))
shenanigans = json["phrases"]
+#define TIMEWASTE_MEDAL "Overextended The Joke"
+
/obj/structure/speaking_tile/interact(mob/user)
if(!isliving(user) || speaking)
return
@@ -45,11 +47,11 @@
SpeakPeace(list("Alright maybe that's too boring.", "I can't keep manually typing these lines out though.", "It's hard to explain but the code structure I'm using is kind of terrible."))
if(10)
SpeakPeace(list("Oh I have an idea!", "Lets outsource this endless banter to Poly!", "Then you'll be able to keep listening to this without getting bored!"))
- if(isnull(shenanigans))
+ if(isnull(shenanigans) || !shenanigans.len)
shenanigans = list("Except the poly file is missing...")
if(11 to 14, 16 to 50, 52 to 99, 103 to 107, 109 to 203, 205 to 249, 252 to 665, 667 to 999, 1001 to 5642)
SpeakPeace(list(pick(shenanigans),pick(shenanigans),pick(shenanigans)))
- if(times_spoken_to * 0.1 == round(times_spoken_to * 0.1))
+ if(times_spoken_to % 10 == 0)
SpeakPeace(list("That's [times_spoken_to] times you've spoken to me by the way."))
if(15)
SpeakPeace(list("See? Isn't this fun?","Now you can mash this for hours without getting bored.","Anyway I'll leave you it."))
@@ -79,6 +81,7 @@
if(1000)
SpeakPeace(list("The ends exists somewhere beyond meaningful milestones.", "There will be no more messages until then.", "You disgust me."))
if(5643)
+ UnlockMedal(TIMEWASTE_MEDAL,user.client)
var/obj/item/reagent_containers/food/drinks/trophy/gold_cup/never_ends = new(get_turf(user))
never_ends.name = "Overextending The Joke: First Place"
never_ends.desc = "And so we are left alone with our regrets."
@@ -87,7 +90,7 @@
speaking = FALSE
times_spoken_to++
-
+#undef TIMEWASTE_MEDAL
/obj/structure/speaking_tile/proc/SpeakPeace(list/statements)
for(var/i in 1 to statements.len)
say("[statements[i]]")
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index d9b25939a5..43ae694b84 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -442,7 +442,7 @@ GLOBAL_LIST(external_rsc_urls)
message_admins("Failed Login: [key] - New account attempting to connect during panic bunker")
to_chat(src, "Sorry but the server is currently not accepting connections from never before seen players.")
var/list/connectiontopic_a = params2list(connectiontopic)
- var/list/panic_addr = CONFIG_GET(string/panic_address)
+ var/list/panic_addr = CONFIG_GET(string/panic_server_address)
if(panic_addr && !connectiontopic_a["redirect"])
var/panic_name = CONFIG_GET(string/panic_server_name)
to_chat(src, "Sending you to [panic_name ? panic_name : panic_addr].")
@@ -663,6 +663,9 @@ GLOBAL_LIST(external_rsc_urls)
return FALSE
if ("key")
return FALSE
+ if("view")
+ change_view(var_value)
+ return TRUE
. = ..()
@@ -683,7 +686,8 @@ GLOBAL_LIST(external_rsc_urls)
/client/proc/apply_clickcatcher()
generate_clickcatcher()
- void.UpdateGreed(view,view)
+ var/list/actualview = getviewsize(view)
+ void.UpdateGreed(actualview[1],actualview[2])
/client/proc/AnnouncePR(announcement)
if(prefs && prefs.chat_toggles & CHAT_PULLR)
diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm
index 2b66a85fe6..2baaf91135 100644
--- a/code/modules/clothing/neck/_neck.dm
+++ b/code/modules/clothing/neck/_neck.dm
@@ -72,6 +72,9 @@
if(!(M.failed_last_breath || M.losebreath))
lung_strength = "healthy"
+ if(M.stat == DEAD && heart && world.time - M.timeofdeath < DEFIB_TIME_LIMIT * 10)
+ heart_strength = "a faint, fluttery"
+
var/diagnosis = (body_part == "chest" ? "You hear [heart_strength] pulse and [lung_strength] respiration." : "You faintly hear [heart_strength] pulse.")
user.visible_message("[user] places [src] against [M]'s [body_part] and listens attentively.", "You place [src] against [M]'s [body_part]. [diagnosis]")
return
diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm
index 79886b1446..d7e13a1fd5 100644
--- a/code/modules/clothing/spacesuits/flightsuit.dm
+++ b/code/modules/clothing/spacesuits/flightsuit.dm
@@ -1100,7 +1100,7 @@
/obj/item/clothing/head/helmet/space/hardsuit/flightsuit/proc/toggle_zoom(mob/living/user, force_off = FALSE)
if(zoom || force_off)
- user.client.change_view(world.view)
+ user.client.change_view(CONFIG_GET(string/default_view))
to_chat(user, "Disabling smart zooming image enhancement...")
zoom = FALSE
return FALSE
diff --git a/code/modules/events/camerafailure.dm b/code/modules/events/camerafailure.dm
index 9f85628629..cbc2d95776 100644
--- a/code/modules/events/camerafailure.dm
+++ b/code/modules/events/camerafailure.dm
@@ -6,11 +6,9 @@
alertadmins = 0
/datum/round_event/camera_failure
- startWhen = 1
- endWhen = 2
fakeable = FALSE
-/datum/round_event/camera_failure/tick()
+/datum/round_event/camera_failure/start()
var/iterations = 1
var/obj/machinery/camera/C = pick(GLOB.cameranet.cameras)
while(prob(round(100/iterations)))
diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm
index 121a0e5083..00d8c3b829 100644
--- a/code/modules/events/wizard/curseditems.dm
+++ b/code/modules/events/wizard/curseditems.dm
@@ -11,29 +11,29 @@
/datum/round_event/wizard/cursed_items/start()
var/item_set = pick("wizardmimic", "swords", "bigfatdoobie", "boxing", "voicemodulators", "catgirls2015")
- var/list/wearslots = list(slot_wear_suit, slot_shoes, slot_head, slot_wear_mask, slot_gloves, slot_ears)
- var/list/loadout = list()
+ var/list/loadout[slots_amt]
var/ruins_spaceworthiness
var/ruins_wizard_loadout
- loadout.len = 7
switch(item_set)
if("wizardmimic")
- loadout = list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/shoes/sandal/magic, /obj/item/clothing/head/wizard)
+ loadout[slot_wear_suit] = /obj/item/clothing/suit/wizrobe
+ loadout[slot_shoes] = /obj/item/clothing/shoes/sandal/magic
+ loadout[slot_head] = /obj/item/clothing/head/wizard
ruins_spaceworthiness = 1
if("swords")
- loadout[5] = /obj/item/katana/cursed
+ loadout[slot_hands] = /obj/item/katana/cursed
if("bigfatdoobie")
- loadout[4] = /obj/item/clothing/mask/cigarette/rollie/trippy
+ loadout[slot_wear_mask] = /obj/item/clothing/mask/cigarette/rollie/trippy
ruins_spaceworthiness = 1
if("boxing")
- loadout[4] = /obj/item/clothing/mask/luchador
- loadout[6] = /obj/item/clothing/gloves/boxing
+ loadout[slot_wear_mask] = /obj/item/clothing/mask/luchador
+ loadout[slot_gloves] = /obj/item/clothing/gloves/boxing
ruins_spaceworthiness = 1
if("voicemodulators")
- loadout[4] = /obj/item/clothing/mask/chameleon
+ loadout[slot_wear_mask] = /obj/item/clothing/mask/chameleon
if("catgirls2015")
- loadout[3] = /obj/item/clothing/head/kitty
+ loadout[slot_head] = /obj/item/clothing/head/kitty
ruins_spaceworthiness = 1
ruins_wizard_loadout = 1
@@ -44,14 +44,13 @@
continue
if(item_set == "catgirls2015") //Wizard code means never having to say you're sorry
H.gender = FEMALE
- var/list/slots = list(H.wear_suit, H.shoes, H.head, H.wear_mask, H.gloves, H.ears) //add new slots as needed to back
for(var/i in 1 to loadout.len)
if(loadout[i])
var/obj/item/J = loadout[i]
var/obj/item/I = new J //dumb but required because of byond throwing a fit anytime new gets too close to a list
- H.temporarilyRemoveItemFromInventory(slots[i], TRUE)
- H.equip_to_slot_or_del(I, wearslots[i])
- I.flags_1 |= NODROP_1
+ H.dropItemToGround(H.get_item_by_slot(i), TRUE)
+ H.equip_to_slot_or_del(I, i)
+ I.flags_1 |= NODROP_1 | DROPDEL_1
I.name = "cursed " + I.name
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm
index 54d3d8ed41..4b2147bd9e 100644
--- a/code/modules/events/wizard/imposter.dm
+++ b/code/modules/events/wizard/imposter.dm
@@ -6,12 +6,11 @@
earliest_start = 0
/datum/round_event/wizard/imposter/start()
-
for(var/datum/mind/M in SSticker.mode.wizards)
if(!ishuman(M.current))
continue
var/mob/living/carbon/human/W = M.current
- var/list/candidates = get_candidates(ROLE_WIZARD)
+ var/list/candidates = pollGhostCandidates("Would you like to be an imposter wizard?", ROLE_WIZARD)
if(!candidates)
return //Sad Trombone
var/client/C = pick(candidates)
@@ -28,10 +27,10 @@
var/datum/antagonist/wizard/master = M.has_antag_datum(/datum/antagonist/wizard)
if(!master.wiz_team)
master.create_wiz_team()
- var/datum/antagonist/wizard/apprentice/imposter = new(I.mind)
+ var/datum/antagonist/wizard/apprentice/imposter/imposter = new(I.mind)
imposter.master = M
imposter.wiz_team = master.wiz_team
- master.wiz_team += imposter
+ master.wiz_team.add_member(imposter)
I.mind.add_antag_datum(imposter)
//Remove if possible
SSticker.mode.apprentices += I.mind
diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm
index e054be9b08..29773d95b2 100644
--- a/code/modules/events/wizard/race.dm
+++ b/code/modules/events/wizard/race.dm
@@ -22,7 +22,7 @@
for(var/mob/living/carbon/human/H in GLOB.carbon_list) //yes, even the dead
H.set_species(new_species)
- H.real_name = new_species.random_name(H.gender,1)
+ H.real_name = H.dna.species.random_name(H.gender,1)
H.dna.unique_enzymes = H.dna.generate_unique_enzymes()
to_chat(H, "You feel somehow... different?")
if(!all_the_same)
diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm
index 5d3cd09f51..7217fe0b28 100644
--- a/code/modules/food_and_drinks/drinks/drinks.dm
+++ b/code/modules/food_and_drinks/drinks/drinks.dm
@@ -115,6 +115,7 @@
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I
+ B.name = "broken [name]"
if(prob(33))
new/obj/item/shard(drop_location())
playsound(src, "shatter", 70, 1)
@@ -186,7 +187,7 @@
// Formatting is the same as food.
/obj/item/reagent_containers/food/drinks/coffee
- name = "Robust Coffee"
+ name = "robust coffee"
desc = "Careful, the beverage you're about to enjoy is extremely hot."
icon_state = "coffee"
list_reagents = list("coffee" = 30)
@@ -195,7 +196,7 @@
isGlass = FALSE
/obj/item/reagent_containers/food/drinks/ice
- name = "Ice Cup"
+ name = "ice cup"
desc = "Careful, cold ice, do not chew."
icon_state = "coffee"
list_reagents = list("ice" = 30)
@@ -216,12 +217,12 @@
icon_state = "tea_empty"
/obj/item/reagent_containers/food/drinks/mug/tea
- name = "Duke Purple Tea"
+ name = "Duke Purple tea"
desc = "An insult to Duke Purple is an insult to the Space Queen! Any proper gentleman will fight you, if you sully this tea."
list_reagents = list("tea" = 30)
/obj/item/reagent_containers/food/drinks/mug/coco
- name = "Dutch Hot Coco"
+ name = "Dutch hot coco"
desc = "Made in Space South America."
list_reagents = list("hot_coco" = 30, "sugar" = 5)
foodtype = SUGAR
@@ -230,7 +231,7 @@
/obj/item/reagent_containers/food/drinks/dry_ramen
- name = "Cup Ramen"
+ name = "cup ramen"
desc = "Just add 10ml of water, self heats! A taste that reminds you of your school years."
icon_state = "ramen"
list_reagents = list("dry_ramen" = 30)
@@ -238,7 +239,7 @@
isGlass = FALSE
/obj/item/reagent_containers/food/drinks/beer
- name = "Space Beer"
+ name = "space beer"
desc = "Beer. In space."
icon_state = "beer"
list_reagents = list("beer" = 30)
@@ -282,7 +283,7 @@
I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1)
I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0))
B.icon = I
- B.name = "broken carton"
+ B.name = "broken [name]"
B.force = 0
B.throwforce = 0
B.desc = "A carton with the bottom half burst open. Might give you a papercut."
@@ -420,28 +421,28 @@
foodtype = SUGAR
/obj/item/reagent_containers/food/drinks/soda_cans/tonic
- name = "T-Borg's Tonic Water"
+ name = "T-Borg's tonic water"
desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
icon_state = "tonic"
list_reagents = list("tonic" = 50)
foodtype = ALCOHOL
/obj/item/reagent_containers/food/drinks/soda_cans/sodawater
- name = "Soda Water"
+ name = "soda water"
desc = "A can of soda water. Why not make a scotch and soda?"
icon_state = "sodawater"
list_reagents = list("sodawater" = 50)
/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime
- name = "Orange Soda"
+ name = "orange soda"
desc = "You wanted ORANGE. It gave you Lemon Lime."
icon_state = "lemon-lime"
list_reagents = list("lemon_lime" = 30)
foodtype = FRUIT
-/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/New()
- ..()
- name = "Lemon-Lime Soda"
+/obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime/Initialize()
+ . = ..()
+ name = "lemon-lime soda"
/obj/item/reagent_containers/food/drinks/soda_cans/space_up
name = "Space-Up!"
@@ -485,14 +486,14 @@
list_reagents = list("pwr_game" = 30)
/obj/item/reagent_containers/food/drinks/soda_cans/shamblers
- name = "Shambler's Juice"
+ name = "Shambler's juice"
desc = "~Shake me up some of that Shambler's Juice!~"
icon_state = "shamblers"
list_reagents = list("shamblers" = 30)
foodtype = SUGAR | JUNKFOOD
/obj/item/reagent_containers/food/drinks/soda_cans/air
- name = "Canned Air"
+ name = "canned air"
desc = "There is no air shortage. Do not drink."
icon_state = "air"
list_reagents = list("nitrogen" = 24, "oxygen" = 6)
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 5625a752b3..005dda29ca 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -35,10 +35,10 @@
new/obj/item/shard(drop_location())
playsound(src, "shatter", 70, 1)
else
- B.name = "broken carton"
B.force = 0
B.throwforce = 0
B.desc = "A carton with the bottom half burst open. Might give you a papercut."
+ B.name = "broken [name]"
transfer_fingerprints_to(B)
qdel(src)
@@ -119,7 +119,7 @@
//Keeping this here for now, I'll ask if I should keep it here.
/obj/item/broken_bottle
- name = "Broken Bottle"
+ name = "broken bottle"
desc = "A bottle with a sharp broken bottom."
icon = 'icons/obj/drinks.dmi'
icon_state = "broken_bottle"
@@ -135,37 +135,37 @@
sharpness = IS_SHARP
/obj/item/reagent_containers/food/drinks/bottle/gin
- name = "Griffeater Gin"
+ name = "Griffeater gin"
desc = "A bottle of high quality gin, produced in the New London Space Station."
icon_state = "ginbottle"
list_reagents = list("gin" = 100)
/obj/item/reagent_containers/food/drinks/bottle/whiskey
- name = "Uncle Git's Special Reserve"
+ name = "Uncle Git's special reserve"
desc = "A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES."
icon_state = "whiskeybottle"
list_reagents = list("whiskey" = 100)
/obj/item/reagent_containers/food/drinks/bottle/vodka
- name = "Tunguska Triple Distilled"
+ name = "Tunguska triple distilled"
desc = "Aah, vodka. Prime choice of drink AND fuel by Russians worldwide."
icon_state = "vodkabottle"
list_reagents = list("vodka" = 100)
/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka
- name = "Badminka Vodka"
+ name = "Badminka vodka"
desc = "The label's written in Cyrillic. All you can make out is the name and a word that looks vaguely like 'Vodka'."
icon_state = "badminka"
list_reagents = list("vodka" = 100)
/obj/item/reagent_containers/food/drinks/bottle/tequila
- name = "Caccavo Guaranteed Quality Tequila"
+ name = "Caccavo guaranteed quality tequila"
desc = "Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients!"
icon_state = "tequilabottle"
list_reagents = list("tequila" = 100)
/obj/item/reagent_containers/food/drinks/bottle/bottleofnothing
- name = "Bottle of Nothing"
+ name = "bottle of nothing"
desc = "A bottle filled with nothing."
icon_state = "bottleofnothing"
list_reagents = list("nothing" = 100)
@@ -178,13 +178,13 @@
list_reagents = list("patron" = 100)
/obj/item/reagent_containers/food/drinks/bottle/rum
- name = "Captain Pete's Cuban Spiced Rum"
+ name = "Captain Pete's Cuban spiced rum"
desc = "This isn't just rum, oh no. It's practically GRIFF in a bottle."
icon_state = "rumbottle"
list_reagents = list("rum" = 100)
/obj/item/reagent_containers/food/drinks/bottle/holywater
- name = "Flask of Holy Water"
+ name = "flask of holy water"
desc = "A flask of the chaplain's holy water."
icon_state = "holyflask"
list_reagents = list("holywater" = 100)
@@ -195,39 +195,39 @@
list_reagents = list("hell_water" = 100)
/obj/item/reagent_containers/food/drinks/bottle/vermouth
- name = "Goldeneye Vermouth"
+ name = "Goldeneye vermouth"
desc = "Sweet, sweet dryness~"
icon_state = "vermouthbottle"
list_reagents = list("vermouth" = 100)
/obj/item/reagent_containers/food/drinks/bottle/kahlua
- name = "Robert Robust's Coffee Liqueur"
+ name = "Robert Robust's coffee liqueur"
desc = "A widely known, Mexican coffee-flavoured liqueur. In production since 1936, HONK."
icon_state = "kahluabottle"
list_reagents = list("kahlua" = 100)
foodtype = VEGETABLES
/obj/item/reagent_containers/food/drinks/bottle/goldschlager
- name = "College Girl Goldschlager"
+ name = "College Girl goldschlager"
desc = "Because they are the only ones who will drink 100 proof cinnamon schnapps."
icon_state = "goldschlagerbottle"
list_reagents = list("goldschlager" = 100)
/obj/item/reagent_containers/food/drinks/bottle/cognac
- name = "Chateau De Baton Premium Cognac"
+ name = "Chateau de Baton premium cognac"
desc = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time."
icon_state = "cognacbottle"
list_reagents = list("cognac" = 100)
/obj/item/reagent_containers/food/drinks/bottle/wine
- name = "Doublebeard Bearded Special Wine"
+ name = "Doublebeard's bearded special wine"
desc = "A faint aura of unease and asspainery surrounds the bottle."
icon_state = "winebottle"
list_reagents = list("wine" = 100)
foodtype = FRUIT | ALCOHOL
/obj/item/reagent_containers/food/drinks/bottle/absinthe
- name = "Extra-Strong Absinthe"
+ name = "extra-strong absinthe"
desc = "An strong alcoholic drink brewed and distributed by"
icon_state = "absinthebottle"
list_reagents = list("absinthe" = 100)
@@ -272,7 +272,7 @@
/obj/item/reagent_containers/food/drinks/bottle/absinthe/premium
- name = "Gwyn's Premium Absinthe"
+ name = "Gwyn's premium absinthe"
desc = "A potent alcoholic beverage, almost makes you forget the ash in your lungs."
icon_state = "absinthepremium"
@@ -280,7 +280,7 @@
return
/obj/item/reagent_containers/food/drinks/bottle/lizardwine
- name = "Bottle of lizard wine"
+ name = "bottle of lizard wine"
desc = "An alcoholic beverage from Space China, made by infusing lizard tails in ethanol. Inexplicably popular among command staff."
icon_state = "lizardwine"
list_reagents = list("lizardwine" = 100)
@@ -302,7 +302,7 @@
//////////////////////////JUICES AND STUFF ///////////////////////
/obj/item/reagent_containers/food/drinks/bottle/orangejuice
- name = "Orange Juice"
+ name = "orange juice"
desc = "Full of vitamins and deliciousness!"
icon_state = "orangejuice"
item_state = "carton"
@@ -313,7 +313,7 @@
foodtype = FRUIT
/obj/item/reagent_containers/food/drinks/bottle/cream
- name = "Milk Cream"
+ name = "milk cream"
desc = "It's cream. Made from milk. What else did you think you'd find in there?"
icon_state = "cream"
item_state = "carton"
@@ -324,7 +324,7 @@
foodtype = DAIRY
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice
- name = "Tomato Juice"
+ name = "tomato juice"
desc = "Well, at least it LOOKS like tomato juice. You can't tell with all that redness."
icon_state = "tomatojuice"
item_state = "carton"
@@ -335,7 +335,7 @@
foodtype = VEGETABLES
/obj/item/reagent_containers/food/drinks/bottle/limejuice
- name = "Lime Juice"
+ name = "lime juice"
desc = "Sweet-sour goodness."
icon_state = "limejuice"
item_state = "carton"
diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm
index 0c626ab71e..c32ebfb765 100644
--- a/code/modules/food_and_drinks/food/snacks_other.dm
+++ b/code/modules/food_and_drinks/food/snacks_other.dm
@@ -380,7 +380,7 @@
foodtype = VEGETABLES | FRIED | DAIRY
/obj/item/reagent_containers/food/snacks/cubannachos
- name = "cuban nachos"
+ name = "Cuban nachos"
desc = "That's some dangerously spicy nachos."
icon_state = "cubannachos"
bonus_reagents = list("nutriment" = 2, "vitamin" = 3)
diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm
index ef518bf5fc..284784484f 100644
--- a/code/modules/food_and_drinks/food/snacks_pastry.dm
+++ b/code/modules/food_and_drinks/food/snacks_pastry.dm
@@ -4,7 +4,7 @@
/obj/item/reagent_containers/food/snacks/donut
name = "donut"
- desc = "Goes great with Robust Coffee."
+ desc = "Goes great with robust coffee."
icon_state = "donut1"
bitesize = 5
bonus_reagents = list("sugar" = 1)
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index 153444c0ed..4d31d082c6 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -253,6 +253,9 @@ em {font-style: normal; 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;}
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 9d6095cf4b..5b1d17182a 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -1,7 +1,7 @@
/obj/machinery/biogenerator
name = "biogenerator"
desc = "Converts plants into biomass, which can be used to construct useful items."
- icon = 'icons/obj/biogenerator.dmi'
+ icon = 'icons/obj/machines/biogenerator.dmi'
icon_state = "biogen-empty"
density = TRUE
anchored = TRUE
diff --git a/code/modules/hydroponics/grown/random.dm b/code/modules/hydroponics/grown/random.dm
index 4ba2451a5a..8f25eff215 100644
--- a/code/modules/hydroponics/grown/random.dm
+++ b/code/modules/hydroponics/grown/random.dm
@@ -16,9 +16,9 @@
randomize_stats()
..()
if(prob(60))
- add_random_reagents()
+ add_random_reagents(1, 3)
if(prob(50))
- add_random_traits()
+ add_random_traits(1, 2)
add_random_plant_type(35)
/obj/item/reagent_containers/food/snacks/grown/random
diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm
index c6e17a63a4..92b6b8abaf 100644
--- a/code/modules/hydroponics/plant_genes.dm
+++ b/code/modules/hydroponics/plant_genes.dm
@@ -375,7 +375,7 @@
pocell.maxcharge *= CG.rate*1000
pocell.charge = pocell.maxcharge
pocell.name = "[G.name] battery"
- pocell.desc = "A rechargeable plant based power cell. This one has a power rating of [DisplayPower(pocell.maxcharge)], and you should not swallow it."
+ pocell.desc = "A rechargeable plant-based power cell. This one has a rating of [DisplayEnergy(pocell.maxcharge)], and you should not swallow it."
if(G.reagents.has_reagent("plasma", 2))
pocell.rigged = 1
diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm
index 7c7439d45b..1e65a2b67d 100644
--- a/code/modules/integrated_electronics/passive/power.dm
+++ b/code/modules/integrated_electronics/passive/power.dm
@@ -13,7 +13,7 @@
/obj/item/integrated_circuit/passive/power/solar_cell
name = "tiny photovoltaic cell"
desc = "It's a very tiny solar cell, generally used in calculators."
- extended_desc = "The cell generates 1W of power per second in optimal lighting conditions. Less light will result in less power being generated."
+ extended_desc = "The cell generates 1 W of power in optimal lighting conditions. Less light will result in less power being generated."
icon_state = "solar_cell"
complexity = 8
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 3, TECH_DATA = 2)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index bb4c0f559b..d19f3d4bf8 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -320,7 +320,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients
to_chat(usr, "Another consciousness is in your body...It is resisting you.")
return
- client.change_view(world.view)
+ client.change_view(CONFIG_GET(string/default_view))
SStgui.on_transfer(src, mind.current) // Transfer NanoUIs.
mind.current.key = key
return 1
@@ -456,7 +456,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set desc = "Change your view range."
var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT
- if(client.view == world.view)
+ if(client.view == CONFIG_GET(string/default_view))
var/list/views = list()
for(var/i in 7 to max_view)
views |= i
@@ -464,7 +464,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(new_view)
client.change_view(Clamp(new_view, 7, max_view))
else
- client.change_view(world.view)
+ client.change_view(CONFIG_GET(string/default_view))
/mob/dead/observer/verb/add_view_range(input as num)
set name = "Add View Range"
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 739b4e3584..7781fd5df6 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -37,36 +37,36 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
//kinda localization -- rastaf0
//same keys as above, but on russian keyboard layout. This file uses cp1251 as encoding.
// Location
- "ê" = "right hand",
- "ä" = "left hand",
- "ø" = "intercom",
+ "ê" = "right hand",
+ "ä" = "left hand",
+ "ø" = "intercom",
// Department
- "ð" = "department",
- "ñ" = "Command",
- "ò" = "Science",
- "ü" = "Medical",
- "ó" = "Engineering",
- "û" = "Security",
- "ã" = "Supply",
- "ì" = "Service",
+ "ð" = "department",
+ "ñ" = "Command",
+ "ò" = "Science",
+ "ü" = "Medical",
+ "ó" = "Engineering",
+ "û" = "Security",
+ "ã" = "Supply",
+ "ì" = "Service",
// Faction
- "å" = "Syndicate",
- "í" = "CentCom",
+ "Ã¥" = "Syndicate",
+ "Ã" = "CentCom",
// Species
- "è" = "binary",
- "ï" = "changeling",
- "ô" = "alientalk",
+ "è" = "binary",
+ "ï" = "changeling",
+ "ô" = "alientalk",
// Admin
- "ç" = "admin",
- "â" = "deadmin",
+ "ç" = "admin",
+ "â" = "deadmin",
// Misc
- "ù" = "AI Private",
- "÷" = "cords"
+ "ù" = "AI Private",
+ "÷" = "cords"
))
/mob/living/say(message, bubble_type,var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE)
@@ -137,7 +137,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
var/datum/saymode/SM = SSradio.saymodes[key]
if(key && SM)
- if(!SM.handle_message(src, message, language))
+ if(!SM.handle_message(src, message, language) && !message_mode)
return
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index ed36e62492..47d5a0ffd8 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -817,7 +817,8 @@
return (GLOB.cameranet && GLOB.cameranet.checkTurfVis(get_turf_pixel(A))) || apc_override
//AI is carded/shunted
//view(src) returns nothing for carded/shunted AIs and they have x-ray vision so just use get_dist
- return get_dist(src, A) <= client.view
+ var/list/viewscale = getviewsize(client.view)
+ return get_dist(src, A) <= max(viewscale[1]*0.5,viewscale[2]*0.5)
/mob/living/silicon/ai/proc/relay_speech(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
raw_message = lang_treat(speaker, message_language, raw_message, spans, message_mode)
diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm
index f10ac43858..785d55e5f4 100644
--- a/code/modules/mob/living/silicon/say.dm
+++ b/code/modules/mob/living/silicon/say.dm
@@ -10,14 +10,14 @@
var/mob/living/silicon/S = src
desig = trim_left(S.designation + " " + S.job)
var/message_a = say_quote(message, get_spans())
- var/rendered = "Robotic Talk, [name] [message_a]"
+ var/rendered = "Robotic Talk, [name] [message_a]"
for(var/mob/M in GLOB.player_list)
if(M.binarycheck())
if(isAI(M))
- var/renderedAI = "Robotic Talk, [name] ([desig]) [message_a]"
+ var/renderedAI = "Robotic Talk, [name] ([desig]) [message_a]"
to_chat(M, renderedAI)
else
- to_chat(M, rendered)
+ to_chat(M, "[rendered]")
if(isobserver(M))
var/following = src
// If the AI talks on binary chat, we still want to follow
@@ -26,7 +26,7 @@
var/mob/living/silicon/ai/ai = src
following = ai.eyeobj
var/link = FOLLOW_LINK(M, following)
- to_chat(M, "[link] [rendered]")
+ to_chat(M, "[link] [rendered]")
/mob/living/silicon/binarycheck()
return 1
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index a333f22c38..1555ad6e6c 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -9,8 +9,8 @@
gender = MALE
speak = list("Meow!", "Esp!", "Purr!", "HSSSSS")
speak_emote = list("purrs", "meows")
- emote_hear = list("meows", "mews")
- emote_see = list("shakes its head", "shivers")
+ emote_hear = list("meows.", "mews.")
+ emote_see = list("shakes its head.", "shivers.")
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
index 97dd430a12..29e4d66424 100644
--- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
+++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
@@ -2,10 +2,10 @@
/mob/living/simple_animal/hostile/asteroid/fugu
name = "wumborian fugu"
desc = "The wumborian fugu rapidly increases its body mass in order to ward off its prey. Great care should be taken to avoid it while it's in this state as it is nearly invincible, but it cannot maintain its form forever."
- icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
- icon_state = "Fugu"
- icon_living = "Fugu"
- icon_aggro = "Fugu"
+ icon = 'icons/mob/lavaland/64x64megafauna.dmi'
+ icon_state = "Fugu0"
+ icon_living = "Fugu0"
+ icon_aggro = "Fugu0"
icon_dead = "Fugu_dead"
icon_gib = "syndicate_gib"
mouse_opacity = MOUSE_OPACITY_OPAQUE
@@ -16,6 +16,7 @@
speed = 0
maxHealth = 50
health = 50
+ pixel_x = -16
harm_intent_damage = 5
obj_damage = 0
melee_damage_lower = 0
@@ -30,13 +31,23 @@
gold_core_spawnable = HOSTILE_SPAWN
var/wumbo = 0
var/inflate_cooldown = 0
+ var/datum/action/innate/fugu/expand/E
loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER})
+/mob/living/simple_animal/hostile/asteroid/fugu/Initialize()
+ . = ..()
+ E = new
+ E.Grant(src)
+
+/mob/living/simple_animal/hostile/asteroid/fugu/Destroy()
+ QDEL_NULL(E)
+ return ..()
+
/mob/living/simple_animal/hostile/asteroid/fugu/Life()
if(!wumbo)
inflate_cooldown = max((inflate_cooldown - 1), 0)
if(target && AIStatus == AI_ON)
- Inflate()
+ E.Activate()
..()
/mob/living/simple_animal/hostile/asteroid/fugu/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
@@ -46,42 +57,47 @@
/mob/living/simple_animal/hostile/asteroid/fugu/Aggro()
..()
- Inflate()
+ E.Activate()
-/mob/living/simple_animal/hostile/asteroid/fugu/verb/Inflate()
- set name = "Inflate"
- set category = "Fugu"
- set desc = "Temporarily increases your size, and makes you significantly more dangerous and tough."
- if(wumbo)
- to_chat(src, "You're already inflated.")
+/datum/action/innate/fugu
+ icon_icon = 'icons/mob/actions/actions_animal.dmi'
+
+/datum/action/innate/fugu/expand
+ name = "Inflate"
+ desc = "Temporarily increases your size, and makes you significantly more dangerous and tough! Do not bully the fugu!"
+ button_icon_state = "expand"
+
+/datum/action/innate/fugu/expand/Activate()
+ var/mob/living/simple_animal/hostile/asteroid/fugu/F = owner
+ if(F.wumbo)
+ to_chat(F, "YOU'RE ALREADY WUMBO!")
return
- if(inflate_cooldown)
- to_chat(src, "We need time to gather our strength.")
+ if(F.inflate_cooldown)
+ to_chat(F, "You need time to gather your strength.")
return
- if(buffed)
- to_chat(src, "Something is interfering with our growth.")
+ if(F.buffed)
+ to_chat(F, "Something is interfering with your growth.")
return
- wumbo = 1
- icon_state = "Fugu_big"
- obj_damage = 60
- melee_damage_lower = 15
- melee_damage_upper = 20
- harm_intent_damage = 0
- throw_message = "is absorbed by the girth of the"
- retreat_distance = null
- minimum_distance = 1
- move_to_delay = 6
- transform *= 2
- environment_smash = ENVIRONMENT_SMASH_WALLS
- mob_size = MOB_SIZE_LARGE
- speed = 1
- addtimer(CALLBACK(src, .proc/Deflate), 100)
+ F.wumbo = 1
+ F.icon_state = "Fugu1"
+ F.obj_damage = 60
+ F.melee_damage_lower = 15
+ F.melee_damage_upper = 20
+ F.harm_intent_damage = 0
+ F.throw_message = "is absorbed by the girth of the"
+ F.retreat_distance = null
+ F.minimum_distance = 1
+ F.move_to_delay = 6
+ F.environment_smash = ENVIRONMENT_SMASH_WALLS
+ F.mob_size = MOB_SIZE_LARGE
+ F.speed = 1
+ addtimer(CALLBACK(F, /mob/living/simple_animal/hostile/asteroid/fugu/proc/Deflate), 100)
/mob/living/simple_animal/hostile/asteroid/fugu/proc/Deflate()
if(wumbo)
walk(src, 0)
wumbo = 0
- icon_state = "Fugu"
+ icon_state = "Fugu0"
obj_damage = 0
melee_damage_lower = 0
melee_damage_upper = 0
@@ -90,7 +106,6 @@
retreat_distance = 9
minimum_distance = 9
move_to_delay = 2
- transform /= 2
inflate_cooldown = 4
environment_smash = ENVIRONMENT_SMASH_NONE
mob_size = MOB_SIZE_SMALL
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index bed14bdff4..8f7c6e2cc6 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -39,7 +39,7 @@
if(client)
client.click_intercept = null
- client.change_view(world.view) // Resets the client.view in case it was changed.
+ client.change_view(CONFIG_GET(string/default_view)) // Resets the client.view in case it was changed.
if(!GLOB.individual_log_list[ckey])
GLOB.individual_log_list[ckey] = logging
diff --git a/code/modules/ninja/suit/gloves.dm b/code/modules/ninja/suit/gloves.dm
index 6cf03d1c10..c49ca072e8 100644
--- a/code/modules/ninja/suit/gloves.dm
+++ b/code/modules/ninja/suit/gloves.dm
@@ -63,9 +63,9 @@
if(isnum(.)) //Numerical values of drained handle their feedback here, Alpha values handle it themselves (Research hacking)
if(.)
- to_chat(H, "Gained [DisplayPower(.)] of power from [A].")
+ to_chat(H, "Gained [DisplayEnergy(.)] of energy from [A].")
else
- to_chat(H, "\The [A] has run dry of power, you must find another source!")
+ to_chat(H, "\The [A] has run dry of energy, you must find another source!")
else
. = 0 //as to not cancel attack_hand()
diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm
index 1dcfed99c0..128997cb98 100644
--- a/code/modules/ninja/suit/suit.dm
+++ b/code/modules/ninja/suit/suit.dm
@@ -152,7 +152,7 @@ Contents:
..()
if(s_initialized)
if(user == affecting)
- to_chat(user, "All systems operational. Current energy capacity: [DisplayPower(cell.charge)].")
+ to_chat(user, "All systems operational. Current energy capacity: [DisplayEnergy(cell.charge)].")
to_chat(user, "The CLOAK-tech device is [s_active?"active":"inactive"].")
to_chat(user, "There are [s_bombs] smoke bomb\s remaining.")
to_chat(user, "There are [a_boost] adrenaline booster\s remaining.")
diff --git a/code/modules/ninja/suit/suit_initialisation.dm b/code/modules/ninja/suit/suit_initialisation.dm
index 0084ff1995..e19e67404d 100644
--- a/code/modules/ninja/suit/suit_initialisation.dm
+++ b/code/modules/ninja/suit/suit_initialisation.dm
@@ -42,7 +42,7 @@
addtimer(CALLBACK(src, .proc/ninitialize_six, delay, U), delay)
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_six(delay, mob/living/carbon/human/U)
- to_chat(U, "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [DisplayPower(cell.charge)].")
+ to_chat(U, "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [DisplayEnergy(cell.charge)].")
addtimer(CALLBACK(src, .proc/ninitialize_seven, delay, U), delay)
/obj/item/clothing/suit/space/space_ninja/proc/ninitialize_seven(delay, mob/living/carbon/human/U)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index dc63253681..9e4e29ceb5 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -430,7 +430,7 @@ By design, d1 is the smallest direction and d2 is the highest
loc = null
powernet.remove_cable(src) //remove the cut cable from its powernet
- addtimer(CALLBACK(src, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
+ addtimer(CALLBACK(O, .proc/auto_propogate_cut_cable, O), 0) //so we don't rebuild the network X times when singulo/explosion destroys a line of X cables
// Disconnect machines connected to nodes
if(d1 == 0) // if we cut a node (O-X) cable
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index acbebea458..625f99a040 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -29,7 +29,7 @@
START_PROCESSING(SSobj, src)
charge = maxcharge
if(ratingdesc)
- desc += " This one has a power rating of [DisplayPower(maxcharge)], and you should not swallow it."
+ desc += " This one has a rating of [DisplayEnergy(maxcharge)], and you should not swallow it."
update_icon()
/obj/item/stock_parts/cell/Destroy()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 920d2f5b52..68751174ca 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -284,7 +284,6 @@
return ..()
/obj/machinery/light/update_icon()
-
switch(status) // set icon_states
if(LIGHT_OK)
if(emergency_mode)
@@ -293,18 +292,17 @@
icon_state = "[base_state][on]"
if(LIGHT_EMPTY)
icon_state = "[base_state]-empty"
- on = FALSE
if(LIGHT_BURNED)
icon_state = "[base_state]-burned"
- on = FALSE
if(LIGHT_BROKEN)
icon_state = "[base_state]-broken"
- on = FALSE
return
// update the icon_state and luminosity of the light depending on its state
/obj/machinery/light/proc/update(trigger = 1)
-
+ switch(status)
+ if(LIGHT_BROKEN,LIGHT_BURNED,LIGHT_EMPTY)
+ on = FALSE
emergency_mode = FALSE
if(on)
if(!light || light.light_range != brightness)
@@ -678,7 +676,7 @@
force = 2
throwforce = 5
w_class = WEIGHT_CLASS_TINY
- var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
+ var/status = LIGHT_OK // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN
var/base_state
var/switchcount = 0 // number of times switched
materials = list(MAT_GLASS=100)
@@ -761,7 +759,7 @@
/obj/item/light/proc/shatter()
if(status == LIGHT_OK || status == LIGHT_BURNED)
- src.visible_message("[name] shatters.","You hear a small glass object shatter.")
+ visible_message("[name] shatters.","You hear a small glass object shatter.")
status = LIGHT_BROKEN
force = 5
playsound(src.loc, 'sound/effects/glasshit.ogg', 75, 1)
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 7596d890e0..1c5f0a3375 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -335,7 +335,7 @@
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 0
if(buckled_mob.client)
- buckled_mob.client.change_view(world.view)
+ buckled_mob.client.change_view(CONFIG_GET(string/default_view))
auto.Remove(buckled_mob)
. = ..()
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 085c618c42..f6435a954c 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -500,7 +500,7 @@
user.client.pixel_x = world.icon_size*_x
user.client.pixel_y = world.icon_size*_y
else
- user.client.change_view(world.view)
+ user.client.change_view(CONFIG_GET(string/default_view))
user.client.pixel_x = 0
user.client.pixel_y = 0
return zoomed
diff --git a/code/modules/projectiles/guns/beam_rifle.dm b/code/modules/projectiles/guns/beam_rifle.dm
index a88e271056..77e9ddeeb8 100644
--- a/code/modules/projectiles/guns/beam_rifle.dm
+++ b/code/modules/projectiles/guns/beam_rifle.dm
@@ -179,7 +179,7 @@
zoom_animating = 0
animate(current_user.client, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW)
zoom_current_view_increase = 0
- current_user.client.change_view(world.view)
+ current_user.client.change_view(CONFIG_GET(string/default_view))
zooming_angle = 0
current_zoom_x = 0
current_zoom_y = 0
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index a01db82752..9ae82d441d 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -396,10 +396,12 @@
var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32
//Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average.
- var/screenview = (user.client.view * 2 + 1) * world.icon_size //Refer to http://www.byond.com/docs/ref/info.html#/client/var/view for mad maths
+ var/list/screenview = getviewsize(user.client.view)
+ var/screenviewX = screenview[1] * world.icon_size
+ var/screenviewY = screenview[2] * world.icon_size
- var/ox = round(screenview/2) - user.client.pixel_x //"origin" x
- var/oy = round(screenview/2) - user.client.pixel_y //"origin" y
+ var/ox = round(screenviewX/2) - user.client.pixel_x //"origin" x
+ var/oy = round(screenviewY/2) - user.client.pixel_y //"origin" y
angle = Atan2(y - oy, x - ox)
return list(angle, p_x, p_y)
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index 9321c6b015..6a3b1a1637 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -109,7 +109,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
color = "#664300" // rgb: 102, 67, 0
boozepwr = 45
glass_icon_state = "kahluaglass"
- glass_name = "glass of RR Coffee Liquor"
+ glass_name = "glass of RR coffee liquor"
glass_desc = "DAMN, THIS THING LOOKS ROBUST!"
shot_glass_icon_state = "shotglasscream"
@@ -341,7 +341,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 25
taste_description = "burning cinnamon"
glass_icon_state = "goldschlagerglass"
- glass_name = "glass of Goldschlager"
+ glass_name = "glass of goldschlager"
glass_desc = "100% proof that teen girls will drink anything with gold in it."
shot_glass_icon_state = "shotglassgold"
@@ -396,7 +396,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 70
taste_description = "cola"
glass_icon_state = "whiskeycolaglass"
- glass_name = "Whiskey Cola"
+ glass_name = "whiskey cola"
glass_desc = "An innocent-looking mixture of cola and Whiskey. Delicious."
/datum/reagent/consumable/ethanol/martini
@@ -706,7 +706,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 70
taste_description = "soda"
glass_icon_state = "whiskeysodaglass2"
- glass_name = "Whiskey Soda"
+ glass_name = "whiskey soda"
glass_desc = "Ultimate refreshment."
/datum/reagent/consumable/ethanol/antifreeze
@@ -785,7 +785,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 70
taste_description = "tart bitterness"
glass_icon_state = "vodkatonicglass"
- glass_name = "Vodka and Tonic"
+ glass_name = "vodka and tonic"
glass_desc = "For when a gin and tonic isn't Russian enough."
@@ -797,7 +797,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 45
taste_description = "dry, tart lemons"
glass_icon_state = "ginfizzglass"
- glass_name = "Gin Fizz"
+ glass_name = "gin fizz"
glass_desc = "Refreshingly lemony, deliciously dry."
@@ -870,7 +870,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 15
taste_description = "refreshingly cold"
glass_icon_state = "iced_beerglass"
- glass_name = "Iced Beer"
+ glass_name = "iced beer"
glass_desc = "A beer so frosty, the air around it freezes."
/datum/reagent/consumable/ethanol/iced_beer/on_mob_life(mob/living/M)
@@ -1069,7 +1069,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 35
taste_description = "sour lemons"
glass_icon_state = "whiskey_sour"
- glass_name = "Whiskey Sour"
+ glass_name = "whiskey sour"
glass_desc = "Lemon juice mixed with whiskey and a dash of sugar. Surprisingly satisfying."
/datum/reagent/consumable/ethanol/hcider
@@ -1081,7 +1081,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 25
taste_description = "apples"
glass_icon_state = "whiskeyglass"
- glass_name = "Hard Cider"
+ glass_name = "hard cider"
glass_desc = "Tastes like autumn."
shot_glass_icon_state = "shotglassbrown"
@@ -1279,5 +1279,5 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 1
taste_description = "custard and alcohol"
glass_icon_state = "glass_yellow"
- glass_name = "Eggnog"
+ glass_name = "eggnog"
glass_desc = "For enjoying the most wonderful time of the year."
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index 308fd47a16..b62afb80c0 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -148,7 +148,7 @@
description = "Absolutely nothing."
taste_description = "nothing"
glass_icon_state = "nothing"
- glass_name = "Nothing"
+ glass_name = "nothing"
glass_desc = "Absolutely nothing."
shot_glass_icon_state = "shotglass"
@@ -319,7 +319,7 @@
nutriment_factor = 0
taste_description = "bitter coldness"
glass_icon_state = "icedcoffeeglass"
- glass_name = "Iced Coffee"
+ glass_name = "iced coffee"
glass_desc = "A drink to perk you up and refresh you!"
/datum/reagent/consumable/icecoffee/on_mob_life(mob/living/M)
@@ -340,7 +340,7 @@
nutriment_factor = 0
taste_description = "sweet tea"
glass_icon_state = "icedteaglass"
- glass_name = "Iced Tea"
+ glass_name = "iced tea"
glass_desc = "All natural, antioxidant-rich flavour sensation."
/datum/reagent/consumable/icetea/on_mob_life(mob/living/M)
@@ -361,7 +361,7 @@
color = "#100800" // rgb: 16, 8, 0
taste_description = "cola"
glass_icon_state = "glass_brown"
- glass_name = "glass of space Cola"
+ glass_name = "glass of Space Cola"
glass_desc = "A glass of refreshing Space Cola."
/datum/reagent/consumable/space_cola/on_mob_life(mob/living/M)
@@ -377,7 +377,7 @@
color = "#100800" // rgb: 16, 8, 0
taste_description = "the future"
glass_icon_state = "nuka_colaglass"
- glass_name = "Nuka Cola"
+ glass_name = "glass of Nuka Cola"
glass_desc = "Don't cry, Don't raise your eye, It's only nuclear wasteland."
/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/M)
@@ -434,7 +434,7 @@
color = "#00FF00" // rgb: 0, 255, 0
taste_description = "cherry soda"
glass_icon_state = "space-up_glass"
- glass_name = "glass of Space-up"
+ glass_name = "glass of Space-Up"
glass_desc = "Space-up. It helps you keep your cool."
@@ -450,7 +450,7 @@
color = "#8CFF00" // rgb: 135, 255, 0
taste_description = "tangy lime and lemon soda"
glass_icon_state = "glass_yellow"
- glass_name = "glass of Lemon-Lime"
+ glass_name = "glass of lemon-lime"
glass_desc = "You're pretty certain a real fruit has never actually touched this."
@@ -481,7 +481,7 @@
color = "#f00060" // rgb: 94, 0, 38
taste_description = "carbonated metallic soda"
glass_icon_state = "glass_red"
- glass_name = "glass of Shambler's Juice"
+ glass_name = "glass of Shambler's juice"
glass_desc = "Mmm mm, shambly."
/datum/reagent/consumable/shamblers/on_mob_life(mob/living/M)
@@ -495,7 +495,7 @@
color = "#619494" // rgb: 97, 148, 148
taste_description = "carbonated water"
glass_icon_state = "glass_clear"
- glass_name = "glass of Soda Water"
+ glass_name = "glass of soda water"
glass_desc = "Soda water. Why not make a scotch and soda?"
/datum/reagent/consumable/sodawater/on_mob_life(mob/living/M)
@@ -512,7 +512,7 @@
color = "#0064C8" // rgb: 0, 100, 200
taste_description = "tart and fresh"
glass_icon_state = "glass_clear"
- glass_name = "glass of Tonic Water"
+ glass_name = "glass of tonic water"
glass_desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away."
/datum/reagent/consumable/tonic/on_mob_life(mob/living/M)
@@ -546,7 +546,7 @@
color = "#664300" // rgb: 102, 67, 0
taste_description = "creamy coffee"
glass_icon_state = "soy_latte"
- glass_name = "Soy Latte"
+ glass_name = "soy latte"
glass_desc = "A nice and refreshing beverage while you're reading."
/datum/reagent/consumable/soy_latte/on_mob_life(mob/living/M)
@@ -568,7 +568,7 @@
color = "#664300" // rgb: 102, 67, 0
taste_description = "bitter cream"
glass_icon_state = "cafe_latte"
- glass_name = "Cafe Latte"
+ glass_name = "cafe latte"
glass_desc = "A nice, strong and refreshing beverage while you're reading."
/datum/reagent/consumable/cafe_latte/on_mob_life(mob/living/M)
@@ -612,7 +612,7 @@
nutriment_factor = 4 * REAGENTS_METABOLISM
taste_description = "sweet chocolate"
glass_icon_state = "chocolatepudding"
- glass_name = "Chocolate Pudding"
+ glass_name = "chocolate pudding"
glass_desc = "Tasty."
/datum/reagent/consumable/vanillapudding
@@ -623,7 +623,7 @@
nutriment_factor = 4 * REAGENTS_METABOLISM
taste_description = "sweet vanilla"
glass_icon_state = "vanillapudding"
- glass_name = "Vanilla Pudding"
+ glass_name = "vanilla pudding"
glass_desc = "Tasty."
/datum/reagent/consumable/cherryshake
@@ -634,7 +634,7 @@
nutriment_factor = 4 * REAGENTS_METABOLISM
taste_description = "creamy cherry"
glass_icon_state = "cherryshake"
- glass_name = "Cherry Shake"
+ glass_name = "cherry shake"
glass_desc = "A cherry flavored milkshake."
/datum/reagent/consumable/bluecherryshake
@@ -645,7 +645,7 @@
nutriment_factor = 4 * REAGENTS_METABOLISM
taste_description = "creamy blue cherry"
glass_icon_state = "bluecherryshake"
- glass_name = "Blue Cherry Shake"
+ glass_name = "blue cherry shake"
glass_desc = "An exotic blue milkshake."
/datum/reagent/consumable/pumpkin_latte
@@ -656,7 +656,7 @@
nutriment_factor = 3 * REAGENTS_METABOLISM
taste_description = "creamy pumpkin"
glass_icon_state = "pumpkin_latte"
- glass_name = "Pumpkin Latte"
+ glass_name = "pumpkin latte"
glass_desc = "A mix of coffee and pumpkin juice."
/datum/reagent/consumable/gibbfloats
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index aab8491249..a439080f55 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -117,7 +117,7 @@
taste_description = "water"
var/cooling_temperature = 2
glass_icon_state = "glass_clear"
- glass_name = "glass of Water"
+ glass_name = "glass of water"
glass_desc = "The father of all refreshments."
shot_glass_icon_state = "shotglassclear"
@@ -188,7 +188,7 @@
description = "Water blessed by some deity."
color = "#E0E8EF" // rgb: 224, 232, 239
glass_icon_state = "glass_clear"
- glass_name = "glass of Holy Water"
+ glass_name = "glass of holy water"
glass_desc = "A glass of holy water."
/datum/reagent/water/holywater/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm
index ebeb869d9c..582efaa474 100644
--- a/code/modules/research/circuitprinter.dm
+++ b/code/modules/research/circuitprinter.dm
@@ -27,9 +27,11 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
"Computer Parts"
)
+ var/datum/component/material_container/materials
+
/obj/machinery/r_n_d/circuit_imprinter/Initialize()
- var/datum/component/material_container/materials = AddComponent(/datum/component/material_container, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE),
- FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready))
+ materials = AddComponent(/datum/component/material_container, list(MAT_GLASS, MAT_GOLD, MAT_DIAMOND, MAT_METAL, MAT_BLUESPACE), 0,
+ FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.precise_insertion = TRUE
create_reagents(0)
return ..()
@@ -76,21 +78,3 @@ using metal and glass, it uses glass and reagents (usually sulfuric acis).
/obj/machinery/r_n_d/circuit_imprinter/disconnect_console()
linked_console.linked_imprinter = null
..()
-
-/obj/machinery/r_n_d/circuit_imprinter/ComponentActivated(datum/component/C)
- ..()
- if(istype(C, /datum/component/material_container))
- var/datum/component/material_container/M = C
- if(!M.last_insert_success)
- return
- var/lit = M.last_inserted_type
- var/stack_name
- if(ispath(lit, /obj/item/ore/bluespace_crystal))
- stack_name = "bluespace"
- use_power(MINERAL_MATERIAL_AMOUNT / 10)
- else
- var/obj/item/stack/S = lit
- stack_name = initial(S.name)
- use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * M.last_amount_inserted / 10)))
- add_overlay("protolathe_[stack_name]")
- addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index d8ace5f9c9..39fd0bf182 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -800,6 +800,13 @@
build_path = /obj/item/device/slime_scanner
category = list("initial", "Misc")
+/datum/design/pet_carrier
+ name = "Pet Carrier"
+ id = "pet_carrier"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 7500, MAT_GLASS = 100)
+ build_path = /obj/item/pet_carrier
+
/datum/design/miniature_power_cell
name = "Light Fixture Battery"
id = "miniature_power_cell"
diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm
index d5526e9509..a6ef6cd2bf 100644
--- a/code/modules/research/designs/power_designs.dm
+++ b/code/modules/research/designs/power_designs.dm
@@ -4,7 +4,7 @@
/datum/design/basic_cell
name = "Basic Power Cell"
- desc = "A basic power cell that holds 1 kW of power."
+ desc = "A basic power cell that holds 1 MJ of energy."
id = "basic_cell"
req_tech = list("powerstorage" = 1)
build_type = PROTOLATHE | AUTOLATHE |MECHFAB
@@ -15,7 +15,7 @@
/datum/design/high_cell
name = "High-Capacity Power Cell"
- desc = "A power cell that holds 10 kW of power."
+ desc = "A power cell that holds 10 MJ of energy."
id = "high_cell"
req_tech = list("powerstorage" = 2)
build_type = PROTOLATHE | AUTOLATHE | MECHFAB
@@ -26,7 +26,7 @@
/datum/design/super_cell
name = "Super-Capacity Power Cell"
- desc = "A power cell that holds 20 kW of power."
+ desc = "A power cell that holds 20 MJ of energy."
id = "super_cell"
req_tech = list("powerstorage" = 3, "materials" = 3)
build_type = PROTOLATHE | MECHFAB
@@ -37,7 +37,7 @@
/datum/design/hyper_cell
name = "Hyper-Capacity Power Cell"
- desc = "A power cell that holds 30 kW of power."
+ desc = "A power cell that holds 30 MJ of energy."
id = "hyper_cell"
req_tech = list("powerstorage" = 5, "materials" = 5, "engineering" = 5)
build_type = PROTOLATHE | MECHFAB
@@ -48,7 +48,7 @@
/datum/design/bluespace_cell
name = "Bluespace Power Cell"
- desc = "A power cell that holds 40 kW of power."
+ desc = "A power cell that holds 40 MJ of energy."
id = "bluespace_cell"
req_tech = list("powerstorage" = 6, "materials" = 5, "engineering" = 5, "bluespace" = 5)
build_type = PROTOLATHE | MECHFAB
diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm
index 9df4946ed2..b4412556c5 100644
--- a/code/modules/research/protolathe.dm
+++ b/code/modules/research/protolathe.dm
@@ -30,12 +30,14 @@ Note: Must be placed west/left of and R&D console to function.
"Computer Parts"
)
+ var/datum/component/material_container/materials
+
/obj/machinery/r_n_d/protolathe/Initialize()
create_reagents(0)
- var/datum/component/material_container/materials = AddComponent(/datum/component/material_container,
- list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE),
- FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready))
+ materials = AddComponent(/datum/component/material_container,
+ list(MAT_METAL, MAT_GLASS, MAT_SILVER, MAT_GOLD, MAT_DIAMOND, MAT_PLASMA, MAT_URANIUM, MAT_BANANIUM, MAT_TITANIUM, MAT_BLUESPACE), 0,
+ FALSE, list(/obj/item/stack, /obj/item/ore/bluespace_crystal), CALLBACK(src, .proc/is_insertion_ready), CALLBACK(src, .proc/AfterMaterialInsert))
materials.precise_insertion = TRUE
return ..()
@@ -77,21 +79,3 @@ Note: Must be placed west/left of and R&D console to function.
/obj/machinery/r_n_d/protolathe/disconnect_console()
linked_console.linked_lathe = null
..()
-
-/obj/machinery/r_n_d/protolathe/ComponentActivated(datum/component/C)
- ..()
- if(istype(C, /datum/component/material_container))
- var/datum/component/material_container/M = C
- if(!M.last_insert_success)
- return
- var/lit = M.last_inserted_type
- var/stack_name
- if(ispath(lit, /obj/item/ore/bluespace_crystal))
- stack_name = "bluespace"
- use_power(MINERAL_MATERIAL_AMOUNT / 10)
- else
- var/obj/item/stack/S = lit
- stack_name = initial(S.name)
- use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * M.last_amount_inserted / 10)))
- add_overlay("protolathe_[stack_name]")
- addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10)
diff --git a/code/modules/research/rdmachines.dm b/code/modules/research/rdmachines.dm
index 973a496254..b2acadb896 100644
--- a/code/modules/research/rdmachines.dm
+++ b/code/modules/research/rdmachines.dm
@@ -106,3 +106,15 @@
if(loaded_item)
loaded_item.forceMove(loc)
..()
+
+/obj/machinery/r_n_d/proc/AfterMaterialInsert(type_inserted, id_inserted, amount_inserted)
+ var/stack_name
+ if(ispath(type_inserted, /obj/item/ore/bluespace_crystal))
+ stack_name = "bluespace"
+ use_power(MINERAL_MATERIAL_AMOUNT / 10)
+ else
+ var/obj/item/stack/S = type_inserted
+ stack_name = initial(S.name)
+ use_power(max(1000, (MINERAL_MATERIAL_AMOUNT * amount_inserted / 10)))
+ add_overlay("protolathe_[stack_name]")
+ addtimer(CALLBACK(src, /atom/proc/cut_overlay, "protolathe_[stack_name]"), 10)
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index 02180b273f..576ba6fe8c 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -12,7 +12,7 @@
/mob/camera/aiEye/remote/xenobio/setLoc(var/t)
var/area/new_area = get_area(t)
- if(new_area && new_area.name == allowed_area || istype(new_area, /area/science/xenobiology ))
+ if(new_area && new_area.name == allowed_area || new_area && new_area.xenobiology_compatible)
return ..()
else
return
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 6f9db6c8e2..b809401ed1 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -508,14 +508,14 @@
/obj/item/areaeditor/blueprints/slime
name = "cerulean prints"
- desc = "A one use yet of blueprints made of jelly like organic material. Renaming an area to 'Xenobiology Lab' will extend the reach of the management console."
+ desc = "A one use yet of blueprints made of jelly like organic material. Extends the reach of the management console."
color = "#2956B2"
/obj/item/areaeditor/blueprints/slime/edit_area()
- var/success = ..()
+ ..()
var/area/A = get_area(src)
- if(success)
- for(var/turf/T in A)
- T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
- T.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY)
- qdel(src)
+ for(var/turf/T in A)
+ T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
+ T.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY)
+ A.xenobiology_compatible = TRUE
+ qdel(src)
diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm
index 67edf8dc9b..46921efc6a 100644
--- a/code/modules/ruins/lavaland_ruin_code.dm
+++ b/code/modules/ruins/lavaland_ruin_code.dm
@@ -97,7 +97,7 @@
name = "Syndicate Bioweapon Scientist"
roundstart = FALSE
death = FALSE
- icon = 'icons/obj/Cryogenic2.dmi'
+ icon = 'icons/obj/machines/sleeper.dmi'
icon_state = "sleeper_s"
flavour_text = "You are a syndicate agent, employed in a top secret research facility developing biological weapons. Unfortunately, your hated enemy, Nanotrasen, has begun mining in this sector. Continue your research as best you can, and try to keep a low profile. DON'T abandon the base without good cause. The base is rigged with explosives should the worst happen, do not let the base fall into enemy hands!"
id_access_list = list(ACCESS_SYNDICATE)
diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm
index dd27d40e91..cedebc8edb 100644
--- a/code/modules/shuttle/navigation_computer.dm
+++ b/code/modules/shuttle/navigation_computer.dm
@@ -69,7 +69,7 @@
var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj
user.client.images -= the_eye.placement_images
user.client.images -= the_eye.placed_images
- user.client.change_view(world.view)
+ user.client.change_view(CONFIG_GET(string/default_view))
/obj/machinery/computer/camera_advanced/shuttle_docker/proc/placeLandingSpot()
if(!checkLandingSpot())
diff --git a/code/modules/shuttle/on_move.dm b/code/modules/shuttle/on_move.dm
index 51c62029e0..15f0dbb011 100644
--- a/code/modules/shuttle/on_move.dm
+++ b/code/modules/shuttle/on_move.dm
@@ -92,7 +92,7 @@ All ShuttleMove procs go here
return TRUE
// Called on atoms after everything has been moved
-/atom/movable/proc/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/atom/movable/proc/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
if(light)
update_light()
if(rotation)
@@ -148,7 +148,7 @@ All ShuttleMove procs go here
A.air_tight = TRUE
INVOKE_ASYNC(A, /obj/machinery/door/.proc/close)
-/obj/machinery/door/airlock/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/machinery/door/airlock/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
shuttledocked = 1
for(var/obj/machinery/door/airlock/A in range(1, src))
@@ -160,24 +160,24 @@ All ShuttleMove procs go here
. |= MOVE_CONTENTS
GLOB.cameranet.removeCamera(src)
-/obj/machinery/camera/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/machinery/camera/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
GLOB.cameranet.addCamera(src)
-/obj/machinery/telecomms/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/machinery/telecomms/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
listening_level = z // Update listening Z, just in case you have telecomm relay on a shuttle
-/obj/machinery/mech_bay_recharge_port/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
+/obj/machinery/mech_bay_recharge_port/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir)
. = ..()
recharging_turf = get_step(loc, dir)
-/obj/machinery/atmospherics/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/machinery/atmospherics/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
if(pipe_vision_img)
pipe_vision_img.loc = loc
-/obj/machinery/computer/auxillary_base/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/machinery/computer/auxillary_base/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
if(z == ZLEVEL_MINING) //Avoids double logging and landing on other Z-levels due to badminnery
SSblackbox.record_feedback("associative", "colonies_dropped", 1, list("x" = x, "y" = y, "z" = z))
@@ -187,7 +187,7 @@ All ShuttleMove procs go here
on = FALSE
update_list()
-/obj/machinery/gravity_generator/main/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/machinery/gravity_generator/main/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
if(charge_count != 0 && charging_state != POWER_UP)
on = TRUE
@@ -198,7 +198,7 @@ All ShuttleMove procs go here
if(. & MOVE_AREA)
. |= MOVE_CONTENTS
-/obj/machinery/atmospherics/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/machinery/atmospherics/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
var/missing_nodes = FALSE
for(DEVICE_TYPE_LOOP)
@@ -227,7 +227,7 @@ All ShuttleMove procs go here
// atmosinit() calls update_icon(), so we don't need to call it
update_icon()
-/obj/machinery/atmospherics/pipe/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/machinery/atmospherics/pipe/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
var/turf/T = loc
hide(T.intact)
@@ -237,7 +237,7 @@ All ShuttleMove procs go here
GLOB.navbeacons["[z]"] -= src
GLOB.deliverybeacons -= src
-/obj/machinery/navbeacon/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/machinery/navbeacon/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
var/turf/T = loc
hide(T.intact)
@@ -249,7 +249,7 @@ All ShuttleMove procs go here
GLOB.deliverybeacons += src
GLOB.deliverybeacontags += location
-/obj/machinery/power/terminal/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/machinery/power/terminal/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
var/turf/T = src.loc
if(level==1)
@@ -257,7 +257,7 @@ All ShuttleMove procs go here
/************************************Item move procs************************************/
-/obj/item/storage/pod/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/item/storage/pod/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
unlocked = TRUE
// If the pod was launched, the storage will always open.
@@ -269,7 +269,7 @@ All ShuttleMove procs go here
return
. = ..()
-/mob/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/mob/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
if(!move_on_shuttle)
return
. = ..()
@@ -279,7 +279,7 @@ All ShuttleMove procs go here
shake_force *= 0.25
shake_camera(src, shake_force, 1)
-/mob/living/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/mob/living/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
if(movement_force && !buckled)
if(movement_force["THROW"])
@@ -307,11 +307,11 @@ All ShuttleMove procs go here
if(. & MOVE_AREA)
. |= MOVE_CONTENTS
-/obj/structure/disposalpipe/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/structure/disposalpipe/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
update()
-/obj/structure/cable/afterShuttleMove(list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
+/obj/structure/cable/afterShuttleMove(turf/oldT, list/movement_force, shuttle_dir, shuttle_preferred_direction, move_dir, rotation)
. = ..()
var/turf/T = loc
if(level==1)
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 2f0fb711bd..79d662c8e4 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -631,7 +631,7 @@
if(moving_atom.loc != oldT) //fix for multi-tile objects
continue
moving_atom.onShuttleMove(newT, oldT, movement_force, movement_direction, old_dock, src) //atoms
- moved_atoms += moving_atom
+ moved_atoms[moving_atom] = oldT
if(move_mode & MOVE_TURF)
oldT.onShuttleMove(newT, movement_force, movement_direction) //turfs
@@ -665,7 +665,8 @@
for(var/i in 1 to moved_atoms.len)
CHECK_TICK
var/atom/movable/moved_object = moved_atoms[i]
- moved_object.afterShuttleMove(movement_force, dir, preferred_direction, movement_direction, rotation)//atoms
+ var/turf/oldT = moved_atoms[moved_object]
+ moved_object.afterShuttleMove(oldT, movement_force, dir, preferred_direction, movement_direction, rotation)//atoms
for(var/i in 1 to old_turfs.len)
CHECK_TICK
diff --git a/code/modules/tgui/states.dm b/code/modules/tgui/states.dm
index c3e7d9b0c9..831f829154 100644
--- a/code/modules/tgui/states.dm
+++ b/code/modules/tgui/states.dm
@@ -26,7 +26,8 @@
. = max(., UI_INTERACTIVE)
// Regular ghosts can always at least view if in range.
- if(get_dist(src_object, user) < user.client.view)
+ var/clientviewlist = getviewsize(user.client.view)
+ if(get_dist(src_object, user) < max(clientviewlist[1],clientviewlist[2]))
. = max(., UI_UPDATE)
// Check if the state allows interaction
diff --git a/code/modules/tgui/states/default.dm b/code/modules/tgui/states/default.dm
index 3ae48c7bc7..e61f61bc4a 100644
--- a/code/modules/tgui/states/default.dm
+++ b/code/modules/tgui/states/default.dm
@@ -33,7 +33,8 @@ GLOBAL_DATUM_INIT(default_state, /datum/ui_state/default, new)
return
// Robots can interact with anything they can see.
- if(get_dist(src, src_object) <= client.view)
+ var/list/clientviewlist = getviewsize(client.view)
+ if(get_dist(src, src_object) <= min(clientviewlist[1],clientviewlist[2]))
return UI_INTERACTIVE
return UI_DISABLED // Otherwise they can keep the UI open.
diff --git a/config/config.txt b/config/config.txt
index a05e463f45..fb648a5fa9 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -386,3 +386,10 @@ DISABLE_HIGH_POP_MC_MODE_AMOUNT 60
## Uncomment to set the number of /world/Reboot()s before the DreamDaemon restarts itself. 0 means restart every round. Requires tgstation server tools.
#ROUNDS_UNTIL_HARD_RESTART 10
+
+
+##Default screen resolution, in tiles.
+## By default, this is 15x15, which gets simplified to 7 by BYOND, as it is a 1:1 screen ratio.
+## For reference, Goonstation uses a resolution of 21x15 for it's widescreen mode.
+## Do note that changing this value will affect the title screen. The title screen will have to be updated manually if this is changed.
+DEFAULT_VIEW 15x15
diff --git a/config/unbuyableshuttles.txt b/config/unbuyableshuttles.txt
index 30c887b39b..b563c6c0e6 100644
--- a/config/unbuyableshuttles.txt
+++ b/config/unbuyableshuttles.txt
@@ -27,3 +27,4 @@
#_maps/shuttles/emergency_scrapheap.dmm
#_maps/shuttles/emergency_supermatter.dmm
#_maps/shuttles/emergency_wabbajack.dmm
+#_maps/shuttles/emergency_discoinferno.dmm
diff --git a/html/changelogs/AutoChangeLog-pr-4176.yml b/html/changelogs/AutoChangeLog-pr-4176.yml
new file mode 100644
index 0000000000..76ccbf0925
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4176.yml
@@ -0,0 +1,8 @@
+author: "Toriate"
+delete-after: True
+changes:
+ - rscadd: "Added Lavaknights, a new ghost role of cat people in knight armor."
+ - rscadd: "Added Hypereutactic blades, NEBs on steroids."
+ - tweak: "Made NEBs alt click to recolor
+wip: Added lavaknight spawners. Someone else needs to add it in to a map or ruin properly."
+ - imageadd: "added sprites for hypereutactic blades"
diff --git a/html/changelogs/AutoChangeLog-pr-4215.yml b/html/changelogs/AutoChangeLog-pr-4215.yml
new file mode 100644
index 0000000000..6e4fe16805
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4215.yml
@@ -0,0 +1,4 @@
+author: "Dax Dupont"
+delete-after: True
+changes:
+ - rscadd: "Nanotrasen is happy to announce the pinnacle in plasma research! The Disco Inferno shuttle design is the result of decades of plasma research. Burn, baby, burn!"
diff --git a/html/changelogs/AutoChangeLog-pr-4216.yml b/html/changelogs/AutoChangeLog-pr-4216.yml
new file mode 100644
index 0000000000..8b39d4aa94
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4216.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - tweak: "Stethoscopes now inform the user if the target can be defibrillated; the user will hear a \"faint, fluttery pulse.\""
diff --git a/html/changelogs/AutoChangeLog-pr-4218.yml b/html/changelogs/AutoChangeLog-pr-4218.yml
new file mode 100644
index 0000000000..334c16e021
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4218.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - spellcheck: "Energy values are now measured in joules. What was previously 1 unit is now 1 kJ."
diff --git a/html/changelogs/AutoChangeLog-pr-4220.yml b/html/changelogs/AutoChangeLog-pr-4220.yml
new file mode 100644
index 0000000000..7287bee043
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4220.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - sounddel: "Reduced the volume of showers"
diff --git a/html/changelogs/AutoChangeLog-pr-4234.yml b/html/changelogs/AutoChangeLog-pr-4234.yml
new file mode 100644
index 0000000000..3310bdb750
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4234.yml
@@ -0,0 +1,4 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Syndicate uplink implants now work again."
diff --git a/html/changelogs/AutoChangeLog-pr-4235.yml b/html/changelogs/AutoChangeLog-pr-4235.yml
new file mode 100644
index 0000000000..35197c0edf
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4235.yml
@@ -0,0 +1,4 @@
+author: "Robustin"
+delete-after: True
+changes:
+ - rscdel: "Reverted changes in 3d sound system that tripled the distance that sound would carry."
diff --git a/html/changelogs/AutoChangeLog-pr-4243.yml b/html/changelogs/AutoChangeLog-pr-4243.yml
new file mode 100644
index 0000000000..4971528f94
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4243.yml
@@ -0,0 +1,4 @@
+author: "Revenant Defile ability"
+delete-after: True
+changes:
+ - bugfix: "Revenant's Defile now removes salt piles"
diff --git a/html/changelogs/AutoChangeLog-pr-4244.yml b/html/changelogs/AutoChangeLog-pr-4244.yml
new file mode 100644
index 0000000000..d1081a8801
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4244.yml
@@ -0,0 +1,4 @@
+author: "Dax Dupont & Alek2ander"
+delete-after: True
+changes:
+ - tweak: "Binary chat messages been made more visible."
diff --git a/html/changelogs/AutoChangeLog-pr-4260.yml b/html/changelogs/AutoChangeLog-pr-4260.yml
new file mode 100644
index 0000000000..1880edb973
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4260.yml
@@ -0,0 +1,4 @@
+author: "Xhuis"
+delete-after: True
+changes:
+ - rscadd: "You can now make pet carriers from the autolathe, to carry around chef meat and other small animals without having to drag them. The HoP, captain, and CMO also start with carriers in their lockers for their pets."
diff --git a/html/changelogs/AutoChangeLog-pr-4261.yml b/html/changelogs/AutoChangeLog-pr-4261.yml
new file mode 100644
index 0000000000..d7b0bcebf5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4261.yml
@@ -0,0 +1,4 @@
+author: "Fox McCloud"
+delete-after: True
+changes:
+ - tweak: "Slime blueprints can now make an area compatible with Xenobio consoles, regardless of the name of the new area"
diff --git a/html/changelogs/AutoChangeLog-pr-4264.yml b/html/changelogs/AutoChangeLog-pr-4264.yml
new file mode 100644
index 0000000000..3a3b5c1f42
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4264.yml
@@ -0,0 +1,5 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - rscadd: "You now can get a medal for wasting hours talking to the secret debug tile."
+ - bugfix: "Fixed runtime for the tile when poly's speech file doesn't exist."
diff --git a/html/changelogs/AutoChangeLog-pr-4266.yml b/html/changelogs/AutoChangeLog-pr-4266.yml
new file mode 100644
index 0000000000..e66348d5b4
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4266.yml
@@ -0,0 +1,5 @@
+author: "CitadelStationBot"
+delete-after: True
+changes:
+ - bugfix: "Fixed the camera failure, race swap, cursed items, and imposter wizard random events"
+ - tweak: "The cursed items event no longer nullspaces items"
diff --git a/html/changelogs/AutoChangeLog-pr-4267.yml b/html/changelogs/AutoChangeLog-pr-4267.yml
new file mode 100644
index 0000000000..97e3a17b9a
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4267.yml
@@ -0,0 +1,4 @@
+author: "MrDoomBringer"
+delete-after: True
+changes:
+ - imageadd: "All stations have been outfitted with brand new Smoke Machines! They have nicer sprites now!"
diff --git a/html/changelogs/AutoChangeLog-pr-4270.yml b/html/changelogs/AutoChangeLog-pr-4270.yml
new file mode 100644
index 0000000000..06c99c93ee
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4270.yml
@@ -0,0 +1,4 @@
+author: "deathride58"
+delete-after: True
+changes:
+ - config: "The default view range can now be defined in the config. The default is 15x15, which is simplified to 7 by BYOND. For reference, Goonstation's widescreen range is 21x15. Do note that changing this value will affect the title screen. The title screen images and the title screen area on the Centcom z-level will have to be updated if the default view range is changed."
diff --git a/html/changelogs/AutoChangeLog-pr-4274.yml b/html/changelogs/AutoChangeLog-pr-4274.yml
new file mode 100644
index 0000000000..b1915f089b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4274.yml
@@ -0,0 +1,4 @@
+author: "Dax Dupont"
+delete-after: True
+changes:
+ - bugfix: "Fixed observer chat flavor of silicon chat."
diff --git a/html/changelogs/AutoChangeLog-pr-4279.yml b/html/changelogs/AutoChangeLog-pr-4279.yml
new file mode 100644
index 0000000000..cddc887068
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-4279.yml
@@ -0,0 +1,4 @@
+author: "Dax Dupont"
+delete-after: True
+changes:
+ - bugfix: "Grilles now no longer revert to a pre-broken icon state when you hit them after they broke."
diff --git a/icons/mob/actions/actions_animal.dmi b/icons/mob/actions/actions_animal.dmi
index 1dcf7590cd..aefa471dd2 100644
Binary files a/icons/mob/actions/actions_animal.dmi and b/icons/mob/actions/actions_animal.dmi differ
diff --git a/icons/mob/actions/actions_clockcult.dmi b/icons/mob/actions/actions_clockcult.dmi
index 19fd68f836..4aad4ba569 100644
Binary files a/icons/mob/actions/actions_clockcult.dmi and b/icons/mob/actions/actions_clockcult.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 198c2ee663..9a7b318e19 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index cef6409ca2..9d9350e644 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/mob/lavaland/64x64megafauna.dmi b/icons/mob/lavaland/64x64megafauna.dmi
index 7cc2b92a17..64304fdcd1 100644
Binary files a/icons/mob/lavaland/64x64megafauna.dmi and b/icons/mob/lavaland/64x64megafauna.dmi differ
diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi
index f072421196..fd93db24aa 100644
Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ
diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi
index e9fd4ed401..fc236ac7e2 100644
Binary files a/icons/mob/screen_cyborg.dmi and b/icons/mob/screen_cyborg.dmi differ
diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi
index f3345c0825..597ee94d72 100644
Binary files a/icons/mob/simple_human.dmi and b/icons/mob/simple_human.dmi differ
diff --git a/icons/obj/assemblies/electronic_components.dmi b/icons/obj/assemblies/electronic_components.dmi
index cdfa386233..cc0367b682 100644
Binary files a/icons/obj/assemblies/electronic_components.dmi and b/icons/obj/assemblies/electronic_components.dmi differ
diff --git a/icons/obj/atmospherics/components/thermomachine.dmi b/icons/obj/atmospherics/components/thermomachine.dmi
new file mode 100644
index 0000000000..2ff9dac031
Binary files /dev/null and b/icons/obj/atmospherics/components/thermomachine.dmi differ
diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi
index 3507d9db53..367be13b3b 100644
Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ
diff --git a/icons/obj/clockwork_objects.dmi b/icons/obj/clockwork_objects.dmi
index 561359959b..784c0f55eb 100644
Binary files a/icons/obj/clockwork_objects.dmi and b/icons/obj/clockwork_objects.dmi differ
diff --git a/icons/obj/guns/bayonets.dmi b/icons/obj/guns/bayonets.dmi
index 176005b7d7..32b5448b8e 100644
Binary files a/icons/obj/guns/bayonets.dmi and b/icons/obj/guns/bayonets.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 0f56fcac9a..446b093167 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/icons/obj/machines/camera.dmi b/icons/obj/machines/camera.dmi
new file mode 100644
index 0000000000..343a5118e8
Binary files /dev/null and b/icons/obj/machines/camera.dmi differ
diff --git a/icons/obj/machines/cloning.dmi b/icons/obj/machines/cloning.dmi
new file mode 100644
index 0000000000..de68060740
Binary files /dev/null and b/icons/obj/machines/cloning.dmi differ
diff --git a/icons/obj/machines/sleeper.dmi b/icons/obj/machines/sleeper.dmi
new file mode 100644
index 0000000000..b027d0d7b1
Binary files /dev/null and b/icons/obj/machines/sleeper.dmi differ
diff --git a/icons/obj/monitors.dmi b/icons/obj/monitors.dmi
index 0a2edd5dbe..b9c34380de 100644
Binary files a/icons/obj/monitors.dmi and b/icons/obj/monitors.dmi differ
diff --git a/icons/obj/pet_carrier.dmi b/icons/obj/pet_carrier.dmi
new file mode 100644
index 0000000000..340636056c
Binary files /dev/null and b/icons/obj/pet_carrier.dmi differ
diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi
index 8fe7c73683..a1471e6418 100644
Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ
diff --git a/icons/obj/vending_restock.dmi b/icons/obj/vending_restock.dmi
index 7f8289a087..a59fdd0f52 100644
Binary files a/icons/obj/vending_restock.dmi and b/icons/obj/vending_restock.dmi differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index 7ad30fb7b5..b4085fcd0d 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -36,6 +36,9 @@ em {font-style: normal; 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;}
diff --git a/modular_citadel/citadel_ghostrole_spawners.dm b/modular_citadel/citadel_ghostrole_spawners.dm
new file mode 100644
index 0000000000..b0cddbd594
--- /dev/null
+++ b/modular_citadel/citadel_ghostrole_spawners.dm
@@ -0,0 +1,43 @@
+/obj/effect/mob_spawn/human/lavaknight
+ name = "odd cryogenics pod"
+ desc = "A humming cryo pod. You can barely recognise a faint glow underneath the built up ice. The machine is attempting to wake up its occupant."
+ mob_name = "a displaced knight from another dimension"
+ icon = 'icons/obj/machines/sleeper.dmi'
+ icon_state = "sleeper"
+ roundstart = FALSE
+ death = FALSE
+ random = TRUE
+ outfit = /datum/outfit/lavaknight
+ mob_species = /datum/species/human
+ flavour_text = "You are a knight who conveniently has some form of retrograde amnesia. \
+ You cannot remember where you came from. However, a few things remain burnt into your mind, most prominently a vow to never harm another sapient being under any circumstances unless it is hellbent on ending your life. \
+ Remember: hostile creatures and such are fair game for attacking, but under no circumstances are you to attack anything capable of thought and/or speech unless it has made it its life's calling to chase you to the ends of the earth."
+ assignedrole = "Cydonian Knight"
+
+/obj/effect/mob_spawn/human/lavaknight/special(mob/living/new_spawn)
+ if(ishuman(new_spawn))
+ var/mob/living/carbon/human/H = new_spawn
+ H.dna.features["ears"] = "Cat" //cat people
+ H.update_body()
+
+/obj/effect/mob_spawn/human/lavaknight/Destroy()
+ new/obj/structure/showcase/machinery/oldpod/used(drop_location())
+ return ..()
+
+/datum/outfit/lavaknight
+ name = "Cydonian Knight"
+ uniform = /obj/item/clothing/under/assistantformal
+ mask = /obj/item/clothing/mask/breath
+ shoes = /obj/item/clothing/shoes/sneakers/black
+ r_pocket = /obj/item/melee/transforming/energy/sword/cx
+ suit = /obj/item/clothing/suit/space/hardsuit/lavaknight
+ suit_store = /obj/item/tank/internals/oxygen
+
+/obj/effect/mob_spawn/human/lavaknight/captain
+ name = "odd gilded cryogenics pod"
+ desc = "A humming cryo pod that appears to be gilded. You can barely recognise a faint glow underneath the built up ice. The machine is attempting to wake up its occupant."
+ flavour_text = "You are a knight who conveniently has some form of retrograde amnesia. \
+ You cannot remember where you came from. However, a few things remain burnt into your mind, most prominently a vow to never harm another sapient being under any circumstances unless it is hellbent on ending your life. \
+ Remember: hostile creatures and such are fair game for attacking, but under no circumstances are you to attack anything capable of thought and/or speech unless it has made it its life's calling to chase you to the ends of the earth. \
+ You feel a natural instict to lead, and as such, you should strive to lead your comrades to safety, and hopefully home. You also feel a burning determination to uphold your vow, as well as your fellow comrade's."
+ l_pocket = /obj/item/twohanded/hypereutactic
diff --git a/modular_citadel/cydonian_armor.dm b/modular_citadel/cydonian_armor.dm
new file mode 100644
index 0000000000..0189358d36
--- /dev/null
+++ b/modular_citadel/cydonian_armor.dm
@@ -0,0 +1,160 @@
+/*
+ CYDONIAN ARMOR THAT IS RGB AND STUFF WOOOOOOOOOO
+*/
+
+/obj/item/clothing/head/helmet/space/hardsuit/lavaknight
+ name = "cydonian helmet"
+ desc = "A helmet designed with both form and function in mind, it protects the user against physical trauma and hazardous conditions while also having polychromic light strips."
+ icon = 'modular_citadel/icons/lavaknight/item/head.dmi'
+ icon_state = "knight_cydonia"
+ item_state = "knight_yellow"
+ item_color = null
+ alternate_worn_icon = 'modular_citadel/icons/lavaknight/mob/head.dmi'
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ resistance_flags = FIRE_PROOF | LAVA_PROOF
+ heat_protection = HEAD
+ armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
+ brightness_on = 7
+ allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/device/mining_scanner, /obj/item/device/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator)
+ var/energy_color = "#35FFF0"
+ var/obj/item/clothing/suit/space/hardsuit/lavaknight/linkedsuit = null
+
+/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/New()
+ ..()
+ if(istype(loc, /obj/item/clothing/suit/space/hardsuit/lavaknight))
+ linkedsuit = loc
+
+/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/attack_self(mob/user)
+ on = !on
+
+ if(on)
+ set_light(brightness_on)
+ else
+ set_light(0)
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
+
+/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/update_icon()
+ var/mutable_appearance/helm_overlay = mutable_appearance('modular_citadel/icons/lavaknight/item/head.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
+
+ if(energy_color)
+ helm_overlay.color = energy_color
+
+ helm_overlay.plane = LIGHTING_PLANE + 1 //Magic number is used here because we have no ABOVE_LIGHTING_PLANE plane defined. Lighting plane is 15, HUD is 18
+
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+
+ add_overlay(helm_overlay)
+
+ emissivelights()
+
+/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/equipped(mob/user, slot)
+ ..()
+ if(slot == slot_head)
+ emissivelights()
+
+/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/dropped(mob/user)
+ ..()
+ emissivelightsoff()
+
+/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/proc/emissivelights(mob/user = usr)
+ var/mutable_appearance/energy_overlay = mutable_appearance('modular_citadel/icons/lavaknight/mob/head.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
+ energy_overlay.color = energy_color
+ energy_overlay.plane = LIGHTING_PLANE + 1
+ user.cut_overlay(energy_overlay) //honk
+ user.add_overlay(energy_overlay) //honk
+
+/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/proc/emissivelightsoff(mob/user = usr)
+ user.cut_overlay()
+ linkedsuit.emissivelights() //HONK HONK HONK MAXIMUM SPAGHETTI
+ user.regenerate_icons() //honk
+
+/obj/item/clothing/suit/space/hardsuit/lavaknight
+ icon = 'modular_citadel/icons/lavaknight/item/suit.dmi'
+ icon_state = "knight_cydonia"
+ name = "cydonian armor"
+ desc = "A suit designed with both form and function in mind, it protects the user against physical trauma and hazardous conditions while also having polychromic light strips."
+ item_state = "swat_suit"
+ alternate_worn_icon = 'modular_citadel/icons/lavaknight/mob/suit.dmi'
+ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT
+ resistance_flags = FIRE_PROOF | LAVA_PROOF
+ armor = list(melee = 50, bullet = 10, laser = 10, energy = 10, bomb = 50, bio = 100, rad = 50, fire = 100, acid = 100)
+ allowed = list(/obj/item/device/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe)
+ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/lavaknight
+ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
+ actions_types = list(/datum/action/item_action/toggle_helmet)
+ var/obj/item/clothing/head/helmet/space/hardsuit/lavaknight/linkedhelm
+
+ var/energy_color = "#35FFF0"
+
+/obj/item/clothing/suit/space/hardsuit/lavaknight/New()
+ ..()
+ if(helmet)
+ linkedhelm = helmet
+ light_color = energy_color
+ set_light(1)
+
+/obj/item/clothing/suit/space/hardsuit/lavaknight/Initialize()
+ ..()
+ update_icon()
+
+/obj/item/clothing/suit/space/hardsuit/lavaknight/update_icon()
+ var/mutable_appearance/suit_overlay = mutable_appearance('modular_citadel/icons/lavaknight/item/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
+
+ if(energy_color)
+ suit_overlay.color = energy_color
+
+ suit_overlay.plane = LIGHTING_PLANE + 1 //Magic number is used here because we have no ABOVE_LIGHTING_PLANE plane defined. Lighting plane is 15.
+
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+
+ add_overlay(suit_overlay)
+
+/obj/item/clothing/suit/space/hardsuit/lavaknight/equipped(mob/user, slot)
+ ..()
+ if(slot == slot_wear_suit)
+ emissivelights()
+
+/obj/item/clothing/suit/space/hardsuit/lavaknight/dropped(mob/user)
+ ..()
+ emissivelightsoff()
+
+/obj/item/clothing/suit/space/hardsuit/lavaknight/proc/emissivelights(mob/user = usr)
+ var/mutable_appearance/energy_overlay = mutable_appearance('modular_citadel/icons/lavaknight/mob/suit.dmi', "knight_cydonia_overlay", LIGHTING_LAYER + 1)
+ energy_overlay.color = energy_color
+ energy_overlay.plane = LIGHTING_PLANE + 1
+ user.cut_overlay(energy_overlay) //honk
+ user.add_overlay(energy_overlay) //honk
+
+/obj/item/clothing/suit/space/hardsuit/lavaknight/proc/emissivelightsoff(mob/user = usr)
+ user.cut_overlays()
+ user.regenerate_icons() //honk
+
+/obj/item/clothing/suit/space/hardsuit/lavaknight/AltClick(mob/living/user)
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!in_range(src, user))
+ return
+ if(user.incapacitated() || !istype(user) || !in_range(src, user))
+ return
+
+ if(alert("Are you sure you want to recolor your armor stripes?", "Confirm Repaint", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"Choose Energy Color") as color|null
+ if(energy_color_input)
+ energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ user.update_inv_wear_suit()
+ if(linkedhelm)
+ linkedhelm.energy_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ user.update_inv_head()
+ linkedhelm.update_icon()
+ update_icon()
+ user.update_inv_wear_suit()
+ light_color = energy_color
+ emissivelights()
+ update_light()
+
+/obj/item/clothing/suit/space/hardsuit/lavaknight/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to recolor it.")
\ No newline at end of file
diff --git a/modular_citadel/hypereutactic_blade.dm b/modular_citadel/hypereutactic_blade.dm
new file mode 100644
index 0000000000..e96789c43f
--- /dev/null
+++ b/modular_citadel/hypereutactic_blade.dm
@@ -0,0 +1,278 @@
+/* fuckhuge esword thingy */
+
+/obj/item/twohanded/hypereutactic
+ icon = 'modular_citadel/icons/hypereutactic/item/hypereutactic.dmi'
+ icon_state = "hypereutactic"
+ lefthand_file = 'modular_citadel/icons/hypereutactic/mob/hypereutactic_left.dmi'
+ righthand_file = 'modular_citadel/icons/hypereutactic/mob/hypereutactic_right.dmi'
+ item_state = "hypereutactic"
+ inhand_x_dimension = 64
+ inhand_y_dimension = 64
+ name = "hypereutactic blade"
+ desc = "A supermassive weapon envisioned to cleave the very fabric of space and time itself in twain, the hypereutactic blade dynamically flash-forges a hypereutactic crystaline nanostructure capable of passing through most known forms of matter like a hot knife through butter."
+ force = 3
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 5
+ w_class = WEIGHT_CLASS_SMALL
+ var/w_class_on = WEIGHT_CLASS_BULKY
+ force_unwielded = 3
+ force_wielded = 40
+ wieldsound = 'sound/weapons/nebon.ogg'
+ unwieldsound = 'sound/weapons/neboff.ogg'
+ hitsound = "swing_hit"
+ armour_penetration = 40
+ origin_tech = "magnets=6;syndicate=1"
+ light_color = "#37FFF7"
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "destroyed", "ripped", "devastated", "shredded")
+ block_chance = 75
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 100, acid = 70)
+ resistance_flags = FIRE_PROOF
+ var/brightness_on = 6 //TWICE AS BRIGHT AS A REGULAR ESWORD
+ flags_2 = SLOWS_WHILE_IN_HAND_2
+
+/obj/item/twohanded/hypereutactic/wield(mob/living/carbon/M) //Specific wield () hulk checks due to reflection chance for balance issues and switches hitsounds.
+ if(M.has_dna())
+ if(M.dna.check_mutation(HULK))
+ to_chat(M, "You lack the grace to wield this!")
+ return
+ ..()
+ if(wielded)
+ sharpness = IS_SHARP
+ w_class = w_class_on
+ hitsound = 'sound/weapons/nebhit.ogg'
+ START_PROCESSING(SSobj, src)
+ set_light(brightness_on)
+ slowdown = 1
+
+/obj/item/twohanded/hypereutactic/unwield() //Specific unwield () to switch hitsounds.
+ sharpness = initial(sharpness)
+ w_class = initial(w_class)
+ ..()
+ hitsound = "swing_hit"
+ STOP_PROCESSING(SSobj, src)
+ set_light(0)
+ slowdown = initial(slowdown)
+
+/obj/item/twohanded/hypereutactic/update_icon()
+ var/mutable_appearance/blade_overlay = mutable_appearance('modular_citadel/icons/hypereutactic/item/hypereutactic.dmi', "hypereutactic_blade")
+ var/mutable_appearance/gem_overlay = mutable_appearance('modular_citadel/icons/hypereutactic/item/hypereutactic.dmi', "hypereutactic_gem")
+
+ if(light_color)
+ blade_overlay.color = light_color
+ gem_overlay.color = light_color
+
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+
+ add_overlay(gem_overlay)
+
+ if(wielded)
+ add_overlay(blade_overlay)
+
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+
+ clean_blood()//blood overlays get weird otherwise, because the sprite changes. (retained from original desword because I have no idea what this is)
+
+/obj/item/twohanded/hypereutactic/AltClick(mob/living/user)
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!in_range(src, user))
+ return
+ if(user.incapacitated() || !istype(user) || !in_range(src, user))
+ return
+
+ if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"Choose Energy Color") as color|null
+ if(energy_color_input)
+ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+ update_light()
+
+/obj/item/twohanded/hypereutactic/worn_overlays(isinhands, icon_file)
+ . = ..()
+ if(isinhands)
+ var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem")
+ gem_inhand.color = light_color
+ . += gem_inhand
+ if(wielded)
+ var/mutable_appearance/blade_inhand = mutable_appearance(icon_file, "hypereutactic_blade")
+ blade_inhand.color = light_color
+ . += blade_inhand
+
+/obj/item/twohanded/hypereutactic/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to recolor it.")
+
+
+
+////////// stuff beneath this is all taken from the desword ////////////
+
+
+
+/obj/item/twohanded/hypereutactic/attack(mob/target, mob/living/carbon/human/user)
+ if(user.has_dna())
+ if(user.dna.check_mutation(HULK))
+ to_chat(user, "You grip the blade too hard and accidentally close it!")
+ unwield()
+ return
+ ..()
+ if(user.disabilities & CLUMSY && (wielded) && prob(40))
+ impale(user)
+ return
+
+/obj/item/twohanded/hypereutactic/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
+
+/obj/item/twohanded/hypereutactic/proc/impale(mob/living/user)
+ to_chat(user, "You spin around a bit before losing your balance and impaling yourself on [src].")
+ if (force_wielded)
+ user.take_bodypart_damage(20,25)
+ else
+ user.adjustStaminaLoss(25)
+
+/obj/item/twohanded/hypereutactic/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ if(wielded)
+ return ..()
+ return 0
+
+/obj/item/twohanded/hypereutactic/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) //In case thats just so happens that it is still activated on the groud, prevents hulk from picking it up
+ if(wielded)
+ to_chat(user, "You can't pick up such dangerous item with your meaty hands without losing fingers, better not to!")
+ return 1
+
+/obj/item/twohanded/hypereutactic/process()
+ if(wielded)
+ open_flame()
+ else
+ STOP_PROCESSING(SSobj, src)
+
+/obj/item/twohanded/hypereutactic/IsReflect()
+ if(wielded)
+ return 1
+
+/obj/item/twohanded/hypereutactic/ignition_effect(atom/A, mob/user)
+ // same as /obj/item/melee/transforming/energy, mostly
+ if(!wielded)
+ return ""
+ var/in_mouth = ""
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ if(C.wear_mask == src)
+ in_mouth = ", barely missing their nose"
+ . = "[user] swings [user.p_their()] [src][in_mouth]. [user.p_they()] light[user.p_s()] [A] in the process."
+ playsound(loc, hitsound, get_clamped_volume(), 1, -1)
+ add_fingerprint(user)
+
+
+////////////////// TOY VERSION /////////////////////////////
+
+/obj/item/twohanded/hypereutactic/toy
+ name = "\improper DX Hyper-Euplastic LightSword"
+ desc = "A supermassive toy envisioned to cleave the very fabric of space and time itself in twain. Realistic visuals and sounds! Ages 8 and up."
+ force = 0
+ throwforce = 0
+ throw_speed = 3
+ throw_range = 5
+ force_unwielded = 0
+ force_wielded = 0
+ origin_tech = null
+ attack_verb = list("attacked", "struck", "hit")
+
+/obj/item/twohanded/hypereutactic/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+ return 0
+
+/obj/item/twohanded/hypereutactic/toy/IsReflect()//Stops it from reflecting energy projectiles
+ return 0
+
+/* old code that don't work no more
+/obj/item/toy/sword/cx/hyper
+ name = "\improper DX Hyper-Euplastic LightSword"
+ desc = "A supermassive toy envisioned to cleave the very fabric of space and time itself in twain. Realistic visuals and sounds! Ages 8 and up."
+ icon = 'modular_citadel/icons/hypereutactic/item/hypereutactic.dmi'
+ icon_state = "hypereutactic"
+ lefthand_file = 'modular_citadel/icons/hypereutactic/mob/hypereutactic_left.dmi'
+ righthand_file = 'modular_citadel/icons/hypereutactic/mob/hypereutactic_right.dmi'
+ item_state = "hypereutactic"
+ inhand_x_dimension = 64
+ inhand_y_dimension = 64
+ active = FALSE
+ w_class = WEIGHT_CLASS_SMALL
+ attack_verb = list("poked", "devastated", "jabbed")
+ light_color = "#37FFF7"
+ light_brightness = 3
+ actions_types = list()
+
+/obj/item/toy/sword/cx/hyper/attack_self(mob/user)
+ active = !( active )
+
+ if (active)
+ to_chat(user, "You activate the holographic blade with a press of a button.")
+ playsound(user, 'sound/weapons/nebon.ogg', 50, 1)
+ w_class = WEIGHT_CLASS_BULKY
+ attack_verb = list("slashed", "stabbed", "ravaged")
+ set_light(light_brightness)
+ update_icon()
+
+ else
+ to_chat(user, "You deactivate the holographic blade with a press of a button.")
+ playsound(user, 'sound/weapons/neboff.ogg', 50, 1)
+ w_class = WEIGHT_CLASS_SMALL
+ attack_verb = list("poked", "jabbed", "hit")
+ set_light(0)
+ update_icon()
+
+ add_fingerprint(user)
+
+/obj/item/toy/sword/cx/hyper/update_icon()
+ var/mutable_appearance/blade_overlay = mutable_appearance('modular_citadel/icons/hypereutactic/item/hypereutactic.dmi', "hypereutactic_blade")
+ var/mutable_appearance/gem_overlay = mutable_appearance('modular_citadel/icons/hypereutactic/item/hypereutactic.dmi', "hypereutactic_gem")
+
+ if(light_color)
+ blade_overlay.color = light_color
+ gem_overlay.color = light_color
+
+ cut_overlays() //So that it doesn't keep stacking overlays non-stop on top of each other
+
+ add_overlay(gem_overlay)
+
+ if(active)
+ add_overlay(blade_overlay)
+
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+
+/obj/item/toy/sword/cx/hyper/AltClick(mob/living/user)
+ if(user.incapacitated() || !istype(user))
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!in_range(src, user))
+ return
+ if(user.incapacitated() || !istype(user) || !in_range(src, user))
+ return
+
+ if(alert("Are you sure you want to recolor your blade?", "Confirm Repaint", "Yes", "No") == "Yes")
+ var/energy_color_input = input(usr,"Choose Energy Color") as color|null
+ if(energy_color_input)
+ light_color = sanitize_hexcolor(energy_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+ update_light()
+
+/obj/item/toy/sword/cx/hyper/worn_overlays(isinhands, icon_file)
+ if(isinhands)
+ var/mutable_appearance/gem_inhand = mutable_appearance(icon_file, "hypereutactic_gem")
+ gem_inhand.color = light_color
+ . += gem_inhand
+ if(active)
+ var/mutable_appearance/blade_inhand = mutable_appearance(icon_file, "hypereutactic_blade")
+ blade_inhand.color = light_color
+ . += blade_inhand
+
+/obj/item/toy/sword/cx/hyper/attackby(obj/item/W, mob/living/user, params)
+ return
+*/
\ No newline at end of file
diff --git a/modular_citadel/icons/hypereutactic/item/hypereutactic.dmi b/modular_citadel/icons/hypereutactic/item/hypereutactic.dmi
new file mode 100644
index 0000000000..90a665f676
Binary files /dev/null and b/modular_citadel/icons/hypereutactic/item/hypereutactic.dmi differ
diff --git a/modular_citadel/icons/hypereutactic/mob/hypereutactic_left.dmi b/modular_citadel/icons/hypereutactic/mob/hypereutactic_left.dmi
new file mode 100644
index 0000000000..ca94055113
Binary files /dev/null and b/modular_citadel/icons/hypereutactic/mob/hypereutactic_left.dmi differ
diff --git a/modular_citadel/icons/hypereutactic/mob/hypereutactic_right.dmi b/modular_citadel/icons/hypereutactic/mob/hypereutactic_right.dmi
new file mode 100644
index 0000000000..a9b90da740
Binary files /dev/null and b/modular_citadel/icons/hypereutactic/mob/hypereutactic_right.dmi differ
diff --git a/modular_citadel/icons/lavaknight/item/head.dmi b/modular_citadel/icons/lavaknight/item/head.dmi
new file mode 100644
index 0000000000..950d4894e9
Binary files /dev/null and b/modular_citadel/icons/lavaknight/item/head.dmi differ
diff --git a/modular_citadel/icons/lavaknight/item/suit.dmi b/modular_citadel/icons/lavaknight/item/suit.dmi
new file mode 100644
index 0000000000..49cd14b666
Binary files /dev/null and b/modular_citadel/icons/lavaknight/item/suit.dmi differ
diff --git a/modular_citadel/icons/lavaknight/mob/head.dmi b/modular_citadel/icons/lavaknight/mob/head.dmi
new file mode 100644
index 0000000000..5084c9c66f
Binary files /dev/null and b/modular_citadel/icons/lavaknight/mob/head.dmi differ
diff --git a/modular_citadel/icons/lavaknight/mob/suit.dmi b/modular_citadel/icons/lavaknight/mob/suit.dmi
new file mode 100644
index 0000000000..ed51ceaaa4
Binary files /dev/null and b/modular_citadel/icons/lavaknight/mob/suit.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index d8094b1744..0e23640d22 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -116,6 +116,7 @@
#include "code\__HELPERS\type2type.dm"
#include "code\__HELPERS\type2type_vr.dm"
#include "code\__HELPERS\unsorted.dm"
+#include "code\__HELPERS\view.dm"
#include "code\__HELPERS\sorts\__main.dm"
#include "code\__HELPERS\sorts\InsertSort.dm"
#include "code\__HELPERS\sorts\MergeSort.dm"
@@ -869,6 +870,7 @@
#include "code\game\objects\items\mop.dm"
#include "code\game\objects\items\paint.dm"
#include "code\game\objects\items\paiwire.dm"
+#include "code\game\objects\items\pet_carrier.dm"
#include "code\game\objects\items\pinpointer.dm"
#include "code\game\objects\items\plushes.dm"
#include "code\game\objects\items\pneumaticCannon.dm"
@@ -2416,6 +2418,9 @@
#include "interface\skin.dmf"
#include "modular_citadel\cit_medkits.dm"
#include "modular_citadel\cit_screenshake.dm"
+#include "modular_citadel\citadel_ghostrole_spawners.dm"
+#include "modular_citadel\cydonian_armor.dm"
+#include "modular_citadel\hypereutactic_blade.dm"
#include "modular_citadel\polychromic_clothes.dm"
#include "modular_citadel\code\datums\uplink_items_cit.dm"
// END_INCLUDE