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"