diff --git a/archive/maps/cynosure/cynosure-6.dmm b/archive/maps/cynosure/cynosure-6.dmm
index 7896b08d79c..a3eb55d4d60 100644
--- a/archive/maps/cynosure/cynosure-6.dmm
+++ b/archive/maps/cynosure/cynosure-6.dmm
@@ -814,8 +814,7 @@
},
/area/wizard_station)
"aRp" = (
-/obj/effect/step_trigger/teleporter/planetary_fall/sif,
-/turf/simulated/sky/moving/north,
+/turf/simulated/sky/moving/north/sif/planet_fall,
/area/space)
"aRw" = (
/obj/structure/window/reinforced/holowindow{
diff --git a/archive/maps/cynosure/turfs/outdoors.dm b/archive/maps/cynosure/turfs/outdoors.dm
index 192aaf53bcb..805539899db 100644
--- a/archive/maps/cynosure/turfs/outdoors.dm
+++ b/archive/maps/cynosure/turfs/outdoors.dm
@@ -178,4 +178,7 @@
oxygen = MOLES_O2SIF
nitrogen = MOLES_N2SIF
temperature = TEMPERATURE_SIF
- outdoors = OUTDOORS_YES
\ No newline at end of file
+ outdoors = OUTDOORS_YES
+
+/turf/simulated/sky/moving/north/sif/planet_fall/find_planet()
+ return planet_sif
diff --git a/archive/maps/southern_cross/southern_cross-7.dmm b/archive/maps/southern_cross/southern_cross-7.dmm
index 33f2c5110be..64768e6cf5f 100644
--- a/archive/maps/southern_cross/southern_cross-7.dmm
+++ b/archive/maps/southern_cross/southern_cross-7.dmm
@@ -115,7 +115,7 @@
"ck" = (/obj/effect/step_trigger/teleporter/landmark{landmark_id = "fall_sif"},/turf/simulated/sky/moving/north,/area/space)
"cl" = (/obj/effect/step_trigger/teleporter/landmark{landmark_id = "fall_sif"},/turf/simulated/sky/moving/south,/area/space)
"cm" = (/obj/effect/step_trigger/teleporter/landmark{landmark_id = "fall_sif"},/turf/simulated/sky/south,/area/space)
-"cn" = (/obj/effect/step_trigger/teleporter/planetary_fall/sif,/turf/simulated/sky/moving/north,/area/space)
+"cn" = (/turf/simulated/sky/moving/north/sif/planet_fall,/area/space)
"co" = (/obj/effect/landmark/teleport_mark{landmark_id = "fall_sif"},/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 2; name = "thrower_throwdown"; nostop = 1; stopper = 0; tiles = 0},/turf/simulated/sky/moving/north,/area/space)
"cp" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/simulated/sky/north,/area/space)
"cq" = (/obj/effect/step_trigger/thrower{direction = 1; name = "thrower_throwup"; nostop = 0; tiles = 0},/turf/simulated/sky/moving/north,/area/space)
diff --git a/archive/maps/southern_cross/turfs/outdoors.dm b/archive/maps/southern_cross/turfs/outdoors.dm
index 7f7b39fc4ac..a31e008d119 100644
--- a/archive/maps/southern_cross/turfs/outdoors.dm
+++ b/archive/maps/southern_cross/turfs/outdoors.dm
@@ -162,4 +162,4 @@
// Step trigger to fall down to planet Sif
/obj/effect/step_trigger/teleporter/planetary_fall/sif/find_planet()
- planet = planet_sif
\ No newline at end of file
+ planet = planet_sif
diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm
index b86bf25463f..acc74efbd0a 100644
--- a/code/game/objects/effects/step_triggers.dm
+++ b/code/game/objects/effects/step_triggers.dm
@@ -203,53 +203,20 @@ GLOBAL_LIST_EMPTY(tele_landmarks)
/obj/effect/step_trigger/teleporter/planetary_fall
var/datum/planet/planet = null
+
+/obj/effect/step_trigger/teleporter/planetary_fall/Destroy()
+ . = ..()
+ planet = null
+
// First time setup, which planet are we aiming for?
/obj/effect/step_trigger/teleporter/planetary_fall/proc/find_planet()
return
/obj/effect/step_trigger/teleporter/planetary_fall/Trigger(var/atom/movable/A)
- if(!planet)
- find_planet()
-
- if(planet)
- if(!planet.planet_floors.len)
- message_admins("ERROR: planetary_fall step trigger's list of outdoor floors was empty.")
- return
- var/turf/simulated/T = null
- var/safety = 100 // Infinite loop protection.
- while(!T && safety)
- var/turf/simulated/candidate = pick(planet.planet_floors)
- if(!istype(candidate) || istype(candidate, /turf/simulated/sky))
- safety--
- continue
- else if(candidate && !candidate.is_outdoors())
- safety--
- continue
- else
- T = candidate
- break
-
- if(!T)
- message_admins("ERROR: planetary_fall step trigger could not find a suitable landing turf.")
- return
-
- if(isobserver(A))
- A.forceMove(T) // Harmlessly move ghosts.
- return
- //VOREStation Edit Start
- if(!(A.can_fall()))
- return // Phased shifted kin should not fall
- //VOREStation Edit End
-
- A.forceMove(T)
- // Living things should probably be logged when they fall...
- if(isliving(A))
- message_admins("\The [A] fell out of the sky.")
- // ... because they're probably going to die from it.
- A.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this.
- else
- message_admins("ERROR: planetary_fall step trigger lacks a planet to fall onto.")
+ var/turf/T = get_turf(A)
+ if(!T)
return
+ T.trigger_fall(A, planet)
//Death
diff --git a/code/game/objects/items/weapons/capture_crystal.dm b/code/game/objects/items/weapons/capture_crystal.dm
index 3fdaf618c21..c6d55b0b1d9 100644
--- a/code/game/objects/items/weapons/capture_crystal.dm
+++ b/code/game/objects/items/weapons/capture_crystal.dm
@@ -44,7 +44,7 @@
if(isanimal(bound_mob))
. += span_notice("[bound_mob.health / bound_mob.maxHealth * 100]%")
if(bound_mob.ooc_notes)
- . += span_deptradio("OOC Notes:") + " \[View\] - \[Print\]"
+ . += span_deptradio("OOC Notes:") + " \[View\] - \[Print\]"
. += span_deptradio("\[Mechanical Vore Preferences\]")
//Command! This lets the owner toggle hostile on AI controlled mobs, or send a silent command message to your bound mob, wherever they may be.
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 1d593580356..f03c77770a5 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -172,8 +172,8 @@
M.inertia_dir = 0
else
M.inertia_dir = 0
-
..()
+
/turf/simulated/proc/handle_slipping(var/mob/living/M, var/slip_dist, var/dirtslip)
PRIVATE_PROC(TRUE)
if(!M || !slip_dist)
diff --git a/code/game/turfs/simulated/outdoors/sky_effect.dm b/code/game/turfs/simulated/outdoors/sky_effect.dm
new file mode 100644
index 00000000000..bf8294ae9dc
--- /dev/null
+++ b/code/game/turfs/simulated/outdoors/sky_effect.dm
@@ -0,0 +1,52 @@
+// Those turfs replace the fall from sky step striggers
+/turf/Entered(var/atom/movable/am, var/atom/old_loc)
+ ..()
+ if(!am.can_fall())
+ return
+ if(isliving(am))
+ var/mob/living/L = am
+ if(L.flying)
+ return
+ var/datum/planet/planet = find_planet()
+ if(!planet)
+ return
+ trigger_fall(am, planet)
+
+/turf/proc/trigger_fall(var/atom/movable/am, var/datum/planet/destination)
+ if(!destination)
+ message_admins("ERROR: planetary_fall step trigger lacks a planet to fall onto.")
+ return
+ if(!destination.planet_floors.len)
+ message_admins("ERROR: planetary_fall step trigger's list of outdoor floors was empty.")
+ return
+ var/turf/simulated/T = null
+ var/safety = 100 // Infinite loop protection.
+ while(!T && safety)
+ var/turf/simulated/candidate = pick(destination.planet_floors)
+ if(!istype(candidate) || istype(candidate, /turf/simulated/sky))
+ safety--
+ continue
+ else if(candidate && !candidate.is_outdoors())
+ safety--
+ continue
+ else
+ T = candidate
+ break
+
+ if(!T)
+ message_admins("ERROR: planetary_fall step trigger could not find a suitable landing turf.")
+ return
+
+ if(isobserver(am))
+ am.forceMove(T) // Harmlessly move ghosts.
+ return
+
+ am.forceMove(T)
+ // Living things should probably be logged when they fall...
+ if(isliving(am))
+ message_admins("\The [am] fell out of the sky.")
+ // ... because they're probably going to die from it.
+ am.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this.
+
+/turf/proc/find_planet()
+ return
diff --git a/code/modules/client/preferences/types/game/ui.dm b/code/modules/client/preferences/types/game/ui.dm
index cf50190be89..74bb412d1c6 100644
--- a/code/modules/client/preferences/types/game/ui.dm
+++ b/code/modules/client/preferences/types/game/ui.dm
@@ -36,7 +36,7 @@
/datum/preference/toggle/tgui_input_mode
category = PREFERENCE_CATEGORY_GAME_PREFERENCES
savefile_key = "tgui_input_mode"
- default_value = FALSE
+ default_value = TRUE
savefile_identifier = PREFERENCE_PLAYER
/datum/preference/toggle/tgui_large_buttons
diff --git a/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm
index 1d9bfbdd17a..692a581a569 100644
--- a/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm
+++ b/code/modules/mob/living/carbon/human/ai_controlled/ai_controlled.dm
@@ -41,7 +41,7 @@
if(generate_id_gender)
identifying_gender = pick(list(MALE, FEMALE, PLURAL, NEUTER))
- ..(loc, generate_species)
+ . = ..(mapload, generate_species)
species.produceCopy(species.traits.Copy(),src,null,FALSE)
diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm
index 24e93b6198e..ead0df0c150 100644
--- a/code/modules/nifsoft/nif.dm
+++ b/code/modules/nifsoft/nif.dm
@@ -156,7 +156,7 @@ You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable
return FALSE
/obj/item/nif/proc/quick_install(var/mob/living/carbon/human/H)
- if(!H) //Or letting them get deleted
+ if(QDELETED(H)) //Or letting them get deleted
return
if(H.mind)
owner = H.mind.name
diff --git a/code/modules/nifsoft/software/14_commlink.dm b/code/modules/nifsoft/software/14_commlink.dm
index f9d4ed8e475..def34c3e174 100644
--- a/code/modules/nifsoft/software/14_commlink.dm
+++ b/code/modules/nifsoft/software/14_commlink.dm
@@ -39,9 +39,9 @@
var/obj/item/nif/nif
var/datum/nifsoft/commlink/nifsoft
-/obj/item/communicator/commlink/New(var/newloc,var/soft)
- ..()
- nif = newloc
+/obj/item/communicator/commlink/Initialize(mapload, var/soft)
+ . = ..()
+ nif = loc
nifsoft = soft
/obj/item/communicator/commlink/Destroy()
diff --git a/maps/tether/submaps/tether_misc.dmm b/maps/tether/submaps/tether_misc.dmm
index 50dd87d839a..c8ed3c4ea37 100644
--- a/maps/tether/submaps/tether_misc.dmm
+++ b/maps/tether/submaps/tether_misc.dmm
@@ -678,8 +678,7 @@
/turf/unsimulated/wall,
/area/ai_multicam_room)
"ce" = (
-/obj/effect/step_trigger/teleporter/planetary_fall/virgo3b,
-/turf/space/transit/south,
+/turf/space/transit/south/virgo3b/planet_fall
/area/space)
"cf" = (
/turf/space/transit/south,
@@ -2319,8 +2318,7 @@
/turf/simulated/floor/holofloor/wood,
/area/holodeck/source_chess)
"oI" = (
-/obj/effect/step_trigger/teleporter/planetary_fall/virgo3b,
-/turf/space/transit/east,
+/turf/space/transit/east/virgo3b/planet_fall,
/area/space)
"oL" = (
/obj/effect/floor_decal/techfloor/orange{
@@ -2881,8 +2879,7 @@
/turf/simulated/floor/holofloor/wood,
/area/holodeck/source_chess)
"Lz" = (
-/obj/effect/step_trigger/teleporter/planetary_fall/virgo3b,
-/turf/simulated/sky/virgo3b/south,
+/turf/simulated/sky/virgo3b/south/planet_fall,
/area/space)
"Me" = (
/turf/simulated/floor/smole/desert,
diff --git a/maps/tether/tether_turfs.dm b/maps/tether/tether_turfs.dm
index b8c993c6e1b..be7d5b7dc4b 100644
--- a/maps/tether/tether_turfs.dm
+++ b/maps/tether/tether_turfs.dm
@@ -99,14 +99,18 @@
UpdateMineral()
update_icon()
-/turf/space/v3b_midpoint/Initialize(mapload)
- . = ..()
- new /obj/effect/step_trigger/teleporter/planetary_fall/virgo3b(src)
-
-/turf/space/v3b_midpoint/ChangeTurf(turf/N, tell_universe, force_lighting_update, preserve_outdoors)
- . = ..()
- for(var/obj/effect/step_trigger/teleporter/planetary_fall/virgo3b/F in src)
- qdel(F)
-
/turf/space/v3b_midpoint/CanZPass(atom, direction)
return 0 // We're not Space
+
+// Virgo 3b trufs
+/turf/space/transit/south/virgo3b/planet_fall/find_planet()
+ return planet_virgo3b
+
+/turf/space/transit/east/virgo3b/planet_fall/find_planet()
+ return planet_virgo3b
+
+/turf/simulated/sky/virgo3b/south/planet_fall/find_planet()
+ return planet_virgo3b
+
+/turf/space/v3b_midpoint/find_planet()
+ return planet_virgo3b
diff --git a/tgui/packages/tgui-dev-server/dreamseeker.ts b/tgui/packages/tgui-dev-server/dreamseeker.js
similarity index 90%
rename from tgui/packages/tgui-dev-server/dreamseeker.ts
rename to tgui/packages/tgui-dev-server/dreamseeker.js
index af95debedfa..d1ca2a9ac53 100644
--- a/tgui/packages/tgui-dev-server/dreamseeker.ts
+++ b/tgui/packages/tgui-dev-server/dreamseeker.js
@@ -16,10 +16,6 @@ const logger = createLogger('dreamseeker');
const instanceByPid = new Map();
export class DreamSeeker {
- pid: number;
- addr: string;
- client: any;
- static getInstancesByPids: (pids: any) => Promise;
constructor(pid, addr) {
this.pid = pid;
this.addr = addr;
@@ -41,8 +37,6 @@ export class DreamSeeker {
}
}
-type Entry = { pid: number; addr: string };
-
/**
* @param {number[]} pids
* @returns {DreamSeeker[]}
@@ -51,8 +45,8 @@ DreamSeeker.getInstancesByPids = async (pids) => {
if (process.platform !== 'win32') {
return [];
}
- const instances: any[] = [];
- const pidsToResolve: number[] = [];
+ const instances = [];
+ const pidsToResolve = [];
for (let pid of pids) {
const instance = instanceByPid.get(pid);
if (instance) {
@@ -70,7 +64,7 @@ DreamSeeker.getInstancesByPids = async (pids) => {
});
// Line format:
// proto addr mask mode pid
- const entries: Entry[] = [];
+ const entries = [];
const lines = stdout.split('\r\n');
for (let line of lines) {
const words = line.match(/\S+/g);
diff --git a/tgui/packages/tgui-dev-server/index.ts b/tgui/packages/tgui-dev-server/index.js
similarity index 100%
rename from tgui/packages/tgui-dev-server/index.ts
rename to tgui/packages/tgui-dev-server/index.js
diff --git a/tgui/packages/tgui-dev-server/link/retrace.ts b/tgui/packages/tgui-dev-server/link/retrace.js
similarity index 93%
rename from tgui/packages/tgui-dev-server/link/retrace.ts
rename to tgui/packages/tgui-dev-server/link/retrace.js
index 4deb7df38c5..083ddb37d1c 100644
--- a/tgui/packages/tgui-dev-server/link/retrace.ts
+++ b/tgui/packages/tgui-dev-server/link/retrace.js
@@ -16,15 +16,13 @@ const { parse: parseStackTrace } = require('stacktrace-parser');
const logger = createLogger('retrace');
-type SourceMapData = { file: string; consumer: any };
-
const { SourceMapConsumer } = SourceMap;
-const sourceMaps: SourceMapData[] = [];
+const sourceMaps = [];
export const loadSourceMaps = async (bundleDir) => {
// Destroy and garbage collect consumers
while (sourceMaps.length !== 0) {
- const { consumer } = sourceMaps.shift() as SourceMapData;
+ const { consumer } = sourceMaps.shift();
consumer.destroy();
}
// Load new sourcemaps
diff --git a/tgui/packages/tgui-dev-server/link/server.ts b/tgui/packages/tgui-dev-server/link/server.js
similarity index 97%
rename from tgui/packages/tgui-dev-server/link/server.ts
rename to tgui/packages/tgui-dev-server/link/server.js
index 45c5633b1e1..2a1f551bf6e 100644
--- a/tgui/packages/tgui-dev-server/link/server.ts
+++ b/tgui/packages/tgui-dev-server/link/server.js
@@ -22,11 +22,6 @@ export { loadSourceMaps };
export const setupLink = () => new LinkServer();
class LinkServer {
- wss: any;
- httpServer: http.Server<
- typeof http.IncomingMessage,
- typeof http.ServerResponse
- >;
constructor() {
logger.log('setting up');
this.wss = null;
diff --git a/tgui/packages/tgui-dev-server/logging.ts b/tgui/packages/tgui-dev-server/logging.js
similarity index 100%
rename from tgui/packages/tgui-dev-server/logging.ts
rename to tgui/packages/tgui-dev-server/logging.js
diff --git a/tgui/packages/tgui-dev-server/reloader.ts b/tgui/packages/tgui-dev-server/reloader.js
similarity index 95%
rename from tgui/packages/tgui-dev-server/reloader.ts
rename to tgui/packages/tgui-dev-server/reloader.js
index 7dc3cd9c6f9..cb477a6523b 100644
--- a/tgui/packages/tgui-dev-server/reloader.ts
+++ b/tgui/packages/tgui-dev-server/reloader.js
@@ -29,7 +29,7 @@ const SEARCH_LOCATIONS = [
`/mnt/c/Users/*/*/BYOND/cache`,
];
-let cacheRoot: string;
+let cacheRoot;
export const findCacheRoot = async () => {
if (cacheRoot) {
@@ -83,10 +83,9 @@ export const reloadByondCache = async (bundleDir) => {
return;
}
// Get dreamseeker instances
- const pids = cacheDirs.map((cacheDir) => {
- const ourDir = cacheDir.split('/cache/tmp').pop();
- return parseInt(ourDir ? ourDir : '', 10);
- });
+ const pids = cacheDirs.map((cacheDir) =>
+ parseInt(cacheDir.split('/cache/tmp').pop(), 10),
+ );
const dssPromise = DreamSeeker.getInstancesByPids(pids);
// Copy assets
const assets = await resolveGlob(
diff --git a/tgui/packages/tgui-dev-server/require.ts b/tgui/packages/tgui-dev-server/require.js
similarity index 100%
rename from tgui/packages/tgui-dev-server/require.ts
rename to tgui/packages/tgui-dev-server/require.js
diff --git a/tgui/packages/tgui-dev-server/util.ts b/tgui/packages/tgui-dev-server/util.js
similarity index 94%
rename from tgui/packages/tgui-dev-server/util.ts
rename to tgui/packages/tgui-dev-server/util.js
index 95258c63f91..13fbef3b21b 100644
--- a/tgui/packages/tgui-dev-server/util.ts
+++ b/tgui/packages/tgui-dev-server/util.js
@@ -22,7 +22,7 @@ export const resolveGlob = (...sections) => {
silent: true,
windowsPathsNoEscape: true,
});
- const safePaths: string[] = [];
+ const safePaths = [];
for (let path of unsafePaths) {
try {
fs.statSync(path);
diff --git a/tgui/packages/tgui-dev-server/webpack.ts b/tgui/packages/tgui-dev-server/webpack.js
similarity index 97%
rename from tgui/packages/tgui-dev-server/webpack.ts
rename to tgui/packages/tgui-dev-server/webpack.js
index 7aeb4c57c94..e4fbdeb9f1e 100644
--- a/tgui/packages/tgui-dev-server/webpack.ts
+++ b/tgui/packages/tgui-dev-server/webpack.js
@@ -26,9 +26,6 @@ export const createCompiler = async (options) => {
};
class WebpackCompiler {
- webpack: any;
- config: any;
- bundleDir: string;
async setup(options) {
// Create a require context that is relative to project root
// and retrieve all necessary dependencies.
diff --git a/tgui/packages/tgui-dev-server/winreg.ts b/tgui/packages/tgui-dev-server/winreg.js
similarity index 100%
rename from tgui/packages/tgui-dev-server/winreg.ts
rename to tgui/packages/tgui-dev-server/winreg.js
diff --git a/tgui/packages/tgui-panel/audio/NowPlayingWidget.tsx b/tgui/packages/tgui-panel/audio/NowPlayingWidget.tsx
index cb4e19ab11f..889dd19f55d 100644
--- a/tgui/packages/tgui-panel/audio/NowPlayingWidget.tsx
+++ b/tgui/packages/tgui-panel/audio/NowPlayingWidget.tsx
@@ -16,9 +16,10 @@ import { toFixed } from 'tgui-core/math';
import { useSettings } from '../settings';
import { selectAudio } from './selectors';
+import type { AudioState } from './types';
export const NowPlayingWidget = (props) => {
- const audio = useSelector(selectAudio),
+ const audio: AudioState = useSelector(selectAudio),
dispatch = useDispatch(),
settings = useSettings(),
title = audio.meta?.title,
@@ -27,7 +28,7 @@ export const NowPlayingWidget = (props) => {
upload_date = audio.meta?.upload_date || 'Unknown Date',
album = audio.meta?.album || 'Unknown Album',
duration = audio.meta?.duration,
- date = !isNaN(upload_date)
+ date = !isNaN(Number(upload_date))
? upload_date?.substring(0, 4) +
'-' +
upload_date?.substring(4, 6) +
diff --git a/tgui/packages/tgui-panel/audio/reducer.ts b/tgui/packages/tgui-panel/audio/reducer.ts
index 17684060ffb..2d6005c6d3b 100644
--- a/tgui/packages/tgui-panel/audio/reducer.ts
+++ b/tgui/packages/tgui-panel/audio/reducer.ts
@@ -4,7 +4,9 @@
* @license MIT
*/
-const initialState = {
+import type { AudioState } from './types';
+
+const initialState: AudioState = {
visible: false,
playing: false,
track: null,
diff --git a/tgui/packages/tgui-panel/audio/types.ts b/tgui/packages/tgui-panel/audio/types.ts
new file mode 100644
index 00000000000..0ca43480bb7
--- /dev/null
+++ b/tgui/packages/tgui-panel/audio/types.ts
@@ -0,0 +1,13 @@
+export type AudioState = {
+ visible: boolean;
+ playing: boolean;
+ track: null | string;
+ meta?: {
+ title: string;
+ link: string;
+ duration: number;
+ artist?: string;
+ upload_date?: string;
+ album?: string;
+ };
+};
diff --git a/tgui/packages/tgui-panel/chat/ChatTabs.tsx b/tgui/packages/tgui-panel/chat/ChatTabs.tsx
index d80be6eff32..5c2e9a59787 100644
--- a/tgui/packages/tgui-panel/chat/ChatTabs.tsx
+++ b/tgui/packages/tgui-panel/chat/ChatTabs.tsx
@@ -10,8 +10,9 @@ import { Box, Button, Stack, Tabs } from 'tgui-core/components';
import { openChatSettings } from '../settings/actions';
import { addChatPage, changeChatPage } from './actions';
import { selectChatPages, selectCurrentChatPage } from './selectors';
+import { Page } from './types';
-const UnreadCountWidget = ({ value }) => (
+const UnreadCountWidget = ({ value }: { value: number }) => (
{
- {pages.map((page) => (
+ {pages.map((page: Page) => (
r.keys().map((path) => r(path));
export const KitchenSink = (props: { panel: boolean }) => {
const { panel } = props;
- const [theme] = useState(undefined);
+ const [theme, setTheme] = useState(undefined);
const [pageIndex, setPageIndex] = useState(0);
const stories = getStories();
const story = stories[pageIndex];
@@ -48,7 +48,9 @@ export const KitchenSink = (props: { panel: boolean }) => {
- {story.meta.render()}
+
+ {story.meta.render(theme, setTheme)}
+
diff --git a/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.tsx b/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.tsx
index ed1c38ac169..047f9e4cfff 100644
--- a/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.tsx
+++ b/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.tsx
@@ -22,7 +22,15 @@ type Data = {
* All props can be redefined if you want custom behavior, but
* it's preferred to stick to defaults.
*/
-export const InterfaceLockNoticeBox = (props) => {
+export const InterfaceLockNoticeBox = (props: {
+ readonly siliconUser?: BooleanLike;
+ readonly locked?: BooleanLike;
+ readonly onLockStatusChange?: (status: BooleanLike) => void;
+ readonly accessText?: string;
+ readonly preventLocking?: BooleanLike;
+ readonly deny?: BooleanLike;
+ readonly denialMessage?: React.JSX.Element | string;
+}) => {
const { act, data } = useBackend();
const {
siliconUser = data.siliconUser,
@@ -30,7 +38,12 @@ export const InterfaceLockNoticeBox = (props) => {
onLockStatusChange = () => act('lock'),
accessText = 'an ID card',
preventLocking = data.preventLocking,
+ deny = false,
+ denialMessage = 'Error.',
} = props;
+ if (deny) {
+ return denialMessage;
+ }
// For silicon users
if (siliconUser) {
return (
diff --git a/tools/mapmerge2/requirements.txt b/tools/mapmerge2/requirements.txt
index 55ee9f719ea..0d0c95b2ffb 100644
--- a/tools/mapmerge2/requirements.txt
+++ b/tools/mapmerge2/requirements.txt
@@ -1,3 +1,3 @@
pygit2
-bidict==0.13.1
-Pillow==10.3.0
+bidict==0.22.1
+Pillow==11.0.0
diff --git a/vorestation.dme b/vorestation.dme
index 0b544053f31..f829908bcec 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1826,6 +1826,7 @@
#include "code\game\turfs\simulated\outdoors\ironsand_vr.dm"
#include "code\game\turfs\simulated\outdoors\outdoors.dm"
#include "code\game\turfs\simulated\outdoors\sky.dm"
+#include "code\game\turfs\simulated\outdoors\sky_effect.dm"
#include "code\game\turfs\simulated\outdoors\snow.dm"
#include "code\game\turfs\simulated\outdoors\survival_action_vr.dm"
#include "code\game\turfs\snow\snow.dm"