();
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/MainPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/MainPage.tsx
index 8ce27f513b5..1789cb29be2 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/MainPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/MainPage.tsx
@@ -1,33 +1,34 @@
+import { filterMap, sortBy } from 'common/collections';
import { classes } from 'common/react';
+
import { sendAct, useBackend, useLocalState } from '../../backend';
import {
Autofocus,
Box,
Button,
+ Dropdown, // SKYRAT EDIT ADDITION
Flex,
LabeledList,
Popper,
Stack,
TrackOutsideClicks,
- Dropdown, // SKYRAT EDIT ADDITION
} from '../../components';
+import { CharacterPreview } from '../common/CharacterPreview';
import {
createSetPreference,
PreferencesMenuData,
RandomSetting,
ServerData,
} from './data';
-import { CharacterPreview } from '../common/CharacterPreview';
-import { RandomizationButton } from './RandomizationButton';
-import { ServerPreferencesFetcher } from './ServerPreferencesFetcher';
import { MultiNameInput, NameInput } from './names';
-import { Gender, GENDERS } from './preferences/gender';
import features from './preferences/features';
import {
FeatureChoicedServerData,
FeatureValueInput,
} from './preferences/features/base';
-import { filterMap, sortBy } from 'common/collections';
+import { Gender, GENDERS } from './preferences/gender';
+import { RandomizationButton } from './RandomizationButton';
+import { ServerPreferencesFetcher } from './ServerPreferencesFetcher';
import { useRandomToggleState } from './useRandomToggleState';
const CLOTHING_CELL_SIZE = 48;
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/PageButton.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/PageButton.tsx
index 36bc8e9767e..a8964b23a01 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/PageButton.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/PageButton.tsx
@@ -1,4 +1,5 @@
import { ReactNode } from 'react';
+
import { Button } from '../../components';
export const PageButton = (props: {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx
index 61199cb65ad..ad0fc14e3d2 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/QuirksPage.tsx
@@ -1,9 +1,10 @@
+import { filterMap } from 'common/collections';
+
+import { useBackend, useLocalState } from '../../backend';
import { Box, Button, Icon, Popper, Stack, Tooltip } from '../../components';
import { PreferencesMenuData, Quirk, RandomSetting, ServerData } from './data';
-import { useBackend, useLocalState } from '../../backend';
-import { ServerPreferencesFetcher } from './ServerPreferencesFetcher';
-import { filterMap } from 'common/collections';
import { getRandomization, PreferenceList } from './MainPage';
+import { ServerPreferencesFetcher } from './ServerPreferencesFetcher';
import { useRandomToggleState } from './useRandomToggleState';
const getValueClass = (value: number): string => {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/RandomizationButton.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/RandomizationButton.tsx
index 9bd735fc4db..04f3b25734a 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/RandomizationButton.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/RandomizationButton.tsx
@@ -1,6 +1,7 @@
+import { exhaustiveCheck } from 'common/exhaustive';
+
import { Dropdown, Icon } from '../../components';
import { RandomSetting } from './data';
-import { exhaustiveCheck } from 'common/exhaustive';
export const RandomizationButton = (props: {
dropdownProps?: Record;
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/ServerPreferencesFetcher.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/ServerPreferencesFetcher.tsx
index fcbe342af61..0b90fd855c7 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/ServerPreferencesFetcher.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/ServerPreferencesFetcher.tsx
@@ -1,4 +1,5 @@
import { Component, ReactNode } from 'react';
+
import { resolveAsset } from '../../assets';
import { fetchRetry } from '../../http';
import { ServerData } from './data';
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/SpeciesPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/SpeciesPage.tsx
index 3138a468c18..dfb56213d64 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/SpeciesPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/SpeciesPage.tsx
@@ -1,4 +1,5 @@
import { classes } from 'common/react';
+
import { useBackend } from '../../backend';
import {
BlockQuote,
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/TabbedMenu.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/TabbedMenu.tsx
index 38f97d8e3dd..13c572ebc84 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/TabbedMenu.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/TabbedMenu.tsx
@@ -1,4 +1,5 @@
import { Component, createRef, ReactNode, RefObject } from 'react';
+
import { Button, Section, Stack } from '../../components';
import { FlexProps } from '../../components/Flex';
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/abductor.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/abductor.ts
index 58db32a372d..cc77194f0cb 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/abductor.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/abductor.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const Abductor: Antagonist = {
key: 'abductor',
name: 'Abductor',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/assaultoperative.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/assaultoperative.tsx
similarity index 96%
rename from tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/assaultoperative.ts
rename to tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/assaultoperative.tsx
index 89a453a35b4..e1ffd36c86e 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/assaultoperative.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/assaultoperative.tsx
@@ -1,6 +1,8 @@
-import { Antagonist, Category } from '../base';
+// THIS IS A SKYRAT UI FILE
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
export const OPERATIVE_MECHANICAL_DESCRIPTION = multiline`
Attain all possible GoldenEye authentication keys and use them to activate
the GoldenEye. These keys use mindfragments of Nanotrasen heads to generate
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/blob.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/blob.ts
index c562e4e5ee5..99861d530ca 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/blob.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/blob.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
export const BLOB_MECHANICAL_DESCRIPTION = multiline`
The blob infests the station and destroys everything in its path, including
hull, fixtures, and creatures. Spread your mass, collect resources, and
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/blobinfection.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/blobinfection.ts
index 3cddceb3c3d..33bc8405d49 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/blobinfection.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/blobinfection.ts
@@ -1,6 +1,7 @@
+import { multiline } from 'common/string';
+
import { Antagonist, Category } from '../base';
import { BLOB_MECHANICAL_DESCRIPTION } from './blob';
-import { multiline } from 'common/string';
const BlobInfection: Antagonist = {
key: 'blobinfection',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/bloodbrother.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/bloodbrother.ts
index 8d4d45f582f..176cd39a7ea 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/bloodbrother.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/bloodbrother.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const BloodBrother: Antagonist = {
key: 'bloodbrother',
name: 'Blood Brother',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/changeling.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/changeling.ts
index d21aff20ee6..2c9698d0bda 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/changeling.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/changeling.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
export const CHANGELING_MECHANICAL_DESCRIPTION = multiline`
Transform yourself or others into different identities, and buy from an
arsenal of biological weaponry with the DNA you collect.
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/changelingmidround.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/changelingmidround.ts
index 733b9cdda3f..90692d28243 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/changelingmidround.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/changelingmidround.ts
@@ -1,5 +1,6 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+
+import { Antagonist, Category } from '../base';
import { CHANGELING_MECHANICAL_DESCRIPTION } from './changeling';
const ChangelingMidround: Antagonist = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/clownoperative.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/clownoperative.ts
index bcb16a8d95a..f32c6c6d3b0 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/clownoperative.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/clownoperative.ts
@@ -1,5 +1,6 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+
+import { Antagonist, Category } from '../base';
import { OPERATIVE_MECHANICAL_DESCRIPTION } from './operative';
const ClownOperative: Antagonist = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/cultist.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/cultist.ts
index a3bb8172142..252f7e65b63 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/cultist.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/cultist.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const Cultist: Antagonist = {
key: 'cultist',
name: 'Cultist',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/driftingcontractor.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/driftingcontractor.ts
index 9c73d38b31b..fa82436bb19 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/driftingcontractor.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/driftingcontractor.ts
@@ -1,4 +1,6 @@
+// THIS IS A SKYRAT UI FILE
import { multiline } from 'common/string';
+
import { Antagonist, Category } from '../base';
export const CONTRACTOR_MECHANICAL_DESCRIPTION = multiline`
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/driftingcontractor.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/driftingcontractor.tsx
new file mode 100644
index 00000000000..fa82436bb19
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/driftingcontractor.tsx
@@ -0,0 +1,22 @@
+// THIS IS A SKYRAT UI FILE
+import { multiline } from 'common/string';
+
+import { Antagonist, Category } from '../base';
+
+export const CONTRACTOR_MECHANICAL_DESCRIPTION = multiline`
+ Float onto the station and complete as many
+ contracts for your employer as you can!
+ `;
+
+const DriftingContractor: Antagonist = {
+ key: 'driftingcontractor',
+ name: 'Drifting Contractor',
+ description: [
+ multiline`A Syndicate agent that can spawn near the station, equipped with
+ top-of-the-line contractor gear, to complete contracts for the Syndicate.`,
+ CONTRACTOR_MECHANICAL_DESCRIPTION,
+ ],
+ category: Category.Midround,
+};
+
+export default DriftingContractor;
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/fugitive.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/fugitive.ts
index 0516788543f..1d7158484a1 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/fugitive.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/fugitive.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const Fugitive: Antagonist = {
key: 'fugitive',
name: 'Fugitive',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/glitch.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/glitch.ts
index 89c7d19a2c2..227ad99b02d 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/glitch.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/glitch.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const Glitch: Antagonist = {
key: 'glitch',
name: 'Glitch',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/headrevolutionary.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/headrevolutionary.ts
index fd2081fe49e..7ef4908368a 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/headrevolutionary.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/headrevolutionary.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
export const REVOLUTIONARY_MECHANICAL_DESCRIPTION = multiline`
Armed with a flash, convert as many people to the revolution as you can.
Kill or exile all heads of staff on the station.
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/heretic.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/heretic.ts
index b8daffc0b64..7d378e6c850 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/heretic.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/heretic.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
export const HERETIC_MECHANICAL_DESCRIPTION = multiline`
Find hidden influences and sacrifice crew members to gain magical
powers and ascend as one of several paths.
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneinfiltrator.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneinfiltrator.ts
index d294c457383..b5ba561212b 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneinfiltrator.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneinfiltrator.ts
@@ -1,4 +1,6 @@
+// THIS IS A SKYRAT UI FILE
import { multiline } from 'common/string';
+
import { Antagonist, Category } from '../base';
const LoneInfiltrator: Antagonist = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneinfiltrator.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneinfiltrator.tsx
new file mode 100644
index 00000000000..b5ba561212b
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneinfiltrator.tsx
@@ -0,0 +1,17 @@
+// THIS IS A SKYRAT UI FILE
+import { multiline } from 'common/string';
+
+import { Antagonist, Category } from '../base';
+
+const LoneInfiltrator: Antagonist = {
+ key: 'loneinfiltrator',
+ name: 'Lone Infiltrator',
+ description: [
+ multiline`A midround traitor that can spawn near the station, equipped with
+ a Syndicate Modsuit and equipment befitting a station boarder.
+ Float onto the station and complete your objectives.`,
+ ],
+ category: Category.Midround,
+};
+
+export default LoneInfiltrator;
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneoperative.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneoperative.ts
index c74b2ca01b4..b9330e41547 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneoperative.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/loneoperative.ts
@@ -1,5 +1,6 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+
+import { Antagonist, Category } from '../base';
import { OPERATIVE_MECHANICAL_DESCRIPTION } from './operative';
const LoneOperative: Antagonist = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/malfai.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/malfai.ts
index 1aa9e0034bb..614e97447f7 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/malfai.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/malfai.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
export const MALF_AI_MECHANICAL_DESCRIPTION = multiline`
With a law zero to complete your objectives at all costs, combine your
omnipotence and malfunction modules to wreak havoc across the station.
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/malfaimidround.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/malfaimidround.ts
index d686a78af49..9b0cd861f13 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/malfaimidround.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/malfaimidround.ts
@@ -1,4 +1,5 @@
import { multiline } from 'common/string';
+
import { Antagonist, Category } from '../base';
import { MALF_AI_MECHANICAL_DESCRIPTION } from './malfai';
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/nightmare.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/nightmare.ts
index b66f03f2b2c..4f317ff0b48 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/nightmare.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/nightmare.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const Nightmare: Antagonist = {
key: 'nightmare',
name: 'Nightmare',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/obsessed.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/obsessed.ts
index fcb18419a81..9e38e37cfe1 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/obsessed.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/obsessed.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const Obsessed: Antagonist = {
key: 'obsessed',
name: 'Obsessed',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/operative.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/operative.ts
index a8b14e88fce..2b179a2bd67 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/operative.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/operative.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
export const OPERATIVE_MECHANICAL_DESCRIPTION = multiline`
Retrieve the nuclear authentication disk, use it to activate the nuclear
fission explosive, and destroy the station.
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/operativemidround.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/operativemidround.ts
index cd4e0e94858..cf79eae9bdc 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/operativemidround.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/operativemidround.ts
@@ -1,5 +1,6 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+
+import { Antagonist, Category } from '../base';
import { OPERATIVE_MECHANICAL_DESCRIPTION } from './operative';
const OperativeMidround: Antagonist = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/paradoxclone.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/paradoxclone.ts
index b0f5091bfbe..9217c3aeb13 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/paradoxclone.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/paradoxclone.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const ParadoxClone: Antagonist = {
key: 'paradoxclone',
name: 'Paradox Clone',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/provocateur.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/provocateur.ts
index b8b847da11d..cd8ef1a380f 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/provocateur.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/provocateur.ts
@@ -1,5 +1,6 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+
+import { Antagonist, Category } from '../base';
import { REVOLUTIONARY_MECHANICAL_DESCRIPTION } from './headrevolutionary';
const Provocateur: Antagonist = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/revenant.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/revenant.ts
index a23b4e178c8..e9fdf3c178d 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/revenant.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/revenant.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const Revenant: Antagonist = {
key: 'revenant',
name: 'Revenant',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/sentiencepotionspawn.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/sentiencepotionspawn.ts
index 247b88aed0d..6b4cad30e18 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/sentiencepotionspawn.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/sentiencepotionspawn.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const SentientCreature: Antagonist = {
key: 'sentiencepotionspawn',
name: 'Sentient Creature',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/sentientdisease.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/sentientdisease.ts
index fabe1d34e5f..f2b2be6ca78 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/sentientdisease.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/sentientdisease.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const SentientDisease: Antagonist = {
key: 'sentientdisease',
name: 'Sentient Disease',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/spacedragon.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/spacedragon.ts
index e3e8940dda9..79e55a0060d 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/spacedragon.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/spacedragon.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const SpaceDragon: Antagonist = {
key: 'spacedragon',
name: 'Space Dragon',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/spaceninja.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/spaceninja.ts
index 18ce064b373..aee97dbdd23 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/spaceninja.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/spaceninja.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const SpaceNinja: Antagonist = {
key: 'spaceninja',
name: 'Space Ninja',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/stowawaychangeling.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/stowawaychangeling.ts
index 8d1191c2b2b..59049ca39fe 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/stowawaychangeling.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/stowawaychangeling.ts
@@ -1,5 +1,6 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+
+import { Antagonist, Category } from '../base';
import { CHANGELING_MECHANICAL_DESCRIPTION } from './changeling';
const Stowaway_Changeling: Antagonist = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/syndicatesleeperagent.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/syndicatesleeperagent.ts
index a692736c408..cce7f70ea6f 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/syndicatesleeperagent.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/syndicatesleeperagent.ts
@@ -1,6 +1,7 @@
+import { multiline } from 'common/string';
+
import { Antagonist, Category } from '../base';
import { TRAITOR_MECHANICAL_DESCRIPTION } from './traitor';
-import { multiline } from 'common/string';
const SyndicateSleeperAgent: Antagonist = {
key: 'syndicatesleeperagent',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/traitor.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/traitor.ts
index 86f4089277a..b815039cbb6 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/traitor.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/traitor.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
export const TRAITOR_MECHANICAL_DESCRIPTION = multiline`
Start with an uplink to purchase your gear and take on your sinister
objectives. Ascend through the ranks and become an infamous legend.
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/wizard.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/wizard.ts
index 9c8f5dc84c7..67118697da0 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/wizard.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/wizard.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
export const WIZARD_MECHANICAL_DESCRIPTION = multiline`
Choose between a variety of powerful spells in order to cause chaos
among Space Station 13.
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/xenomorph.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/xenomorph.ts
index 6bea64450e9..c7596969264 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/xenomorph.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/antagonists/antagonists/xenomorph.ts
@@ -1,6 +1,7 @@
-import { Antagonist, Category } from '../base';
import { multiline } from 'common/string';
+import { Antagonist, Category } from '../base';
+
const Xenomorph: Antagonist = {
key: 'xenomorph',
name: 'Xenomorph',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts b/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
index 95163a4e40c..d3570464af2 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/data.ts
@@ -1,4 +1,5 @@
import { BooleanLike } from 'common/react';
+
import { sendAct } from '../../backend';
import { Gender } from './preferences/gender';
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/index.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/index.tsx
index cacfd3c9578..0f8aefcecf9 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/index.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/index.tsx
@@ -1,11 +1,12 @@
import { exhaustiveCheck } from 'common/exhaustive';
+
import { useBackend } from '../../backend';
+import { CharacterPreferenceWindow } from './CharacterPreferenceWindow';
import {
GamePreferencesSelectedPage,
PreferencesMenuData,
Window,
} from './data';
-import { CharacterPreferenceWindow } from './CharacterPreferenceWindow';
import { GamePreferenceWindow } from './GamePreferenceWindow';
export const PreferencesMenu = (props) => {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/names.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/names.tsx
index c6475763eaa..55fe73c594f 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/names.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/names.tsx
@@ -1,4 +1,5 @@
import { binaryInsertWith, sortBy } from 'common/collections';
+
import { useLocalState } from '../../backend';
import {
Box,
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skin_tone.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skin_tone.tsx
index b45c436c3ab..fe18a89418d 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skin_tone.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skin_tone.tsx
@@ -1,4 +1,5 @@
import { sortBy } from 'common/collections';
+
import { Box, Stack } from '../../../../../components';
import {
Feature,
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/death_degradation.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/death_degradation.tsx
index 1be18a9682e..15f7738be03 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/death_degradation.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/death_degradation.tsx
@@ -1,5 +1,5 @@
// THIS IS A SKYRAT UI FILE
-import { Feature, CheckboxInput, FeatureNumberInput } from '../../base';
+import { CheckboxInput, Feature, FeatureNumberInput } from '../../base';
export const dc_starting_degradation: Feature = {
name: 'A_Starting Degradation',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx
index 0d02cc508b6..2a387eea994 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/genitals.tsx
@@ -1,16 +1,16 @@
// THIS IS A SKYRAT UI FILE
import {
- FeatureDropdownInput,
- Feature,
- FeatureNumberInput,
CheckboxInput,
- FeatureTriColorInput,
- FeatureTriBoolInput,
+ Feature,
+ FeatureChoiced,
+ FeatureChoicedServerData,
+ FeatureDropdownInput,
+ FeatureNumberInput,
FeatureNumeric,
FeatureToggle,
- FeatureChoiced,
+ FeatureTriBoolInput,
+ FeatureTriColorInput,
FeatureValueProps,
- FeatureChoicedServerData,
} from '../../base';
export const feature_penis: Feature = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx
index bc744b11550..8b4bc190161 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/skyrat/species_features.tsx
@@ -1,18 +1,18 @@
// THIS IS A SKYRAT UI FILE
import {
- FeatureChoiced,
- FeatureDropdownInput,
- Feature,
- FeatureColorInput,
- FeatureTextInput,
- FeatureShortTextInput,
CheckboxInput,
- FeatureTriColorInput,
- FeatureTriBoolInput,
- FeatureToggle,
- FeatureNumberInput,
- FeatureValueProps,
+ Feature,
+ FeatureChoiced,
FeatureChoicedServerData,
+ FeatureColorInput,
+ FeatureDropdownInput,
+ FeatureNumberInput,
+ FeatureShortTextInput,
+ FeatureTextInput,
+ FeatureToggle,
+ FeatureTriBoolInput,
+ FeatureTriColorInput,
+ FeatureValueProps,
} from '../../base';
export const feature_leg_type: FeatureChoiced = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tts_voice.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tts_voice.tsx
index a1f47300573..94a208158c5 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tts_voice.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/tts_voice.tsx
@@ -1,12 +1,12 @@
+import { Button, Stack } from '../../../../../components';
import {
FeatureChoiced,
FeatureChoicedServerData,
FeatureDropdownInput,
- FeatureValueProps,
FeatureNumeric,
FeatureSliderInput,
+ FeatureValueProps,
} from '../base';
-import { Stack, Button } from '../../../../../components';
const FeatureTTSDropdownInput = (
props: FeatureValueProps,
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx
index 4fc3d7f05c0..03244e9f6ee 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx
@@ -1,11 +1,12 @@
+import { multiline } from 'common/string';
+
import {
CheckboxInput,
- FeatureColorInput,
Feature,
+ FeatureColorInput,
FeatureDropdownInput,
FeatureToggle,
} from '../base';
-import { multiline } from 'common/string';
export const asaycolor: Feature = {
name: 'Admin chat color',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/broadcast_login_logout.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/broadcast_login_logout.tsx
index f8252412fc9..de2ad66bd99 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/broadcast_login_logout.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/broadcast_login_logout.tsx
@@ -1,4 +1,5 @@
import { multiline } from 'common/string';
+
import { CheckboxInput, FeatureToggle } from '../base';
export const broadcast_login_logout: FeatureToggle = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkened_flash.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkened_flash.tsx
index 0703c7ef04c..a60c6d9d31c 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkened_flash.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/darkened_flash.tsx
@@ -1,4 +1,5 @@
import { multiline } from 'common/string';
+
import { CheckboxInput, FeatureToggle } from '../base';
export const darkened_flash: FeatureToggle = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ghost.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ghost.tsx
index c335b1128e2..cfa323dce2c 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ghost.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ghost.tsx
@@ -1,4 +1,11 @@
+import { binaryInsertWith } from 'common/collections';
+import { classes } from 'common/react';
import { multiline } from 'common/string';
+import { ReactNode } from 'react';
+
+import { useBackend } from '../../../../../backend';
+import { Box, Dropdown, Flex } from '../../../../../components';
+import { PreferencesMenuData } from '../../../data';
import {
CheckboxInput,
FeatureChoiced,
@@ -7,12 +14,6 @@ import {
FeatureToggle,
FeatureValueProps,
} from '../base';
-import { Box, Dropdown, Flex } from '../../../../../components';
-import { classes } from 'common/react';
-import { ReactNode } from 'react';
-import { binaryInsertWith } from 'common/collections';
-import { useBackend } from '../../../../../backend';
-import { PreferencesMenuData } from '../../../data';
export const ghost_accs: FeatureChoiced = {
name: 'Ghost accessories',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_chat_toggles.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_chat_toggles.tsx
index 58b1a5b9914..5dd251c9cd0 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_chat_toggles.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_chat_toggles.tsx
@@ -1,5 +1,6 @@
import { multiline } from 'common/string';
-import { FeatureToggle, CheckboxInput } from '../base';
+
+import { CheckboxInput, FeatureToggle } from '../base';
export const chat_bankcard: FeatureToggle = {
name: 'Enable income updates',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_toggles.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_toggles.tsx
index e94eb6c522a..fdc3c62d2f3 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_toggles.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/legacy_toggles.tsx
@@ -1,5 +1,6 @@
import { multiline } from 'common/string';
-import { FeatureToggle, CheckboxInput, CheckboxInputInverse } from '../base';
+
+import { CheckboxInput, CheckboxInputInverse, FeatureToggle } from '../base';
export const admin_ignore_cult_ghost: FeatureToggle = {
name: 'Prevent being summoned as a cult ghost',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ooc.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ooc.tsx
index 3e0421de712..fe551cce2f7 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ooc.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ooc.tsx
@@ -1,4 +1,4 @@
-import { FeatureColorInput, Feature } from '../base';
+import { Feature, FeatureColorInput } from '../base';
export const ooccolor: Feature = {
name: 'OOC color',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/preferred_map.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/preferred_map.tsx
index 8d3c8b17426..1a1755ce714 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/preferred_map.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/preferred_map.tsx
@@ -1,4 +1,5 @@
import { multiline } from 'common/string';
+
import { Feature, FeatureDropdownInput } from '../base';
export const preferred_map: Feature = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/screentips.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/screentips.tsx
index 3601b1b0c4e..5c65c4f100a 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/screentips.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/screentips.tsx
@@ -1,11 +1,12 @@
import { multiline } from 'common/string';
+
import {
CheckboxInput,
- FeatureColorInput,
- FeatureToggle,
Feature,
FeatureChoiced,
+ FeatureColorInput,
FeatureDropdownInput,
+ FeatureToggle,
} from '../base';
export const screentip_color: Feature = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/auto_dementor.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/auto_dementor.tsx
index b393b825a0b..de3ddfbd2a7 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/auto_dementor.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/auto_dementor.tsx
@@ -1,5 +1,5 @@
// THIS IS A SKYRAT UI FILE
-import { FeatureToggle, CheckboxInput } from '../../base';
+import { CheckboxInput, FeatureToggle } from '../../base';
export const auto_dementor_pref: FeatureToggle = {
name: 'Auto dementor',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/erp_preferences.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/erp_preferences.tsx
index 35715adbe61..a737e62e10d 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/erp_preferences.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/erp_preferences.tsx
@@ -1,8 +1,8 @@
// THIS IS A SKYRAT UI FILE
import {
CheckboxInput,
- FeatureDropdownInput,
FeatureChoiced,
+ FeatureDropdownInput,
FeatureToggle,
} from '../../base';
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/face_cursor_combat_mode.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/face_cursor_combat_mode.tsx
index 099bbd2fbfe..fc90bf483f1 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/face_cursor_combat_mode.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/face_cursor_combat_mode.tsx
@@ -1,5 +1,6 @@
// THIS IS A SKYRAT UI FILE
import { multiline } from 'common/string';
+
import { CheckboxInput, FeatureToggle } from '../../base';
export const face_cursor_combat_mode: FeatureToggle = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/ticket_ping.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/ticket_ping.tsx
index d6bd9c576dc..55e07f0e10d 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/ticket_ping.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/skyrat/ticket_ping.tsx
@@ -1,5 +1,5 @@
// THIS IS A SKYRAT UI FILE
-import { FeatureToggle, CheckboxInput } from '../../base';
+import { CheckboxInput, FeatureToggle } from '../../base';
export const ticket_ping_pref: FeatureToggle = {
name: 'Ticket ping',
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/sounds.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/sounds.tsx
index 537ccb230b6..0bce5e0982e 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/sounds.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/sounds.tsx
@@ -1,11 +1,12 @@
import { multiline } from 'common/string';
+
import {
CheckboxInput,
+ Feature,
FeatureChoiced,
FeatureDropdownInput,
- FeatureToggle,
- Feature,
FeatureSliderInput,
+ FeatureToggle,
} from '../base';
export const sound_ambience: FeatureToggle = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/tooltips.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/tooltips.tsx
index 34d66864259..d3df346a83f 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/tooltips.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/tooltips.tsx
@@ -1,4 +1,5 @@
import { multiline } from 'common/string';
+
import {
CheckboxInput,
Feature,
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ui_style.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ui_style.tsx
index fa133c4abc2..218b5b3c580 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ui_style.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/ui_style.tsx
@@ -1,11 +1,12 @@
import { classes } from 'common/react';
+
+import { Box, Dropdown, Stack } from '../../../../../components';
import {
FeatureChoiced,
FeatureChoicedServerData,
FeatureValueProps,
sortChoices,
} from '../base';
-import { Box, Dropdown, Stack } from '../../../../../components';
const UIStyleInput = (
props: FeatureValueProps,
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/window_flashing.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/window_flashing.tsx
index c4b7b6c2768..510bfc7ae2c 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/window_flashing.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/window_flashing.tsx
@@ -1,4 +1,5 @@
import { multiline } from 'common/string';
+
import { CheckboxInput, FeatureToggle } from '../base';
export const windowflashing: FeatureToggle = {
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/species_features.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/species_features.tsx
index a30821ca7ee..f3c931325fc 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/species_features.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/species_features.tsx
@@ -1,10 +1,10 @@
import {
- FeatureColorInput,
Feature,
FeatureChoiced,
+ FeatureChoicedServerData,
+ FeatureColorInput,
FeatureDropdownInput,
FeatureValueProps,
- FeatureChoicedServerData,
} from './base';
export const eye_color: Feature = {
diff --git a/tgui/packages/tgui/interfaces/PrisonerManagement.tsx b/tgui/packages/tgui/interfaces/PrisonerManagement.tsx
index 73c7ceadc93..ee2fcc88ee0 100644
--- a/tgui/packages/tgui/interfaces/PrisonerManagement.tsx
+++ b/tgui/packages/tgui/interfaces/PrisonerManagement.tsx
@@ -1,5 +1,6 @@
-import { useBackend, useSharedState } from '../backend';
import { BooleanLike } from 'common/react';
+
+import { useBackend, useSharedState } from '../backend';
import {
Box,
Button,
diff --git a/tgui/packages/tgui/interfaces/ProcCallMenu.tsx b/tgui/packages/tgui/interfaces/ProcCallMenu.tsx
index b3414cd942f..2da9fdf2104 100644
--- a/tgui/packages/tgui/interfaces/ProcCallMenu.tsx
+++ b/tgui/packages/tgui/interfaces/ProcCallMenu.tsx
@@ -1,12 +1,13 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
- Stack,
- Section,
- Input,
Button,
Dropdown,
+ Input,
NoticeBox,
+ Section,
+ Stack,
} from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/ProduceConsole.tsx b/tgui/packages/tgui/interfaces/ProduceConsole.tsx
index 49775ab1f88..51b7809db6f 100644
--- a/tgui/packages/tgui/interfaces/ProduceConsole.tsx
+++ b/tgui/packages/tgui/interfaces/ProduceConsole.tsx
@@ -1,6 +1,7 @@
import { BooleanLike } from 'common/react';
import { capitalize, createSearch } from 'common/string';
import { useState } from 'react';
+
import { useBackend, useLocalState } from '../backend';
import {
Box,
@@ -8,10 +9,10 @@ import {
Dimmer,
Divider,
Icon,
+ Image,
Input,
NumberInput,
Section,
- Image,
Stack,
Tabs,
} from '../components';
diff --git a/tgui/packages/tgui/interfaces/QuantumConsole.tsx b/tgui/packages/tgui/interfaces/QuantumConsole.tsx
index f648e2cfd33..2563c2dfc9f 100644
--- a/tgui/packages/tgui/interfaces/QuantumConsole.tsx
+++ b/tgui/packages/tgui/interfaces/QuantumConsole.tsx
@@ -1,4 +1,5 @@
-import { Window } from '../layouts';
+import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
Button,
@@ -11,9 +12,9 @@ import {
Table,
Tooltip,
} from '../components';
-import { BooleanLike } from 'common/react';
-import { LoadingScreen } from './common/LoadingToolbox';
import { TableCell, TableRow } from '../components/Table';
+import { Window } from '../layouts';
+import { LoadingScreen } from './common/LoadingToolbox';
type Data =
| {
diff --git a/tgui/packages/tgui/interfaces/Radio.jsx b/tgui/packages/tgui/interfaces/Radio.jsx
index e2e0c1b3ffd..a6a35739d43 100644
--- a/tgui/packages/tgui/interfaces/Radio.jsx
+++ b/tgui/packages/tgui/interfaces/Radio.jsx
@@ -1,5 +1,6 @@
import { map } from 'common/collections';
import { toFixed } from 'common/math';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, NumberInput, Section } from '../components';
import { RADIO_CHANNELS } from '../constants';
diff --git a/tgui/packages/tgui/interfaces/RadioactiveMicrolaser.jsx b/tgui/packages/tgui/interfaces/RadioactiveMicrolaser.jsx
index 3179a1f0542..2732d6d327d 100644
--- a/tgui/packages/tgui/interfaces/RadioactiveMicrolaser.jsx
+++ b/tgui/packages/tgui/interfaces/RadioactiveMicrolaser.jsx
@@ -1,5 +1,5 @@
import { useBackend } from '../backend';
-import { Button, Box, NumberInput, Section, LabeledList } from '../components';
+import { Box, Button, LabeledList, NumberInput, Section } from '../components';
import { Window } from '../layouts';
export const RadioactiveMicrolaser = (props) => {
diff --git a/tgui/packages/tgui/interfaces/RapidConstructionDevice.tsx b/tgui/packages/tgui/interfaces/RapidConstructionDevice.tsx
index ece6bb57220..8f1ebd95126 100644
--- a/tgui/packages/tgui/interfaces/RapidConstructionDevice.tsx
+++ b/tgui/packages/tgui/interfaces/RapidConstructionDevice.tsx
@@ -1,11 +1,12 @@
-import { Window } from '../layouts';
import { BooleanLike, classes } from 'common/react';
import { capitalizeAll } from 'common/string';
-import { useBackend } from '../backend';
-import { LabeledList, Section, Button, Tabs, Stack, Box } from '../components';
-import { AirLockMainSection } from './AirlockElectronics';
import { useState } from 'react';
+import { useBackend } from '../backend';
+import { Box, Button, LabeledList, Section, Stack, Tabs } from '../components';
+import { Window } from '../layouts';
+import { AirLockMainSection } from './AirlockElectronics';
+
type Data = {
matterLeft: number;
silo_upgraded: BooleanLike;
diff --git a/tgui/packages/tgui/interfaces/RapidPipeDispenser.tsx b/tgui/packages/tgui/interfaces/RapidPipeDispenser.tsx
index e2acbf36db0..37fb66ca28e 100644
--- a/tgui/packages/tgui/interfaces/RapidPipeDispenser.tsx
+++ b/tgui/packages/tgui/interfaces/RapidPipeDispenser.tsx
@@ -2,6 +2,7 @@ import { BooleanLike, classes } from 'common/react';
import { multiline } from 'common/string';
import { capitalizeAll } from 'common/string';
import { useState } from 'react';
+
import { useBackend } from '../backend';
import {
Box,
@@ -10,8 +11,8 @@ import {
LabeledList,
Section,
Stack,
- Tabs,
Table,
+ Tabs,
} from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/RapidPlumbingDevice.tsx b/tgui/packages/tgui/interfaces/RapidPlumbingDevice.tsx
index 52b1cc7f9ca..53e677cde0d 100644
--- a/tgui/packages/tgui/interfaces/RapidPlumbingDevice.tsx
+++ b/tgui/packages/tgui/interfaces/RapidPlumbingDevice.tsx
@@ -1,12 +1,13 @@
-import { useBackend } from '../backend';
-import { capitalizeAll } from 'common/string';
import { BooleanLike, classes } from 'common/react';
-import { Window } from '../layouts';
-import { Section, Tabs, Button, Stack, Box } from '../components';
-import { ColorItem, LayerSelect } from './RapidPipeDispenser';
-import { SiloItem, MatterItem } from './RapidConstructionDevice';
+import { capitalizeAll } from 'common/string';
import { useState } from 'react';
+import { useBackend } from '../backend';
+import { Box, Button, Section, Stack, Tabs } from '../components';
+import { Window } from '../layouts';
+import { MatterItem, SiloItem } from './RapidConstructionDevice';
+import { ColorItem, LayerSelect } from './RapidPipeDispenser';
+
type Data = {
silo_upgraded: BooleanLike;
layer_icon: string;
diff --git a/tgui/packages/tgui/interfaces/RapidTilingDevice.tsx b/tgui/packages/tgui/interfaces/RapidTilingDevice.tsx
index 5a199ba020d..3e5d6d861b7 100644
--- a/tgui/packages/tgui/interfaces/RapidTilingDevice.tsx
+++ b/tgui/packages/tgui/interfaces/RapidTilingDevice.tsx
@@ -1,11 +1,12 @@
import { classes } from 'common/react';
import { capitalizeAll } from 'common/string';
-import { useBackend } from '../backend';
-import { Box, Button, Section, Tabs, Stack } from '../components';
-import { InfoSection } from './RapidConstructionDevice';
-import { Window } from '../layouts';
import { useState } from 'react';
+import { useBackend } from '../backend';
+import { Box, Button, Section, Stack, Tabs } from '../components';
+import { Window } from '../layouts';
+import { InfoSection } from './RapidConstructionDevice';
+
type Data = {
selected_icon: string;
tile_dirs: string[];
diff --git a/tgui/packages/tgui/interfaces/RecordManifest.jsx b/tgui/packages/tgui/interfaces/RecordManifest.jsx
index c8f0e41510c..2abc482513d 100644
--- a/tgui/packages/tgui/interfaces/RecordManifest.jsx
+++ b/tgui/packages/tgui/interfaces/RecordManifest.jsx
@@ -1,7 +1,8 @@
// THIS IS A SKYRAT UI FILE
import { classes } from 'common/react';
+
import { useBackend } from '../backend';
-import { Icon, Section, Table, Tooltip, Button } from '../components';
+import { Button, Icon, Section, Table, Tooltip } from '../components';
import { Window } from '../layouts';
const commandJobs = [
diff --git a/tgui/packages/tgui/interfaces/Reflector.tsx b/tgui/packages/tgui/interfaces/Reflector.tsx
index 8f30a6b85b1..32f0dee38c5 100644
--- a/tgui/packages/tgui/interfaces/Reflector.tsx
+++ b/tgui/packages/tgui/interfaces/Reflector.tsx
@@ -2,11 +2,11 @@ import { useBackend } from '../backend';
import {
Box,
Button,
- Stack,
Icon,
LabeledControls,
- Section,
NumberInput,
+ Section,
+ Stack,
Table,
} from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/RemoteRobotControl.jsx b/tgui/packages/tgui/interfaces/RemoteRobotControl.jsx
index 872a12fe3f3..f613dc7b804 100644
--- a/tgui/packages/tgui/interfaces/RemoteRobotControl.jsx
+++ b/tgui/packages/tgui/interfaces/RemoteRobotControl.jsx
@@ -1,6 +1,7 @@
import { decodeHtmlEntities } from 'common/string';
+
import { useBackend } from '../backend';
-import { Box, Button, NoticeBox, Section, LabeledList } from '../components';
+import { Box, Button, LabeledList, NoticeBox, Section } from '../components';
import { Window } from '../layouts';
export const RemoteRobotControl = (props) => {
diff --git a/tgui/packages/tgui/interfaces/RequestManager.jsx b/tgui/packages/tgui/interfaces/RequestManager.jsx
index e1d3eba4e39..d9eb4527e85 100644
--- a/tgui/packages/tgui/interfaces/RequestManager.jsx
+++ b/tgui/packages/tgui/interfaces/RequestManager.jsx
@@ -5,6 +5,7 @@
*/
import { decodeHtmlEntities } from 'common/string';
+
import { useBackend, useLocalState } from '../backend';
import { Button, Input, Section, Table } from '../components';
import { Popper } from '../components/Popper';
diff --git a/tgui/packages/tgui/interfaces/RequestsConsole/MessageViewTab.tsx b/tgui/packages/tgui/interfaces/RequestsConsole/MessageViewTab.tsx
index 6e32c313e11..7d238abbc76 100644
--- a/tgui/packages/tgui/interfaces/RequestsConsole/MessageViewTab.tsx
+++ b/tgui/packages/tgui/interfaces/RequestsConsole/MessageViewTab.tsx
@@ -1,3 +1,5 @@
+import { decodeHtmlEntities } from 'common/string';
+
import { useBackend } from '../../backend';
import {
BlockQuote,
@@ -7,7 +9,6 @@ import {
Section,
Stack,
} from '../../components';
-import { decodeHtmlEntities } from 'common/string';
import {
RequestMessage,
RequestPriority,
diff --git a/tgui/packages/tgui/interfaces/RequestsConsole/MessageWriteTab.tsx b/tgui/packages/tgui/interfaces/RequestsConsole/MessageWriteTab.tsx
index eb84384055b..5274fd2071c 100644
--- a/tgui/packages/tgui/interfaces/RequestsConsole/MessageWriteTab.tsx
+++ b/tgui/packages/tgui/interfaces/RequestsConsole/MessageWriteTab.tsx
@@ -1,5 +1,6 @@
-import { useBackend, useLocalState } from '../../backend';
import { sortStrings } from 'common/collections';
+
+import { useBackend, useLocalState } from '../../backend';
import {
Box,
Button,
@@ -8,7 +9,7 @@ import {
Stack,
TextArea,
} from '../../components';
-import { RequestsData, RequestType, RequestPriority } from './types';
+import { RequestPriority, RequestsData, RequestType } from './types';
export const MessageWriteTab = (props) => {
const { act, data } = useBackend();
diff --git a/tgui/packages/tgui/interfaces/RequestsConsole/RequestsConsoleHeader.tsx b/tgui/packages/tgui/interfaces/RequestsConsole/RequestsConsoleHeader.tsx
index 297fb767979..8307fd5dc6b 100644
--- a/tgui/packages/tgui/interfaces/RequestsConsole/RequestsConsoleHeader.tsx
+++ b/tgui/packages/tgui/interfaces/RequestsConsole/RequestsConsoleHeader.tsx
@@ -1,6 +1,6 @@
import { useBackend } from '../../backend';
import { Button, NoticeBox, Stack } from '../../components';
-import { RequestsData, RequestPriority } from './types';
+import { RequestPriority, RequestsData } from './types';
export const RequestsConsoleHeader = (props) => {
const { act, data } = useBackend();
diff --git a/tgui/packages/tgui/interfaces/RequestsConsole/RequestsConsoleMainScreen.tsx b/tgui/packages/tgui/interfaces/RequestsConsole/RequestsConsoleMainScreen.tsx
index f3791baa915..0ab87aece93 100644
--- a/tgui/packages/tgui/interfaces/RequestsConsole/RequestsConsoleMainScreen.tsx
+++ b/tgui/packages/tgui/interfaces/RequestsConsole/RequestsConsoleMainScreen.tsx
@@ -1,9 +1,9 @@
import { useBackend, useSharedState } from '../../backend';
import { Icon, Stack, Tabs } from '../../components';
-import { RequestsData, RequestTabs } from './types';
+import { AnnouncementTab } from './AnnouncementTab';
import { MessageViewTab } from './MessageViewTab';
import { MessageWriteTab } from './MessageWriteTab';
-import { AnnouncementTab } from './AnnouncementTab';
+import { RequestsData, RequestTabs } from './types';
export const RequestMainScreen = (props) => {
const { act, data } = useBackend();
diff --git a/tgui/packages/tgui/interfaces/RequestsConsole/index.tsx b/tgui/packages/tgui/interfaces/RequestsConsole/index.tsx
index 080890b5150..6327d35bb7e 100644
--- a/tgui/packages/tgui/interfaces/RequestsConsole/index.tsx
+++ b/tgui/packages/tgui/interfaces/RequestsConsole/index.tsx
@@ -1,9 +1,9 @@
import { useBackend } from '../../backend';
import { Button, Stack } from '../../components';
import { Window } from '../../layouts';
-import { RequestsData } from './types';
import { RequestsConsoleHeader } from './RequestsConsoleHeader';
import { RequestMainScreen } from './RequestsConsoleMainScreen';
+import { RequestsData } from './types';
export const RequestsConsole = (props) => {
const { act, data } = useBackend();
diff --git a/tgui/packages/tgui/interfaces/Roulette.jsx b/tgui/packages/tgui/interfaces/Roulette.jsx
index c1bcb2ef0c7..1579ad3ab34 100644
--- a/tgui/packages/tgui/interfaces/Roulette.jsx
+++ b/tgui/packages/tgui/interfaces/Roulette.jsx
@@ -1,8 +1,9 @@
import { classes } from 'common/react';
+import { useState } from 'react';
+
import { useBackend } from '../backend';
import { Box, Button, Grid, NumberInput, Table } from '../components';
import { Window } from '../layouts';
-import { useState } from 'react';
const getNumberColor = (number) => {
const inRedOddRange =
diff --git a/tgui/packages/tgui/interfaces/Safe.jsx b/tgui/packages/tgui/interfaces/Safe.jsx
index 3a989a2960f..5a89f8ca94c 100644
--- a/tgui/packages/tgui/interfaces/Safe.jsx
+++ b/tgui/packages/tgui/interfaces/Safe.jsx
@@ -1,4 +1,5 @@
import { Fragment } from 'react';
+
import { resolveAsset } from '../assets';
import { useBackend } from '../backend';
import { Box, Button, Icon, Section, Image } from '../components';
diff --git a/tgui/packages/tgui/interfaces/SatelliteControl.tsx b/tgui/packages/tgui/interfaces/SatelliteControl.tsx
index a9009b77efe..1bc7e6deec0 100644
--- a/tgui/packages/tgui/interfaces/SatelliteControl.tsx
+++ b/tgui/packages/tgui/interfaces/SatelliteControl.tsx
@@ -1,4 +1,5 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Box, Button, LabeledList, ProgressBar, Section } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/ScannerGate.jsx b/tgui/packages/tgui/interfaces/ScannerGate.jsx
index 448fa81600a..5afbf30072a 100644
--- a/tgui/packages/tgui/interfaces/ScannerGate.jsx
+++ b/tgui/packages/tgui/interfaces/ScannerGate.jsx
@@ -1,7 +1,7 @@
import { useBackend } from '../backend';
import { Box, Button, LabeledList, Section } from '../components';
-import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox';
import { Window } from '../layouts';
+import { InterfaceLockNoticeBox } from './common/InterfaceLockNoticeBox';
const DISEASE_THEASHOLD_LIST = [
'Positive',
diff --git a/tgui/packages/tgui/interfaces/Secrets.jsx b/tgui/packages/tgui/interfaces/Secrets.jsx
index b37a6213c04..95d0189a1cc 100644
--- a/tgui/packages/tgui/interfaces/Secrets.jsx
+++ b/tgui/packages/tgui/interfaces/Secrets.jsx
@@ -1,4 +1,6 @@
import { toFixed } from 'common/math';
+import { useState } from 'react';
+
import { useBackend } from '../backend';
import {
Button,
@@ -10,7 +12,6 @@ import {
Stack,
} from '../components';
import { Window } from '../layouts';
-import { useState } from 'react';
const TAB2NAME = [
{
diff --git a/tgui/packages/tgui/interfaces/SecurityRecords/CrimeWatcher.tsx b/tgui/packages/tgui/interfaces/SecurityRecords/CrimeWatcher.tsx
index 73c731d3a64..45b35d2c69b 100644
--- a/tgui/packages/tgui/interfaces/SecurityRecords/CrimeWatcher.tsx
+++ b/tgui/packages/tgui/interfaces/SecurityRecords/CrimeWatcher.tsx
@@ -1,6 +1,4 @@
-import { useLocalState, useBackend } from 'tgui/backend';
-import { SECURETAB, Crime, SecurityRecordsData } from './types';
-import { getSecurityRecord } from './helpers';
+import { useBackend, useLocalState } from 'tgui/backend';
import {
BlockQuote,
Box,
@@ -18,6 +16,9 @@ import {
Tooltip,
} from 'tgui/components';
+import { getSecurityRecord } from './helpers';
+import { Crime, SECURETAB, SecurityRecordsData } from './types';
+
/** Displays a list of crimes and allows to add new ones. */
export const CrimeWatcher = (props) => {
const foundRecord = getSecurityRecord();
diff --git a/tgui/packages/tgui/interfaces/SecurityRecords/RecordPrint.tsx b/tgui/packages/tgui/interfaces/SecurityRecords/RecordPrint.tsx
index 95b840dc4ae..9b34f3396ba 100644
--- a/tgui/packages/tgui/interfaces/SecurityRecords/RecordPrint.tsx
+++ b/tgui/packages/tgui/interfaces/SecurityRecords/RecordPrint.tsx
@@ -1,11 +1,12 @@
import { useBackend, useLocalState } from 'tgui/backend';
-import { PRINTOUT, SecurityRecordsData } from './types';
import { Box, Button, Input, Section, Stack } from 'tgui/components';
+
import {
- getSecurityRecord,
getDefaultPrintDescription,
getDefaultPrintHeader,
+ getSecurityRecord,
} from './helpers';
+import { PRINTOUT, SecurityRecordsData } from './types';
/** Handles printing posters and rapsheets */
export const RecordPrint = (props) => {
diff --git a/tgui/packages/tgui/interfaces/SecurityRecords/RecordTabs.tsx b/tgui/packages/tgui/interfaces/SecurityRecords/RecordTabs.tsx
index dd313b1e4ec..df8e2a60743 100644
--- a/tgui/packages/tgui/interfaces/SecurityRecords/RecordTabs.tsx
+++ b/tgui/packages/tgui/interfaces/SecurityRecords/RecordTabs.tsx
@@ -2,19 +2,20 @@ import { filter, sortBy } from 'common/collections';
import { flow } from 'common/fp';
import { useBackend, useLocalState } from 'tgui/backend';
import {
- Stack,
- Input,
- Section,
- Tabs,
- NoticeBox,
Box,
- Icon,
Button,
+ Icon,
+ Input,
+ NoticeBox,
+ Section,
+ Stack,
+ Tabs,
} from 'tgui/components';
+
import { JOB2ICON } from '../common/JobToIcon';
import { CRIMESTATUS2COLOR } from './constants';
import { isRecordMatch } from './helpers';
-import { SecurityRecordsData, SecurityRecord } from './types';
+import { SecurityRecord, SecurityRecordsData } from './types';
/** Tabs on left, with search bar */
export const SecurityRecordTabs = (props) => {
diff --git a/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx b/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx
index cd3df0af1f3..bc6d968d70e 100644
--- a/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx
+++ b/tgui/packages/tgui/interfaces/SecurityRecords/RecordView.tsx
@@ -9,12 +9,13 @@ import {
Stack,
Table,
} from 'tgui/components';
+
import { CharacterPreview } from '../common/CharacterPreview';
import { EditableText } from '../common/EditableText';
-import { CrimeWatcher } from './CrimeWatcher';
-import { RecordPrint } from './RecordPrint';
import { CRIMESTATUS2COLOR, CRIMESTATUS2DESC } from './constants';
+import { CrimeWatcher } from './CrimeWatcher';
import { getSecurityRecord } from './helpers';
+import { RecordPrint } from './RecordPrint';
import { SecurityRecordsData } from './types';
/** Views a selected record. */
diff --git a/tgui/packages/tgui/interfaces/SecurityRecords/helpers.ts b/tgui/packages/tgui/interfaces/SecurityRecords/helpers.ts
index 036e4d115eb..4636923239d 100644
--- a/tgui/packages/tgui/interfaces/SecurityRecords/helpers.ts
+++ b/tgui/packages/tgui/interfaces/SecurityRecords/helpers.ts
@@ -1,5 +1,6 @@
import { useBackend, useLocalState } from 'tgui/backend';
-import { PRINTOUT, SecurityRecordsData, SecurityRecord } from './types';
+
+import { PRINTOUT, SecurityRecord, SecurityRecordsData } from './types';
/** We need an active reference and this a pain to rewrite */
export const getSecurityRecord = () => {
diff --git a/tgui/packages/tgui/interfaces/SecurityRecords/index.tsx b/tgui/packages/tgui/interfaces/SecurityRecords/index.tsx
index 800397afe4f..e0eb6016ad8 100644
--- a/tgui/packages/tgui/interfaces/SecurityRecords/index.tsx
+++ b/tgui/packages/tgui/interfaces/SecurityRecords/index.tsx
@@ -1,9 +1,10 @@
import { useBackend } from 'tgui/backend';
import { Box, Button, Icon, NoticeBox, Stack } from 'tgui/components';
import { Window } from 'tgui/layouts';
-import { SecurityRecordsData } from './types';
-import { SecurityRecordView } from './RecordView';
+
import { SecurityRecordTabs } from './RecordTabs';
+import { SecurityRecordView } from './RecordView';
+import { SecurityRecordsData } from './types';
export const SecurityRecords = (props) => {
const { data } = useBackend();
diff --git a/tgui/packages/tgui/interfaces/SeedExtractor.tsx b/tgui/packages/tgui/interfaces/SeedExtractor.tsx
index f403b7efad6..a7778087292 100644
--- a/tgui/packages/tgui/interfaces/SeedExtractor.tsx
+++ b/tgui/packages/tgui/interfaces/SeedExtractor.tsx
@@ -1,21 +1,22 @@
+import { sortBy } from 'common/collections';
+import { flow } from 'common/fp';
import { classes } from 'common/react';
import { createSearch } from 'common/string';
-import { flow } from 'common/fp';
-import { sortBy } from 'common/collections';
+import { useState } from 'react';
+
import { useBackend } from '../backend';
import {
- Input,
- Tooltip,
Box,
- ProgressBar,
Button,
+ Icon,
+ Input,
+ NoticeBox,
+ ProgressBar,
Section,
Table,
- NoticeBox,
- Icon,
+ Tooltip,
} from '../components';
import { Window } from '../layouts';
-import { useState } from 'react';
type TraitData = {
path: string;
diff --git a/tgui/packages/tgui/interfaces/SelectEquipment.jsx b/tgui/packages/tgui/interfaces/SelectEquipment.jsx
index ef726f609f9..f9fac18df56 100644
--- a/tgui/packages/tgui/interfaces/SelectEquipment.jsx
+++ b/tgui/packages/tgui/interfaces/SelectEquipment.jsx
@@ -1,6 +1,7 @@
import { filter, map, sortBy, uniq } from 'common/collections';
import { flow } from 'common/fp';
import { createSearch } from 'common/string';
+
import { useBackend, useLocalState } from '../backend';
import {
Box,
diff --git a/tgui/packages/tgui/interfaces/SentienceFunBalloon.jsx b/tgui/packages/tgui/interfaces/SentienceFunBalloon.jsx
index 8b68d44ce5d..bb7d1d56fbd 100644
--- a/tgui/packages/tgui/interfaces/SentienceFunBalloon.jsx
+++ b/tgui/packages/tgui/interfaces/SentienceFunBalloon.jsx
@@ -1,11 +1,11 @@
import { useBackend } from '../backend';
import {
Button,
+ Input,
+ LabeledList,
NumberInput,
Section,
Stack,
- Input,
- LabeledList,
} from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/ServerControl.tsx b/tgui/packages/tgui/interfaces/ServerControl.tsx
index 2c1dcaaee8e..8b51cdf625e 100644
--- a/tgui/packages/tgui/interfaces/ServerControl.tsx
+++ b/tgui/packages/tgui/interfaces/ServerControl.tsx
@@ -1,6 +1,7 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
-import { Button, Collapsible, Section, Table, NoticeBox } from '../components';
+import { Button, Collapsible, NoticeBox, Section, Table } from '../components';
import { Window } from '../layouts';
type Data = {
diff --git a/tgui/packages/tgui/interfaces/ServerControlPanel.jsx b/tgui/packages/tgui/interfaces/ServerControlPanel.jsx
index e6d7860f83c..5e6d9c82f92 100644
--- a/tgui/packages/tgui/interfaces/ServerControlPanel.jsx
+++ b/tgui/packages/tgui/interfaces/ServerControlPanel.jsx
@@ -1,6 +1,6 @@
// THIS IS A SKYRAT UI FILE
import { useBackend } from '../backend';
-import { NoticeBox, Section, Button, LabeledList } from '../components';
+import { Button, LabeledList, NoticeBox, Section } from '../components';
import { Window } from '../layouts';
export const MicrofusionGunControl = (props) => {
diff --git a/tgui/packages/tgui/interfaces/ServerMonitor.jsx b/tgui/packages/tgui/interfaces/ServerMonitor.jsx
index 74f445211ef..87cbd18f343 100644
--- a/tgui/packages/tgui/interfaces/ServerMonitor.jsx
+++ b/tgui/packages/tgui/interfaces/ServerMonitor.jsx
@@ -1,17 +1,18 @@
+import { useState } from 'react';
+
import { useBackend } from '../backend';
import {
+ Button,
+ Divider,
+ Flex,
+ Input,
+ LabeledList,
+ NoticeBox,
Section,
Stack,
- Input,
- Button,
Table,
- LabeledList,
- Flex,
- Divider,
- NoticeBox,
} from '../components';
import { Window } from '../layouts';
-import { useState } from 'react';
const PacketInfo = (props) => {
const { act, data } = useBackend();
diff --git a/tgui/packages/tgui/interfaces/ShuttleManipulator.jsx b/tgui/packages/tgui/interfaces/ShuttleManipulator.jsx
index 430ed79e35d..e64f47086cd 100644
--- a/tgui/packages/tgui/interfaces/ShuttleManipulator.jsx
+++ b/tgui/packages/tgui/interfaces/ShuttleManipulator.jsx
@@ -1,8 +1,9 @@
import { map } from 'common/collections';
+import { useState } from 'react';
+
import { useBackend } from '../backend';
import { Button, Flex, LabeledList, Section, Table, Tabs } from '../components';
import { Window } from '../layouts';
-import { useState } from 'react';
export const ShuttleManipulator = (props) => {
const [tab, setTab] = useState(1);
diff --git a/tgui/packages/tgui/interfaces/Signaler.tsx b/tgui/packages/tgui/interfaces/Signaler.tsx
index 8383a8a28ee..15a486a62df 100644
--- a/tgui/packages/tgui/interfaces/Signaler.tsx
+++ b/tgui/packages/tgui/interfaces/Signaler.tsx
@@ -1,6 +1,7 @@
import { toFixed } from 'common/math';
+
import { useBackend } from '../backend';
-import { Button, Stack, NumberInput, Section } from '../components';
+import { Button, NumberInput, Section, Stack } from '../components';
import { Window } from '../layouts';
type Data = {
diff --git a/tgui/packages/tgui/interfaces/Signalvib.jsx b/tgui/packages/tgui/interfaces/Signalvib.jsx
index 3915931766c..192233cc40c 100644
--- a/tgui/packages/tgui/interfaces/Signalvib.jsx
+++ b/tgui/packages/tgui/interfaces/Signalvib.jsx
@@ -1,5 +1,6 @@
// THIS IS A SKYRAT UI FILE
import { toFixed } from 'common/math';
+
import { useBackend } from '../backend';
import { Button, LabeledList, NumberInput, Section } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/SkillStation.jsx b/tgui/packages/tgui/interfaces/SkillStation.jsx
index ce77d7b7b03..b26163bbaf8 100644
--- a/tgui/packages/tgui/interfaces/SkillStation.jsx
+++ b/tgui/packages/tgui/interfaces/SkillStation.jsx
@@ -1,4 +1,5 @@
import { toFixed } from 'common/math';
+
import { useBackend } from '../backend';
import {
Box,
diff --git a/tgui/packages/tgui/interfaces/SlimeBodySwapper.jsx b/tgui/packages/tgui/interfaces/SlimeBodySwapper.jsx
index 887e0cb8d1d..d5c97e05d37 100644
--- a/tgui/packages/tgui/interfaces/SlimeBodySwapper.jsx
+++ b/tgui/packages/tgui/interfaces/SlimeBodySwapper.jsx
@@ -1,5 +1,5 @@
import { useBackend } from '../backend';
-import { Section, LabeledList, Button, Box } from '../components';
+import { Box, Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
const statusMap = {
diff --git a/tgui/packages/tgui/interfaces/SmartVend.tsx b/tgui/packages/tgui/interfaces/SmartVend.tsx
index 4b89b29fbcf..d71877d086c 100644
--- a/tgui/packages/tgui/interfaces/SmartVend.tsx
+++ b/tgui/packages/tgui/interfaces/SmartVend.tsx
@@ -1,4 +1,5 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Button, NoticeBox, Section, Table } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/SmokeMachine.tsx b/tgui/packages/tgui/interfaces/SmokeMachine.tsx
index 6b96289c064..072a7546876 100644
--- a/tgui/packages/tgui/interfaces/SmokeMachine.tsx
+++ b/tgui/packages/tgui/interfaces/SmokeMachine.tsx
@@ -1,4 +1,5 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
AnimatedNumber,
diff --git a/tgui/packages/tgui/interfaces/SolarControl.tsx b/tgui/packages/tgui/interfaces/SolarControl.tsx
index 83016d4c0c4..f3cd5a324a7 100644
--- a/tgui/packages/tgui/interfaces/SolarControl.tsx
+++ b/tgui/packages/tgui/interfaces/SolarControl.tsx
@@ -1,17 +1,18 @@
import { BooleanLike } from 'common/react';
-import { formatPower } from '../format';
+
import { useBackend } from '../backend';
import {
Box,
Button,
+ Chart,
+ Icon,
LabeledList,
NumberInput,
ProgressBar,
- Chart,
Section,
Stack,
- Icon,
} from '../components';
+import { formatPower } from '../format';
import { Window } from '../layouts';
type Data = {
diff --git a/tgui/packages/tgui/interfaces/Soulcatcher.jsx b/tgui/packages/tgui/interfaces/Soulcatcher.jsx
index d5ce9f2fd8f..f797d5b2225 100644
--- a/tgui/packages/tgui/interfaces/Soulcatcher.jsx
+++ b/tgui/packages/tgui/interfaces/Soulcatcher.jsx
@@ -1,17 +1,17 @@
// THIS IS A SKYRAT UI FILE
import { useBackend } from '../backend';
-import { Window } from '../layouts';
import {
BlockQuote,
- Button,
- Divider,
- Section,
Box,
- Flex,
+ Button,
Collapsible,
+ Divider,
+ Flex,
LabeledList,
ProgressBar,
+ Section,
} from '../components';
+import { Window } from '../layouts';
export const Soulcatcher = (props) => {
const { act, data } = useBackend();
diff --git a/tgui/packages/tgui/interfaces/SoulcatcherUser.jsx b/tgui/packages/tgui/interfaces/SoulcatcherUser.jsx
index 3dce5aec758..d0b3e37780a 100644
--- a/tgui/packages/tgui/interfaces/SoulcatcherUser.jsx
+++ b/tgui/packages/tgui/interfaces/SoulcatcherUser.jsx
@@ -1,16 +1,16 @@
// THIS IS A SKYRAT UI FILE
import { useBackend } from '../backend';
-import { Window } from '../layouts';
import {
BlockQuote,
- Button,
- Divider,
Box,
- Flex,
+ Button,
Collapsible,
+ Divider,
+ Flex,
LabeledList,
Section,
} from '../components';
+import { Window } from '../layouts';
export const SoulcatcherUser = (props) => {
const { act, data } = useBackend();
diff --git a/tgui/packages/tgui/interfaces/SparringContract.tsx b/tgui/packages/tgui/interfaces/SparringContract.tsx
index e0b47a5d6ae..ccaf2768a72 100644
--- a/tgui/packages/tgui/interfaces/SparringContract.tsx
+++ b/tgui/packages/tgui/interfaces/SparringContract.tsx
@@ -1,6 +1,7 @@
import { BooleanLike } from 'common/react';
import { multiline } from 'common/string';
import { useState } from 'react';
+
import { useBackend } from '../backend';
import { BlockQuote, Button, Dropdown, Section, Stack } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/Spellbook.tsx b/tgui/packages/tgui/interfaces/Spellbook.tsx
index 47fe2f7ffd2..514471dc0d9 100644
--- a/tgui/packages/tgui/interfaces/Spellbook.tsx
+++ b/tgui/packages/tgui/interfaces/Spellbook.tsx
@@ -1,5 +1,7 @@
import { BooleanLike } from 'common/react';
import { multiline } from 'common/string';
+import { ReactNode } from 'react';
+
import { useBackend, useLocalState } from '../backend';
import {
Box,
@@ -14,7 +16,6 @@ import {
Stack,
} from '../components';
import { Window } from '../layouts';
-import { ReactNode } from 'react';
enum SpellCategory {
Offensive = 'Offensive',
diff --git a/tgui/packages/tgui/interfaces/StackCrafting.tsx b/tgui/packages/tgui/interfaces/StackCrafting.tsx
index ab7e109cd96..ddaa0986c78 100644
--- a/tgui/packages/tgui/interfaces/StackCrafting.tsx
+++ b/tgui/packages/tgui/interfaces/StackCrafting.tsx
@@ -1,19 +1,20 @@
-import { createSearch } from 'common/string';
import { filter, map, reduce, sortBy } from 'common/collections';
+import { flow } from 'common/fp';
+import { clamp } from 'common/math';
+import { createSearch } from 'common/string';
+import { useState } from 'react';
+
import { useBackend } from '../backend';
import {
Box,
Button,
+ Collapsible,
Input,
NoticeBox,
Section,
- Collapsible,
Table,
} from '../components';
import { Window } from '../layouts';
-import { clamp } from 'common/math';
-import { flow } from 'common/fp';
-import { useState } from 'react';
type Recipe = {
ref: unknown | null;
diff --git a/tgui/packages/tgui/interfaces/StationAlertConsole.jsx b/tgui/packages/tgui/interfaces/StationAlertConsole.jsx
index 0483065f530..f80a5826b06 100644
--- a/tgui/packages/tgui/interfaces/StationAlertConsole.jsx
+++ b/tgui/packages/tgui/interfaces/StationAlertConsole.jsx
@@ -1,5 +1,6 @@
import { sortBy } from 'common/collections';
import { flow } from 'common/fp';
+
import { useBackend } from '../backend';
import { Button, Section, Stack } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/StationTraitsPanel.tsx b/tgui/packages/tgui/interfaces/StationTraitsPanel.tsx
index d92254695db..f3176415a4f 100644
--- a/tgui/packages/tgui/interfaces/StationTraitsPanel.tsx
+++ b/tgui/packages/tgui/interfaces/StationTraitsPanel.tsx
@@ -2,6 +2,7 @@ import { filterMap } from 'common/collections';
import { exhaustiveCheck } from 'common/exhaustive';
import { BooleanLike } from 'common/react';
import { useState } from 'react';
+
import { useBackend } from '../backend';
import { Box, Button, Divider, Dropdown, Stack, Tabs } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/StoryManager.tsx b/tgui/packages/tgui/interfaces/StoryManager.tsx
index 56e7f7ef977..7486e83dc84 100644
--- a/tgui/packages/tgui/interfaces/StoryManager.tsx
+++ b/tgui/packages/tgui/interfaces/StoryManager.tsx
@@ -1,11 +1,11 @@
// THIS IS A SKYRAT UI FILE
import { useBackend, useLocalState } from '../backend';
import {
+ Button,
Collapsible,
+ LabeledList,
Section,
TextArea,
- LabeledList,
- Button,
} from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/StripMenu.tsx b/tgui/packages/tgui/interfaces/StripMenu.tsx
index e16cbce9af6..968ca8b1cc0 100644
--- a/tgui/packages/tgui/interfaces/StripMenu.tsx
+++ b/tgui/packages/tgui/interfaces/StripMenu.tsx
@@ -1,8 +1,9 @@
import { range } from 'common/collections';
import { BooleanLike } from 'common/react';
+
import { resolveAsset } from '../assets';
import { useBackend } from '../backend';
-import { Box, Button, Icon, Stack, Image } from '../components';
+import { Box, Button, Icon, Image, Stack } from '../components';
import { Window } from '../layouts';
const ROWS = 6; // SKYRAT EDIT CHANGE
diff --git a/tgui/packages/tgui/interfaces/Supermatter.tsx b/tgui/packages/tgui/interfaces/Supermatter.tsx
index 20e4f2ccb65..9bb8661ca29 100644
--- a/tgui/packages/tgui/interfaces/Supermatter.tsx
+++ b/tgui/packages/tgui/interfaces/Supermatter.tsx
@@ -3,6 +3,7 @@ import { flow } from 'common/fp';
import { toFixed } from 'common/math';
import { BooleanLike } from 'common/react';
import { ReactNode, useState } from 'react';
+
import { useBackend } from '../backend';
import {
Box,
diff --git a/tgui/packages/tgui/interfaces/SurgeryInitiator.tsx b/tgui/packages/tgui/interfaces/SurgeryInitiator.tsx
index ec20862c41d..2e9403794bf 100644
--- a/tgui/packages/tgui/interfaces/SurgeryInitiator.tsx
+++ b/tgui/packages/tgui/interfaces/SurgeryInitiator.tsx
@@ -2,6 +2,7 @@ import { sortBy } from 'common/collections';
import { KEY_DOWN, KEY_ENTER, KEY_UP } from 'common/keycodes';
import { BooleanLike } from 'common/react';
import { Component } from 'react';
+
import { useBackend } from '../backend';
import { Button, KeyListener, Stack } from '../components';
import { BodyZone, BodyZoneSelector } from '../components/BodyZoneSelector';
diff --git a/tgui/packages/tgui/interfaces/SyndContractor.jsx b/tgui/packages/tgui/interfaces/SyndContractor.jsx
index 47ecacb5c97..472a1834df6 100644
--- a/tgui/packages/tgui/interfaces/SyndContractor.jsx
+++ b/tgui/packages/tgui/interfaces/SyndContractor.jsx
@@ -1,4 +1,5 @@
-import { FakeTerminal } from '../components/FakeTerminal';
+import { useState } from 'react';
+
import { useBackend } from '../backend';
import {
Box,
@@ -10,11 +11,11 @@ import {
Modal,
NoticeBox,
Section,
- Tabs,
Table,
+ Tabs,
} from '../components';
+import { FakeTerminal } from '../components/FakeTerminal';
import { NtosWindow } from '../layouts';
-import { useState } from 'react';
const CONTRACT_STATUS_INACTIVE = 1;
const CONTRACT_STATUS_ACTIVE = 2;
diff --git a/tgui/packages/tgui/interfaces/Tank.jsx b/tgui/packages/tgui/interfaces/Tank.jsx
index 8710a94b74e..87c1d4e2221 100644
--- a/tgui/packages/tgui/interfaces/Tank.jsx
+++ b/tgui/packages/tgui/interfaces/Tank.jsx
@@ -1,4 +1,5 @@
import { toFixed } from 'common/math';
+
import { useBackend } from '../backend';
import {
Button,
diff --git a/tgui/packages/tgui/interfaces/TankCompressor.jsx b/tgui/packages/tgui/interfaces/TankCompressor.jsx
index 6ac37ca800b..1fddb2b1938 100644
--- a/tgui/packages/tgui/interfaces/TankCompressor.jsx
+++ b/tgui/packages/tgui/interfaces/TankCompressor.jsx
@@ -4,14 +4,14 @@ import {
Button,
Flex,
Icon,
+ LabeledList,
Modal,
+ NoticeBox,
RoundGauge,
Section,
Slider,
Stack,
- NoticeBox,
Tabs,
- LabeledList,
} from '../components';
import { Window } from '../layouts';
import { GasmixParser } from './common/GasmixParser';
diff --git a/tgui/packages/tgui/interfaces/Techweb.jsx b/tgui/packages/tgui/interfaces/Techweb.jsx
index 031b3ebc2ad..62381d5037b 100644
--- a/tgui/packages/tgui/interfaces/Techweb.jsx
+++ b/tgui/packages/tgui/interfaces/Techweb.jsx
@@ -1,19 +1,20 @@
import { map, sortBy } from 'common/collections';
+
import { useBackend, useLocalState } from '../backend';
import {
- Button,
- Section,
- Modal,
- Tabs,
Box,
- Input,
- Flex,
- ProgressBar,
+ Button,
Collapsible,
- Icon,
Divider,
+ Flex,
+ Icon,
+ Input,
+ Modal,
+ ProgressBar,
+ Section,
+ Tabs,
} from '../components';
-import { Window, NtosWindow } from '../layouts';
+import { NtosWindow, Window } from '../layouts';
import { Experiment } from './ExperimentConfigure';
// Data reshaping / ingestion (thanks stylemistake for the help, very cool!)
diff --git a/tgui/packages/tgui/interfaces/Telecomms.jsx b/tgui/packages/tgui/interfaces/Telecomms.jsx
index 6ef6b902ed6..d0faebd0b9a 100644
--- a/tgui/packages/tgui/interfaces/Telecomms.jsx
+++ b/tgui/packages/tgui/interfaces/Telecomms.jsx
@@ -1,14 +1,14 @@
import { useBackend } from '../backend';
import {
+ Box,
Button,
Input,
+ LabeledControls,
LabeledList,
- Section,
- Table,
NoticeBox,
NumberInput,
- LabeledControls,
- Box,
+ Section,
+ Table,
} from '../components';
import { RADIO_CHANNELS } from '../constants';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/TelecommsMonitor.tsx b/tgui/packages/tgui/interfaces/TelecommsMonitor.tsx
index 619eb9d9801..8a1ecdd64d6 100644
--- a/tgui/packages/tgui/interfaces/TelecommsMonitor.tsx
+++ b/tgui/packages/tgui/interfaces/TelecommsMonitor.tsx
@@ -1,13 +1,14 @@
import { useState } from 'react';
+
import { useBackend } from '../backend';
import {
- Section,
- Stack,
- Input,
Button,
- Table,
+ Input,
LabeledList,
NoticeBox,
+ Section,
+ Stack,
+ Table,
} from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/TextInputModal.tsx b/tgui/packages/tgui/interfaces/TextInputModal.tsx
index 63abe5f8413..f9ec036575e 100644
--- a/tgui/packages/tgui/interfaces/TextInputModal.tsx
+++ b/tgui/packages/tgui/interfaces/TextInputModal.tsx
@@ -1,10 +1,11 @@
-import { Loader } from './common/Loader';
-import { InputButtons } from './common/InputButtons';
+import { KEY } from 'common/keys';
+import { useState } from 'react';
+
import { useBackend } from '../backend';
import { Box, Section, Stack, TextArea } from '../components';
import { Window } from '../layouts';
-import { useState } from 'react';
-import { KEY } from 'common/keys';
+import { InputButtons } from './common/InputButtons';
+import { Loader } from './common/Loader';
type TextInputData = {
large_buttons: boolean;
diff --git a/tgui/packages/tgui/interfaces/ThermoMachine.jsx b/tgui/packages/tgui/interfaces/ThermoMachine.jsx
index 419803b2059..cf5695b73b6 100644
--- a/tgui/packages/tgui/interfaces/ThermoMachine.jsx
+++ b/tgui/packages/tgui/interfaces/ThermoMachine.jsx
@@ -1,4 +1,5 @@
import { toFixed } from 'common/math';
+
import { useBackend } from '../backend';
import {
AnimatedNumber,
diff --git a/tgui/packages/tgui/interfaces/Thermometer.jsx b/tgui/packages/tgui/interfaces/Thermometer.jsx
index 85a5eb7c44a..19a97d65a2e 100644
--- a/tgui/packages/tgui/interfaces/Thermometer.jsx
+++ b/tgui/packages/tgui/interfaces/Thermometer.jsx
@@ -1,4 +1,5 @@
import { Component } from 'react';
+
import { useBackend } from '../backend';
import { Box, Stack } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/TimeClock.jsx b/tgui/packages/tgui/interfaces/TimeClock.jsx
index dfd90b51968..dc8f0e8165b 100644
--- a/tgui/packages/tgui/interfaces/TimeClock.jsx
+++ b/tgui/packages/tgui/interfaces/TimeClock.jsx
@@ -1,7 +1,7 @@
// THIS IS A SKYRAT UI FILE
import { useBackend } from '../backend';
+import { Box, Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
-import { Box, LabeledList, Section, Button } from '../components';
export const TimeClock = (props) => {
const { act, data } = useBackend();
diff --git a/tgui/packages/tgui/interfaces/Timer.tsx b/tgui/packages/tgui/interfaces/Timer.tsx
index fcf4ccaad25..10cb76cb5de 100644
--- a/tgui/packages/tgui/interfaces/Timer.tsx
+++ b/tgui/packages/tgui/interfaces/Timer.tsx
@@ -1,4 +1,5 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Button, Section } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/TrackedPlaytime.jsx b/tgui/packages/tgui/interfaces/TrackedPlaytime.jsx
index f405e5b8623..3f1a3dcb543 100644
--- a/tgui/packages/tgui/interfaces/TrackedPlaytime.jsx
+++ b/tgui/packages/tgui/interfaces/TrackedPlaytime.jsx
@@ -1,4 +1,5 @@
import { sortBy } from 'common/collections';
+
import { useBackend } from '../backend';
import { Box, Button, Flex, ProgressBar, Section, Table } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/TrainingMachine.tsx b/tgui/packages/tgui/interfaces/TrainingMachine.tsx
index 804c2d4ed3e..1bf9a87dcc7 100644
--- a/tgui/packages/tgui/interfaces/TrainingMachine.tsx
+++ b/tgui/packages/tgui/interfaces/TrainingMachine.tsx
@@ -1,4 +1,5 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
Box,
diff --git a/tgui/packages/tgui/interfaces/TraitorObjectiveDebug.tsx b/tgui/packages/tgui/interfaces/TraitorObjectiveDebug.tsx
index 4455c11fbb4..3b6b0103528 100644
--- a/tgui/packages/tgui/interfaces/TraitorObjectiveDebug.tsx
+++ b/tgui/packages/tgui/interfaces/TraitorObjectiveDebug.tsx
@@ -1,4 +1,5 @@
import { useState } from 'react';
+
import { useBackend } from '../backend';
import { Box, LabeledList, Stack, Tabs, Tooltip } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/TramControl.tsx b/tgui/packages/tgui/interfaces/TramControl.tsx
index 5c10e85181f..74b93c61dec 100644
--- a/tgui/packages/tgui/interfaces/TramControl.tsx
+++ b/tgui/packages/tgui/interfaces/TramControl.tsx
@@ -1,8 +1,9 @@
+import { BooleanLike } from 'common/react';
+import { useState } from 'react';
+
import { useBackend } from '../backend';
import { Box, Button, Dimmer, Icon, Section, Stack } from '../components';
import { Window } from '../layouts';
-import { useState } from 'react';
-import { BooleanLike } from 'common/react';
type Data = {
broken: BooleanLike;
diff --git a/tgui/packages/tgui/interfaces/TramController.tsx b/tgui/packages/tgui/interfaces/TramController.tsx
index 536d01dd6e3..07fef58f8e4 100644
--- a/tgui/packages/tgui/interfaces/TramController.tsx
+++ b/tgui/packages/tgui/interfaces/TramController.tsx
@@ -1,15 +1,16 @@
-import { useBackend, useLocalState } from '../backend';
-import { BooleanLike } from 'common/react';
-import {
- Stack,
- Section,
- LabeledList,
- ProgressBar,
- Button,
- NoticeBox,
- Dropdown,
-} from '../components';
import { toFixed } from 'common/math';
+import { BooleanLike } from 'common/react';
+
+import { useBackend, useLocalState } from '../backend';
+import {
+ Button,
+ Dropdown,
+ LabeledList,
+ NoticeBox,
+ ProgressBar,
+ Section,
+ Stack,
+} from '../components';
import { Window } from '../layouts';
type Data = {
diff --git a/tgui/packages/tgui/interfaces/TramPlaque.tsx b/tgui/packages/tgui/interfaces/TramPlaque.tsx
index 3da01d1f132..ebf03b0c4da 100644
--- a/tgui/packages/tgui/interfaces/TramPlaque.tsx
+++ b/tgui/packages/tgui/interfaces/TramPlaque.tsx
@@ -1,5 +1,5 @@
import { useBackend } from '../backend';
-import { NoticeBox, Section, LabeledList, Stack } from '../components';
+import { LabeledList, NoticeBox, Section, Stack } from '../components';
import { Window } from '../layouts';
type Data = {
diff --git a/tgui/packages/tgui/interfaces/TrophyAdminPanel.jsx b/tgui/packages/tgui/interfaces/TrophyAdminPanel.jsx
index 093c5edbc5b..885223b8a20 100644
--- a/tgui/packages/tgui/interfaces/TrophyAdminPanel.jsx
+++ b/tgui/packages/tgui/interfaces/TrophyAdminPanel.jsx
@@ -1,4 +1,5 @@
import { decodeHtmlEntities } from 'common/string';
+
import { useBackend } from '../backend';
import { Button, Table } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/Trophycase.jsx b/tgui/packages/tgui/interfaces/Trophycase.jsx
index 12892adff51..7a664befb4d 100644
--- a/tgui/packages/tgui/interfaces/Trophycase.jsx
+++ b/tgui/packages/tgui/interfaces/Trophycase.jsx
@@ -1,13 +1,14 @@
import { decodeHtmlEntities } from 'common/string';
+
import { useBackend } from '../backend';
import {
- Icon,
Box,
Button,
Dimmer,
+ Icon,
+ Image,
Section,
Stack,
- Image,
} from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/TurbineComputer.tsx b/tgui/packages/tgui/interfaces/TurbineComputer.tsx
index b2a001338cd..f9e261f4932 100644
--- a/tgui/packages/tgui/interfaces/TurbineComputer.tsx
+++ b/tgui/packages/tgui/interfaces/TurbineComputer.tsx
@@ -1,13 +1,14 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
+ Box,
Button,
LabeledList,
- Section,
- Box,
Modal,
- ProgressBar,
NumberInput,
+ ProgressBar,
+ Section,
} from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/TurretControl.tsx b/tgui/packages/tgui/interfaces/TurretControl.tsx
index dec3c72f203..2009ff4f742 100644
--- a/tgui/packages/tgui/interfaces/TurretControl.tsx
+++ b/tgui/packages/tgui/interfaces/TurretControl.tsx
@@ -1,4 +1,5 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Button, LabeledList, Section } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx b/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx
index 8f06a03148e..d505f726e4d 100644
--- a/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx
+++ b/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx
@@ -1,13 +1,14 @@
import { BooleanLike } from 'common/react';
import { useState } from 'react';
+
import {
Box,
Button,
Input,
- Section,
- Tabs,
NoticeBox,
+ Section,
Stack,
+ Tabs,
} from '../../components';
type GenericUplinkProps = {
diff --git a/tgui/packages/tgui/interfaces/Uplink/ObjectiveMenu.tsx b/tgui/packages/tgui/interfaces/Uplink/ObjectiveMenu.tsx
index 81d803b3b82..e2eb714413c 100644
--- a/tgui/packages/tgui/interfaces/Uplink/ObjectiveMenu.tsx
+++ b/tgui/packages/tgui/interfaces/Uplink/ObjectiveMenu.tsx
@@ -1,15 +1,16 @@
import { BooleanLike, classes } from 'common/react';
import { Component } from 'react';
+
import {
- Section,
- Stack,
Box,
Button,
- Flex,
- Tooltip,
- NoticeBox,
Dimmer,
+ Flex,
Icon,
+ NoticeBox,
+ Section,
+ Stack,
+ Tooltip,
} from '../../components';
import {
calculateProgression,
diff --git a/tgui/packages/tgui/interfaces/Uplink/index.tsx b/tgui/packages/tgui/interfaces/Uplink/index.tsx
index 843963b4b7f..a8b2e7d477b 100644
--- a/tgui/packages/tgui/interfaces/Uplink/index.tsx
+++ b/tgui/packages/tgui/interfaces/Uplink/index.tsx
@@ -1,27 +1,28 @@
-import { useBackend } from '../../backend';
-import { Window } from '../../layouts';
-import { GenericUplink, Item } from './GenericUplink';
-import { Component, Fragment } from 'react';
-import { fetchRetry } from '../../http';
-import { resolveAsset } from '../../assets';
import { BooleanLike } from 'common/react';
+import { Component, Fragment } from 'react';
+
+import { resolveAsset } from '../../assets';
+import { useBackend } from '../../backend';
import {
Box,
- Tabs,
Button,
- Stack,
- Section,
- Tooltip,
Dimmer,
+ Section,
+ Stack,
+ Tabs,
+ Tooltip,
} from '../../components';
-import { PrimaryObjectiveMenu } from './PrimaryObjectiveMenu';
-import { Objective, ObjectiveMenu } from './ObjectiveMenu';
+import { fetchRetry } from '../../http';
+import { Window } from '../../layouts';
import {
- calculateProgression,
calculateDangerLevel,
+ calculateProgression,
dangerDefault,
dangerLevelsTooltip,
} from './calculateDangerLevel';
+import { GenericUplink, Item } from './GenericUplink';
+import { Objective, ObjectiveMenu } from './ObjectiveMenu';
+import { PrimaryObjectiveMenu } from './PrimaryObjectiveMenu';
type UplinkItem = {
id: string;
diff --git a/tgui/packages/tgui/interfaces/VaultController.tsx b/tgui/packages/tgui/interfaces/VaultController.tsx
index 774483176c1..57a879bc096 100644
--- a/tgui/packages/tgui/interfaces/VaultController.tsx
+++ b/tgui/packages/tgui/interfaces/VaultController.tsx
@@ -1,5 +1,6 @@
import { toFixed } from 'common/math';
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import { Button, LabeledList, ProgressBar, Section } from '../components';
import { Window } from '../layouts';
diff --git a/tgui/packages/tgui/interfaces/Vendatray.tsx b/tgui/packages/tgui/interfaces/Vendatray.tsx
index 9e1787f0e7c..ae8a4e07e7e 100644
--- a/tgui/packages/tgui/interfaces/Vendatray.tsx
+++ b/tgui/packages/tgui/interfaces/Vendatray.tsx
@@ -1,6 +1,7 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
-import { Box, Button, Section, Stack, Image } from '../components';
+import { Box, Button, Image, Section, Stack } from '../components';
import { Window } from '../layouts';
type Data = {
diff --git a/tgui/packages/tgui/interfaces/VotePanel.tsx b/tgui/packages/tgui/interfaces/VotePanel.tsx
index d9f1683b05a..a56f656a4a6 100644
--- a/tgui/packages/tgui/interfaces/VotePanel.tsx
+++ b/tgui/packages/tgui/interfaces/VotePanel.tsx
@@ -1,16 +1,17 @@
import { BooleanLike } from 'common/react';
+
+import { useBackend } from '../backend';
import {
Box,
- Icon,
- Stack,
Button,
- Section,
- NoticeBox,
- LabeledList,
Collapsible,
+ Icon,
+ LabeledList,
+ NoticeBox,
+ Section,
+ Stack,
} from '../components';
import { Window } from '../layouts';
-import { useBackend } from '../backend';
enum VoteConfig {
None = -1,
diff --git a/tgui/packages/tgui/interfaces/WarrantConsole.tsx b/tgui/packages/tgui/interfaces/WarrantConsole.tsx
index 662e197bc36..245d7486c21 100644
--- a/tgui/packages/tgui/interfaces/WarrantConsole.tsx
+++ b/tgui/packages/tgui/interfaces/WarrantConsole.tsx
@@ -1,5 +1,6 @@
+import { sortBy } from 'common/collections';
+
import { useBackend, useLocalState } from '../backend';
-import { Window } from '../layouts';
import {
BlockQuote,
Button,
@@ -11,7 +12,7 @@ import {
Stack,
Tabs,
} from '../components';
-import { sortBy } from 'common/collections';
+import { Window } from '../layouts';
type Data = {
records: WarrantRecord[];
diff --git a/tgui/packages/tgui/interfaces/Wires.tsx b/tgui/packages/tgui/interfaces/Wires.tsx
index 6f310f6e1da..19cfa76df5a 100644
--- a/tgui/packages/tgui/interfaces/Wires.tsx
+++ b/tgui/packages/tgui/interfaces/Wires.tsx
@@ -1,4 +1,5 @@
import { BooleanLike } from 'common/react';
+
import { useBackend } from '../backend';
import {
Box,
diff --git a/tgui/packages/tgui/interfaces/common/AccessConfig.jsx b/tgui/packages/tgui/interfaces/common/AccessConfig.jsx
index fb16d28b6e9..274ecf0f76a 100644
--- a/tgui/packages/tgui/interfaces/common/AccessConfig.jsx
+++ b/tgui/packages/tgui/interfaces/common/AccessConfig.jsx
@@ -1,6 +1,7 @@
import { sortBy } from 'common/collections';
-import { Section, Button, Flex, Tabs, Grid } from '../../components';
+
import { useLocalState } from '../../backend';
+import { Button, Flex, Grid, Section, Tabs } from '../../components';
export const AccessConfig = (props) => {
const {
diff --git a/tgui/packages/tgui/interfaces/common/AccessList.jsx b/tgui/packages/tgui/interfaces/common/AccessList.jsx
index 8f651618b6c..a4096b6ce30 100644
--- a/tgui/packages/tgui/interfaces/common/AccessList.jsx
+++ b/tgui/packages/tgui/interfaces/common/AccessList.jsx
@@ -1,4 +1,5 @@
import { sortBy } from 'common/collections';
+
import { useSharedState } from '../../backend';
import { Button, Flex, Section, Tabs } from '../../components';
diff --git a/tgui/packages/tgui/interfaces/common/AtmosControls.tsx b/tgui/packages/tgui/interfaces/common/AtmosControls.tsx
index a01d17fa405..4d126133526 100644
--- a/tgui/packages/tgui/interfaces/common/AtmosControls.tsx
+++ b/tgui/packages/tgui/interfaces/common/AtmosControls.tsx
@@ -1,5 +1,6 @@
import { BooleanLike } from 'common/react';
import { decodeHtmlEntities } from 'common/string';
+
import { useBackend } from '../../backend';
import { Button, LabeledList, NumberInput, Section } from '../../components';
import { getGasLabel } from '../../constants';
diff --git a/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx b/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx
index bb2670829de..65bf5f839be 100644
--- a/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx
+++ b/tgui/packages/tgui/interfaces/common/AtmosHandbook.tsx
@@ -1,4 +1,5 @@
import { ReactNode } from 'react';
+
import { useBackend, useLocalState } from '../../backend';
import {
Box,
diff --git a/tgui/packages/tgui/interfaces/common/BeakerDisplay.tsx b/tgui/packages/tgui/interfaces/common/BeakerDisplay.tsx
index 699c40fb134..dc5b045d7f7 100644
--- a/tgui/packages/tgui/interfaces/common/BeakerDisplay.tsx
+++ b/tgui/packages/tgui/interfaces/common/BeakerDisplay.tsx
@@ -1,6 +1,7 @@
import { BooleanLike } from 'common/react';
-import { AnimatedNumber, Box, Button, LabeledList } from '../../components';
+
import { useBackend } from '../../backend';
+import { AnimatedNumber, Box, Button, LabeledList } from '../../components';
type BeakerReagent = {
name: string;
diff --git a/tgui/packages/tgui/interfaces/common/Connections.tsx b/tgui/packages/tgui/interfaces/common/Connections.tsx
index f5f1abca119..e27b48d6735 100644
--- a/tgui/packages/tgui/interfaces/common/Connections.tsx
+++ b/tgui/packages/tgui/interfaces/common/Connections.tsx
@@ -1,5 +1,5 @@
-import { CSS_COLORS } from '../../constants';
import { classes } from '../../../common/react';
+import { CSS_COLORS } from '../../constants';
const SVG_CURVE_INTENSITY = 64;
diff --git a/tgui/packages/tgui/interfaces/common/EditableText.tsx b/tgui/packages/tgui/interfaces/common/EditableText.tsx
index 06e5d31c01a..ab6cf191f1c 100644
--- a/tgui/packages/tgui/interfaces/common/EditableText.tsx
+++ b/tgui/packages/tgui/interfaces/common/EditableText.tsx
@@ -1,5 +1,5 @@
import { useBackend, useLocalState } from 'tgui/backend';
-import { Input, Stack, Box, Button } from 'tgui/components';
+import { Box, Button, Input, Stack } from 'tgui/components';
type Props = {
color?: string;
diff --git a/tgui/packages/tgui/interfaces/common/GasmixParser.tsx b/tgui/packages/tgui/interfaces/common/GasmixParser.tsx
index c31010ff581..bdb00b4b536 100644
--- a/tgui/packages/tgui/interfaces/common/GasmixParser.tsx
+++ b/tgui/packages/tgui/interfaces/common/GasmixParser.tsx
@@ -1,4 +1,4 @@
-import { LabeledList, Box, Button } from '../../components';
+import { Box, Button, LabeledList } from '../../components';
export type Gasmix = {
name?: string;
diff --git a/tgui/packages/tgui/interfaces/common/InputButtons.tsx b/tgui/packages/tgui/interfaces/common/InputButtons.tsx
index 23452685325..aad3d92f081 100644
--- a/tgui/packages/tgui/interfaces/common/InputButtons.tsx
+++ b/tgui/packages/tgui/interfaces/common/InputButtons.tsx
@@ -1,6 +1,5 @@
-import { Box, Button, Flex } from '../../components';
-
import { useBackend } from '../../backend';
+import { Box, Button, Flex } from '../../components';
type InputButtonsData = {
large_buttons: boolean;
diff --git a/tgui/packages/tgui/interfaces/common/Loader.tsx b/tgui/packages/tgui/interfaces/common/Loader.tsx
index 7f758a94ad9..bf0f432d055 100644
--- a/tgui/packages/tgui/interfaces/common/Loader.tsx
+++ b/tgui/packages/tgui/interfaces/common/Loader.tsx
@@ -1,6 +1,7 @@
-import { Box } from '../../components';
import { clamp01 } from 'common/math';
+import { Box } from '../../components';
+
export const Loader = (props) => {
const { value } = props;
diff --git a/tgui/packages/tgui/interfaces/common/LoadingToolbox.tsx b/tgui/packages/tgui/interfaces/common/LoadingToolbox.tsx
index df8cd88418c..fcd30711090 100644
--- a/tgui/packages/tgui/interfaces/common/LoadingToolbox.tsx
+++ b/tgui/packages/tgui/interfaces/common/LoadingToolbox.tsx
@@ -1,4 +1,4 @@
-import { Stack, Icon, Dimmer } from '../../components';
+import { Dimmer, Icon, Stack } from '../../components';
/** Spinner that represents loading states.
*
diff --git a/tgui/packages/tgui/interfaces/common/Objectives.tsx b/tgui/packages/tgui/interfaces/common/Objectives.tsx
index 73fbfe2ccf2..16f89d427c6 100644
--- a/tgui/packages/tgui/interfaces/common/Objectives.tsx
+++ b/tgui/packages/tgui/interfaces/common/Objectives.tsx
@@ -1,5 +1,6 @@
import { BooleanLike } from 'common/react';
import { ReactNode } from 'react';
+
import { useBackend } from '../../backend';
import { Button, Stack } from '../../components';
diff --git a/tgui/packages/tgui/interfaces/common/StatusDisplayControls.tsx b/tgui/packages/tgui/interfaces/common/StatusDisplayControls.tsx
index a9cd0675c96..48bc48e0ad1 100644
--- a/tgui/packages/tgui/interfaces/common/StatusDisplayControls.tsx
+++ b/tgui/packages/tgui/interfaces/common/StatusDisplayControls.tsx
@@ -1,5 +1,5 @@
import { useBackend, useSharedState } from '../../backend';
-import { Flex, Input, Section, Button } from '../../components';
+import { Button, Flex, Input, Section } from '../../components';
type Data = {
upperText: string;
diff --git a/tgui/packages/tgui/layouts/Layout.jsx b/tgui/packages/tgui/layouts/Layout.jsx
index 40c25bfc383..59f7c943b87 100644
--- a/tgui/packages/tgui/layouts/Layout.jsx
+++ b/tgui/packages/tgui/layouts/Layout.jsx
@@ -5,6 +5,7 @@
*/
import { classes } from 'common/react';
+
import { computeBoxClassName, computeBoxProps } from '../components/Box';
import { addScrollableNode, removeScrollableNode } from '../events';
diff --git a/tgui/packages/tgui/layouts/NtosWindow.tsx b/tgui/packages/tgui/layouts/NtosWindow.tsx
index db40f075fe7..0d3b2d5d187 100644
--- a/tgui/packages/tgui/layouts/NtosWindow.tsx
+++ b/tgui/packages/tgui/layouts/NtosWindow.tsx
@@ -5,6 +5,7 @@
*/
import { BooleanLike } from 'common/react';
+
import { resolveAsset } from '../assets';
import { useBackend } from '../backend';
import { Box, Button } from '../components';
diff --git a/tgui/packages/tgui/layouts/Pane.jsx b/tgui/packages/tgui/layouts/Pane.jsx
index b3792312b2c..baad09dd86d 100644
--- a/tgui/packages/tgui/layouts/Pane.jsx
+++ b/tgui/packages/tgui/layouts/Pane.jsx
@@ -5,6 +5,7 @@
*/
import { classes } from 'common/react';
+
import { useBackend } from '../backend';
import { Box } from '../components';
import { Layout } from './Layout';
diff --git a/tgui/packages/tgui/layouts/Window.tsx b/tgui/packages/tgui/layouts/Window.tsx
index dfb74e7343a..2b6fbf87356 100644
--- a/tgui/packages/tgui/layouts/Window.tsx
+++ b/tgui/packages/tgui/layouts/Window.tsx
@@ -6,8 +6,12 @@
import { classes } from 'common/react';
import { decodeHtmlEntities, toTitleCase } from 'common/string';
+import { PropsWithChildren, ReactNode, useEffect } from 'react';
+
import { backendSuspendStart, useBackend } from '../backend';
+import { globalStore } from '../backend';
import { Icon } from '../components';
+import { BoxProps } from '../components/Box';
import { UI_DISABLED, UI_INTERACTIVE, UI_UPDATE } from '../constants';
import { toggleKitchenSink } from '../debug/actions';
import {
@@ -18,9 +22,6 @@ import {
} from '../drag';
import { createLogger } from '../logging';
import { Layout } from './Layout';
-import { globalStore } from '../backend';
-import { PropsWithChildren, ReactNode, useEffect } from 'react';
-import { BoxProps } from '../components/Box';
const logger = createLogger('Window');
diff --git a/tgui/packages/tgui/renderer.ts b/tgui/packages/tgui/renderer.ts
index 1fc9d134236..692b37322da 100644
--- a/tgui/packages/tgui/renderer.ts
+++ b/tgui/packages/tgui/renderer.ts
@@ -1,5 +1,6 @@
import { perf } from 'common/perf';
import { render } from 'react-dom';
+
import { createLogger } from './logging';
const logger = createLogger('renderer');
diff --git a/tgui/packages/tgui/routes.tsx b/tgui/packages/tgui/routes.tsx
index d02ba8210e3..b843da88799 100644
--- a/tgui/packages/tgui/routes.tsx
+++ b/tgui/packages/tgui/routes.tsx
@@ -4,9 +4,9 @@
* @license MIT
*/
-import { Window } from './layouts';
import { useBackend } from './backend';
import { LoadingScreen } from './interfaces/common/LoadingToolbox';
+import { Window } from './layouts';
const requireInterface = require.context('./interfaces');
diff --git a/tgui/packages/tgui/store.ts b/tgui/packages/tgui/store.ts
index 5a29e8022a6..19483315666 100644
--- a/tgui/packages/tgui/store.ts
+++ b/tgui/packages/tgui/store.ts
@@ -4,20 +4,20 @@
* @license MIT
*/
+import { flow } from 'common/fp';
import {
- Middleware,
- Reducer,
- Store,
applyMiddleware,
combineReducers,
createStore,
+ Middleware,
+ Reducer,
+ Store,
} from 'common/redux';
-import { backendMiddleware, backendReducer } from './backend';
-import { debugMiddleware, debugReducer, relayMiddleware } from './debug';
import { assetMiddleware } from './assets';
+import { backendMiddleware, backendReducer } from './backend';
+import { debugMiddleware, debugReducer, relayMiddleware } from './debug';
import { createLogger } from './logging';
-import { flow } from 'common/fp';
type ConfigureStoreOptions = {
sideEffects?: boolean;
diff --git a/tgui/packages/tgui/stories/Storage.stories.jsx b/tgui/packages/tgui/stories/Storage.stories.jsx
index 78c3893739f..2fb115bf453 100644
--- a/tgui/packages/tgui/stories/Storage.stories.jsx
+++ b/tgui/packages/tgui/stories/Storage.stories.jsx
@@ -5,6 +5,7 @@
*/
import { storage } from 'common/storage';
+
import { Button, LabeledList, NoticeBox, Section } from '../components';
import { formatSiUnit } from '../format';
diff --git a/tgui/yarn.lock b/tgui/yarn.lock
index 49f5a5ebf5d..06461a0daaa 100644
--- a/tgui/yarn.lock
+++ b/tgui/yarn.lock
@@ -5,6 +5,13 @@ __metadata:
version: 6
cacheKey: 8
+"@aashutoshrathi/word-wrap@npm:^1.2.3":
+ version: 1.2.6
+ resolution: "@aashutoshrathi/word-wrap@npm:1.2.6"
+ checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd
+ languageName: node
+ linkType: hard
+
"@ampproject/remapping@npm:^2.2.0":
version: 2.2.1
resolution: "@ampproject/remapping@npm:2.2.1"
@@ -15,15 +22,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/code-frame@npm:7.12.11":
- version: 7.12.11
- resolution: "@babel/code-frame@npm:7.12.11"
- dependencies:
- "@babel/highlight": ^7.10.4
- checksum: 3963eff3ebfb0e091c7e6f99596ef4b258683e4ba8a134e4e95f77afe85be5c931e184fff6435fb4885d12eba04a5e25532f7fbc292ca13b48e7da943474e2f3
- languageName: node
- linkType: hard
-
"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.14.5":
version: 7.16.7
resolution: "@babel/code-frame@npm:7.16.7"
@@ -230,7 +228,7 @@ __metadata:
languageName: node
linkType: hard
-"@babel/highlight@npm:^7.10.4, @babel/highlight@npm:^7.16.7":
+"@babel/highlight@npm:^7.16.7":
version: 7.17.12
resolution: "@babel/highlight@npm:7.17.12"
dependencies:
@@ -660,20 +658,45 @@ __metadata:
languageName: node
linkType: hard
-"@eslint/eslintrc@npm:^0.4.3":
- version: 0.4.3
- resolution: "@eslint/eslintrc@npm:0.4.3"
+"@eslint-community/eslint-utils@npm:^4.2.0":
+ version: 4.4.0
+ resolution: "@eslint-community/eslint-utils@npm:4.4.0"
+ dependencies:
+ eslint-visitor-keys: ^3.3.0
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22
+ languageName: node
+ linkType: hard
+
+"@eslint-community/regexpp@npm:^4.6.1":
+ version: 4.10.0
+ resolution: "@eslint-community/regexpp@npm:4.10.0"
+ checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b
+ languageName: node
+ linkType: hard
+
+"@eslint/eslintrc@npm:^2.1.4":
+ version: 2.1.4
+ resolution: "@eslint/eslintrc@npm:2.1.4"
dependencies:
ajv: ^6.12.4
- debug: ^4.1.1
- espree: ^7.3.0
- globals: ^13.9.0
- ignore: ^4.0.6
+ debug: ^4.3.2
+ espree: ^9.6.0
+ globals: ^13.19.0
+ ignore: ^5.2.0
import-fresh: ^3.2.1
- js-yaml: ^3.13.1
- minimatch: ^3.0.4
+ js-yaml: ^4.1.0
+ minimatch: ^3.1.2
strip-json-comments: ^3.1.1
- checksum: 03a7704150b868c318aab6a94d87a33d30dc2ec579d27374575014f06237ba1370ae11178db772f985ef680d469dc237e7b16a1c5d8edaaeb8c3733e7a95a6d3
+ checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127
+ languageName: node
+ linkType: hard
+
+"@eslint/js@npm:8.56.0":
+ version: 8.56.0
+ resolution: "@eslint/js@npm:8.56.0"
+ checksum: 5804130574ef810207bdf321c265437814e7a26f4e6fac9b496de3206afd52f533e09ec002a3be06cd9adcc9da63e727f1883938e663c4e4751c007d5b58e539
languageName: node
linkType: hard
@@ -727,21 +750,28 @@ __metadata:
languageName: node
linkType: hard
-"@humanwhocodes/config-array@npm:^0.5.0":
- version: 0.5.0
- resolution: "@humanwhocodes/config-array@npm:0.5.0"
+"@humanwhocodes/config-array@npm:^0.11.13":
+ version: 0.11.13
+ resolution: "@humanwhocodes/config-array@npm:0.11.13"
dependencies:
- "@humanwhocodes/object-schema": ^1.2.0
+ "@humanwhocodes/object-schema": ^2.0.1
debug: ^4.1.1
- minimatch: ^3.0.4
- checksum: 44ee6a9f05d93dd9d5935a006b17572328ba9caff8002442f601736cbda79c580cc0f5a49ce9eb88fbacc5c3a6b62098357c2e95326cd17bb9f1a6c61d6e95e7
+ minimatch: ^3.0.5
+ checksum: f8ea57b0d7ed7f2d64cd3944654976829d9da91c04d9c860e18804729a33f7681f78166ef4c761850b8c324d362f7d53f14c5c44907a6b38b32c703ff85e4805
languageName: node
linkType: hard
-"@humanwhocodes/object-schema@npm:^1.2.0":
- version: 1.2.0
- resolution: "@humanwhocodes/object-schema@npm:1.2.0"
- checksum: 40b75480376de8104d65f7c44a7dd76d30fb57823ca8ba3a3239b2b568323be894d93440578a72fd8e5e2cc3df3577ce0d2f0fe308b990dd51cf35392bf3c9a2
+"@humanwhocodes/module-importer@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "@humanwhocodes/module-importer@npm:1.0.1"
+ checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61
+ languageName: node
+ linkType: hard
+
+"@humanwhocodes/object-schema@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "@humanwhocodes/object-schema@npm:2.0.1"
+ checksum: 24929487b1ed48795d2f08346a0116cc5ee4634848bce64161fb947109352c562310fd159fc64dda0e8b853307f5794605191a9547f7341158559ca3c8262a45
languageName: node
linkType: hard
@@ -1163,6 +1193,16 @@ __metadata:
languageName: node
linkType: hard
+"@nodelib/fs.scandir@npm:2.1.5":
+ version: 2.1.5
+ resolution: "@nodelib/fs.scandir@npm:2.1.5"
+ dependencies:
+ "@nodelib/fs.stat": 2.0.5
+ run-parallel: ^1.1.9
+ checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59
+ languageName: node
+ linkType: hard
+
"@nodelib/fs.stat@npm:2.0.4, @nodelib/fs.stat@npm:^2.0.2":
version: 2.0.4
resolution: "@nodelib/fs.stat@npm:2.0.4"
@@ -1170,6 +1210,13 @@ __metadata:
languageName: node
linkType: hard
+"@nodelib/fs.stat@npm:2.0.5":
+ version: 2.0.5
+ resolution: "@nodelib/fs.stat@npm:2.0.5"
+ checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0
+ languageName: node
+ linkType: hard
+
"@nodelib/fs.walk@npm:^1.2.3":
version: 1.2.6
resolution: "@nodelib/fs.walk@npm:1.2.6"
@@ -1180,6 +1227,16 @@ __metadata:
languageName: node
linkType: hard
+"@nodelib/fs.walk@npm:^1.2.8":
+ version: 1.2.8
+ resolution: "@nodelib/fs.walk@npm:1.2.8"
+ dependencies:
+ "@nodelib/fs.scandir": 2.1.5
+ fastq: ^1.6.0
+ checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53
+ languageName: node
+ linkType: hard
+
"@npmcli/move-file@npm:^1.0.1":
version: 1.1.2
resolution: "@npmcli/move-file@npm:1.1.2"
@@ -1660,65 +1717,73 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/parser@npm:^5.62.0":
- version: 5.62.0
- resolution: "@typescript-eslint/parser@npm:5.62.0"
+"@typescript-eslint/parser@npm:^6.14.0":
+ version: 6.14.0
+ resolution: "@typescript-eslint/parser@npm:6.14.0"
dependencies:
- "@typescript-eslint/scope-manager": 5.62.0
- "@typescript-eslint/types": 5.62.0
- "@typescript-eslint/typescript-estree": 5.62.0
+ "@typescript-eslint/scope-manager": 6.14.0
+ "@typescript-eslint/types": 6.14.0
+ "@typescript-eslint/typescript-estree": 6.14.0
+ "@typescript-eslint/visitor-keys": 6.14.0
debug: ^4.3.4
peerDependencies:
- eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ eslint: ^7.0.0 || ^8.0.0
peerDependenciesMeta:
typescript:
optional: true
- checksum: d168f4c7f21a7a63f47002e2d319bcbb6173597af5c60c1cf2de046b46c76b4930a093619e69faf2d30214c29ab27b54dcf1efc7046a6a6bd6f37f59a990e752
+ checksum: 5fbe8d7431654c14ba6c9782d3728026ad5c90e02c9c4319f45df972e653cf5c15ba320dce70cdffa9fb7ce4c4263c37585e7bc1c909d1252d0a599880963063
languageName: node
linkType: hard
-"@typescript-eslint/scope-manager@npm:5.62.0":
- version: 5.62.0
- resolution: "@typescript-eslint/scope-manager@npm:5.62.0"
+"@typescript-eslint/scope-manager@npm:6.14.0":
+ version: 6.14.0
+ resolution: "@typescript-eslint/scope-manager@npm:6.14.0"
dependencies:
- "@typescript-eslint/types": 5.62.0
- "@typescript-eslint/visitor-keys": 5.62.0
- checksum: 6062d6b797fe1ce4d275bb0d17204c827494af59b5eaf09d8a78cdd39dadddb31074dded4297aaf5d0f839016d601032857698b0e4516c86a41207de606e9573
+ "@typescript-eslint/types": 6.14.0
+ "@typescript-eslint/visitor-keys": 6.14.0
+ checksum: 0b577d42db925426a9838fe61703c226e18b697374fbe20cf9b93ba30fe58bf4a7f7f42491a4d24b7f3cc12d9a189fe3524c0e9b7708727e710d95b908250a14
languageName: node
linkType: hard
-"@typescript-eslint/types@npm:5.62.0":
- version: 5.62.0
- resolution: "@typescript-eslint/types@npm:5.62.0"
- checksum: 48c87117383d1864766486f24de34086155532b070f6264e09d0e6139449270f8a9559cfef3c56d16e3bcfb52d83d42105d61b36743626399c7c2b5e0ac3b670
+"@typescript-eslint/types@npm:6.14.0":
+ version: 6.14.0
+ resolution: "@typescript-eslint/types@npm:6.14.0"
+ checksum: 624e6c5227f596dcc9757348d09c5a09b846a62938b8b4409614cf8108013b64ed8b270c32e87ea8890dd09ed896b82e92872c3574dbf07dcda11a168d69dd1f
languageName: node
linkType: hard
-"@typescript-eslint/typescript-estree@npm:5.62.0":
- version: 5.62.0
- resolution: "@typescript-eslint/typescript-estree@npm:5.62.0"
+"@typescript-eslint/typescript-estree@npm:6.14.0":
+ version: 6.14.0
+ resolution: "@typescript-eslint/typescript-estree@npm:6.14.0"
dependencies:
- "@typescript-eslint/types": 5.62.0
- "@typescript-eslint/visitor-keys": 5.62.0
+ "@typescript-eslint/types": 6.14.0
+ "@typescript-eslint/visitor-keys": 6.14.0
debug: ^4.3.4
globby: ^11.1.0
is-glob: ^4.0.3
- semver: ^7.3.7
- tsutils: ^3.21.0
+ semver: ^7.5.4
+ ts-api-utils: ^1.0.1
peerDependenciesMeta:
typescript:
optional: true
- checksum: 3624520abb5807ed8f57b1197e61c7b1ed770c56dfcaca66372d584ff50175225798bccb701f7ef129d62c5989070e1ee3a0aa2d84e56d9524dcf011a2bb1a52
+ checksum: 495d7616463685bfd8138ffa9fbc0a7f9130ff8a3f6f85775960b4f0a3fdc259ae53b104cdfe562b60310860b5a6c8387307790734555084aa087e3bb9c28a69
languageName: node
linkType: hard
-"@typescript-eslint/visitor-keys@npm:5.62.0":
- version: 5.62.0
- resolution: "@typescript-eslint/visitor-keys@npm:5.62.0"
+"@typescript-eslint/visitor-keys@npm:6.14.0":
+ version: 6.14.0
+ resolution: "@typescript-eslint/visitor-keys@npm:6.14.0"
dependencies:
- "@typescript-eslint/types": 5.62.0
- eslint-visitor-keys: ^3.3.0
- checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35
+ "@typescript-eslint/types": 6.14.0
+ eslint-visitor-keys: ^3.4.1
+ checksum: fc593c4e94d5739be7bd88e42313a301bc9806fad758b6a0a1bafd296ff41522be602caf4976beec84e363b0f56585bb98df3c157f70de984de721798501fd8a
+ languageName: node
+ linkType: hard
+
+"@ungap/structured-clone@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "@ungap/structured-clone@npm:1.2.0"
+ checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524
languageName: node
linkType: hard
@@ -2120,12 +2185,12 @@ __metadata:
languageName: node
linkType: hard
-"acorn-jsx@npm:^5.3.1":
- version: 5.3.1
- resolution: "acorn-jsx@npm:5.3.1"
+"acorn-jsx@npm:^5.3.2":
+ version: 5.3.2
+ resolution: "acorn-jsx@npm:5.3.2"
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- checksum: daf441a9d7b59c0ea1f7fe2934c48aca604a007455129ce35fa62ec3d4c8363e2efc2d4da636d18ce0049979260ba07d8b42bc002ae95182916d2c90901529c2
+ checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950
languageName: node
linkType: hard
@@ -2143,15 +2208,6 @@ __metadata:
languageName: node
linkType: hard
-"acorn@npm:^7.4.0":
- version: 7.4.1
- resolution: "acorn@npm:7.4.1"
- bin:
- acorn: bin/acorn
- checksum: 1860f23c2107c910c6177b7b7be71be350db9e1080d814493fae143ae37605189504152d1ba8743ba3178d0b37269ce1ffc42b101547fdc1827078f82671e407
- languageName: node
- linkType: hard
-
"acorn@npm:^8.0.4, acorn@npm:^8.5.0, acorn@npm:^8.7.1":
version: 8.8.2
resolution: "acorn@npm:8.8.2"
@@ -2161,7 +2217,7 @@ __metadata:
languageName: node
linkType: hard
-"acorn@npm:^8.1.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2":
+"acorn@npm:^8.1.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0":
version: 8.11.2
resolution: "acorn@npm:8.11.2"
bin:
@@ -2234,7 +2290,7 @@ __metadata:
languageName: node
linkType: hard
-"ajv@npm:^6.10.0, ajv@npm:^6.11.0, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:^6.12.6":
+"ajv@npm:^6.11.0, ajv@npm:^6.12.3, ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:^6.12.6":
version: 6.12.6
resolution: "ajv@npm:6.12.6"
dependencies:
@@ -2258,25 +2314,6 @@ __metadata:
languageName: node
linkType: hard
-"ajv@npm:^8.0.1":
- version: 8.6.2
- resolution: "ajv@npm:8.6.2"
- dependencies:
- fast-deep-equal: ^3.1.1
- json-schema-traverse: ^1.0.0
- require-from-string: ^2.0.2
- uri-js: ^4.2.2
- checksum: b86d6cb86c69abbd8ce71ab7d4ff272660bf6d34fa9fbe770f73e54da59d531b2546692e36e2b35bbcfb11d20db774b4c09189671335185b8c799d65194e5169
- languageName: node
- linkType: hard
-
-"ansi-colors@npm:^4.1.1":
- version: 4.1.1
- resolution: "ansi-colors@npm:4.1.1"
- checksum: 138d04a51076cb085da0a7e2d000c5c0bb09f6e772ed5c65c53cb118d37f6c5f1637506d7155fb5f330f0abcf6f12fa2e489ac3f8cdab9da393bf1bb4f9a32b0
- languageName: node
- linkType: hard
-
"ansi-escapes@npm:^4.2.1":
version: 4.3.1
resolution: "ansi-escapes@npm:4.3.1"
@@ -2488,13 +2525,6 @@ __metadata:
languageName: node
linkType: hard
-"astral-regex@npm:^2.0.0":
- version: 2.0.0
- resolution: "astral-regex@npm:2.0.0"
- checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766
- languageName: node
- linkType: hard
-
"asynciterator.prototype@npm:^1.0.0":
version: 1.0.0
resolution: "asynciterator.prototype@npm:1.0.0"
@@ -3329,7 +3359,7 @@ __metadata:
languageName: node
linkType: hard
-"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.0.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.4":
+"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.4":
version: 4.3.4
resolution: "debug@npm:4.3.4"
dependencies:
@@ -3588,15 +3618,6 @@ __metadata:
languageName: node
linkType: hard
-"enquirer@npm:^2.3.5":
- version: 2.3.6
- resolution: "enquirer@npm:2.3.6"
- dependencies:
- ansi-colors: ^4.1.1
- checksum: 1c0911e14a6f8d26721c91e01db06092a5f7675159f0261d69c403396a385afd13dd76825e7678f66daffa930cfaa8d45f506fb35f818a2788463d022af1b884
- languageName: node
- linkType: hard
-
"entities@npm:^4.4.0":
version: 4.4.0
resolution: "entities@npm:4.4.0"
@@ -3963,14 +3984,14 @@ __metadata:
languageName: node
linkType: hard
-"eslint-config-prettier@npm:^9.0.0":
- version: 9.0.0
- resolution: "eslint-config-prettier@npm:9.0.0"
+"eslint-config-prettier@npm:^9.1.0":
+ version: 9.1.0
+ resolution: "eslint-config-prettier@npm:9.1.0"
peerDependencies:
eslint: ">=7.0.0"
bin:
eslint-config-prettier: bin/cli.js
- checksum: 362e991b6cb343f79362bada2d97c202e5303e6865888918a7445c555fb75e4c078b01278e90be98aa98ae22f8597d8e93d48314bec6824f540f7efcab3ce451
+ checksum: 9229b768c879f500ee54ca05925f31b0c0bafff3d9f5521f98ff05127356de78c81deb9365c86a5ec4efa990cb72b74df8612ae15965b14136044c73e1f6a907
languageName: node
linkType: hard
@@ -4009,18 +4030,27 @@ __metadata:
languageName: node
linkType: hard
-"eslint-plugin-unused-imports@npm:^1.1.5":
- version: 1.1.5
- resolution: "eslint-plugin-unused-imports@npm:1.1.5"
+"eslint-plugin-simple-import-sort@npm:^10.0.0":
+ version: 10.0.0
+ resolution: "eslint-plugin-simple-import-sort@npm:10.0.0"
+ peerDependencies:
+ eslint: ">=5.0.0"
+ checksum: 23221ff63f80f9c52da807d388ee8a51bc36a3b73345f60ec886e7973c28d75eb1d1e47f7f2916a7c1f94a1b5037b1450356a64a8fbd58096fd6bee57c6e3e48
+ languageName: node
+ linkType: hard
+
+"eslint-plugin-unused-imports@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "eslint-plugin-unused-imports@npm:3.0.0"
dependencies:
eslint-rule-composer: ^0.3.0
peerDependencies:
- "@typescript-eslint/eslint-plugin": ^4.14.2
- eslint: ^6.0.0 || ^7.0.0
+ "@typescript-eslint/eslint-plugin": ^6.0.0
+ eslint: ^8.0.0
peerDependenciesMeta:
"@typescript-eslint/eslint-plugin":
optional: true
- checksum: fd1ef93fd414240594ea2f78cd7334523c244af12a610442c6dbf78b0058915c363ce78032730962f510fdd2792ded0607bc13adea9a724d1c5cec736704c99d
+ checksum: 51666f62cc8dccba2895ced83f3c1e0b78b68c357e17360e156c4db548bfdeda34cbd8725192fb4903f22d5069400fb22ded6039631df01ee82fd618dc307247
languageName: node
linkType: hard
@@ -4031,7 +4061,7 @@ __metadata:
languageName: node
linkType: hard
-"eslint-scope@npm:5.1.1, eslint-scope@npm:^5.1.1":
+"eslint-scope@npm:5.1.1":
version: 5.1.1
resolution: "eslint-scope@npm:5.1.1"
dependencies:
@@ -4041,94 +4071,79 @@ __metadata:
languageName: node
linkType: hard
-"eslint-utils@npm:^2.1.0":
- version: 2.1.0
- resolution: "eslint-utils@npm:2.1.0"
+"eslint-scope@npm:^7.2.2":
+ version: 7.2.2
+ resolution: "eslint-scope@npm:7.2.2"
dependencies:
- eslint-visitor-keys: ^1.1.0
- checksum: 27500938f348da42100d9e6ad03ae29b3de19ba757ae1a7f4a087bdcf83ac60949bbb54286492ca61fac1f5f3ac8692dd21537ce6214240bf95ad0122f24d71d
+ esrecurse: ^4.3.0
+ estraverse: ^5.2.0
+ checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e
languageName: node
linkType: hard
-"eslint-visitor-keys@npm:^1.1.0, eslint-visitor-keys@npm:^1.3.0":
- version: 1.3.0
- resolution: "eslint-visitor-keys@npm:1.3.0"
- checksum: 37a19b712f42f4c9027e8ba98c2b06031c17e0c0a4c696cd429bd9ee04eb43889c446f2cd545e1ff51bef9593fcec94ecd2c2ef89129fcbbf3adadbef520376a
- languageName: node
- linkType: hard
-
-"eslint-visitor-keys@npm:^2.0.0":
- version: 2.1.0
- resolution: "eslint-visitor-keys@npm:2.1.0"
- checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d
- languageName: node
- linkType: hard
-
-"eslint-visitor-keys@npm:^3.3.0":
+"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3":
version: 3.4.3
resolution: "eslint-visitor-keys@npm:3.4.3"
checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60
languageName: node
linkType: hard
-"eslint@npm:^7.32.0":
- version: 7.32.0
- resolution: "eslint@npm:7.32.0"
+"eslint@npm:^8.56.0":
+ version: 8.56.0
+ resolution: "eslint@npm:8.56.0"
dependencies:
- "@babel/code-frame": 7.12.11
- "@eslint/eslintrc": ^0.4.3
- "@humanwhocodes/config-array": ^0.5.0
- ajv: ^6.10.0
+ "@eslint-community/eslint-utils": ^4.2.0
+ "@eslint-community/regexpp": ^4.6.1
+ "@eslint/eslintrc": ^2.1.4
+ "@eslint/js": 8.56.0
+ "@humanwhocodes/config-array": ^0.11.13
+ "@humanwhocodes/module-importer": ^1.0.1
+ "@nodelib/fs.walk": ^1.2.8
+ "@ungap/structured-clone": ^1.2.0
+ ajv: ^6.12.4
chalk: ^4.0.0
cross-spawn: ^7.0.2
- debug: ^4.0.1
+ debug: ^4.3.2
doctrine: ^3.0.0
- enquirer: ^2.3.5
escape-string-regexp: ^4.0.0
- eslint-scope: ^5.1.1
- eslint-utils: ^2.1.0
- eslint-visitor-keys: ^2.0.0
- espree: ^7.3.1
- esquery: ^1.4.0
+ eslint-scope: ^7.2.2
+ eslint-visitor-keys: ^3.4.3
+ espree: ^9.6.1
+ esquery: ^1.4.2
esutils: ^2.0.2
fast-deep-equal: ^3.1.3
file-entry-cache: ^6.0.1
- functional-red-black-tree: ^1.0.1
- glob-parent: ^5.1.2
- globals: ^13.6.0
- ignore: ^4.0.6
- import-fresh: ^3.0.0
+ find-up: ^5.0.0
+ glob-parent: ^6.0.2
+ globals: ^13.19.0
+ graphemer: ^1.4.0
+ ignore: ^5.2.0
imurmurhash: ^0.1.4
is-glob: ^4.0.0
- js-yaml: ^3.13.1
+ is-path-inside: ^3.0.3
+ js-yaml: ^4.1.0
json-stable-stringify-without-jsonify: ^1.0.1
levn: ^0.4.1
lodash.merge: ^4.6.2
- minimatch: ^3.0.4
+ minimatch: ^3.1.2
natural-compare: ^1.4.0
- optionator: ^0.9.1
- progress: ^2.0.0
- regexpp: ^3.1.0
- semver: ^7.2.1
- strip-ansi: ^6.0.0
- strip-json-comments: ^3.1.0
- table: ^6.0.9
+ optionator: ^0.9.3
+ strip-ansi: ^6.0.1
text-table: ^0.2.0
- v8-compile-cache: ^2.0.3
bin:
eslint: bin/eslint.js
- checksum: cc85af9985a3a11085c011f3d27abe8111006d34cc274291b3c4d7bea51a4e2ff6135780249becd919ba7f6d6d1ecc38a6b73dacb6a7be08d38453b344dc8d37
+ checksum: 883436d1e809b4a25d9eb03d42f584b84c408dbac28b0019f6ea07b5177940bf3cca86208f749a6a1e0039b63e085ee47aca1236c30721e91f0deef5cc5a5136
languageName: node
linkType: hard
-"espree@npm:^7.3.0, espree@npm:^7.3.1":
- version: 7.3.1
- resolution: "espree@npm:7.3.1"
+"espree@npm:^9.6.0, espree@npm:^9.6.1":
+ version: 9.6.1
+ resolution: "espree@npm:9.6.1"
dependencies:
- acorn: ^7.4.0
- acorn-jsx: ^5.3.1
- eslint-visitor-keys: ^1.3.0
- checksum: aa9b50dcce883449af2e23bc2b8d9abb77118f96f4cb313935d6b220f77137eaef7724a83c3f6243b96bc0e4ab14766198e60818caad99f9519ae5a336a39b45
+ acorn: ^8.9.0
+ acorn-jsx: ^5.3.2
+ eslint-visitor-keys: ^3.4.1
+ checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9
languageName: node
linkType: hard
@@ -4142,12 +4157,12 @@ __metadata:
languageName: node
linkType: hard
-"esquery@npm:^1.4.0":
- version: 1.4.0
- resolution: "esquery@npm:1.4.0"
+"esquery@npm:^1.4.2":
+ version: 1.5.0
+ resolution: "esquery@npm:1.5.0"
dependencies:
estraverse: ^5.1.0
- checksum: a0807e17abd7fbe5fbd4fab673038d6d8a50675cdae6b04fbaa520c34581be0c5fa24582990e8acd8854f671dd291c78bb2efb9e0ed5b62f33bac4f9cf820210
+ checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900
languageName: node
linkType: hard
@@ -4495,6 +4510,16 @@ __metadata:
languageName: node
linkType: hard
+"find-up@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "find-up@npm:5.0.0"
+ dependencies:
+ locate-path: ^6.0.0
+ path-exists: ^4.0.0
+ checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095
+ languageName: node
+ linkType: hard
+
"flat-cache@npm:^3.0.4":
version: 3.0.4
resolution: "flat-cache@npm:3.0.4"
@@ -4635,13 +4660,6 @@ __metadata:
languageName: node
linkType: hard
-"functional-red-black-tree@npm:^1.0.1":
- version: 1.0.1
- resolution: "functional-red-black-tree@npm:1.0.1"
- checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f
- languageName: node
- linkType: hard
-
"functions-have-names@npm:^1.2.3":
version: 1.2.3
resolution: "functions-have-names@npm:1.2.3"
@@ -4760,6 +4778,15 @@ __metadata:
languageName: node
linkType: hard
+"glob-parent@npm:^6.0.2":
+ version: 6.0.2
+ resolution: "glob-parent@npm:6.0.2"
+ dependencies:
+ is-glob: ^4.0.3
+ checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8
+ languageName: node
+ linkType: hard
+
"glob-to-regexp@npm:^0.4.1":
version: 0.4.1
resolution: "glob-to-regexp@npm:0.4.1"
@@ -4815,12 +4842,12 @@ __metadata:
languageName: node
linkType: hard
-"globals@npm:^13.6.0, globals@npm:^13.9.0":
- version: 13.10.0
- resolution: "globals@npm:13.10.0"
+"globals@npm:^13.19.0":
+ version: 13.24.0
+ resolution: "globals@npm:13.24.0"
dependencies:
type-fest: ^0.20.2
- checksum: 64e45d96d634d2b047385eb5925de3abb5964cf4f3564eba493694f5ab1a8818b333f89d34b0f71f9b1d87391e6e25c5ca1a87094dd80a657d1d99b9321e1f4e
+ checksum: 56066ef058f6867c04ff203b8a44c15b038346a62efbc3060052a1016be9f56f4cf0b2cd45b74b22b81e521a889fc7786c73691b0549c2f3a6e825b3d394f43c
languageName: node
linkType: hard
@@ -4863,6 +4890,13 @@ __metadata:
languageName: node
linkType: hard
+"graphemer@npm:^1.4.0":
+ version: 1.4.0
+ resolution: "graphemer@npm:1.4.0"
+ checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673
+ languageName: node
+ linkType: hard
+
"gzip-size@npm:^6.0.0":
version: 6.0.0
resolution: "gzip-size@npm:6.0.0"
@@ -5139,13 +5173,6 @@ __metadata:
languageName: node
linkType: hard
-"ignore@npm:^4.0.6":
- version: 4.0.6
- resolution: "ignore@npm:4.0.6"
- checksum: 248f82e50a430906f9ee7f35e1158e3ec4c3971451dd9f99c9bc1548261b4db2b99709f60ac6c6cac9333494384176cc4cc9b07acbe42d52ac6a09cad734d800
- languageName: node
- linkType: hard
-
"ignore@npm:^5.2.0":
version: 5.2.4
resolution: "ignore@npm:5.2.4"
@@ -5160,7 +5187,7 @@ __metadata:
languageName: node
linkType: hard
-"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1":
+"import-fresh@npm:^3.2.1":
version: 3.3.0
resolution: "import-fresh@npm:3.3.0"
dependencies:
@@ -5481,6 +5508,13 @@ __metadata:
languageName: node
linkType: hard
+"is-path-inside@npm:^3.0.3":
+ version: 3.0.3
+ resolution: "is-path-inside@npm:3.0.3"
+ checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9
+ languageName: node
+ linkType: hard
+
"is-plain-object@npm:^2.0.4":
version: 2.0.4
resolution: "is-plain-object@npm:2.0.4"
@@ -6564,10 +6598,12 @@ __metadata:
languageName: node
linkType: hard
-"lodash.clonedeep@npm:^4.5.0":
- version: 4.5.0
- resolution: "lodash.clonedeep@npm:4.5.0"
- checksum: 92c46f094b064e876a23c97f57f81fbffd5d760bf2d8a1c61d85db6d1e488c66b0384c943abee4f6af7debf5ad4e4282e74ff83177c9e63d8ff081a4837c3489
+"locate-path@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "locate-path@npm:6.0.0"
+ dependencies:
+ p-locate: ^5.0.0
+ checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a
languageName: node
linkType: hard
@@ -6578,13 +6614,6 @@ __metadata:
languageName: node
linkType: hard
-"lodash.truncate@npm:^4.4.2":
- version: 4.4.2
- resolution: "lodash.truncate@npm:4.4.2"
- checksum: b463d8a382cfb5f0e71c504dcb6f807a7bd379ff1ea216669aa42c52fc28c54e404bfbd96791aa09e6df0de2c1d7b8f1b7f4b1a61f324d38fe98bc535aeee4f5
- languageName: node
- linkType: hard
-
"lodash@npm:^4.17.10, lodash@npm:^4.17.21":
version: 4.17.21
resolution: "lodash@npm:4.17.21"
@@ -6779,7 +6808,16 @@ __metadata:
languageName: node
linkType: hard
-"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2":
+"minimatch@npm:^3.0.4":
+ version: 3.0.4
+ resolution: "minimatch@npm:3.0.4"
+ dependencies:
+ brace-expansion: ^1.1.7
+ checksum: 66ac295f8a7b59788000ea3749938b0970344c841750abd96694f80269b926ebcafad3deeb3f1da2522978b119e6ae3a5869b63b13a7859a456b3408bd18a078
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2":
version: 3.1.2
resolution: "minimatch@npm:3.1.2"
dependencies:
@@ -7212,17 +7250,17 @@ __metadata:
languageName: node
linkType: hard
-"optionator@npm:^0.9.1":
- version: 0.9.1
- resolution: "optionator@npm:0.9.1"
+"optionator@npm:^0.9.3":
+ version: 0.9.3
+ resolution: "optionator@npm:0.9.3"
dependencies:
+ "@aashutoshrathi/word-wrap": ^1.2.3
deep-is: ^0.1.3
fast-levenshtein: ^2.0.6
levn: ^0.4.1
prelude-ls: ^1.2.1
type-check: ^0.4.0
- word-wrap: ^1.2.3
- checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0
+ checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a
languageName: node
linkType: hard
@@ -7235,7 +7273,7 @@ __metadata:
languageName: node
linkType: hard
-"p-limit@npm:^3.1.0":
+"p-limit@npm:^3.0.2, p-limit@npm:^3.1.0":
version: 3.1.0
resolution: "p-limit@npm:3.1.0"
dependencies:
@@ -7253,6 +7291,15 @@ __metadata:
languageName: node
linkType: hard
+"p-locate@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "p-locate@npm:5.0.0"
+ dependencies:
+ p-limit: ^3.0.2
+ checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3
+ languageName: node
+ linkType: hard
+
"p-map@npm:^4.0.0":
version: 4.0.0
resolution: "p-map@npm:4.0.0"
@@ -7572,13 +7619,6 @@ __metadata:
languageName: node
linkType: hard
-"progress@npm:^2.0.0":
- version: 2.0.3
- resolution: "progress@npm:2.0.3"
- checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7
- languageName: node
- linkType: hard
-
"promise-inflight@npm:^1.0.1":
version: 1.0.1
resolution: "promise-inflight@npm:1.0.1"
@@ -7822,13 +7862,6 @@ __metadata:
languageName: node
linkType: hard
-"regexpp@npm:^3.1.0":
- version: 3.1.0
- resolution: "regexpp@npm:3.1.0"
- checksum: 63bcb2c98d63274774c79bef256e03f716d25f1fa8427267d0302d1436a83fa0d905f4e8a172fdfa99fb4d84833df2fb3bf7da2a1a868f156e913174c32b1139
- languageName: node
- linkType: hard
-
"request@npm:^2.88.2":
version: 2.88.2
resolution: "request@npm:2.88.2"
@@ -8197,7 +8230,7 @@ resolve@^1.20.0:
languageName: node
linkType: hard
-"semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5":
+"semver@npm:^7.3.2, semver@npm:^7.3.5":
version: 7.3.8
resolution: "semver@npm:7.3.8"
dependencies:
@@ -8208,7 +8241,7 @@ resolve@^1.20.0:
languageName: node
linkType: hard
-"semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4":
+"semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4":
version: 7.5.4
resolution: "semver@npm:7.5.4"
dependencies:
@@ -8367,17 +8400,6 @@ resolve@^1.20.0:
languageName: node
linkType: hard
-"slice-ansi@npm:^4.0.0":
- version: 4.0.0
- resolution: "slice-ansi@npm:4.0.0"
- dependencies:
- ansi-styles: ^4.0.0
- astral-regex: ^2.0.0
- is-fullwidth-code-point: ^3.0.0
- checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756
- languageName: node
- linkType: hard
-
"slugify@npm:^1.5.3":
version: 1.6.0
resolution: "slugify@npm:1.6.0"
@@ -8769,7 +8791,7 @@ resolve@^1.20.0:
languageName: node
linkType: hard
-"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1":
+"strip-json-comments@npm:^3.1.1":
version: 3.1.1
resolution: "strip-json-comments@npm:3.1.1"
checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443
@@ -8886,20 +8908,6 @@ resolve@^1.20.0:
languageName: node
linkType: hard
-"table@npm:^6.0.9":
- version: 6.7.1
- resolution: "table@npm:6.7.1"
- dependencies:
- ajv: ^8.0.1
- lodash.clonedeep: ^4.5.0
- lodash.truncate: ^4.4.2
- slice-ansi: ^4.0.0
- string-width: ^4.2.0
- strip-ansi: ^6.0.0
- checksum: 053b61fa4e8f8396c65ff7a95da90e85620370932652d501ff7a0a3ed7317f1cc549702bd2abf2bd9ed01e20757b73a8b57374f8a8a2ac02fbe0550276263fb6
- languageName: node
- linkType: hard
-
"tapable@npm:^2.1.1, tapable@npm:^2.2.0":
version: 2.2.0
resolution: "tapable@npm:2.2.0"
@@ -9089,14 +9097,15 @@ resolve@^1.20.0:
"@types/node": ^14.x
"@types/webpack": ^5.28.5
"@types/webpack-env": ^1.18.4
- "@typescript-eslint/parser": ^5.62.0
+ "@typescript-eslint/parser": ^6.14.0
css-loader: ^6.8.1
esbuild-loader: ^4.0.2
- eslint: ^7.32.0
- eslint-config-prettier: ^9.0.0
+ eslint: ^8.56.0
+ eslint-config-prettier: ^9.1.0
eslint-plugin-radar: ^0.2.1
eslint-plugin-react: ^7.33.2
- eslint-plugin-unused-imports: ^1.1.5
+ eslint-plugin-simple-import-sort: ^10.0.0
+ eslint-plugin-unused-imports: ^3.0.0
file-loader: ^6.2.0
jest: ^29.7.0
jest-circus: ^29.7.0
@@ -9238,7 +9247,16 @@ resolve@^1.20.0:
languageName: node
linkType: hard
-"tslib@npm:^1.8.1, tslib@npm:^1.9.0":
+"ts-api-utils@npm:^1.0.1":
+ version: 1.0.3
+ resolution: "ts-api-utils@npm:1.0.3"
+ peerDependencies:
+ typescript: ">=4.2.0"
+ checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6
+ languageName: node
+ linkType: hard
+
+"tslib@npm:^1.9.0":
version: 1.14.1
resolution: "tslib@npm:1.14.1"
checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd
@@ -9252,17 +9270,6 @@ resolve@^1.20.0:
languageName: node
linkType: hard
-"tsutils@npm:^3.21.0":
- version: 3.21.0
- resolution: "tsutils@npm:3.21.0"
- dependencies:
- tslib: ^1.8.1
- peerDependencies:
- typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
- checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48
- languageName: node
- linkType: hard
-
"ttf2eot@npm:^2.0.0":
version: 2.0.0
resolution: "ttf2eot@npm:2.0.0"
@@ -9592,13 +9599,6 @@ resolve@^1.20.0:
languageName: node
linkType: hard
-"v8-compile-cache@npm:^2.0.3":
- version: 2.2.0
- resolution: "v8-compile-cache@npm:2.2.0"
- checksum: b5916ac2079a4d3de003d9d657d37e1b96453603158ccf6f3d2cc64d0018b71f3576fd3534f519829f9641b4588c830b9363dc5821fe213a51c1b1b3728a382a
- languageName: node
- linkType: hard
-
"v8-to-istanbul@npm:^9.0.1":
version: 9.2.0
resolution: "v8-to-istanbul@npm:9.2.0"
@@ -9945,13 +9945,6 @@ resolve@^1.20.0:
languageName: node
linkType: hard
-"word-wrap@npm:^1.2.3":
- version: 1.2.3
- resolution: "word-wrap@npm:1.2.3"
- checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f
- languageName: node
- linkType: hard
-
"wordwrap@npm:^1.0.0":
version: 1.0.0
resolution: "wordwrap@npm:1.0.0"
From d3bb8c4ad5ff6df3a3ef210014bf9b21b7dc18e8 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Tue, 19 Dec 2023 20:57:50 +0100
Subject: [PATCH 003/188] [MIRROR] Fixes image onclick [No gbp] [MDB IGNORE]
(#25735)
* Fixes image onclick [No gbp] (#80441)
## About The Pull Request
Noticed by @ stylemistake: onClick event was not being passed into image
component
## Why It's Good For The Game
Bug fixes
## Changelog
:cl:
fix: Emojipedia should copy the text on click properly, now
/:cl:
* Fixes image onclick [No gbp]
---------
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
---
tgui/packages/tgui/components/Image.tsx | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/tgui/packages/tgui/components/Image.tsx b/tgui/packages/tgui/components/Image.tsx
index 0bb374d5e52..3e1519bfbbf 100644
--- a/tgui/packages/tgui/components/Image.tsx
+++ b/tgui/packages/tgui/components/Image.tsx
@@ -33,13 +33,14 @@ export const Image = (props: Props) => {
...rest
} = props;
- const computedStyle = {
- ...computeBoxProps(rest).style,
+ const computedProps = computeBoxProps(rest);
+ computedProps['style'] = {
+ ...computedProps.style,
'-ms-interpolation-mode': fixBlur ? 'nearest-neighbor' : 'auto',
objectFit,
};
- let content =
;
+ let content =
;
if (tooltip) {
content = {content};
From 0aed4579e3d55977952efe97b5392ca8e71e1227 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Tue, 19 Dec 2023 20:58:11 +0100
Subject: [PATCH 004/188] Automatic changelog for PR #25735 [ci skip]
---
html/changelogs/AutoChangeLog-pr-25735.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-25735.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25735.yml b/html/changelogs/AutoChangeLog-pr-25735.yml
new file mode 100644
index 00000000000..450a371f429
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25735.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Emojipedia should copy the text on click properly, now"
\ No newline at end of file
From 07127f688e2e49d861eca708e325425a3fa7f653 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Tue, 19 Dec 2023 21:41:34 +0100
Subject: [PATCH 005/188] [MIRROR] Admin server announcement uses new
announcement span [MDB IGNORE] (#25737)
* Admin server announcement uses new announcement span (#80403)
## About The Pull Request
The current admin announce is just notice span text, which is easily
missed mixed in with all the other white noise of the chat box.
Currently admins have to fill it with linebreaks or manually add their
own spans to increase visibility.
This updates the admin announcement proc to use the new alert box divs,
similar to other announcements, making it more visible.
## Why It's Good For The Game
Admin server-wide announcements are generally things you want the
players to notice

## Changelog
:cl: LT3
admin: Server wide admin announcements now use an alert box like other
announcements
/:cl:
---------
Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com>
* Admin server announcement uses new announcement span
---------
Co-authored-by: lessthanthree <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: MrMelbert <51863163+MrMelbert@ users.noreply.github.com>
---
code/__DEFINES/span.dm | 2 +
code/__HELPERS/announcements.dm | 76 +++++++++++++++++++++++++++++++
code/modules/admin/verbs/admin.dm | 2 +-
tgstation.dme | 1 +
4 files changed, 80 insertions(+), 1 deletion(-)
create mode 100644 code/__HELPERS/announcements.dm
diff --git a/code/__DEFINES/span.dm b/code/__DEFINES/span.dm
index cbd29cd4218..a30e980770b 100644
--- a/code/__DEFINES/span.dm
+++ b/code/__DEFINES/span.dm
@@ -13,6 +13,7 @@
#define span_alertwarning(str) ("" + str + "")
#define span_alien(str) ("" + str + "")
#define span_announce(str) ("" + str + "")
+#define span_announcement_header(str) ("")
#define span_average(str) ("" + str + "")
@@ -70,6 +71,7 @@
#define span_interface(str) ("" + str + "")
#define span_linkify(str) ("" + str + "")
#define span_looc(str) ("" + str + "")
+#define span_major_announcement_text(str) ("" + str + "")
#define span_medal(str) ("" + str + "")
#define span_medradio(str) ("" + str + "")
#define span_memo(str) ("" + str + "")
diff --git a/code/__HELPERS/announcements.dm b/code/__HELPERS/announcements.dm
new file mode 100644
index 00000000000..d0deab12e99
--- /dev/null
+++ b/code/__HELPERS/announcements.dm
@@ -0,0 +1,76 @@
+/**
+ * Sends a div formatted chat box announcement
+ *
+ * Formatted like:
+ *
+ * " Server Announcement " (or sender_override)
+ *
+ * " Title "
+ *
+ * " Text "
+ *
+ * Arguments
+ * * text - required, the text to announce
+ * * title - optional, the title of the announcement.
+ * * players - optional, a list of all players to send the message to. defaults to the entire world
+ * * play_sound - if TRUE, play a sound with the announcement (based on player option)
+ * * sound_override - optional, override the default announcement sound
+ * * sender_override - optional, modifies the sender of the announcement
+ * * encode_title - if TRUE, the title will be HTML encoded
+ * * encode_text - if TRUE, the text will be HTML encoded
+ * * color_override - optional, set a color for the announcement box
+ */
+
+/proc/send_formatted_announcement(
+ text,
+ title = "",
+ players,
+ play_sound = TRUE,
+ sound_override = 'sound/ai/default/attention.ogg',
+ sender_override = "Server Admin Announcement",
+ encode_title = TRUE,
+ encode_text = TRUE,
+ color_override = "grey",
+)
+ if(isnull(text))
+ return
+
+ var/list/announcement_strings = list()
+
+ if(encode_title && title && length(title) > 0)
+ title = html_encode(title)
+ if(encode_text)
+ text = html_encode(text)
+ if(!length(text))
+ return
+
+ announcement_strings += span_announcement_header(generate_unique_announcement_header(title, sender_override))
+ announcement_strings += span_major_announcement_text(text)
+ var/finalized_announcement = create_announcement_div(jointext(announcement_strings, ""), color_override)
+
+ if(islist(players))
+ for(var/mob/target in players)
+ to_chat(target, finalized_announcement)
+ if(play_sound && target.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements))
+ SEND_SOUND(target, sound(sound_override))
+ else
+ to_chat(world, finalized_announcement)
+
+ if(!play_sound)
+ return
+
+ for(var/mob/player in GLOB.player_list)
+ if(player.client?.prefs.read_preference(/datum/preference/toggle/sound_announcements))
+ SEND_SOUND(player, sound(sound_override))
+
+/**
+ * Inserts a span styled message into an alert box div
+ *
+ *
+ * Arguments
+ * * message - required, the message contents
+ * * color - optional, set a div color other than default
+ */
+/proc/create_announcement_div(message, color = "default")
+ var/processed_message = "[message]
"
+ return processed_message
diff --git a/code/modules/admin/verbs/admin.dm b/code/modules/admin/verbs/admin.dm
index 0bd348076aa..67319a32195 100644
--- a/code/modules/admin/verbs/admin.dm
+++ b/code/modules/admin/verbs/admin.dm
@@ -37,7 +37,7 @@
if(message)
if(!check_rights(R_SERVER,0))
message = adminscrub(message,500)
- to_chat(world, "[span_adminnotice("[usr.client.holder.fakekey ? "Administrator" : usr.key] Announces:")]\n \t [message]", confidential = TRUE)
+ send_formatted_announcement(message, "From [usr.client.holder.fakekey ? "Administrator" : usr.key]")
log_admin("Announce: [key_name(usr)] : [message]")
BLACKBOX_LOG_ADMIN_VERB("Announce")
diff --git a/tgstation.dme b/tgstation.dme
index 5cd2202077b..8bb9ed7da6d 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -472,6 +472,7 @@
#include "code\__HELPERS\_string_lists.dm"
#include "code\__HELPERS\admin.dm"
#include "code\__HELPERS\ai.dm"
+#include "code\__HELPERS\announcements.dm"
#include "code\__HELPERS\areas.dm"
#include "code\__HELPERS\atmospherics.dm"
#include "code\__HELPERS\atoms.dm"
From 304c43b750d1ac5eff5e002b844a973c14308619 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Tue, 19 Dec 2023 21:41:58 +0100
Subject: [PATCH 006/188] Automatic changelog for PR #25737 [ci skip]
---
html/changelogs/AutoChangeLog-pr-25737.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-25737.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25737.yml b/html/changelogs/AutoChangeLog-pr-25737.yml
new file mode 100644
index 00000000000..d6edaa02b45
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25737.yml
@@ -0,0 +1,4 @@
+author: "LT3"
+delete-after: True
+changes:
+ - admin: "Server wide admin announcements now use an alert box like other announcements"
\ No newline at end of file
From 452b6e905c6c7b2ce1b163a0d4ac36cebcba63f3 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 00:34:27 +0100
Subject: [PATCH 007/188] [MIRROR] Disallows siphoning credits outside of
station [MDB IGNORE] (#25733)
* Disallows siphoning credits outside of station (#80394)
## About The Pull Request
Imagine a funny little antagonist going to deep space with one of these.
You'll never find them, and even if it were to have a gps signal by the
time you were out to the location they could (And most like will) be
long gone, or in a different ruin entirely.
* Disallows siphoning credits outside of station
---------
Co-authored-by: Waterpig <49160555+Majkl-J@users.noreply.github.com>
---
code/game/machinery/bank_machine.dm | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 4d276b6ebae..40670a22f44 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -105,14 +105,23 @@
switch(action)
if("siphon")
- say("Siphon of station credits has begun!")
- start_siphon(ui.user)
+ if(is_station_level(src.z) || is_centcom_level(src.z))
+ say("Siphon of station credits has begun!")
+ start_siphon(ui.user)
+ else
+ say("Error: Console not in reach of station, withdrawal cannot begin.")
. = TRUE
if("halt")
say("Station credit withdrawal halted.")
end_siphon()
. = TRUE
+/obj/machinery/computer/bank_machine/on_changed_z_level()
+ . = ..()
+ if(siphoning && !(is_station_level(src.z) || is_centcom_level(src.z)))
+ say("Error: Console not in reach of station. Siphon halted.")
+ end_siphon()
+
/obj/machinery/computer/bank_machine/proc/end_siphon()
siphoning = FALSE
unauthorized = FALSE
From d5a02b44e9156989a121e412b3b58b3b7b31411f Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 00:34:34 +0100
Subject: [PATCH 008/188] [MIRROR] Icebox escape pods now properly target the
Icemoon surface [MDB IGNORE] (#25740)
* Icebox escape pods now properly target the Icemoon surface (#80452)
## About The Pull Request
This fixes Icebox escape pods only landing in certain ruins when
launched early.
`/area/icemoon/surface/outdoors` only shows up in a few select ruins.
The new area value used to decide a landing point,
`/area/icemoon/surface/outdoors/unexplored/rivers/no_monsters`, covers
the majority of the Icemoon surface.
## Why It's Good For The Game
Closes #78735.
Escape pods might not very useful on Icebox, but this makes using them
less hazardous. You're guaranteed to at least land somewhere safe and
away from the station.
## Changelog
:cl: Rhials
fix: Icebox escape pods will now land randomly on the surface, instead
of only in certain ruins.
/:cl:
* Icebox escape pods now properly target the Icemoon surface
---------
Co-authored-by: Rhials <28870487+Rhials@users.noreply.github.com>
---
code/modules/shuttle/emergency.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index d1b30ddfad5..73de05a8f37 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -744,7 +744,7 @@
return INITIALIZE_HINT_QDEL
/obj/docking_port/stationary/random/icemoon
- target_area = /area/icemoon/surface/outdoors
+ target_area = /area/icemoon/surface/outdoors/unexplored/rivers/no_monsters
//Pod suits/pickaxes
From 3014be4ce258a5d62a183a5f374dad88da569d65 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 00:34:48 +0100
Subject: [PATCH 009/188] Automatic changelog for PR #25733 [ci skip]
---
html/changelogs/AutoChangeLog-pr-25733.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-25733.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25733.yml b/html/changelogs/AutoChangeLog-pr-25733.yml
new file mode 100644
index 00000000000..907bcc2f49c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25733.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - balance: "Disallows siphoning credits outside of station"
\ No newline at end of file
From 6c76f02fdaa71c3072e97d0a9d2c131e9fba1d85 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 00:34:56 +0100
Subject: [PATCH 010/188] Automatic changelog for PR #25740 [ci skip]
---
html/changelogs/AutoChangeLog-pr-25740.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-25740.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25740.yml b/html/changelogs/AutoChangeLog-pr-25740.yml
new file mode 100644
index 00000000000..469b24e2e62
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25740.yml
@@ -0,0 +1,4 @@
+author: "Rhials"
+delete-after: True
+changes:
+ - bugfix: "Icebox escape pods will now land randomly on the surface, instead of only in certain ruins."
\ No newline at end of file
From 7c0d50e65d4cee9ac1abe0228b45fd4c5a638ede Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 00:35:19 +0100
Subject: [PATCH 011/188] [MIRROR] Alien nests and some other stuf can be hit
again. [MDB IGNORE] (#25736)
* Alien nests and some other stuf can be hit again. (#80418)
## About The Pull Request
Another small issue fixed. Thanks Melbert for telling us what's wrong
with it.
EDIT: other objects were rendered unhittable by that flags refactor PR.
## Why It's Good For The Game
Fixes #80311. I made the xmas tree indestructible because the comment to
the `NO_DECONSTRUCTION` flag didn't make a load of sense since that
doesn't stop it from getting destroyed anyway.
## Changelog
:cl: MrMelbert, Ghommie
fix: Alien nests, and some other stuff, can be physically attacked
again.
balance: x-mas trees (the ones with presents), are indestructibles.
Truly protected by a yuletide spirit.
/:cl:
* Alien nests and some other stuf can be hit again.
---------
Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
---
code/game/machinery/dance_machine.dm | 2 +-
code/game/machinery/hologram.dm | 2 +-
code/game/machinery/limbgrower.dm | 2 +-
code/game/machinery/telecomms/machines/allinone.dm | 2 +-
code/game/objects/structures/beds_chairs/alien_nest.dm | 2 +-
code/game/objects/structures/beds_chairs/chair.dm | 2 +-
code/game/objects/structures/flora.dm | 3 ++-
code/game/objects/structures/window.dm | 2 +-
code/modules/awaymissions/mission_code/murderdome.dm | 2 +-
code/modules/capture_the_flag/ctf_game.dm | 2 +-
code/modules/food_and_drinks/machinery/food_cart.dm | 2 +-
code/modules/hydroponics/hydroponics.dm | 2 +-
code/modules/mining/equipment/survival_pod.dm | 2 +-
code/modules/reagents/chemistry/machinery/chem_dispenser.dm | 2 +-
code/modules/reagents/chemistry/machinery/chem_synthesizer.dm | 2 +-
code/modules/shuttle/spaceship_navigation_beacon.dm | 2 +-
code/modules/shuttle/special.dm | 4 ++--
code/modules/shuttle/syndicate.dm | 2 +-
code/modules/transport/tram/tram_controller.dm | 2 +-
19 files changed, 21 insertions(+), 20 deletions(-)
diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm
index d542555af84..de60d84dafd 100644
--- a/code/game/machinery/dance_machine.dm
+++ b/code/game/machinery/dance_machine.dm
@@ -41,7 +41,7 @@
req_access = null
anchored = TRUE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
/datum/track
var/song_name = "generic"
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index c01fb139c35..bc0d480af64 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -123,7 +123,7 @@ Possible to do for anyone motivated enough:
/obj/machinery/holopad/tutorial
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
on_network = FALSE
///Proximity monitor associated with this atom, needed for proximity checks.
var/datum/proximity_monitor/proximity_monitor
diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm
index caedf9fffeb..38d88b013d1 100644
--- a/code/game/machinery/limbgrower.dm
+++ b/code/game/machinery/limbgrower.dm
@@ -283,7 +283,7 @@
/obj/machinery/limbgrower/fullupgrade //Inherently cheaper organ production. This is to NEVER be inherently emagged, no valids.
desc = "It grows new limbs using Synthflesh. This alien model seems more efficient."
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
circuit = /obj/item/circuitboard/machine/limbgrower/fullupgrade
/obj/machinery/limbgrower/fullupgrade/Initialize(mapload)
diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm
index dd1e4a3f610..931979f6b0a 100644
--- a/code/game/machinery/telecomms/machines/allinone.dm
+++ b/code/game/machinery/telecomms/machines/allinone.dm
@@ -20,7 +20,7 @@
/obj/machinery/telecomms/allinone/indestructible
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
/obj/machinery/telecomms/allinone/receive_signal(datum/signal/subspace/signal)
if(!istype(signal) || signal.transmission_method != TRANSMISSION_SUBSPACE) // receives on subspace only
diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm
index fee4703d117..32e1226c93e 100644
--- a/code/game/objects/structures/beds_chairs/alien_nest.dm
+++ b/code/game/objects/structures/beds_chairs/alien_nest.dm
@@ -12,7 +12,7 @@
smoothing_groups = SMOOTH_GROUP_ALIEN_NEST
canSmoothWith = SMOOTH_GROUP_ALIEN_NEST
build_stack_type = null
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
elevation = 0
var/static/mutable_appearance/nest_overlay = mutable_appearance('icons/mob/nonhuman-player/alien.dmi', "nestoverlay", LYING_MOB_LAYER)
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 6dd9c6cd2c7..a6a1131a1b9 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -495,7 +495,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0)
icon_state = null
buildstacktype = null
item_chair = null
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
alpha = 0
/obj/structure/chair/mime/post_buckle_mob(mob/living/M)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index d64e658273f..6fcf85630c6 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -446,11 +446,12 @@
name = "xmas tree"
desc = "A wondrous decorated Christmas tree."
icon_state = "pine_c"
- obj_flags = NO_DECONSTRUCTION //protected by the christmas spirit
/obj/structure/flora/tree/pine/xmas/presents
icon_state = "pinepresents"
desc = "A wondrous decorated Christmas tree. It has presents!"
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF //protected by the christmas spirit
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
var/gift_type = /obj/item/gift/anything
var/unlimited = FALSE
var/static/list/took_presents //shared between all xmas trees
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index f809a3c32fd..678a9a25314 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -803,7 +803,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/tinted/frosted/spaw
/obj/structure/window/reinforced/shuttle/indestructible
name = "hardened shuttle window"
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
flags_1 = PREVENT_CLICK_UNDER_1
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
diff --git a/code/modules/awaymissions/mission_code/murderdome.dm b/code/modules/awaymissions/mission_code/murderdome.dm
index c99b9d91d5a..2e1154d29cf 100644
--- a/code/modules/awaymissions/mission_code/murderdome.dm
+++ b/code/modules/awaymissions/mission_code/murderdome.dm
@@ -1,7 +1,7 @@
/obj/structure/window/reinforced/fulltile/indestructible
name = "robust window"
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
flags_1 = PREVENT_CLICK_UNDER_1
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
diff --git a/code/modules/capture_the_flag/ctf_game.dm b/code/modules/capture_the_flag/ctf_game.dm
index 980cf1a0f69..f333b370d48 100644
--- a/code/modules/capture_the_flag/ctf_game.dm
+++ b/code/modules/capture_the_flag/ctf_game.dm
@@ -464,7 +464,7 @@
/obj/structure/table/reinforced/ctf
resistance_flags = INDESTRUCTIBLE
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
#define CTF_LOADING_UNLOADED 0
#define CTF_LOADING_LOADING 1
diff --git a/code/modules/food_and_drinks/machinery/food_cart.dm b/code/modules/food_and_drinks/machinery/food_cart.dm
index b7a47b11d62..f8410d2065d 100644
--- a/code/modules/food_and_drinks/machinery/food_cart.dm
+++ b/code/modules/food_and_drinks/machinery/food_cart.dm
@@ -8,7 +8,7 @@
anchored = FALSE
use_power = NO_POWER_USE
req_access = list(ACCESS_KITCHEN)
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
var/unpacked = FALSE
var/obj/machinery/griddle/stand/cart_griddle
var/obj/machinery/smartfridge/food/cart_smartfridge
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 72f897106dc..d1eb12a4ea9 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -1159,7 +1159,7 @@
circuit = null
density = FALSE
use_power = NO_POWER_USE
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
unwrenchable = FALSE
self_sustaining_overlay_icon_state = null
maxnutri = 15
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index c04ad5c6ff1..95ee1015a95 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -201,7 +201,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/reinforced/survival_pod/spawne
light_color = COLOR_VERY_PALE_LIME_GREEN
max_n_of_items = 10
pixel_y = -4
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
/obj/machinery/smartfridge/survival_pod/Initialize(mapload)
AddElement(/datum/element/update_icon_blocker)
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 1e5f828947a..668cd2b0d76 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -785,7 +785,7 @@
/obj/machinery/chem_dispenser/mutagensaltpeter
name = "botanical chemical dispenser"
desc = "Creates and dispenses chemicals useful for botany."
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
circuit = /obj/item/circuitboard/machine/chem_dispenser/mutagensaltpeter
/// The default list of dispensable reagents available in the mutagensaltpeter chem dispenser
diff --git a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
index 6cee41bb3eb..6177baa269a 100644
--- a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
@@ -6,7 +6,7 @@
base_icon_state = "dispenser"
amount = 10
resistance_flags = INDESTRUCTIBLE | FIRE_PROOF | ACID_PROOF | LAVA_PROOF
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
use_power = NO_POWER_USE
var/static/list/shortcuts = list(
"meth" = /datum/reagent/drug/methamphetamine
diff --git a/code/modules/shuttle/spaceship_navigation_beacon.dm b/code/modules/shuttle/spaceship_navigation_beacon.dm
index 71e88c7fcc4..7338d336bde 100644
--- a/code/modules/shuttle/spaceship_navigation_beacon.dm
+++ b/code/modules/shuttle/spaceship_navigation_beacon.dm
@@ -5,7 +5,7 @@
icon_state = "beacon_active"
base_icon_state = "beacon"
density = TRUE
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
/// Locked beacons cannot be jumped to by ships.
var/locked = FALSE
diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm
index 089e8b1f9fe..b897bb76111 100644
--- a/code/modules/shuttle/special.dm
+++ b/code/modules/shuttle/special.dm
@@ -79,7 +79,7 @@
var/obj/machinery/power/emitter/energycannon/magical/our_statue
var/list/mob/living/sleepers = list()
var/never_spoken = TRUE
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
/obj/structure/table/abductor/wabbajack/Initialize(mapload)
. = ..()
@@ -201,7 +201,7 @@
/obj/structure/table/wood/shuttle_bar
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
max_integrity = 1000
var/boot_dir = 1
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index 53d625dc758..4c59d9848fc 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -11,7 +11,7 @@
shuttleId = "syndicate"
possible_destinations = "syndicate_away;syndicate_z5;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s;syndicate_custom"
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
/obj/machinery/computer/shuttle/syndicate/launch_check(mob/user)
. = ..()
diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm
index 44a9a4db4b2..ed84ba2cfe0 100644
--- a/code/modules/transport/tram/tram_controller.dm
+++ b/code/modules/transport/tram/tram_controller.dm
@@ -697,7 +697,7 @@
/obj/machinery/transport/tram_controller/hilbert
configured_transport_id = HILBERT_LINE_1
- obj_flags = NO_DECONSTRUCTION
+ obj_flags = /obj::obj_flags | NO_DECONSTRUCTION
/obj/machinery/transport/tram_controller/Initialize(mapload)
. = ..()
From 31d7d8075c40a6d442c6c71f1c407a34ec34ab10 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 00:36:16 +0100
Subject: [PATCH 012/188] [MIRROR] Fixes circuit variable UI [MDB IGNORE]
(#25734)
* Fixes circuit variable UI (#80410)
## About The Pull Request
Circuit UI bluescreens when inputting a global var.
I was curious stepping into this, the recent trend would suggest my
recent UI changes did it, but why would it lose an import statement? I
looked through the history, and this file's just [never had
one](https://github.com/tgstation/tgstation/commit/a4be13ac625f8bf669e2c7b4cd83fffab4759b07#diff-4250b9fec9c0c9ff00917c2e75c6ebd937a364531b9b743b15edd9dfe177be28).
It's been calling an undefined tag for two years. Fascinating.
## Why It's Good For The Game
Fixes #80387
## Changelog
:cl:
fix: Fixed a bluescreen while inputting a global variable in the circuit
UI.
/:cl:
* Fixes circuit variable UI
---------
Co-authored-by: Jeremiah <42397676+jlsnow301@users.noreply.github.com>
---
tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.jsx | 1 +
1 file changed, 1 insertion(+)
diff --git a/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.jsx b/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.jsx
index 1262bdc2868..955e45da41b 100644
--- a/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.jsx
+++ b/tgui/packages/tgui/interfaces/IntegratedCircuit/VariableMenu.jsx
@@ -15,6 +15,7 @@ import {
VARIABLE_LIST,
VARIABLE_NOT_A_LIST,
} from './constants';
+import { multiline } from 'common/string';
export class VariableMenu extends Component {
constructor(props) {
From b1e0cd031ffb8f3449c0834415df74894bf6e137 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 00:46:46 +0100
Subject: [PATCH 013/188] Automatic changelog for PR #25736 [ci skip]
---
html/changelogs/AutoChangeLog-pr-25736.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-25736.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25736.yml b/html/changelogs/AutoChangeLog-pr-25736.yml
new file mode 100644
index 00000000000..c413571e47e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25736.yml
@@ -0,0 +1,5 @@
+author: "MrMelbert, Ghommie"
+delete-after: True
+changes:
+ - bugfix: "Alien nests, and some other stuff, can be physically attacked again."
+ - balance: "x-mas trees (the ones with presents), are indestructibles. Truly protected by a yuletide spirit."
\ No newline at end of file
From 32e301ba5cc86a24ead34f6b6bf24fbbb8648bfc Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 00:47:44 +0100
Subject: [PATCH 014/188] Automatic changelog for PR #25734 [ci skip]
---
html/changelogs/AutoChangeLog-pr-25734.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-25734.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25734.yml b/html/changelogs/AutoChangeLog-pr-25734.yml
new file mode 100644
index 00000000000..16e7dbf3e2c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25734.yml
@@ -0,0 +1,4 @@
+author: "SkyratBot"
+delete-after: True
+changes:
+ - bugfix: "Fixed a bluescreen while inputting a global variable in the circuit UI."
\ No newline at end of file
From b3e520b9ade36608e3ad26b3c4a42961fd30c43d Mon Sep 17 00:00:00 2001
From: Changelogs
Date: Wed, 20 Dec 2023 00:28:02 +0000
Subject: [PATCH 015/188] Automatic changelog compile [ci skip]
---
html/changelogs/AutoChangeLog-pr-25703.yml | 5 ----
html/changelogs/AutoChangeLog-pr-25707.yml | 5 ----
html/changelogs/AutoChangeLog-pr-25709.yml | 4 ---
html/changelogs/AutoChangeLog-pr-25721.yml | 4 ---
html/changelogs/AutoChangeLog-pr-25724.yml | 4 ---
html/changelogs/AutoChangeLog-pr-25728.yml | 4 ---
html/changelogs/AutoChangeLog-pr-25733.yml | 4 ---
html/changelogs/AutoChangeLog-pr-25734.yml | 4 ---
html/changelogs/AutoChangeLog-pr-25735.yml | 4 ---
html/changelogs/AutoChangeLog-pr-25736.yml | 5 ----
html/changelogs/AutoChangeLog-pr-25737.yml | 4 ---
html/changelogs/AutoChangeLog-pr-25740.yml | 4 ---
html/changelogs/archive/2023-12.yml | 29 ++++++++++++++++++++++
13 files changed, 29 insertions(+), 51 deletions(-)
delete mode 100644 html/changelogs/AutoChangeLog-pr-25703.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25707.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25709.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25721.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25724.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25728.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25733.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25734.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25735.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25736.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25737.yml
delete mode 100644 html/changelogs/AutoChangeLog-pr-25740.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25703.yml b/html/changelogs/AutoChangeLog-pr-25703.yml
deleted file mode 100644
index d6a9d7dc0cc..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25703.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - image: "the SpacePol bounty hunters have finally had a new run of Uniforms made, bringing them back to the forefront of enforcement fashion! Wardens will find their Police Jackets/Hats have been updated match SpacePol's new look as well."
- - bugfix: "fixed the Mafia Warden having a hat that didn't match his jacket, and fixed SpacePol masks not covering the nose"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25707.yml b/html/changelogs/AutoChangeLog-pr-25707.yml
deleted file mode 100644
index c7a5b10fa95..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25707.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "qm's intern id is now \"quartermaster-in-training\""
- - image: "qm's id and hud icons now use the cargo tech icons (but blue) to be consistent with the other heads of staff"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25709.yml b/html/changelogs/AutoChangeLog-pr-25709.yml
deleted file mode 100644
index 446537d4c56..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25709.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "Made Syndicate Stormtrooper and Nuclear Operative TGC card holograms visible again"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25721.yml b/html/changelogs/AutoChangeLog-pr-25721.yml
deleted file mode 100644
index 9dc538de7e2..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25721.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Hatterhat"
-delete-after: True
-changes:
- - balance: "Rough stones and stone bricks now have 10 force, up from 0, and 15 throwforce, up from 0/10, respectively."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25724.yml b/html/changelogs/AutoChangeLog-pr-25724.yml
deleted file mode 100644
index a1bfcef8ed4..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25724.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "Fixes runtime from augments not unregistering a signal."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25728.yml b/html/changelogs/AutoChangeLog-pr-25728.yml
deleted file mode 100644
index 4a3e57411f9..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25728.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - image: "cyborg tools became animated"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25733.yml b/html/changelogs/AutoChangeLog-pr-25733.yml
deleted file mode 100644
index 907bcc2f49c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25733.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - balance: "Disallows siphoning credits outside of station"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25734.yml b/html/changelogs/AutoChangeLog-pr-25734.yml
deleted file mode 100644
index 16e7dbf3e2c..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25734.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "Fixed a bluescreen while inputting a global variable in the circuit UI."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25735.yml b/html/changelogs/AutoChangeLog-pr-25735.yml
deleted file mode 100644
index 450a371f429..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25735.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "SkyratBot"
-delete-after: True
-changes:
- - bugfix: "Emojipedia should copy the text on click properly, now"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25736.yml b/html/changelogs/AutoChangeLog-pr-25736.yml
deleted file mode 100644
index c413571e47e..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25736.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "MrMelbert, Ghommie"
-delete-after: True
-changes:
- - bugfix: "Alien nests, and some other stuff, can be physically attacked again."
- - balance: "x-mas trees (the ones with presents), are indestructibles. Truly protected by a yuletide spirit."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25737.yml b/html/changelogs/AutoChangeLog-pr-25737.yml
deleted file mode 100644
index d6edaa02b45..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25737.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "LT3"
-delete-after: True
-changes:
- - admin: "Server wide admin announcements now use an alert box like other announcements"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-25740.yml b/html/changelogs/AutoChangeLog-pr-25740.yml
deleted file mode 100644
index 469b24e2e62..00000000000
--- a/html/changelogs/AutoChangeLog-pr-25740.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Rhials"
-delete-after: True
-changes:
- - bugfix: "Icebox escape pods will now land randomly on the surface, instead of only in certain ruins."
\ No newline at end of file
diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml
index 70ae42a2ac9..faa40426581 100644
--- a/html/changelogs/archive/2023-12.yml
+++ b/html/changelogs/archive/2023-12.yml
@@ -679,3 +679,32 @@
- image: added inhand sprites for towels
zeroisthebiggay:
- rscadd: face scarves for icewalkers
+2023-12-20:
+ Hatterhat:
+ - balance: Rough stones and stone bricks now have 10 force, up from 0, and 15 throwforce,
+ up from 0/10, respectively.
+ LT3:
+ - admin: Server wide admin announcements now use an alert box like other announcements
+ MrMelbert, Ghommie:
+ - bugfix: Alien nests, and some other stuff, can be physically attacked again.
+ - balance: x-mas trees (the ones with presents), are indestructibles. Truly protected
+ by a yuletide spirit.
+ Rhials:
+ - bugfix: Icebox escape pods will now land randomly on the surface, instead of only
+ in certain ruins.
+ SkyratBot:
+ - bugfix: Fixes runtime from augments not unregistering a signal.
+ - bugfix: qm's intern id is now "quartermaster-in-training"
+ - image: qm's id and hud icons now use the cargo tech icons (but blue) to be consistent
+ with the other heads of staff
+ - balance: Disallows siphoning credits outside of station
+ - bugfix: Made Syndicate Stormtrooper and Nuclear Operative TGC card holograms visible
+ again
+ - bugfix: Fixed a bluescreen while inputting a global variable in the circuit UI.
+ - image: cyborg tools became animated
+ - image: the SpacePol bounty hunters have finally had a new run of Uniforms made,
+ bringing them back to the forefront of enforcement fashion! Wardens will find
+ their Police Jackets/Hats have been updated match SpacePol's new look as well.
+ - bugfix: fixed the Mafia Warden having a hat that didn't match his jacket, and
+ fixed SpacePol masks not covering the nose
+ - bugfix: Emojipedia should copy the text on click properly, now
From d6b5e46172efd3e9645fd356fd8708fb4e71273b Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 05:00:37 +0100
Subject: [PATCH 016/188] [MIRROR] actually log total vote votes correctly [MDB
IGNORE] (#25741)
* actually log total vote votes correctly (#80438)
yeah i goofed
* actually log total vote votes correctly
---------
Co-authored-by: Zephyr <12817816+ZephyrTFA@users.noreply.github.com>
---
code/controllers/subsystem/vote.dm | 1 +
1 file changed, 1 insertion(+)
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index 2d134eacb66..c4c3b85b4c9 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -90,6 +90,7 @@ SUBSYSTEM_DEF(vote)
var/list/vote_choice_data = list()
for(var/choice in current_vote.choices)
var/choice_votes = current_vote.choices[choice]
+ total_votes += choice_votes
vote_choice_data["[choice]"] = choice_votes
// stringify the winners to prevent potential unimplemented serialization errors.
From fd0298cb1403fbb7198c8735af7f529325f6236d Mon Sep 17 00:00:00 2001
From: Hypertorus Fusion Reactor
<109750345+dis-integrates-the-integration-tests@users.noreply.github.com>
Date: Wed, 20 Dec 2023 06:01:02 +0200
Subject: [PATCH 017/188] *moan but a little more exciting. For mature, rugged
souls! (#25559)
* ticks new emote file
* makes a lewdmoan emote yesyes
* change physique to gender
* fixes everything else because im dumb
* Update modular_skyrat/modules/modular_items/lewd_items/code/emote.dm (Remove miming check)
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* allows the lewdmoan to vary in pitch
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* uses get_sound() instead of play_lewd_sound
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* uhhh makes a var of get_sound, for lewdness
* creates lewdness in /datum/emote/living/lewd
* slightly makes the emote louder, because yes
* FIXES THE DUMB MOTHERFUCKING ERROR
* i forgot dont bully me pls
* Update modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Update modular_skyrat/master_files/code/datums/emotes.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Update modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* test test does this make it invisible for non-erpers?
* Update code/datums/emotes.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Update code/datums/emotes.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* added pref_to_check in the visible and audible msg procs
* Update modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Update modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Update code/datums/emotes.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Update code/modules/mob/mob.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Update code/modules/mob/mob.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Update modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Update modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* Apply suggestions from code review
* Update modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
* adds pref checks to silicon messages too
* changes user.client to M.client
* adds pref_to_check to drake override
* Update code/datums/emotes.dm
* Apply suggestions from code review
* Apply suggestions from code review
* Update modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
---------
Co-authored-by: Bloop <13398309+vinylspiders@users.noreply.github.com>
---
code/datums/emotes.dm | 22 ++++++----
.../simple_animal/hostile/megafauna/drake.dm | 2 +-
code/modules/mob/mob.dm | 16 ++++++--
.../modular_items/lewd_items/code/emote.dm | 40 +++++++++++++++++++
tgstation.dme | 1 +
5 files changed, 68 insertions(+), 13 deletions(-)
create mode 100644 modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm
index 9a4a2f263e6..64c7de25764 100644
--- a/code/datums/emotes.dm
+++ b/code/datums/emotes.dm
@@ -119,7 +119,10 @@
TIMER_COOLDOWN_START(user, type, audio_cooldown)
//SKYRAT EDIT CHANGE BEGIN
//playsound(user, tmp_sound, 50, vary) - SKYRAT EDIT - ORIGINAL
- playsound(user, tmp_sound, sound_volume, vary)
+ if(istype(src, /datum/emote/living/lewd))
+ play_lewd_sound(user, tmp_sound, sound_volume, vary, pref_to_check = /datum/preference/toggle/erp/sounds)
+ else
+ playsound(user, tmp_sound, sound_volume, vary)
//SKYRAT EDIT CHANGE END
var/user_turf = get_turf(user)
@@ -128,27 +131,30 @@
if(!ghost.client || isnewplayer(ghost))
continue
if(get_chat_toggles(ghost.client) & CHAT_GHOSTSIGHT && !(ghost in viewers(user_turf, null)))
- ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]")
+ if(pref_check_emote(ghost)) // SKYRAT EDIT ADDITION - Pref checked emotes
+ ghost.show_message("[FOLLOW_LINK(ghost, user)] [dchatmsg]") // SKYRAT EDIT CHANGE - Indented
if(emote_type & (EMOTE_AUDIBLE | EMOTE_VISIBLE)) //emote is audible and visible
- user.audible_message(msg, deaf_message = "You see how [user][space][msg]", audible_message_flags = EMOTE_MESSAGE, separation = space) // SKYRAT EDIT - Better emotes - ORIGINAL: user.audible_message(msg, deaf_message = "You see how [user] [msg]", audible_message_flags = EMOTE_MESSAGE)
+ user.audible_message(msg, deaf_message = "You see how [user][space][msg]", audible_message_flags = EMOTE_MESSAGE, separation = space, pref_to_check = pref_to_check) // SKYRAT EDIT - Better emotes - ORIGINAL: user.audible_message(msg, deaf_message = "You see how [user] [msg]", audible_message_flags = EMOTE_MESSAGE)
else if(emote_type & EMOTE_VISIBLE) //emote is only visible
- user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE, separation = space) // SKYRAT EDIT - Better emotes - ORIGINAL: user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE)
+ user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE, separation = space, pref_to_check = pref_to_check) // SKYRAT EDIT - Better emotes - ORIGINAL: user.visible_message(msg, visible_message_flags = EMOTE_MESSAGE)
if(emote_type & EMOTE_IMPORTANT)
for(var/mob/living/viewer in viewers())
if(viewer.is_blind() && !viewer.can_hear())
- to_chat(viewer, msg)
+ if(pref_check_emote(viewer)) // SKYRAT EDIT ADDITION - Pref checked emotes
+ to_chat(viewer, msg) // SKYRAT EDIT CHANGE - Indented
// SKYRAT EDIT -- BEGIN -- ADDITION -- AI QOL - RELAY EMOTES OVER HOLOPADS
var/obj/effect/overlay/holo_pad_hologram/hologram = GLOB.hologram_impersonators[user]
if(hologram)
if(emote_type & (EMOTE_AUDIBLE | EMOTE_VISIBLE))
- hologram.audible_message(msg, deaf_message = span_emote("You see how [user] [msg]"), audible_message_flags = EMOTE_MESSAGE)
+ hologram.audible_message(msg, deaf_message = span_emote("You see how [user] [msg]"), audible_message_flags = EMOTE_MESSAGE, pref_to_check = pref_to_check)
else if(emote_type & EMOTE_VISIBLE)
- hologram.visible_message(msg, visible_message_flags = EMOTE_MESSAGE)
+ hologram.visible_message(msg, visible_message_flags = EMOTE_MESSAGE, pref_to_check = pref_to_check)
if(emote_type & EMOTE_IMPORTANT)
for(var/mob/living/viewer in viewers(world.view, hologram))
if(viewer.is_blind() && !viewer.can_hear())
- to_chat(viewer, msg)
+ if(pref_check_emote(viewer))
+ to_chat(viewer, msg)
// SKYRAT EDIT -- END
/**
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 8531f13c2f5..3cda123814c 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -174,7 +174,7 @@
return FALSE
return ..()
-/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE, separation = " ") // SKYRAT EDIT ADDITION - Better emotes - Original: /mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE)
+/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE, separation = " ", pref_to_check) // SKYRAT EDIT ADDITION - Better emotes - Original: /mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE), pref checks
if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit
return
return ..()
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 7726d30dc18..817e9ce9474 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -267,7 +267,7 @@
* * vision_distance (optional) define how many tiles away the message can be seen.
* * ignored_mob (optional) doesn't show any message to a given mob if TRUE.
*/
-/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE, separation = " ") // SKYRAT EDIT ADDITION - SEPERATION
+/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE, separation = " ", pref_to_check) // SKYRAT EDIT ADDITION - separation, pref checks
var/turf/T = get_turf(src)
if(!T)
return
@@ -298,6 +298,10 @@
for(var/mob/M in hearers)
if(!M.client)
continue
+ // SKYRAT EDIT ADDITION - Emote pref checks
+ if(pref_to_check && !M.client?.prefs.read_preference(pref_to_check))
+ continue
+ // SKYRAT EDIT END
//This entire if/else chain could be in two lines but isn't for readibilties sake.
var/msg = message
@@ -323,7 +327,7 @@
///Adds the functionality to self_message.
-/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE, separation = " ") // SKYRAT EDIT ADDITION - Better emotes
+/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, visible_message_flags = NONE, separation = " ", pref_to_check) // SKYRAT EDIT ADDITION - Better emotes, pref checks
. = ..()
if(self_message)
show_message(self_message, MSG_VISUAL, blind_message, MSG_AUDIBLE)
@@ -338,7 +342,7 @@
* * deaf_message (optional) is what deaf people will see.
* * hearing_distance (optional) is the range, how many tiles away the message can be heard.
*/
-/atom/proc/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE, separation = " ") // SKYRAT EDIT ADDITION - Better emotes
+/atom/proc/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE, separation = " ", pref_to_check) // SKYRAT EDIT ADDITION - Better emotes, pref checks
var/list/hearers = get_hearers_in_view(hearing_distance, src)
//SKYRAT EDIT ADDITION BEGIN - AI QoL
@@ -358,6 +362,10 @@
if(audible_message_flags & EMOTE_MESSAGE)
message = "[src][separation][message]" //SKYRAT EDIT CHANGE
for(var/mob/M in hearers)
+ // SKYRAT EDIT ADDITION - Emote pref checks
+ if(pref_to_check && !M.client?.prefs.read_preference(pref_to_check))
+ continue
+ // SKYRAT EDIT END
if(audible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, audible_message_flags) && M.can_hear())
M.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags)
M.show_message(message, MSG_AUDIBLE, deaf_message, MSG_VISUAL)
@@ -373,7 +381,7 @@
* * deaf_message (optional) is what deaf people will see.
* * hearing_distance (optional) is the range, how many tiles away the message can be heard.
*/
-/mob/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE, separation = " ") // SKYRAT EDIT ADDITION - Better emotes
+/mob/audible_message(message, deaf_message, hearing_distance = DEFAULT_MESSAGE_RANGE, self_message, audible_message_flags = NONE, separation = " ", pref_to_check) // SKYRAT EDIT ADDITION - Better emotes, pref checks
. = ..()
if(self_message)
show_message(self_message, MSG_AUDIBLE, deaf_message, MSG_VISUAL)
diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/emote.dm b/modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
new file mode 100644
index 00000000000..f7645d92016
--- /dev/null
+++ b/modular_skyrat/modules/modular_items/lewd_items/code/emote.dm
@@ -0,0 +1,40 @@
+/datum/emote
+ /// If we should check a preference for this emote
+ var/pref_to_check
+
+/datum/emote/living/lewd
+ pref_to_check = /datum/preference/toggle/erp
+
+// Can we play this emote to viewers?
+/datum/emote/proc/pref_check_emote(mob/user)
+ if(isnull(pref_to_check))
+ return TRUE
+ if(!user.client?.prefs.read_preference(pref_to_check))
+ return FALSE
+
+/datum/emote/living/lewd/can_run_emote(mob/living/carbon/user, status_check = TRUE, intentional)
+ return ..() && user.client?.prefs?.read_preference(pref_to_check)
+
+/datum/emote/living/lewd/lewdmoan
+ key = "lewdmoan"
+ key_third_person = "lewdmoans"
+ message = "moans lewdly!"
+ emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE
+ vary = TRUE
+ sound_volume = 35
+
+/datum/emote/living/lewd/lewdmoan/get_sound(mob/living/carbon/user)
+ if(!istype(user))
+ return
+
+ if(user.gender == MALE)
+ return pick('modular_skyrat/modules/modular_items/lewd_items/sounds/final_m1.ogg',
+ 'modular_skyrat/modules/modular_items/lewd_items/sounds/final_m2.ogg',
+ 'modular_skyrat/modules/modular_items/lewd_items/sounds/final_m3.ogg',
+
+ )
+ else
+ return pick('modular_skyrat/modules/modular_items/lewd_items/sounds/final_f1.ogg',
+ 'modular_skyrat/modules/modular_items/lewd_items/sounds/final_f2.ogg',
+ 'modular_skyrat/modules/modular_items/lewd_items/sounds/final_f3.ogg',
+ )
diff --git a/tgstation.dme b/tgstation.dme
index 8bb9ed7da6d..3de1bf9b391 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7491,6 +7491,7 @@
#include "modular_skyrat\modules\modular_items\code\thieving_gloves.dm"
#include "modular_skyrat\modules\modular_items\lewd_items\code\clothing_pref_check.dm"
#include "modular_skyrat\modules\modular_items\lewd_items\code\decals.dm"
+#include "modular_skyrat\modules\modular_items\lewd_items\code\emote.dm"
#include "modular_skyrat\modules\modular_items\lewd_items\code\lewd_quirks.dm"
#include "modular_skyrat\modules\modular_items\lewd_items\code\screen_icons.dm"
#include "modular_skyrat\modules\modular_items\lewd_items\code\verbs.dm"
From 6d65f0c7dc3f57c528f67b885510c2e5b89815c0 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 05:04:28 +0100
Subject: [PATCH 018/188] Automatic changelog for PR #25559 [ci skip]
---
html/changelogs/AutoChangeLog-pr-25559.yml | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-25559.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25559.yml b/html/changelogs/AutoChangeLog-pr-25559.yml
new file mode 100644
index 00000000000..caebbb3a80e
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25559.yml
@@ -0,0 +1,4 @@
+author: "KannaLisvern"
+delete-after: True
+changes:
+ - rscadd: "Added a new ERP emote. *lewdmoan"
\ No newline at end of file
From 2805c86c811fde2450a054a25c7a665b77df47e5 Mon Sep 17 00:00:00 2001
From: Nerevar <12636964+Nerev4r@users.noreply.github.com>
Date: Tue, 19 Dec 2023 22:53:54 -0700
Subject: [PATCH 019/188] [THE HALF-MODULAR PRINCE] Snalance (Snail Balance)
and Snissues (Snail Issues) Adjustment (#25439)
* initial d
* holy shit i forgot
* i got so much cheese in my pocket, they thought I was a fucking calzone
* opp was sneak-dissing on the 'gram, turned his city into pompeii
* Just fixing some diffs (line breaks should match tg)
* Fixes these edit comments
---------
Co-authored-by: Giz <13398309+vinylspiders@users.noreply.github.com>
---
code/datums/elements/snail_crawl.dm | 14 ++-
.../carbon/human/species_types/snail.dm | 92 ++--------------
.../living/carbon/human/species_type/snail.dm | 100 +++++++++++++++++-
.../research/designs/limbgrower_designs.dm | 12 +++
.../master_files/icons/obj/surgery.dmi | Bin 6077 -> 6754 bytes
modular_skyrat/modules/organs/code/heart.dm | 75 +++++++++++++
modular_skyrat/modules/organs/code/liver.dm | 3 +-
tgstation.dme | 1 +
8 files changed, 206 insertions(+), 91 deletions(-)
create mode 100644 modular_skyrat/modules/organs/code/heart.dm
diff --git a/code/datums/elements/snail_crawl.dm b/code/datums/elements/snail_crawl.dm
index 9893c9922ca..80b3f66e03b 100644
--- a/code/datums/elements/snail_crawl.dm
+++ b/code/datums/elements/snail_crawl.dm
@@ -23,14 +23,24 @@
if(snail.resting && !snail.buckled && lubricate(snail))
snail.add_movespeed_modifier(/datum/movespeed_modifier/snail_crawl)
+ //SKYRAT EDIT ADDITION BEGIN - This is to prevent snails from achieving FTL speeds without gravity, think of it like snails affixing to walls irl.
+ ADD_TRAIT(snail, TRAIT_NEGATES_GRAVITY, TRAIT_GENERIC)
+ snail.AddElement(/datum/element/forced_gravity, 0)
+ if(HAS_TRAIT(snail, TRAIT_SETTLER)) //This is to keep settlers from reaching FTL speeds too.
+ snail.remove_movespeed_modifier(/datum/movespeed_modifier/snail_crawl)
+ //SKYRAT EDIT ADDITION END
else
snail.remove_movespeed_modifier(/datum/movespeed_modifier/snail_crawl)
+ //SKYRAT EDIT ADDITION BEGIN - This clears the forced gravity so they're affected by it while standing.
+ REMOVE_TRAIT(snail, TRAIT_NEGATES_GRAVITY, TRAIT_GENERIC)
+ snail.RemoveElement(/datum/element/forced_gravity, 0)
+ //SKYRAT EDIT ADDITION END
/datum/element/snailcrawl/proc/lubricate(atom/movable/snail)
SIGNAL_HANDLER
var/turf/open/OT = get_turf(snail)
if(istype(OT))
- OT.MakeSlippery(TURF_WET_WATER, 1 SECONDS) //SKYRAT EDIT: Roundstart Snails - No more lube
- OT.wash(CLEAN_WASH) //SKYRAT EDIT: Roundstart Snails - Snails Keep Clean
+ OT.MakeSlippery(TURF_WET_WATER, 1 SECONDS) //SKYRAT EDIT CHANGE: Roundstart Snails - No more lube - ORIGINAL: OT.MakeSlippery(TURF_WET_LUBE, 20)
+ OT.wash(CLEAN_WASH) //SKYRAT EDIT ADDITION: Roundstart Snails - Snails Keep Clean
return TRUE
diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm
index 036b5ad5c24..6f2f12ebe03 100644
--- a/code/modules/mob/living/carbon/human/species_types/snail.dm
+++ b/code/modules/mob/living/carbon/human/species_types/snail.dm
@@ -3,9 +3,9 @@
id = SPECIES_SNAIL
inherent_traits = list(
TRAIT_MUTANT_COLORS,
- // TRAIT_NO_UNDERWEAR, //SKYRAT EDIT - Snails deserve to wear underwear
+ // TRAIT_NO_UNDERWEAR, //SKYRAT EDIT REMOVAL - Roundstart Snails - Snails deserve to wear underwear
TRAIT_NO_SLIP_ALL,
- TRAIT_WATER_BREATHING, //SKYRAT EDIT - Roundstart Snails
+ TRAIT_WATER_BREATHING, //SKYRAT EDIT ADDITION - Roundstart Snails - Sea snails exist, and land snails can weather being underwater for almost a day.
)
coldmod = 0.5 //snails only come out when its cold and wet
@@ -13,11 +13,9 @@
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP
sexes = FALSE //snails are hermaphrodites
- eyes_icon = 'modular_skyrat/modules/organs/icons/snail_eyes.dmi' // SKYRAT EDIT - Roundstart Snails
mutanteyes = /obj/item/organ/internal/eyes/snail
mutanttongue = /obj/item/organ/internal/tongue/snail
- mutantliver = /obj/item/organ/internal/liver/snail //SKYRAT EDIT - Roundstart Snails
- // exotic_blood = /datum/reagent/lube // SKYRAT EDIT REMOVAL: Roundstart Snails - No more lube
+ exotic_blood = /datum/reagent/lube
bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/snail,
@@ -50,9 +48,8 @@
if(new_snailperson.dropItemToGround(bag)) //returns TRUE even if its null
new_snailperson.equip_to_slot_or_del(new /obj/item/storage/backpack/snail(new_snailperson), ITEM_SLOT_BACK)
new_snailperson.AddElement(/datum/element/snailcrawl)
- new_snailperson.update_icons() //SKYRAT EDIT: Roundstart Snails
- //if(ishuman(new_snailperson)) //SKYRAT EDIT: Snails don't have exotic blood here!
- // update_mail_goodies(new_snailperson) //SKYRAT EDIT END
+ if(ishuman(new_snailperson))
+ update_mail_goodies(new_snailperson)
/datum/species/snail/on_species_loss(mob/living/carbon/former_snailperson, datum/species/new_species, pref_load)
. = ..()
@@ -63,12 +60,12 @@
former_snailperson.temporarilyRemoveItemFromInventory(bag, TRUE)
qdel(bag)
-/*/datum/species/snail/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies = list()) //SKYRAT EDIT: Snails don't have exotic blood here!
+/datum/species/snail/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies = list())
if(istype(quirk, /datum/quirk/blooddeficiency))
mail_goodies += list(
/obj/item/reagent_containers/blood/snail
)
- return ..()*/ //SKYRAT EDIT END
+ return ..()
/obj/item/storage/backpack/snail
name = "snail shell"
@@ -80,81 +77,8 @@
armor_type = /datum/armor/backpack_snail
max_integrity = 200
resistance_flags = FIRE_PROOF | ACID_PROOF
- //SKYRAT EDIT BEGIN - Roundstart Snails
- slowdown = 6 // The snail's shell is what's making them slow.
- alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //This makes them layer over tails like the cult backpack; some tails really shouldn't appear over them!
- uses_advanced_reskins = TRUE
- unique_reskin = list(
- "Conical Shell" = list(
- RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
- RESKIN_ICON_STATE = "coneshell",
- RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
- RESKIN_WORN_ICON_STATE = "coneshell"
- ),
- "Round Shell" = list(
- RESKIN_ICON = 'icons/obj/storage/backpack.dmi',
- RESKIN_ICON_STATE = "snailshell",
- RESKIN_WORN_ICON = 'icons/mob/clothing/back/backpack.dmi',
- RESKIN_WORN_ICON_STATE = "snailshell"
- ),
- "Cinnamon Shell" = list(
- RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
- RESKIN_ICON_STATE = "cinnamonshell",
- RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
- RESKIN_WORN_ICON_STATE = "cinnamonshell"
- ),
- "Caramel Shell" = list(
- RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
- RESKIN_ICON_STATE = "caramelshell",
- RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
- RESKIN_WORN_ICON_STATE = "caramelshell"
- ),
- "Metal Shell" = list(
- RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
- RESKIN_ICON_STATE = "mechashell",
- RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
- RESKIN_WORN_ICON_STATE = "mechashell"
- ),
- "Pyramid Shell" = list(
- RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
- RESKIN_ICON_STATE = "pyramidshell",
- RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
- RESKIN_WORN_ICON_STATE = "pyramidshell"
- ),
- "Ivory Pyramid Shell" = list(
- RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
- RESKIN_ICON_STATE = "pyramidshellwhite",
- RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
- RESKIN_WORN_ICON_STATE = "pyramidshellwhite"
- ),
- "Spiral Shell" = list(
- RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
- RESKIN_ICON_STATE = "spiralshell",
- RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
- RESKIN_WORN_ICON_STATE = "spiralshell"
- ),
- "Ivory Spiral Shell" = list(
- RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
- RESKIN_ICON_STATE = "spiralshellwhite",
- RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
- RESKIN_WORN_ICON_STATE = "spiralshellwhite"
- ),
- "Rocky Shell" = list(
- RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
- RESKIN_ICON_STATE = "rockshell",
- RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
- RESKIN_WORN_ICON_STATE = "rockshell"
- ),
- "Ivory Rocky Shell" = list(
- RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
- RESKIN_ICON_STATE = "rockshellwhite",
- RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
- RESKIN_WORN_ICON_STATE = "rockshellwhite"
- ),
- )
- //SKYRAT EDIT END - Roundstart Snails
-/datum/armor/backpack_snail
+/datum/armor/backpack_snail //SKYRAT COMMENT CLARIFICATION - Roundstart Snails - These armor values don't actually do any protection of the wearer, this is for checking direct damage to the backpack. Damage resistance stuff is in their heart file.
melee = 40
bullet = 30
laser = 30
diff --git a/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species_type/snail.dm b/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species_type/snail.dm
index d6ae6c5a103..7d145267b94 100644
--- a/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species_type/snail.dm
+++ b/modular_skyrat/master_files/code/modules/mob/living/carbon/human/species_type/snail.dm
@@ -1,9 +1,95 @@
#define SHELL_TRANSPARENCY_ALPHA 90
+/datum/species/snail
+ eyes_icon = 'modular_skyrat/modules/organs/icons/snail_eyes.dmi' //This is to consolidate our icons and prevent future calamity.
+ mutantliver = /obj/item/organ/internal/liver/snail //This is just a better liver to deal with toxins, it's a thematic thing.
+ mutantheart = /obj/item/organ/internal/heart/snail //This gives them the shell buff where they take less damage from behind, and their heart's more durable.
+ exotic_blood = null
+
+ eyes_icon = 'modular_skyrat/modules/organs/icons/snail_eyes.dmi'
+
+/datum/species/snail/on_species_gain(mob/living/carbon/new_snailperson, datum/species/old_species, pref_load)
+ . = ..()
+ new_snailperson.update_icons()
+
+/datum/species/snail/update_quirk_mail_goodies(mob/living/carbon/human/recipient, datum/quirk/quirk, list/mail_goodies = list())
+ return //This is so that they don't get lube sent in the mail - they don't have exotic blood, so there's no need for it.
+
/obj/item/storage/backpack/snail
/// Whether or not a bluespace anomaly core has been inserted
var/storage_core = FALSE
- obj_flags = IMMUTABLE_SLOW
+ slowdown = 6 // The snail's shell is what's making them slow.
+ obj_flags = IMMUTABLE_SLOW //This should hopefully solve other issues involing it as well.
+ alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //This makes them layer over tails like the cult backpack; some tails really shouldn't appear over them!
+ uses_advanced_reskins = TRUE
+ unique_reskin = list(
+ "Conical Shell" = list(
+ RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
+ RESKIN_ICON_STATE = "coneshell",
+ RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
+ RESKIN_WORN_ICON_STATE = "coneshell"
+ ),
+ "Round Shell" = list(
+ RESKIN_ICON = 'icons/obj/storage/backpack.dmi',
+ RESKIN_ICON_STATE = "snailshell",
+ RESKIN_WORN_ICON = 'icons/mob/clothing/back/backpack.dmi',
+ RESKIN_WORN_ICON_STATE = "snailshell"
+ ),
+ "Cinnamon Shell" = list(
+ RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
+ RESKIN_ICON_STATE = "cinnamonshell",
+ RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
+ RESKIN_WORN_ICON_STATE = "cinnamonshell"
+ ),
+ "Caramel Shell" = list(
+ RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
+ RESKIN_ICON_STATE = "caramelshell",
+ RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
+ RESKIN_WORN_ICON_STATE = "caramelshell"
+ ),
+ "Metal Shell" = list(
+ RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
+ RESKIN_ICON_STATE = "mechashell",
+ RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
+ RESKIN_WORN_ICON_STATE = "mechashell"
+ ),
+ "Pyramid Shell" = list(
+ RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
+ RESKIN_ICON_STATE = "pyramidshell",
+ RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
+ RESKIN_WORN_ICON_STATE = "pyramidshell"
+ ),
+ "Ivory Pyramid Shell" = list(
+ RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
+ RESKIN_ICON_STATE = "pyramidshellwhite",
+ RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
+ RESKIN_WORN_ICON_STATE = "pyramidshellwhite"
+ ),
+ "Spiral Shell" = list(
+ RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
+ RESKIN_ICON_STATE = "spiralshell",
+ RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
+ RESKIN_WORN_ICON_STATE = "spiralshell"
+ ),
+ "Ivory Spiral Shell" = list(
+ RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
+ RESKIN_ICON_STATE = "spiralshellwhite",
+ RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
+ RESKIN_WORN_ICON_STATE = "spiralshellwhite"
+ ),
+ "Rocky Shell" = list(
+ RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
+ RESKIN_ICON_STATE = "rockshell",
+ RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
+ RESKIN_WORN_ICON_STATE = "rockshell"
+ ),
+ "Ivory Rocky Shell" = list(
+ RESKIN_ICON = 'modular_skyrat/master_files/icons/obj/clothing/backpacks.dmi',
+ RESKIN_ICON_STATE = "rockshellwhite",
+ RESKIN_WORN_ICON = 'modular_skyrat/master_files/icons/mob/clothing/back.dmi',
+ RESKIN_WORN_ICON_STATE = "rockshellwhite"
+ ),
+ )
/obj/item/storage/backpack/snail/Initialize(mapload)
. = ..()
@@ -52,7 +138,7 @@
SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
SPECIES_PERK_ICON = "home",
SPECIES_PERK_NAME = "Shellback",
- SPECIES_PERK_DESC = "Snails have a shell fused to their back. While it doesn't offer any protection, it offers great storage. Alt click to change the sprite!",
+ SPECIES_PERK_DESC = "Snails have a shell fused to their back. It offers great storage and most importantly gives them 50% brute damage reduction from behind, or while resting. Alt click to change the sprite!",
),
list(
SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
@@ -60,6 +146,12 @@
SPECIES_PERK_NAME = "Poison Resistance",
SPECIES_PERK_DESC = "Snails have a higher tolerance for poison owing to their robust livers.",
),
+ list(
+ SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
+ SPECIES_PERK_ICON = "heart",
+ SPECIES_PERK_NAME = "Double Hearts",
+ SPECIES_PERK_DESC = "Snails have two hearts, meaning it'll take more to break theirs.",
+ ),
list(
SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
SPECIES_PERK_ICON = "water",
@@ -70,13 +162,13 @@
SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
SPECIES_PERK_ICON = "bone",
SPECIES_PERK_NAME = "Boneless",
- SPECIES_PERK_DESC = "Snails are invertebrates.",
+ SPECIES_PERK_DESC = "Snails are invertebrates, meaning they don't take bone wounds, but are easier to delimb.",
),
list(
SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK,
SPECIES_PERK_ICON = "crutch",
SPECIES_PERK_NAME = "Sheer Mollusk Speed",
- SPECIES_PERK_DESC = "Snails move incredibly slow while standing. They move much faster while crawling.",
+ SPECIES_PERK_DESC = "Snails move incredibly slow while standing. They move much faster while crawling, and can stick to the floors when the gravity is out.",
),
list(
SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK,
diff --git a/modular_skyrat/master_files/code/modules/research/designs/limbgrower_designs.dm b/modular_skyrat/master_files/code/modules/research/designs/limbgrower_designs.dm
index 419041848bb..9c65cf4502a 100644
--- a/modular_skyrat/master_files/code/modules/research/designs/limbgrower_designs.dm
+++ b/modular_skyrat/master_files/code/modules/research/designs/limbgrower_designs.dm
@@ -19,3 +19,15 @@
id = "snailtongue"
build_path = /obj/item/organ/internal/tongue/snail
category = list(SPECIES_SNAIL, RND_CATEGORY_INITIAL)
+
+/datum/design/liver/snail
+ name = "Snail Liver"
+ id = "snailliver"
+ build_path = /obj/item/organ/internal/liver/snail
+ category = list(SPECIES_SNAIL, RND_CATEGORY_INITIAL)
+
+/datum/design/heart/snail
+ name = "Snail Heart"
+ id = "snailheart"
+ build_path = /obj/item/organ/internal/heart/snail
+ category = list(SPECIES_SNAIL, RND_CATEGORY_INITIAL)
diff --git a/modular_skyrat/master_files/icons/obj/surgery.dmi b/modular_skyrat/master_files/icons/obj/surgery.dmi
index 5a3aabe223b112817b9ace6924c156949ada8e93..3ba35f9ad5afe626c15ec0f5e26ca13343c686a6 100644
GIT binary patch
literal 6754
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
Mm9>>Bo>>O|4~+O=+W-In
literal 6077
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 7?G5O|2wV68Lz(CPqw?FVa+>Gcl1Al
z<~LqEoPQ{jY&lv9jr~V}8%x2B*`6Fy4*`#N?B5>eslbqvqB*3Rw}Hu%oxZAzQd)(W
z%oX*qn-%INMECRYzuHnyObRXD0yeGRl2$-7=jVY}czMtSBf*qzd_6EmEOHCf_=AC}
z(@M67R!9ziMGq9H`aJbjqXK+X2pWvB=QBp8U)$c^JssL01%2)|_0ikF!;Fye!o$pn
z_1gYlaN`G^!+%`EZ~ccd^4~J}ugVimptLxQ`NXM+q^uD8?*Z2x6lZ`F;s}seB#TQ^l}HTy`^R1Rb>u^zeUO)LdB~HbP!r!UrzVTu
z*QfUOrz68tZ0?4!eVzCy!C=CZr}mBN7QF6ZzF~Y_pp-O-Q1i%Ht$j^c$jcKVYwe&5
zC1j)KNy*#AgO`lhtuwK%SgT@X)3({aXQmtzxTC#Cm;DBc}sDoi|$_
zYEpNT((tE|0NWVq0?%f0Dh`Kd{|{ZjuA{fXH!ngN+|r2nBxfZS&qMd-;bs<`aVy{|
zto#ZG;{|rm`m>kUr6#EcT`U4?8EHMy*DGBy*9N~~pbbIU)s(j26#;+9R3OAvV
zuf>fe&h~DJ7vSOno4egi-mK!=tt8NkdM^mjG=yZ;+3dH5)ZeX1Ef)t*OuII(rmtz58f|VyL`&Z%D_oZ&dLG;QW
zz#g$2-8eHLMM*Mvg~$yR(4KRaB=T9RO#)hX{cvDnqI57F&G$^ZH_B~s|1Jx`O#xZ>
zh2HUa8kWYW(oh7q97wehXAi~iWCI%+nd0~5a?SpdILM4G-jU#9&=sn#?+xyFhga
z&|EoLsT22Gm_8h{_hvL9&cH%!j{^IKD|N&^*DN^{M4)2}#aiw1H#mLvrN=$Hbc$vQCC
zJvkU;m6!1g!EuYnuYLEH${Jbwm&fgyXr&u3K-2tt_l5?7#d-pHq#cg-s
z5N6ATtL4x00#+YWsw^z!1M@vwBMdb+_D)1>LyaBu?6Z-A8=s^hB
zlOen{iwic|-@JTA)qvc!&;1r;bLvrCO{fPZhb%dt_Ga3W%~aA&a>&IKTCM;y0!Jy6
zpcr-Ex<{BzUg?0(3eRD02zHP?2b3dUkjcKiYGjdTC5TP_s`if)wZIMyUlZGzw`DB5
z8|T><1Czy`rgppMu6W{s_(bZg94Rp9xdzm
zy+sqlm-&Bg8a4MGH1OssLH#MP-iG>PW-Tr}ev<(IZe=EryXBQy2-vF!2J}06urb&Q
zhBfS29G^rElP6I-T{d6Ra*v^xyf|{KIp}Me}E}j6s4!ep*^uT^?5IW!7fj
z74VV?Wte{>Rji*W;AonR4fZy?x`=yTa*W#A9zQxAyzDyk`tSyH}Z6mq3rnl-FD|=8M9l25!es
z_k051jdJ=kyaKJT5acNP^rz97ascr)>F>cQdk6zmo{3@wh2cpKPf^Y#FJ%unn7ae+
zgtU72e;binoy)++0|oU8D9895MgzMkvt}9?SK#7X1c_Rn^J|3W|{6?wrxq0}10eEN{`v3p{
diff --git a/modular_skyrat/modules/organs/code/heart.dm b/modular_skyrat/modules/organs/code/heart.dm
new file mode 100644
index 00000000000..88f1de4ac4c
--- /dev/null
+++ b/modular_skyrat/modules/organs/code/heart.dm
@@ -0,0 +1,75 @@
+/obj/item/organ/internal/heart/snail
+ name = "twin gastropod hearts"
+ desc = "A primary heart normally nestled inside a gastropod's shell, and another in the owner's actual chest; necessary to maintain ample bloodflow through essentially two torsos."
+ icon = 'modular_skyrat/master_files/icons/obj/surgery.dmi'
+ icon_state = "heart-snail-on"
+ base_icon_state = "heart-snail"
+ maxHealth = 2 * STANDARD_ORGAN_THRESHOLD // There's two of them. Also, due to the special interaction below, it's best we make sure these aren't easily lost.
+ now_fixed = span_info("Your hearts begin to beat again.") //For the sake of verisimilitude.
+
+ COOLDOWN_DECLARE(shell_effect_cd)
+
+/obj/item/organ/internal/heart/snail/on_insert(mob/living/carbon/organ_owner, special)
+ . = ..()
+ if(!ishuman(organ_owner))
+ return
+
+ if(!issnail(organ_owner)) //This is cleaner than checking for the shell, because there's not really going to be any non-horribly-bugged situation in which a snail will be lacking a shell.
+ return
+
+ var/mob/living/carbon/human/human_owner = organ_owner
+
+ RegisterSignal(human_owner, COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, PROC_REF(modify_damage))
+ RegisterSignal(human_owner, COMSIG_MOB_AFTER_APPLY_DAMAGE, PROC_REF(do_block_effect))
+
+/obj/item/organ/internal/heart/snail/on_remove(mob/living/carbon/organ_owner, special)
+ . = ..()
+ if(!ishuman(organ_owner) || QDELETED(organ_owner))
+ return
+
+ var/mob/living/carbon/human/human_owner = organ_owner
+
+ UnregisterSignal(human_owner, list(COMSIG_MOB_APPLY_DAMAGE_MODIFIERS, COMSIG_MOB_AFTER_APPLY_DAMAGE))
+
+/**
+ * Signal proc for [COMSIG_MOB_APPLY_DAMAGE_MODIFIERS]
+ *
+ * Adds a 0.5 modifier to attacks from the back, code borrowed (wholesale) from the roach heart.
+ */
+/obj/item/organ/internal/heart/snail/proc/modify_damage(mob/living/carbon/human/source, list/damage_mods, damage_amount, damagetype, def_zone, sharpness, attack_direction, obj/item/attacking_item)
+ SIGNAL_HANDLER
+
+ if(!is_blocking(source, damage_amount, damagetype, attack_direction))
+ return
+
+ damage_mods += 0.5
+
+/**
+ * Signal proc for [COMSIG_MOB_AFTER_APPLY_DAMAGE]
+ *
+ * Does a special effect if we blocked damage with our shell.
+ */
+/obj/item/organ/internal/heart/snail/proc/do_block_effect(mob/living/carbon/human/source, damage_dealt, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, obj/item/attacking_item)
+ SIGNAL_HANDLER
+
+ if(!is_blocking(source, damage_dealt, damagetype, attack_direction))
+ return
+
+ if(COOLDOWN_FINISHED(src, shell_effect_cd))
+ source.visible_message(span_warning("[source]'s shell weathers the blow, absorbing most of the shock!"))
+ playsound(source, 'sound/weapons/parry.ogg', 50, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
+
+ COOLDOWN_START(src, shell_effect_cd, 5 SECONDS) // Cooldown resets EVERY time we get hit
+
+/// Checks if the passed mob is in a valid state to be blocking damage with the snail shell
+/obj/item/organ/internal/heart/snail/proc/is_blocking(mob/living/carbon/human/blocker, damage_amount, damagetype, attack_direction)
+ if(damage_amount < 5 || damagetype != BRUTE || !attack_direction)
+ return
+ if(!ishuman(blocker) || blocker.stat >= UNCONSCIOUS)
+ return FALSE
+ // No tactical spinning
+ if(HAS_TRAIT(blocker, TRAIT_SPINNING))
+ return FALSE
+ if(blocker.body_position == LYING_DOWN || (blocker.dir & attack_direction))
+ return TRUE
+ return FALSE
diff --git a/modular_skyrat/modules/organs/code/liver.dm b/modular_skyrat/modules/organs/code/liver.dm
index 1fe231786ea..8c275530084 100644
--- a/modular_skyrat/modules/organs/code/liver.dm
+++ b/modular_skyrat/modules/organs/code/liver.dm
@@ -1,6 +1,7 @@
/obj/item/organ/internal/liver/snail
name = "gastropod liver"
- icon_state = "liver-x"
+ icon = 'modular_skyrat/master_files/icons/obj/surgery.dmi'
+ icon_state = "liver-snail"
desc = "Due to snailfolk evolving in typically poisonous environments such as bogs, their liver has a higher tolerance for poisons compared to most."
maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD
toxTolerance = 5 //can shrug off up to 5u of toxins
diff --git a/tgstation.dme b/tgstation.dme
index 3de1bf9b391..fb5459dc95b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7751,6 +7751,7 @@
#include "modular_skyrat\modules\opposing_force\code\equipment\modsuit.dm"
#include "modular_skyrat\modules\opposing_force\code\equipment\spells.dm"
#include "modular_skyrat\modules\opposing_force\code\equipment\uplink.dm"
+#include "modular_skyrat\modules\organs\code\heart.dm"
#include "modular_skyrat\modules\organs\code\liver.dm"
#include "modular_skyrat\modules\organs\code\lungs.dm"
#include "modular_skyrat\modules\organs\code\organs.dm"
From cb729735bf01063890e6bdd667809dbed43a02a0 Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 06:54:20 +0100
Subject: [PATCH 020/188] Automatic changelog for PR #25439 [ci skip]
---
html/changelogs/AutoChangeLog-pr-25439.yml | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-25439.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25439.yml b/html/changelogs/AutoChangeLog-pr-25439.yml
new file mode 100644
index 00000000000..c47128d686f
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25439.yml
@@ -0,0 +1,6 @@
+author: "Nerev4r"
+delete-after: True
+changes:
+ - rscadd: "Due to increased availability of calcium supplements in Sector 13 due to Deep Spacer lobbying, snailpeople have found their shells to be more suited towards protection of themselves and their recently-discovered-to-be-binary hearts in a combat scenario."
+ - rscadd: "Snailpeople have been invited to recent EVA training sessions, and have learned to attach themselves to the floors if gravity generators go out; who'd have thunk it?"
+ - bugfix: "Snailpeople no longer benefit from Settler's equipment load reduction while crawling. I could not think of a funny caption for this."
\ No newline at end of file
From b48b7a9451803396c3717f97a0710a0eb46cfb3b Mon Sep 17 00:00:00 2001
From: RaShCAt <33174229+RaShCat@users.noreply.github.com>
Date: Wed, 20 Dec 2023 09:18:16 +0300
Subject: [PATCH 021/188] Teshari offsets and simple redraw of sabres for them.
(#25712)
* Just one pixel! Sorry!
Simple redraw in belt.dmi for sabres.
* Also teshari offsets
---
.../mob/clothing/species/teshari/belt.dmi | Bin 8118 -> 8060 bytes
.../bodyparts/code/teshari_bodyparts.dm | 19 +++++++++++++++++-
2 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/modular_skyrat/master_files/icons/mob/clothing/species/teshari/belt.dmi b/modular_skyrat/master_files/icons/mob/clothing/species/teshari/belt.dmi
index eadfe01a6e37755cc50281c71080bfd51df95aa2..c3ee69dd2a334bf0f859596c5ba371c3482ab381 100644
GIT binary patch
literal 8060
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
ZNsdwW=lf>x7W|zKC@ZML%H>Q#{trT0Z{h#|
literal 8118
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
diff --git a/modular_skyrat/modules/bodyparts/code/teshari_bodyparts.dm b/modular_skyrat/modules/bodyparts/code/teshari_bodyparts.dm
index 3762bf1d0a8..2127353beff 100644
--- a/modular_skyrat/modules/bodyparts/code/teshari_bodyparts.dm
+++ b/modular_skyrat/modules/bodyparts/code/teshari_bodyparts.dm
@@ -21,7 +21,7 @@
worn_head_offset = new(
attached_part = src,
feature_key = OFFSET_HEAD,
- offset_x = list("north" = 1, "south" = 1, "east" = 1, "west" = -1, "northwest" = -1, "southwest" = -1),
+ offset_x = list("north" = 1, "south" = 1, "east" = 1, "west" = -1, "northwest" = -1, "southwest" = -1, "northeast" = 1, "southeast" = 1),
offset_y = list("north" = -4, "south" = -4, "east" = -4, "west" = -4),
)
worn_mask_offset = new(
@@ -52,6 +52,23 @@
)
return ..()
+/obj/item/bodypart/arm/left/mutant/teshari/Initialize(mapload)
+ held_hand_offset = new(
+ attached_part = src,
+ feature_key = OFFSET_HELD,
+ offset_x = list("north" = 0, "south" = 0, "east" = 0, "west" = -6, "northwest" = -6, "southwest" = -6, "northeast" = 0, "southeast" = 0),
+ offset_y = list("north" = -3, "south" = -3, "east" = -3, "west" = -3),
+ )
+ return ..()
+
+/obj/item/bodypart/arm/right/mutant/teshari/Initialize(mapload)
+ held_hand_offset = new(
+ attached_part = src,
+ feature_key = OFFSET_HELD,
+ offset_x = list("north" = 0, "south" = 0, "east" = 6, "west" = 0, "northwest" = 0, "southwest" = 0, "northeast" = 6, "southeast" = 6),
+ offset_y = list("north" = -3, "south" = -3, "east" = -3, "west" = -3),
+ )
+ return ..()
/obj/item/bodypart/arm/left/mutant/teshari
icon_greyscale = BODYPART_ICON_TESHARI
From 1b6e3f9098e01133b949125aa75ba027fe30ab9d Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 07:18:39 +0100
Subject: [PATCH 022/188] Automatic changelog for PR #25712 [ci skip]
---
html/changelogs/AutoChangeLog-pr-25712.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-25712.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25712.yml b/html/changelogs/AutoChangeLog-pr-25712.yml
new file mode 100644
index 00000000000..00cb69b9193
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25712.yml
@@ -0,0 +1,5 @@
+author: "RaShCat"
+delete-after: True
+changes:
+ - bugfix: "offsets of items in teshari's paws and worn head"
+ - image: "simple redraw of teshari's sabres."
\ No newline at end of file
From a6e49dbdee25f0af7b63bc9b31269e1d97ee4c31 Mon Sep 17 00:00:00 2001
From: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com>
Date: Wed, 20 Dec 2023 10:23:44 -0500
Subject: [PATCH 023/188] PR of the day, a day late | I HATE THE ANTICHRIST!! |
Upgrades the SolFed response outfits (except the engineering one) (#25490)
* everything
* puts the right item paths there
* fixes the gas masks
* fixes outfit sanity
* Adds trailing commas to multi-line lists.
---------
Co-authored-by: GoldenAlpharex <58045821+GoldenAlpharex@users.noreply.github.com>
---
.../code/armament_datums/sol_defense.dm | 20 +++--
.../modules/goofsec/code/sol_fed.dm | 84 ++++++++++--------
.../modules/goofsec/code/solfed_clothing.dm | 42 +++++++++
.../modules/goofsec/icons/uniforms.dmi | Bin 0 -> 1212 bytes
.../modules/goofsec/icons/uniforms_worn.dmi | Bin 0 -> 3403 bytes
.../goofsec/icons/uniforms_worn_digi.dmi | Bin 0 -> 2647 bytes
tgstation.dme | 1 +
7 files changed, 106 insertions(+), 41 deletions(-)
create mode 100644 modular_skyrat/modules/goofsec/code/solfed_clothing.dm
create mode 100644 modular_skyrat/modules/goofsec/icons/uniforms.dmi
create mode 100644 modular_skyrat/modules/goofsec/icons/uniforms_worn.dmi
create mode 100644 modular_skyrat/modules/goofsec/icons/uniforms_worn_digi.dmi
diff --git a/modular_skyrat/modules/company_imports/code/armament_datums/sol_defense.dm b/modular_skyrat/modules/company_imports/code/armament_datums/sol_defense.dm
index 0d7e4a8eca1..97a9f446cb9 100644
--- a/modular_skyrat/modules/company_imports/code/armament_datums/sol_defense.dm
+++ b/modular_skyrat/modules/company_imports/code/armament_datums/sol_defense.dm
@@ -2,6 +2,18 @@
category = SOL_DEFENSE_DEFENSE_NAME
company_bitflag = CARGO_COMPANY_SOL_DEFENSE
+// Beautiful SolFed clothing
+
+/datum/armament_entry/company_import/sol_defense/clothing
+ subcategory = "Surplus Clothing"
+ cost = PAYCHECK_CREW
+
+/datum/armament_entry/company_import/sol_defense/clothing/peacekeeper
+ item_type = /obj/item/clothing/under/sol_peacekeeper
+
+/datum/armament_entry/company_import/sol_defense/clothing/emt
+ item_type = /obj/item/clothing/under/sol_emt
+
// Armor vests for protecting against bullets
/datum/armament_entry/company_import/sol_defense/armor
@@ -20,12 +32,11 @@
/datum/armament_entry/company_import/sol_defense/armor/sf_soft_vest
item_type = /obj/item/clothing/suit/armor/sf_peacekeeper
-/datum/armament_entry/company_import/sol_defense/armor/normal_vest
- name = "type I vest - normal"
- item_type = /obj/item/clothing/suit/armor/vest/alt
+/datum/armament_entry/company_import/sol_defense/armor/flak_jacket
+ item_type = /obj/item/clothing/suit/armor/vest/det_suit/sol
/datum/armament_entry/company_import/sol_defense/armor/slim_vest
- name = "type I vest - slim"
+ name = "type I vest"
item_type = /obj/item/clothing/suit/armor/vest
/datum/armament_entry/company_import/sol_defense/armor_hardened
@@ -35,7 +46,6 @@
/datum/armament_entry/company_import/sol_defense/armor_hardened/enclosed_helmet
item_type = /obj/item/clothing/head/helmet/toggleable/sf_hardened
-
/datum/armament_entry/company_import/sol_defense/armor_hardened/emt_enclosed_helmet
item_type = /obj/item/clothing/head/helmet/toggleable/sf_hardened/emt
diff --git a/modular_skyrat/modules/goofsec/code/sol_fed.dm b/modular_skyrat/modules/goofsec/code/sol_fed.dm
index 2e8348b8eba..2f6e9064c50 100644
--- a/modular_skyrat/modules/goofsec/code/sol_fed.dm
+++ b/modular_skyrat/modules/goofsec/code/sol_fed.dm
@@ -321,21 +321,24 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list(
/datum/outfit/request_911/police
name = "911 Response: Marshal"
- back = /obj/item/storage/backpack/duffelbag/cops
- uniform = /obj/item/clothing/under/rank/security/detective/cowboy
- shoes = /obj/item/clothing/shoes/cowboy
+ back = /obj/item/storage/backpack/satchel
+ uniform = /obj/item/clothing/under/sol_peacekeeper
+ suit = /obj/item/clothing/suit/armor/vest/det_suit/sol
+ shoes = /obj/item/clothing/shoes/jackboots
glasses = /obj/item/clothing/glasses/sunglasses
ears = /obj/item/radio/headset/headset_sec/alt
- head = /obj/item/clothing/head/cowboy
- belt = /obj/item/gun/energy/disabler
- r_pocket = /obj/item/lighter
+ head = /obj/item/clothing/head/soft/black
+ suit_store = /obj/item/gun/energy/disabler
+ belt = /obj/item/melee/baton/security/loaded
+ r_pocket = /obj/item/flashlight/seclite
l_pocket = /obj/item/restraints/handcuffs
id = /obj/item/card/id/advanced/solfed
- backpack_contents = list(/obj/item/storage/box/survival = 1,
+ backpack_contents = list(
+ /obj/item/storage/box/survival = 1,
/obj/item/storage/box/handcuffs = 1,
- /obj/item/melee/baton/security/loaded = 1,
/obj/item/solfed_reporter/swat_caller = 1,
- /obj/item/beamout_tool = 1)
+ /obj/item/beamout_tool = 1,
+ )
id_trim = /datum/id_trim/solfed
@@ -366,7 +369,7 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list(
/obj/item/rwd/loaded = 1,
/obj/item/beamout_tool = 1,
/obj/item/solfed_reporter/swat_caller = 1,
- )
+ )
id_trim = /datum/id_trim/solfed/atmos
/obj/item/radio/headset/headset_solfed/atmos
@@ -396,21 +399,25 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list(
/datum/outfit/request_911/emt
name = "911 Response: EMT"
- back = /obj/item/storage/backpack/duffelbag/cops
- uniform = /obj/item/clothing/under/rank/medical/paramedic
- shoes = /obj/item/clothing/shoes/sneakers/white
+ back = /obj/item/storage/backpack/medic
+ uniform = /obj/item/clothing/under/sol_emt
+ shoes = /obj/item/clothing/shoes/jackboots
ears = /obj/item/radio/headset/headset_med
- head = /obj/item/clothing/head/soft/paramedic
+ mask = /obj/item/clothing/mask/gas/alt
+ head = /obj/item/clothing/head/helmet/toggleable/sf_hardened/emt
id = /obj/item/card/id/advanced/solfed
- suit = /obj/item/clothing/suit/toggle/labcoat/paramedic
+ suit = /obj/item/clothing/suit/armor/sf_hardened/emt
gloves = /obj/item/clothing/gloves/latex/nitrile
- belt = /obj/item/storage/belt/medical/paramedic
- suit_store = /obj/item/flashlight/pen/paramedic
- backpack_contents = list(/obj/item/storage/box/survival = 1,
+ belt = /obj/item/storage/backpack/duffelbag/deforest_medkit/stocked
+ suit_store = /obj/item/tank/internals/emergency_oxygen/engi
+ r_pocket = /obj/item/flashlight/seclite
+ l_pocket = /obj/item/storage/medkit/civil_defense
+ backpack_contents = list(
+ /obj/item/storage/box/survival = 1,
/obj/item/emergency_bed = 1,
- /obj/item/storage/medkit/surgery = 1,
/obj/item/solfed_reporter/swat_caller = 1,
- /obj/item/beamout_tool = 1)
+ /obj/item/beamout_tool = 1,
+ )
id_trim = /datum/id_trim/solfed
@@ -438,24 +445,26 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list(
/datum/outfit/request_911/condom_destroyer
name = "911 Response: Armed S.W.A.T. Officer"
- back = /obj/item/storage/backpack/duffelbag/cops
- uniform = /obj/item/clothing/under/rank/security/officer/beatcop
+ back = /obj/item/storage/backpack
+ uniform = /obj/item/clothing/under/sol_peacekeeper
shoes = /obj/item/clothing/shoes/jackboots
glasses = /obj/item/clothing/glasses/sunglasses
ears = /obj/item/radio/headset/headset_sec/alt
- head = /obj/item/clothing/head/helmet/toggleable/riot
+ head = /obj/item/clothing/head/helmet/sf_peacekeeper
belt = /obj/item/gun/energy/disabler
- suit = /obj/item/clothing/suit/armor/riot
- r_pocket = /obj/item/lighter
+ suit = /obj/item/clothing/suit/armor/sf_peacekeeper
+ r_pocket = /obj/item/flashlight/seclite
l_pocket = /obj/item/restraints/handcuffs
id = /obj/item/card/id/advanced/solfed
- l_hand = /obj/item/gun/ballistic/shotgun/riot
- backpack_contents = list(/obj/item/storage/box/survival = 1,
+ l_hand = /obj/item/gun/ballistic/shotgun/riot/sol
+ backpack_contents = list(
+ /obj/item/storage/box/survival = 1,
/obj/item/storage/box/handcuffs = 1,
/obj/item/melee/baton/security/loaded = 1,
/obj/item/storage/box/lethalshot = 2,
/obj/item/solfed_reporter/treason_reporter = 1,
- /obj/item/beamout_tool = 1)
+ /obj/item/beamout_tool = 1,
+ )
id_trim = /datum/id_trim/solfed
@@ -482,22 +491,25 @@ GLOBAL_LIST_INIT(call911_do_and_do_not, list(
/datum/outfit/request_911/treason_destroyer
name = "911 Response: SolFed Military"
- uniform = /obj/item/clothing/under/rank/security/officer/hecu
- head = /obj/item/clothing/head/helmet
- mask = /obj/item/clothing/mask/gas/hecu2
+ uniform = /obj/item/clothing/under/sol_peacekeeper
+ head = /obj/item/clothing/head/helmet/sf_sacrificial
+ mask = /obj/item/clothing/mask/gas/alt
gloves = /obj/item/clothing/gloves/combat
- suit = /obj/item/clothing/suit/armor/vest
- shoes = /obj/item/clothing/shoes/combat
+ suit = /obj/item/clothing/suit/armor/sf_sacrificial
+ shoes = /obj/item/clothing/shoes/jackboots
- back = /obj/item/storage/backpack/duffelbag/cops
+ back = /obj/item/storage/backpack
glasses = /obj/item/clothing/glasses/sunglasses
ears = /obj/item/radio/headset/headset_sec/alt
l_pocket = /obj/item/restraints/handcuffs
+ r_pocket = /obj/item/flashlight/seclite
id = /obj/item/card/id/advanced/solfed
r_hand = /obj/item/gun/ballistic/automatic/sol_rifle
- backpack_contents = list(/obj/item/storage/box/handcuffs = 1,
+ backpack_contents = list(
+ /obj/item/storage/box/handcuffs = 1,
+ /obj/item/sacrificial_face_shield = 1,
/obj/item/melee/baton/security/loaded = 1,
- /obj/item/ammo_box/magazine/c40sol_rifle/standard = 4
+ /obj/item/ammo_box/magazine/c40sol_rifle/standard = 4,
)
id_trim = /datum/id_trim/solfed
diff --git a/modular_skyrat/modules/goofsec/code/solfed_clothing.dm b/modular_skyrat/modules/goofsec/code/solfed_clothing.dm
new file mode 100644
index 00000000000..ab3bff3e7d2
--- /dev/null
+++ b/modular_skyrat/modules/goofsec/code/solfed_clothing.dm
@@ -0,0 +1,42 @@
+// Peacekeeper jumpsuit
+
+/obj/item/clothing/under/sol_peacekeeper
+ name = "sol peacekeeper uniform"
+ desc = "A military-grade uniform with military grade comfort (none at all), often seen on \
+ SolFed's various peacekeeping forces, and usually alongside a blue helmet."
+ icon = 'modular_skyrat/modules/goofsec/icons/uniforms.dmi'
+ icon_state = "peacekeeper"
+ worn_icon = 'modular_skyrat/modules/goofsec/icons/uniforms_worn.dmi'
+ worn_icon_digi = 'modular_skyrat/modules/goofsec/icons/uniforms_worn_digi.dmi'
+ worn_icon_state = "peacekeeper"
+ armor_type = /datum/armor/clothing_under/rank_security
+ inhand_icon_state = null
+ has_sensor = SENSOR_COORDS
+ random_sensor = FALSE
+
+// EMT jumpsuit
+
+/obj/item/clothing/under/sol_emt
+ name = "sol emergency medical uniform"
+ desc = "A copy of SolFed's peacekeeping uniform, recolored and re-built paramedics in mind."
+ icon = 'modular_skyrat/modules/goofsec/icons/uniforms.dmi'
+ icon_state = "emt"
+ worn_icon = 'modular_skyrat/modules/goofsec/icons/uniforms_worn.dmi'
+ worn_icon_digi = 'modular_skyrat/modules/goofsec/icons/uniforms_worn_digi.dmi'
+ worn_icon_state = "emt"
+ armor_type = /datum/armor/clothing_under/rank_medical
+ inhand_icon_state = null
+ has_sensor = SENSOR_COORDS
+ random_sensor = FALSE
+
+// Solfed flak jacket, for marshals
+
+/obj/item/clothing/suit/armor/vest/det_suit/sol
+ name = "'Gordyn' flak vest"
+ desc = "A light armored jacket common on SolFed personnel who need armor, but find a full vest \
+ too impractical or uneeded."
+ icon = 'modular_skyrat/modules/goofsec/icons/uniforms.dmi'
+ icon_state = "flak"
+ worn_icon = 'modular_skyrat/modules/goofsec/icons/uniforms_worn.dmi'
+ worn_icon_state = "flak"
+ supports_variations_flags = CLOTHING_DIGITIGRADE_VARIATION_NO_NEW_ICON
diff --git a/modular_skyrat/modules/goofsec/icons/uniforms.dmi b/modular_skyrat/modules/goofsec/icons/uniforms.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..82b6c313b73325036f28217b0d24d3d595ae023a
GIT binary patch
literal 1212
zcmV;t1Vj6YP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+
z(=$pSoZ^zil2jm5sUS5mIW;>qwIH=fiHkEOv#1y-YRJWzR+N~V3Sq<5rskFqRFjsI
zn2k%3vVyCh3)qzaQ&ljfF}Vvu000B~Nkl!&BbQ;FtYY8WA(p!-mkJBE5Yl~BwTwTa9D1sqkm2C%yKFrNk~!VPr6*?
zy*V;Uu~;YDRS~p|426Q$GY}u7#b1k-(fezvZC&UU)Lmk8J*@#n8#8ipTLoKR7P9h%
z$rR7RU1MswkEBYjVd*fMT3qCm`ZFdg!4wv$X0WSs)h=$QbV@aENPE95ci
z983u@KR!7@&;xEw0T>ZZj4*^dz^HRzsF_yp`0i6fAfvsb3DMU4Vlr0K`$}AR2hRSMX^d
zjyea?!0S~|asUvG%#`;M(a21B6_gzSU~JpHE-DRer%zK~sp(wAQR7a5vDZ&EQR(TW
z_OCu@bNntxYXBC)Yc0)mp|QzI`NFtbYXBC)*uWFI@~+=X`NHUA4Ul#Kb^z@8nT+Ho
zLa*)v)_Fg<=VvmKp9od&1JVudV71dwy$&>T#Fb7=WPGe{a`quGwp)F#hlSJT1n%q~Ghiy8s_$I0J?wMLFJb
z!i)ZSjVc>)jim$KNE(D=6UmY&(u
z_EPXXbuZt2t-W}U^=(6HsPKEQtFp(Hx=DtFg%x*gmb-!Yj!9ILx|Y^M
zzrpwo?Cmm>$=UD#ck;HDXa61sOUlcdeG=@hF4|bc;s>yI;r31Txchi1s5|^9P09MB
zow~)8DwU1*4Dy>l3|DSj!R^u&p9g+f&u2Y9lpXhnZky~B`fEmiCc2^
zE&dA5$9q|xgY@kp_ht0i-!b?`$)Z`BC%&`TtBcrO$;Yq$y;O^EihkgTp54j|Gs29-
zmR-4+7P~m#3O&4q7CP#2di4&-!_Gt=is8LsFK%GF@@a?JH^vWLZ#)cXqPIgf`S{Cw
zjdVgdv_4~2eykZ6fE71Xu<*#Po>Q_W9Pc2ApWUONbT&d3ioaV&5`WX-z8@KzoXDKD
zyLE_7<7Uscnn{jx99sTkw!~C?{Wu
z1WexU*OugIQ;BB{pmv7SJz_+F4EFP&+0J$V>>HMoLoTSaiyD$A@Y&hcqE!wNzK$Mx
zrVHLI0o(O7`HVD|5$P-77Vov~|EN_FLf>lBM;Iw6!$%%Hst6Vvqcahbq{1|v_Cm#g@FlLf5@@T
z+fs5%K_~;oVT^uU-+VN50e8o_(}k@40tQ_nCYv{Prf-a@g7SN|7^(pv^aPWKGwkQZ
zU=#0X)#VF#*6sjUv=I|fAd*76El&!^E4-9vgpm-XLq)y{_TA#p7*xc=%yRCB+AQjN
zmjtRcO;}=tfJHzK&EWCcRcc(Q*KvU7S9<%QW*MGF9fP+S@0>vpeooF!6#-DhZ+v^u
ztIE^SD#aD*Y`#+Z_SB7PWSj=0NzK{lqzV}c?A~Sy`Jyd|h0vObXenZfed>?tcw43Y`4@ktb|9b XiMULI
zK&1_7EH62ginp}6Uh7q##`^0~hPlyYu7fIyZu1*9y5=6R2KLJ&VI}t7`ghuNx$o{o
z9|3>=N@rmEyj~$9J}?@q?msQ9&8f?g9h@o8TKx1x>ASR@>snr#xO(|O-){Y4~=XXV6Z+8ftIIlN8c2mBj&W
z-URKZzv>!Z>e%Qtxt&9gwb%M1
zTfRTl2811FIC70VcATR5x8z-HPF&yML-*?X1X1U=8l(%2RgS;h@j8+4W+7<57}Y!?
zzi!_6HSv{?d*&1IV4QFW3=i(+U|f`f`>p!Z*=fPU{IjwfIrp5_!_ZKninR(e{Vr2q
zz8f6g!KSY(ZSgY;{=C%9G-P|xV0*u1Ra
z=-e^K-$Mnb)C27J$Snt&MRi1T%k#(F`DSTIm-`ywTfn^xdIddiYXo?WxeS8KryxF{
zXaXe!e$>LgK_Zi`$Jy#{Ak}2loW@zXORY}Ee3iettw1h#
zF@iXoK!TPFAT{!K*Jx0M)%ljZAXbStMU*K1!n$?}f-lnbR2G$~rkzDFZmR4gKFNm{
zgU|o!yqZ%nWUy5qVV^K-IweT)+OoOoyB4J(Wu#FlG|js5k6$GZyGtFN-ucF~va)IU
z6`8mqvb^u=8)9FkP+YPbf6=D!j+nS35cT&~R47|ZH3d=cis-b3zMw~ro<4I`F?q@_
zK@7Z0Vl&bAL3C0;JAS;~?-HbD6JEvFIlq|;J&zC~Td#)CVJL5$Yj!oy8raLf3Gl5ypz)sxj3rMGjSl^
zhqtf#S(jPHsf6`wQA)g}3ZIxuoCM>Y6uL$}A=XhY5-NqpwG>t9qAu9Q-~#0L=dJ(Q
zKqp1NzjJg^y;R-xGjotm1Yj`|*`4lI+WB|TJVUq57>kfO4QE^C5cB)x@4YX=!wWVE
z!_>23PBEw7!m4tp
z%n2y2$ugPQUl&11NUuC|&KN=9YlS~^c_Q!blT(fLM{1u3|I5`0#Dg3zEVDiB`jwWu
zQi&o=Fqy)T9(iqsM=`>^eV>@$?474cu94(8oZ$Ba392`?R
z;~>EMK3~{%YQ5@5=Zu*C&re(eGhZe--&Ezg8(%MzQA-iW$GC`xRH2`g
z+Ar?&6c5ul;X2H_YI36vs7kZJR35Fw4bAOG}@o}
zsTDbMSpmlq{8KQ$I6U5j7l(EmhqCIq#WQXUP!RWSHk{&eUwZc21o9Zp!oJViT5X<-pzT$x|g$X^r5sa>U0RuZtz>|7Ld
zh`u>~QWqtd5l<`>pL`6+9JX(13S2u7=57%c#@%Dj_H?6sa)gf5Dj>|;z!mP2zTtqVQ!Y4d
zAV-cps_iJ@>d^2UB2SNXp$Xuj0f4&OrPo=FyCxd$8K&Xt#kgs`Eb33%_U;sS_d97p
zAb}l`r#Dz+?I?#vIqdhTUDr<{jnU60eMq0=7=bTs6gKBRsCQ~)d&=t_YwPY3A_zVo
zShf}?%Guzq#U(#YG#jUC9h$~d(jMJ!njfB0nKj{+O{w1Mo$uZllg(6WT^*F(w^N&&
z2$^k~5flQBa&3ohw$9u}MOL*H^%r=F_JI
zlwO!>p70;H;n|?F(<|_+s-kvXHj%Wrz}|ssdTG%soos1Bg(hpptQszx6og^O&qGZY
z$v$Sw^@md2Kdj;yE!tzhU}9=sVk%(5eltqm`Ktf4YN^39x_F6WMgUI^{(L(E7~C_~
J|ET8@^FJ>4w(tM|
literal 0
HcmV?d00001
diff --git a/modular_skyrat/modules/goofsec/icons/uniforms_worn_digi.dmi b/modular_skyrat/modules/goofsec/icons/uniforms_worn_digi.dmi
new file mode 100644
index 0000000000000000000000000000000000000000..934a079713ae3675671ffb07d562405355746e06
GIT binary patch
literal 2647
zcmbu>X*?9_9tZFl8iX-A30cCyAcP!aDKoY#A!Q0>${W8GDA2oRTA*B4G*I+xM>$;ZT+TC#j*Pt#L`CO0vo{K0#f!
zqChw|B|*JdUQP219)>T3!Q--42@}7#5@uj#w_8X0L2C+tOM-BkO2DHo0N`YbnUVg@
zFzk#`c&9l@o*yrj(TTbc2vQq!2K>mH;MkcT5dc;{O;63u(7etL9%F4
zfNm;$to(p6HPuL;9M`x@?b7^Q_YX?-%87x;&`O|BjAg0v-t9y&XV*Coze(j!hjHL7
zbBW_gv?^*eUu)641>IePcvY#odHHf^$lezs(6nw#m>3|jW{I=9-a@8ok7M{SB5_YM)8L4W%ewqH5DgvBRUjI^@BgZ;1;uJ9
z)Mvw4G7l$Z^a$uePP9F5Syr`bT)|HYd9~lrXHEkTz+vB*_JtP
zjyPDyh0~php`GIE%`}|Qq{(YePIxqb!LbTD`Y93N@0_`D-ylDS(Z$>+X~tECMjnxQ
zMr&Gd%K&<&)&d-R5R2%41At*KG4-u``C&{Cpq`BpnsbI!xwZ3n
z$8hE*%$;#tG{8Yi?|hxLfhDy+jc0wrLBz0_T{0&OxVfh}b-4+@hsY{2>qK7}dc@dI
zqJuP)ZXE{a5+E^dt>=7Zh$_cz`N7}+Ouq>JjovTB2f2RRSPlYB>u+Oeu(Xfd|Qb7!sdV_WHlNX%ys^O}H
zno696Yj;+n8fJtiUO9GLFpHOqcf8*$<(mDW`{tEO7elW^56-MpPv7ehSu#;Z0?UB0;tK4evH&izNSlDwgA?~{ucS`+`*#2TjR);V7jk43}6;wZb)_9{fA|hSHL$BM*
zKEu^>4Y15qWfq;k*Vm6K{(ZJ?*1WTFcy&IaZ$xXSn6U6A6Gfevhj_DBW}WmUwJ1pW
zBvfUWu|JstNo#EuHmIB_TEWyuuB^q5{kp&b>W!28!X=gioog_C=@M
zn<$P+Tf8X4Eh6od>%i^!Oe%IJVUbhnQ$IxCoi9y9=hxJz?06wp+r>aOu!sI>`sf=M
zEFyy6uA196d|7bM|QjS3RmFZr8YwzTLboj3mKWBoM22UB(-aR9cmB=L?yaf!T*gC3j0m~UY
zv$TGPW$<$dKaztL@pJ6*aLlxAB%p)y`o9A64V7@}@0ArXMQ;lzAi;|Iff}9XkgR=x
z?bs0XIYjc`Ed9ORGpNyVl+VbXa-+BH)H1woQ!X@$nkXCFmw&&V7IKgzM*Q5=d;DYK
z(ed_P*s7dKIrBo&0qCpx9(kZDOR2!}((elNP6XH3QI8cm?*_>E3>h(p#%?nsF)Z-Hb*td|!0ou<66yl
zcazY5#mJ@|95GtMFSA84RX3c}xJg_A(GqMjEghGG2ur)khk{xo;7mqR!~SRQ2^6Ji
zK*gu}M5z?b4%6FQ%>R|f{(!OOL7p0;4INFlE?cFx4RfoJmrni7$_!&D$Eu!sp8}BQ>0w9G}J4MD)m0*
zr(6$$Er)zR5jj@c@q*L!86#ESCd&&UcT2~2B~{I57V=XMM16FUJ-t|Q3wRC@C6Bui
zOuF(Gx`af2Ec4!h*X*`7K0IFdR&@B;LM-GN#D4+LWApt{pyL#Or>
z9&nVQ2JH4uZMtm^Z9f)G1c2
z_MskAKR#;ABv&3(Xca-{AjS8N92U
zj(jak#?YP?%o6n!5+UJs-Yi+c`HYyXEiGXfHlm9qI!DY}2L
dBmABT>Bml^8fb{wJ=lE$sjR
literal 0
HcmV?d00001
diff --git a/tgstation.dme b/tgstation.dme
index fb5459dc95b..7f0541e2d21 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7203,6 +7203,7 @@
#include "modular_skyrat\modules\goofsec\code\hud.dm"
#include "modular_skyrat\modules\goofsec\code\sec_clothing_overrides.dm"
#include "modular_skyrat\modules\goofsec\code\sol_fed.dm"
+#include "modular_skyrat\modules\goofsec\code\solfed_clothing.dm"
#include "modular_skyrat\modules\gun_safety\code\keybinding.dm"
#include "modular_skyrat\modules\gun_safety\code\safety_additions.dm"
#include "modular_skyrat\modules\gun_safety\code\safety_component.dm"
From ee7f872dd5a00ffd076c21b1273b531f7f85390f Mon Sep 17 00:00:00 2001
From: SkyratBot <59378654+SkyratBot@users.noreply.github.com>
Date: Wed, 20 Dec 2023 16:24:09 +0100
Subject: [PATCH 024/188] Automatic changelog for PR #25490 [ci skip]
---
html/changelogs/AutoChangeLog-pr-25490.yml | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 html/changelogs/AutoChangeLog-pr-25490.yml
diff --git a/html/changelogs/AutoChangeLog-pr-25490.yml b/html/changelogs/AutoChangeLog-pr-25490.yml
new file mode 100644
index 00000000000..aa19906705c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-25490.yml
@@ -0,0 +1,5 @@
+author: "Paxilmaniac"
+delete-after: True
+changes:
+ - balance: "SolFed response team equipment has been changed around a bit with the new armor and whatnot."
+ - image: "SolFed response teams (and cargo imports) can now see a new set of SolFed uniforms, one for peacekeepers and one for EMTs. No longer do they have to dress as wild west larpers, or half life HECU."
\ No newline at end of file
From 21b50f27383709803913d2f124b1e93d1c9e4164 Mon Sep 17 00:00:00 2001
From: Paxilmaniac <82386923+Paxilmaniac@users.noreply.github.com>
Date: Wed, 20 Dec 2023 10:25:29 -0500
Subject: [PATCH 025/188] Makes the arc welder sound a gazillion times better
(#25744)
the arc welder she told you not to worry about
---
.../colony_fabricator/code/tools/tools.dm | 7 +------
.../sound/arc_welder/arc_welder.ogg | Bin 0 -> 36944 bytes
.../colony_fabricator/sound/attributions.txt | 4 ++++
3 files changed, 5 insertions(+), 6 deletions(-)
create mode 100644 modular_skyrat/modules/colony_fabricator/sound/arc_welder/arc_welder.ogg
diff --git a/modular_skyrat/modules/colony_fabricator/code/tools/tools.dm b/modular_skyrat/modules/colony_fabricator/code/tools/tools.dm
index 554b8d3d3ff..604bf109b0e 100644
--- a/modular_skyrat/modules/colony_fabricator/code/tools/tools.dm
+++ b/modular_skyrat/modules/colony_fabricator/code/tools/tools.dm
@@ -134,12 +134,7 @@
but it still gets the job done and chances are you printed this bad boy off for free."
icon = 'modular_skyrat/modules/colony_fabricator/icons/tools.dmi'
icon_state = "arc_welder"
- usesound = list(
- 'modular_skyrat/modules/colony_fabricator/sound/arc_furnace/arc_furnace_mid_1.wav',
- 'modular_skyrat/modules/colony_fabricator/sound/arc_furnace/arc_furnace_mid_2.wav',
- 'modular_skyrat/modules/colony_fabricator/sound/arc_furnace/arc_furnace_mid_3.wav',
- 'modular_skyrat/modules/colony_fabricator/sound/arc_furnace/arc_furnace_mid_4.wav',
- )
+ usesound = 'modular_skyrat/modules/colony_fabricator/sound/arc_welder/arc_welder.ogg'
light_range = 2
light_power = 0.75
toolspeed = 1
diff --git a/modular_skyrat/modules/colony_fabricator/sound/arc_welder/arc_welder.ogg b/modular_skyrat/modules/colony_fabricator/sound/arc_welder/arc_welder.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..8c76738f0f473774d628569427556355e0622310
GIT binary patch
literal 36944
zcmagF1z40%*D!u>ur$&VOG@p+0=w)YAks)kcM4L{9R}zk9U@ZF-Q8gTD%}DCA_#~A
zim0Rt2>%;@&-*^l|NXw}{qAdacJ4VdXJ$^#nX|LHH*OdLP~czB_P|9;MTo_o^|Mm1cuaaqOfQRlJhtz@GH$#B69B*gq7ZpP(VB+q
znDh-6!35uYX%`)-GH%jX{bgzLm-_@}dNpFG9@|N|c!9Nlh*68x#B5=LqXy
zzcK0c?0;qCf7ihc&P55q>OiYRc7{G0RhsS#qWWi9+yD_=CZP6+QKNxzxB)r(nooB}
zM4y51T0+&(NZS~E0<28~9cKdrW&=aa(<3a~L(JPFEaxJue@0wqiTqdk6|(g6Ed5&WJb(riKw9?uAp3pzR1Nt0eMLzBQg{FWd8%L_((8*?
z^TYT1$%0AEUu7^wYjjWR+TG*=>-MB??oWFdlRSqjLMss0%WY!F@WkvnrDb9YplCi7E%1!LCKix{IU
z!H$abtiK#|A7fnwd5Idz=*`cV$n+c2pvo-yr*w-xi?pU<60Bog&!*{Py$-f>nam`u
zcxwjsHJ`{_EAL(@*HQ_PNrlGalM$0=jSH-V0C
zTOBRiLd;wLr7-`f&C+bZe`wB`ittJ&tg0u$|E)RsLJ1$F5-w;Y@tG$H+)BFddUS$NOqxqfW@SgA`%vxXlmBP>Z_QEjYIoT{
zh)G2&>;eD91a9h=rB)iBq{u+C2M6>4fQTKy_OSSlX$ |