From 9cdddd4210a6ab1ade6ecfcc1530adb889609b67 Mon Sep 17 00:00:00 2001 From: Doubleumc Date: Tue, 19 Dec 2023 07:57:11 -0500 Subject: [PATCH 001/205] Projectile ref clears (#5164) # About the pull request Forgot to clear a reference I set in https://github.com/cmss13-devs/cmss13/pull/4986 and cleared some others I saw. Not familiar enough with the Destroy/QDEL pipeline to know what else, if anything, should be done with `weapon_cause_data` and `bullet_traits` since they hold references themselves. # Explain why it's good for the game I will clean up after myself. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog No player-facing changes. --- code/modules/projectiles/projectile.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index ef265e0b8095..d6191898c8c2 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -96,7 +96,10 @@ starting = null permutated = null path = null + vis_source = null + process_start_turf = null weapon_cause_data = null + bullet_traits = null firer = null QDEL_NULL(bound_beam) SSprojectiles.stop_projectile(src) From 8e5ff1efb1f35c7aae38b31eaa1dc6db0c5f7a18 Mon Sep 17 00:00:00 2001 From: Contrabang <91113370+Contrabang@users.noreply.github.com> Date: Tue, 19 Dec 2023 13:39:17 -0500 Subject: [PATCH 002/205] Fixes matches doing brute instead of burn when accidently burning yourself (#5243) # About the pull request Burning yourself when trying to start a match now does burn damage, instead of brute. # Explain why it's good for the game If the text says it burns ya, it should probably burn ya. # Testing Photographs and Procedure
Screenshots & Videos ouch ow my fingers, burnt
# Changelog :cl: fix: Matches now do burn damage instead of brute, when you accidently burn your own hand. /:cl: --- code/game/objects/items/storage/fancy.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 9afa0dfd1851..d12f09c2042e 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -302,7 +302,7 @@ if(istype(W) && !W.heat_source && !W.burnt) if(prob(burn_chance)) to_chat(user, SPAN_WARNING("\The [W] lights, but you burn your hand in the process! Ouch!")) - user.apply_damage(3, BRUTE, pick("r_hand", "l_hand")) + user.apply_damage(3, BURN, pick("r_hand", "l_hand")) if((user.pain.feels_pain) && prob(25)) user.emote("scream") W.light_match() From 308396378a15a6bc5f956245395db0aa52ed446b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 19 Dec 2023 18:50:17 +0000 Subject: [PATCH 003/205] Automatic changelog for PR #5243 [ci skip] --- html/changelogs/AutoChangeLog-pr-5243.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5243.yml diff --git a/html/changelogs/AutoChangeLog-pr-5243.yml b/html/changelogs/AutoChangeLog-pr-5243.yml new file mode 100644 index 000000000000..07bc1c732124 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5243.yml @@ -0,0 +1,4 @@ +author: "Contrabang" +delete-after: True +changes: + - bugfix: "Matches now do burn damage instead of brute, when you accidently burn your own hand." \ No newline at end of file From 99d2d6535acfb27a10b20f5af883c3ac2e87662c Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Tue, 19 Dec 2023 18:39:54 +0000 Subject: [PATCH 004/205] Adds closeother to USS Almayer doors. (#5235) # About the pull request As title. Turns out we've had the ability for a long time and never used it. Particularly useful in the Brig/CIC lobby. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: maptweak: Various doors around the Almayer will now close their opposites for better security. /:cl: --- maps/map_files/USS_Almayer/USS_Almayer.dmm | 89 ++++++++++++++++------ 1 file changed, 66 insertions(+), 23 deletions(-) diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index bf5663120e60..1c56dc0400ee 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -3320,7 +3320,8 @@ }, /obj/structure/machinery/door/airlock/almayer/security/glass/reinforced{ dir = 1; - name = "\improper Brig Maintenance" + name = "\improper Brig Maintenance"; + closeOtherId = "brigmaint_s" }, /obj/structure/machinery/door/poddoor/almayer/open{ id = "perma_lockdown_2"; @@ -7522,7 +7523,8 @@ name = "\improper Combat Information Center Blast Door" }, /obj/structure/machinery/door/airlock/almayer/command/reinforced{ - name = "\improper Combat Information Center" + name = "\improper Combat Information Center"; + closeOtherId = "ciclobby_n" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -8116,7 +8118,8 @@ }, /obj/structure/machinery/door/airlock/almayer/command/reinforced{ id_tag = "cic_exterior"; - name = "\improper Combat Information Center" + name = "\improper Combat Information Center"; + closeOtherId = "ciclobby_n" }, /obj/structure/machinery/door/poddoor/almayer/open{ dir = 4; @@ -24843,6 +24846,27 @@ icon_state = "red" }, /area/almayer/living/cryo_cells) +"ccc" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "W"; + pixel_x = -1 + }, +/obj/structure/machinery/door/airlock/almayer/research/reinforced{ + dir = 8; + name = "\improper Containment Airlock"; + closeOtherId = "containment_n" + }, +/obj/structure/machinery/door/poddoor/almayer/biohazard/white{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/medical/containment) "ccd" = ( /obj/structure/machinery/cm_vending/sorted/cargo_guns/squad_prep, /turf/open/floor/almayer{ @@ -26844,7 +26868,8 @@ access_modified = 1; name = "\improper Astronavigational Deck"; req_access = null; - req_one_access_txt = "3;19" + req_one_access_txt = "3;19"; + closeOtherId = "astroladder_n" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -26856,7 +26881,8 @@ access_modified = 1; name = "\improper Astronavigational Deck"; req_access = null; - req_one_access_txt = "3;19" + req_one_access_txt = "3;19"; + closeOtherId = "astroladder_s" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -29462,7 +29488,8 @@ dir = 1 }, /obj/structure/machinery/door/airlock/multi_tile/almayer/secdoor/glass/reinforced{ - name = "\improper Brig Lobby" + name = "\improper Brig Lobby"; + closeOtherId = "brignorth" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -29998,7 +30025,8 @@ }, /obj/structure/machinery/door/airlock/almayer/command/reinforced{ id_tag = "cic_exterior"; - name = "\improper Combat Information Center" + name = "\improper Combat Information Center"; + closeOtherId = "ciclobby_s" }, /obj/structure/machinery/door/poddoor/almayer/open{ dir = 4; @@ -33360,7 +33388,8 @@ "eKa" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/secdoor/glass/reinforced{ dir = 2; - name = "\improper Brig Lobby" + name = "\improper Brig Lobby"; + closeOtherId = "briglobby" }, /obj/structure/machinery/door/firedoor/border_only/almayer, /turf/open/floor/almayer{ @@ -39939,7 +39968,8 @@ dir = 4 }, /obj/structure/machinery/door/airlock/almayer/command/reinforced{ - name = "\improper Combat Information Center" + name = "\improper Combat Information Center"; + closeOtherId = "ciclobby_s" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -41546,7 +41576,8 @@ }, /obj/structure/machinery/door/airlock/almayer/security/glass/reinforced{ dir = 1; - name = "\improper Brig Prison Yard And Offices" + name = "\improper Brig Prison Yard And Offices"; + closeOtherId = "brigcells" }, /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -50405,7 +50436,8 @@ /area/almayer/hull/lower_hull/l_m_p) "lFJ" = ( /obj/structure/machinery/door/airlock/almayer/security/glass/reinforced{ - name = "\improper Brig Prisoner Yard" + name = "\improper Brig Prisoner Yard"; + closeOtherId = "brigcells" }, /obj/structure/disposalpipe/segment{ dir = 8 @@ -51047,7 +51079,8 @@ /area/almayer/hull/upper_hull/u_f_p) "lUm" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/secdoor/glass/reinforced{ - name = "\improper Brig Cells" + name = "\improper Brig Cells"; + closeOtherId = "briglobby" }, /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 1 @@ -52501,7 +52534,8 @@ access_modified = 1; name = "\improper Astronavigational Deck"; req_access = null; - req_one_access_txt = "3;19" + req_one_access_txt = "3;19"; + closeOtherId = "astroladder_n" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -57833,7 +57867,8 @@ }, /obj/structure/machinery/door/airlock/almayer/research/reinforced{ dir = 8; - name = "\improper Containment Airlock" + name = "\improper Containment Airlock"; + closeOtherId = "containment_n" }, /obj/structure/machinery/door/poddoor/almayer/biohazard/white{ dir = 4 @@ -61539,7 +61574,8 @@ }, /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/machinery/door/airlock/almayer/security/glass/reinforced{ - name = "\improper Brig" + name = "\improper Brig"; + closeOtherId = "brigmaint_n" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -64845,7 +64881,8 @@ /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/machinery/door/airlock/almayer/security/glass/reinforced{ dir = 1; - name = "\improper Warden's Office" + name = "\improper Warden's Office"; + closeOtherId = "brigwarden" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -66928,7 +66965,8 @@ dir = 2; name = "\improper Brig Armoury"; req_access = null; - req_one_access_txt = "1;3" + req_one_access_txt = "1;3"; + closeOtherId = "brignorth" }, /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -70316,7 +70354,8 @@ /area/almayer/hallways/aft_hallway) "tMH" = ( /obj/structure/machinery/door/airlock/almayer/security/glass/reinforced{ - name = "\improper Warden's Office" + name = "\improper Warden's Office"; + closeOtherId = "brigwarden" }, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ dir = 4; @@ -76333,7 +76372,8 @@ "wdo" = ( /obj/structure/machinery/door/airlock/almayer/research/reinforced{ dir = 8; - name = "\improper Containment Airlock" + name = "\improper Containment Airlock"; + closeOtherId = "containment_s" }, /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -77179,7 +77219,8 @@ name = "\improper Brig Medbay"; req_access = null; req_one_access = null; - req_one_access_txt = "20;3" + req_one_access_txt = "20;3"; + closeOtherId = "brigmed" }, /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -79122,7 +79163,8 @@ "xhM" = ( /obj/structure/machinery/door/airlock/almayer/security/glass/reinforced{ dir = 1; - name = "\improper Brig" + name = "\improper Brig"; + closeOtherId = "brigmaint_n" }, /obj/structure/machinery/door/poddoor/almayer/open{ id = "Brig Lockdown Shutters"; @@ -81974,7 +82016,8 @@ }, /obj/structure/machinery/door/airlock/almayer/research/reinforced{ dir = 8; - name = "\improper Containment Airlock" + name = "\improper Containment Airlock"; + closeOtherId = "containment_s" }, /obj/structure/machinery/door/poddoor/almayer/biohazard/white{ dir = 4 @@ -115166,7 +115209,7 @@ mSK mSK vOy vOy -ylc +ccc wKP ylc vOy From a6b67c5693f2aeb9e4ecd373f679a48483edb3b5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 19 Dec 2023 19:05:21 +0000 Subject: [PATCH 005/205] Automatic changelog for PR #5235 [ci skip] --- html/changelogs/AutoChangeLog-pr-5235.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5235.yml diff --git a/html/changelogs/AutoChangeLog-pr-5235.yml b/html/changelogs/AutoChangeLog-pr-5235.yml new file mode 100644 index 000000000000..1442f3b2437e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5235.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - maptweak: "Various doors around the Almayer will now close their opposites for better security." \ No newline at end of file From 2263280f518327b03dae7dcedfe1db3592147a1e Mon Sep 17 00:00:00 2001 From: ItsVyzo <46250991+ItsVyzo@users.noreply.github.com> Date: Tue, 19 Dec 2023 10:40:15 -0800 Subject: [PATCH 006/205] suspect sec records qol fix (#5230) # About the pull request Missed another code line for making suspects nardo gray instead of green # Explain why it's good for the game Makes it easier to distinguish suspects from innocents on sec records # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: LTNTS qol: makes suspect nardo gray /:cl: --- code/game/machinery/computer/security.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 9a08ab7bd566..e7626938549a 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -95,7 +95,7 @@ if("Released") background = "'background-color:#2981b3;'" if("Suspect") - background = "'background-color:#008743;'" + background = "'background-color:#686A6C;'" if("NJP") background = "'background-color:#faa20a;'" if("None") From c8baa27f0e4b3f01cbcb9290f5d116f1ad9f5047 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 19 Dec 2023 19:19:14 +0000 Subject: [PATCH 007/205] Automatic changelog for PR #5230 [ci skip] --- html/changelogs/AutoChangeLog-pr-5230.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5230.yml diff --git a/html/changelogs/AutoChangeLog-pr-5230.yml b/html/changelogs/AutoChangeLog-pr-5230.yml new file mode 100644 index 000000000000..5c3ba51b1edb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5230.yml @@ -0,0 +1,4 @@ +author: "LTNTS" +delete-after: True +changes: + - qol: "makes suspect nardo gray" \ No newline at end of file From f733a560483b92712551438b3f0cf9512e307a12 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Tue, 19 Dec 2023 21:09:54 +0000 Subject: [PATCH 008/205] Hive UI pylon crash fix (#5249) # About the pull request This is a ref not a new list so we remove huggers/lessers etc from the hive and crash the UI every time the pylon calls `give_larva()` Big credit to Fira for doing most of the work on finding this. ![Discord_2023-12-18_21-31-58](https://github.com/cmss13-devs/cmss13/assets/25027759/afb25591-1bef-4ef2-9c04-3ddaec945fde) # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Birdtalon, Fira fix: Fixes hive UI crash upon pylon giving new larva. /:cl: --- code/modules/cm_aliens/structures/special/pylon_core.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm index d62db4947b95..2350ecfa4462 100644 --- a/code/modules/cm_aliens/structures/special/pylon_core.dm +++ b/code/modules/cm_aliens/structures/special/pylon_core.dm @@ -190,7 +190,7 @@ if(!linked_hive.hive_location || !linked_hive.living_xeno_queen) return - var/list/hive_xenos = linked_hive.totalXenos + var/list/hive_xenos = linked_hive.totalXenos.Copy() for(var/mob/living/carbon/xenomorph/xeno in hive_xenos) if(!xeno.counts_for_slots) From 34ced12830f031c1f36695b5e3e65266ce54fa2a Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 19 Dec 2023 21:18:23 +0000 Subject: [PATCH 009/205] Automatic changelog for PR #5249 [ci skip] --- html/changelogs/AutoChangeLog-pr-5249.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5249.yml diff --git a/html/changelogs/AutoChangeLog-pr-5249.yml b/html/changelogs/AutoChangeLog-pr-5249.yml new file mode 100644 index 000000000000..ec0404cb997b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5249.yml @@ -0,0 +1,4 @@ +author: "Birdtalon, Fira" +delete-after: True +changes: + - bugfix: "Fixes hive UI crash upon pylon giving new larva." \ No newline at end of file From 03292967e4c0ce138e3e04e202c85190326f70cc Mon Sep 17 00:00:00 2001 From: InsaneRed <47158596+InsaneRed@users.noreply.github.com> Date: Wed, 20 Dec 2023 01:21:44 +0300 Subject: [PATCH 010/205] You/We fixes (#5240) # About the pull request Fixes up a few overlooked things # Explain why it's good for the game consistency # Testing Photographs and Procedure
Screenshots & Videos it ran on my pc
# Changelog :cl: spellcheck: Converted more "YOU" to "WE" for xenomorphs. /:cl: --------- Co-authored-by: InsaneRed --- code/modules/cm_aliens/structures/egg.dm | 10 ++++---- code/modules/cm_aliens/structures/tunnel.dm | 24 +++++++++---------- .../living/carbon/xenomorph/castes/Crusher.dm | 16 ++++++------- .../strains/hivelord/resin_whisperer.dm | 6 ++--- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/code/modules/cm_aliens/structures/egg.dm b/code/modules/cm_aliens/structures/egg.dm index edb86c204558..5b0654d05b55 100644 --- a/code/modules/cm_aliens/structures/egg.dm +++ b/code/modules/cm_aliens/structures/egg.dm @@ -49,7 +49,7 @@ if(status == EGG_BURST || status == EGG_DESTROYED) M.animation_attack_on(src) M.visible_message(SPAN_XENONOTICE("[M] clears the hatched egg."), \ - SPAN_XENONOTICE("You clear the hatched egg.")) + SPAN_XENONOTICE("We clear the hatched egg.")) playsound(src.loc, "alien_resin_break", 25) qdel(src) return XENO_NONCOMBAT_ACTION @@ -57,7 +57,7 @@ if(M.hivenumber != hivenumber) M.animation_attack_on(src) M.visible_message(SPAN_XENOWARNING("[M] crushes \the [src]"), - SPAN_XENOWARNING("You crush \the [src]")) + SPAN_XENOWARNING("We crush \the [src]")) Burst(TRUE) return XENO_ATTACK_ACTION @@ -70,9 +70,9 @@ return XENO_NO_DELAY_ACTION if(EGG_GROWN) if(islarva(M)) - to_chat(M, SPAN_XENOWARNING("You nudge the egg, but nothing happens.")) + to_chat(M, SPAN_XENOWARNING("We nudge the egg, but nothing happens.")) return - to_chat(M, SPAN_XENONOTICE("You retrieve the child.")) + to_chat(M, SPAN_XENONOTICE("We retrieve the child.")) Burst(FALSE) return XENO_NONCOMBAT_ACTION @@ -186,7 +186,7 @@ if(EGG_BURST) if(user) visible_message(SPAN_XENOWARNING("[user] slides [F] back into [src]."), \ - SPAN_XENONOTICE("You place the child back in to [src].")) + SPAN_XENONOTICE("We place the child back in to [src].")) user.temp_drop_inv_item(F) else visible_message(SPAN_XENOWARNING("[F] crawls back into [src]!")) //Not sure how, but let's roll with it for now. diff --git a/code/modules/cm_aliens/structures/tunnel.dm b/code/modules/cm_aliens/structures/tunnel.dm index 8c467be695b4..1f0f98c14361 100644 --- a/code/modules/cm_aliens/structures/tunnel.dm +++ b/code/modules/cm_aliens/structures/tunnel.dm @@ -147,7 +147,7 @@ //No teleporting! return FALSE - to_chat(X, SPAN_XENONOTICE("You begin moving to your destination.")) + to_chat(X, SPAN_XENONOTICE("We begin moving to our destination.")) var/tunnel_time = TUNNEL_MOVEMENT_XENO_DELAY @@ -165,11 +165,11 @@ to_chat(X, SPAN_WARNING("The tunnel is too crowded, wait for others to exit!")) return FALSE if(!T.loc) - to_chat(X, SPAN_WARNING("The tunnel has collapsed before you reached its exit!")) + to_chat(X, SPAN_WARNING("The tunnel has collapsed before we reached its exit!")) return FALSE X.forceMove(T) - to_chat(X, SPAN_XENONOTICE("You have reached your destination.")) + to_chat(X, SPAN_XENONOTICE("We have reached our destination.")) return TRUE /obj/structure/tunnel/proc/exit_tunnel(mob/living/carbon/xenomorph/X) @@ -177,7 +177,7 @@ if(X in contents) X.forceMove(loc) visible_message(SPAN_XENONOTICE("\The [X] pops out of the tunnel!"), \ - SPAN_XENONOTICE("You pop out through the other side!")) + SPAN_XENONOTICE("We pop out through the other side!")) return TRUE //Used for controling tunnel exiting and returning @@ -200,15 +200,15 @@ if(!isfriendly(M)) if(M.mob_size < MOB_SIZE_BIG) - to_chat(M, SPAN_XENOWARNING("You aren't large enough to collapse this tunnel!")) + to_chat(M, SPAN_XENOWARNING("We aren't large enough to collapse this tunnel!")) return XENO_NO_DELAY_ACTION M.visible_message(SPAN_XENODANGER("[M] begins to fill [src] with dirt."),\ - SPAN_XENONOTICE("You begin to fill [src] with dirt using your massive claws."), max_distance = 3) + SPAN_XENONOTICE("We begin to fill [src] with dirt using our massive claws."), max_distance = 3) xeno_attack_delay(M) if(!do_after(M, 10 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE, src, INTERRUPT_ALL_OUT_OF_RANGE, max_dist = 1)) - to_chat(M, SPAN_XENOWARNING("You decide not to cave the tunnel in.")) + to_chat(M, SPAN_XENOWARNING("We decide not to cave the tunnel in.")) return XENO_NO_DELAY_ACTION src.visible_message(SPAN_XENODANGER("[src] caves in!"), max_distance = 3) @@ -217,7 +217,7 @@ return XENO_NO_DELAY_ACTION if(M.anchored) - to_chat(M, SPAN_XENOWARNING("You can't climb through a tunnel while immobile.")) + to_chat(M, SPAN_XENOWARNING("We can't climb through a tunnel while immobile.")) return XENO_NO_DELAY_ACTION if(!hive.tunnels.len) @@ -237,14 +237,14 @@ if(M.mob_size >= MOB_SIZE_BIG) M.visible_message(SPAN_XENONOTICE("[M] begins heaving their huge bulk down into \the [src]."), \ - SPAN_XENONOTICE("You begin heaving your monstrous bulk into \the [src].")) + SPAN_XENONOTICE("We begin heaving our monstrous bulk into \the [src].")) else M.visible_message(SPAN_XENONOTICE("\The [M] begins crawling down into \the [src]."), \ - SPAN_XENONOTICE("You begin crawling down into \the [src].")) + SPAN_XENONOTICE("We begin crawling down into \the [src].")) xeno_attack_delay(M) if(!do_after(M, tunnel_time, INTERRUPT_NO_NEEDHAND, BUSY_ICON_GENERIC)) - to_chat(M, SPAN_WARNING("Your crawling was interrupted!")) + to_chat(M, SPAN_WARNING("Our crawling was interrupted!")) return XENO_NO_DELAY_ACTION if(hive.tunnels.len) //Make sure other tunnels exist @@ -252,7 +252,7 @@ to_chat(M, SPAN_HIGHDANGER("Alt + Click the tunnel to exit, Ctrl + Click to choose a destination.")) pick_tunnel(M) else - to_chat(M, SPAN_WARNING("\The [src] ended unexpectedly, so you return back up.")) + to_chat(M, SPAN_WARNING("\The [src] ended unexpectedly, so we return back up.")) return XENO_NO_DELAY_ACTION /obj/structure/tunnel/maint_tunnel diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm b/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm index 64dfd021f894..d2c0b0e40e59 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Crusher.dm @@ -81,21 +81,21 @@ //Barricade collision else if (istype(target, /obj/structure/barricade)) var/obj/structure/barricade/B = target - visible_message(SPAN_DANGER("[src] rams into [B] and skids to a halt!"), SPAN_XENOWARNING("You ram into [B] and skid to a halt!")) + visible_message(SPAN_DANGER("[src] rams into [B] and skids to a halt!"), SPAN_XENOWARNING("We ram into [B] and skid to a halt!")) B.Collided(src) . = FALSE else if (istype(target, /obj/vehicle/multitile)) var/obj/vehicle/multitile/M = target - visible_message(SPAN_DANGER("[src] rams into [M] and skids to a halt!"), SPAN_XENOWARNING("You ram into [M] and skid to a halt!")) + visible_message(SPAN_DANGER("[src] rams into [M] and skids to a halt!"), SPAN_XENOWARNING("We ram into [M] and skid to a halt!")) M.Collided(src) . = FALSE else if (istype(target, /obj/structure/machinery/m56d_hmg)) var/obj/structure/machinery/m56d_hmg/HMG = target - visible_message(SPAN_DANGER("[src] rams [HMG]!"), SPAN_XENODANGER("You ram [HMG]!")) + visible_message(SPAN_DANGER("[src] rams [HMG]!"), SPAN_XENODANGER("We ram [HMG]!")) playsound(loc, "punch", 25, 1) HMG.CrusherImpact() . = FALSE @@ -132,7 +132,7 @@ else if (istype(target, /obj/structure/machinery/defenses)) var/obj/structure/machinery/defenses/DF = target - visible_message(SPAN_DANGER("[src] rams [DF]!"), SPAN_XENODANGER("You ram [DF]!")) + visible_message(SPAN_DANGER("[src] rams [DF]!"), SPAN_XENODANGER("We ram [DF]!")) if (!DF.unacidable) playsound(loc, "punch", 25, 1) @@ -148,7 +148,7 @@ if (V.unslashable) . = FALSE else - visible_message(SPAN_DANGER("[src] smashes straight into [V]!"), SPAN_XENODANGER("You smash straight into [V]!")) + visible_message(SPAN_DANGER("[src] smashes straight into [V]!"), SPAN_XENODANGER("We smash straight into [V]!")) playsound(loc, "punch", 25, 1) V.tip_over() @@ -165,7 +165,7 @@ if (V.unslashable) . = FALSE else - visible_message(SPAN_DANGER("[src] smashes straight into [V]!"), SPAN_XENODANGER("You smash straight into [V]!")) + visible_message(SPAN_DANGER("[src] smashes straight into [V]!"), SPAN_XENODANGER("We smash straight into [V]!")) playsound(loc, "punch", 25, 1) V.tip_over() @@ -184,7 +184,7 @@ if (O.unacidable) . = FALSE else if (O.anchored) - visible_message(SPAN_DANGER("[src] crushes [O]!"), SPAN_XENODANGER("You crush [O]!")) + visible_message(SPAN_DANGER("[src] crushes [O]!"), SPAN_XENODANGER("We crush [O]!")) if(O.contents.len) //Hopefully won't auto-delete things inside crushed stuff. var/turf/T = get_turf(src) for(var/atom/movable/S in T.contents) S.forceMove(T) @@ -195,7 +195,7 @@ else if(O.buckled_mob) O.unbuckle() - visible_message(SPAN_WARNING("[src] knocks [O] aside!"), SPAN_XENOWARNING("You knock [O] aside.")) //Canisters, crates etc. go flying. + visible_message(SPAN_WARNING("[src] knocks [O] aside!"), SPAN_XENOWARNING("We knock [O] aside.")) //Canisters, crates etc. go flying. playsound(loc, "punch", 25, 1) var/impact_range = 2 diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/hivelord/resin_whisperer.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/hivelord/resin_whisperer.dm index 3200fd0da4a1..3653209b78f2 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/hivelord/resin_whisperer.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/hivelord/resin_whisperer.dm @@ -90,9 +90,9 @@ var/obj/structure/mineral_door/resin/resin_door = target_atom resin_door.TryToSwitchState(owner) if(resin_door.state) - to_chat(owner, SPAN_XENONOTICE("You focus your connection to the resin and remotely close the resin door.")) + to_chat(owner, SPAN_XENONOTICE("We focus our connection to the resin and remotely close the resin door.")) else - to_chat(owner, SPAN_XENONOTICE("You focus your connection to the resin and remotely open the resin door.")) + to_chat(owner, SPAN_XENONOTICE("We focus our connection to the resin and remotely open the resin door.")) return // since actions are instanced per hivelord, and only one construction can be made at a time, tweaking the datum on the fly here is fine. you're going to have to figure something out if these conditions change, though @@ -111,7 +111,7 @@ var/datum/resin_construction/resing_construction = GLOB.resin_constructions_list[hivelord.selected_resin] target_turf.visible_message(SPAN_XENONOTICE("The weeds begin pulsating wildly and secrete resin in the shape of \a [resing_construction.construction_name]!"), null, 5) - to_chat(owner, SPAN_XENONOTICE("You focus your plasma into the weeds below you and force the weeds to secrete resin in the shape of \a [resing_construction.construction_name].")) + to_chat(owner, SPAN_XENONOTICE("We focus our plasma into the weeds below us and force the weeds to secrete resin in the shape of \a [resing_construction.construction_name].")) playsound(target_turf, "alien_resin_build", 25) return TRUE From f28e9294cb573a5a8a19c3b620a33ee78c775e0e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 19 Dec 2023 22:30:22 +0000 Subject: [PATCH 011/205] Automatic changelog for PR #5240 [ci skip] --- html/changelogs/AutoChangeLog-pr-5240.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5240.yml diff --git a/html/changelogs/AutoChangeLog-pr-5240.yml b/html/changelogs/AutoChangeLog-pr-5240.yml new file mode 100644 index 000000000000..d600d5d9acf2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5240.yml @@ -0,0 +1,4 @@ +author: "InsaneRed" +delete-after: True +changes: + - spellcheck: "Converted more \"YOU\" to \"WE\" for xenomorphs." \ No newline at end of file From 92c1793b233955ef8bcd0eaee139736d340c374e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 20 Dec 2023 00:58:35 +0000 Subject: [PATCH 012/205] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-4842.yml | 12 ---------- html/changelogs/AutoChangeLog-pr-5230.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5235.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5240.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5243.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5249.yml | 4 ---- html/changelogs/archive/2023-12.yml | 29 +++++++++++++++++++++++ 7 files changed, 29 insertions(+), 32 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4842.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5230.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5235.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5240.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5243.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5249.yml diff --git a/html/changelogs/AutoChangeLog-pr-4842.yml b/html/changelogs/AutoChangeLog-pr-4842.yml deleted file mode 100644 index 6c1c16a996b3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4842.yml +++ /dev/null @@ -1,12 +0,0 @@ -author: "fira" -delete-after: True -changes: - - rscadd: "Added Buckled, Handcuffed and Legcuffed screen alerts" - - code_imp: "Ported /tg/ status effects backend, modified with timers to let effects end at appropriate time" - - code_imp: "Stun, Knockdown and Knockout now use the new effects backend" - - balance: "Due to backend change, all KO/KD/Stuns may behave differently timing wise. This is of course subject to adjustments." - - balance: "Endurance is now set at 8% effect duration reduction per level above 1. However it now compounds with species bonus. Feel free to adjust." - - balance: "Knockdowns are not inherently incapacitating anymore and many sources of it have been updated to also stun to make up for it." - - bugfix: "KO/KD/Stuns do not artificially and randomly ''stack'' due to incorrect timer offset calculation anymore." - - bugfix: "Stuns now correctly apply Stun reduction values instead of Knockdown reductions." - - bugfix: "Crawling can now be interrupted by a normal move, if you are fit enough to do so." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5230.yml b/html/changelogs/AutoChangeLog-pr-5230.yml deleted file mode 100644 index 5c3ba51b1edb..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5230.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "LTNTS" -delete-after: True -changes: - - qol: "makes suspect nardo gray" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5235.yml b/html/changelogs/AutoChangeLog-pr-5235.yml deleted file mode 100644 index 1442f3b2437e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5235.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - maptweak: "Various doors around the Almayer will now close their opposites for better security." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5240.yml b/html/changelogs/AutoChangeLog-pr-5240.yml deleted file mode 100644 index d600d5d9acf2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5240.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "InsaneRed" -delete-after: True -changes: - - spellcheck: "Converted more \"YOU\" to \"WE\" for xenomorphs." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5243.yml b/html/changelogs/AutoChangeLog-pr-5243.yml deleted file mode 100644 index 07bc1c732124..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5243.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Contrabang" -delete-after: True -changes: - - bugfix: "Matches now do burn damage instead of brute, when you accidently burn your own hand." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5249.yml b/html/changelogs/AutoChangeLog-pr-5249.yml deleted file mode 100644 index ec0404cb997b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5249.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon, Fira" -delete-after: True -changes: - - bugfix: "Fixes hive UI crash upon pylon giving new larva." \ No newline at end of file diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml index 4a882e76a8d1..b0bde6fe0753 100644 --- a/html/changelogs/archive/2023-12.yml +++ b/html/changelogs/archive/2023-12.yml @@ -374,3 +374,32 @@ - bugfix: Escape-pod stasis bays no longer accept corpses. stalkerino: - balance: fixes the balance of the game by making hair gradient trait free +2023-12-20: + Birdtalon, Fira: + - bugfix: Fixes hive UI crash upon pylon giving new larva. + Contrabang: + - bugfix: Matches now do burn damage instead of brute, when you accidently burn + your own hand. + InsaneRed: + - spellcheck: Converted more "YOU" to "WE" for xenomorphs. + LTNTS: + - qol: makes suspect nardo gray + fira: + - rscadd: Added Buckled, Handcuffed and Legcuffed screen alerts + - code_imp: Ported /tg/ status effects backend, modified with timers to let effects + end at appropriate time + - code_imp: Stun, Knockdown and Knockout now use the new effects backend + - balance: Due to backend change, all KO/KD/Stuns may behave differently timing + wise. This is of course subject to adjustments. + - balance: Endurance is now set at 8% effect duration reduction per level above + 1. However it now compounds with species bonus. Feel free to adjust. + - balance: Knockdowns are not inherently incapacitating anymore and many sources + of it have been updated to also stun to make up for it. + - bugfix: KO/KD/Stuns do not artificially and randomly ''stack'' due to incorrect + timer offset calculation anymore. + - bugfix: Stuns now correctly apply Stun reduction values instead of Knockdown reductions. + - bugfix: Crawling can now be interrupted by a normal move, if you are fit enough + to do so. + realforest2001: + - maptweak: Various doors around the Almayer will now close their opposites for + better security. From 60ddbd4d1f17b0adef4c1023877a74b753b43dcc Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Wed, 20 Dec 2023 12:02:58 +0000 Subject: [PATCH 013/205] Fixes lurker tail stab over ledges and window frames (#5160) # About the pull request Fixes lurker tail stab not being usable over window frames and ledges. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Lurker can tail jab over ledges and window frames. /:cl: --- .../living/carbon/xenomorph/abilities/lurker/lurker_powers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm index 69f869387068..4ec301a17819 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_powers.dm @@ -208,7 +208,7 @@ xeno.visible_message(SPAN_XENOWARNING("\The [xeno] strikes the window with their tail!"), SPAN_XENOWARNING("We strike the window with our tail!")) apply_cooldown(cooldown_modifier = 0.5) return - if(current_structure.density) + if(current_structure.density && !current_structure.throwpass) to_chat(xeno, SPAN_WARNING("There's something blocking us from striking!")) return From 7917dec240aaeb8085877e55f009d17d8e07069a Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 20 Dec 2023 12:14:59 +0000 Subject: [PATCH 014/205] Automatic changelog for PR #5160 [ci skip] --- html/changelogs/AutoChangeLog-pr-5160.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5160.yml diff --git a/html/changelogs/AutoChangeLog-pr-5160.yml b/html/changelogs/AutoChangeLog-pr-5160.yml new file mode 100644 index 000000000000..730a2bc41181 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5160.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - bugfix: "Lurker can tail jab over ledges and window frames." \ No newline at end of file From 4a29849b40aa24457f77034bd345016f597158e2 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Wed, 20 Dec 2023 06:12:28 -0800 Subject: [PATCH 015/205] Update weeded warrior sprites (#5250) # About the pull request This PR is a followup to #5214 to fix the weeded warrior sprites that didn't get updated. # Explain why it's good for the game Fixes this: ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/78a98ca3-7d6d-4a5d-a57a-e67e69e6ee58) # Testing Photographs and Procedure ![warrior](https://github.com/cmss13-devs/cmss13/assets/76988376/f7b7f547-66c0-447a-b290-c37b96f67f2b) # Changelog :cl: Drathek imageadd: Update weeded warrior sprites to be compatible with knight strain sprite /:cl: --- icons/mob/xenos/weeds_64x64.dmi | Bin 28551 -> 32998 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/xenos/weeds_64x64.dmi b/icons/mob/xenos/weeds_64x64.dmi index 43d92fc4a8ac5403159d8cdbba093b3916f4f8b5..26a31eb0fc607feebfb0992994b8cfe308a8cc54 100644 GIT binary patch literal 32998 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 literal 28551 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

lZh~wu;FK4 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 B`cnV^ From f94b1387dac12e62d722b1ce926692ee79fa59d6 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 20 Dec 2023 14:23:14 +0000 Subject: [PATCH 016/205] Automatic changelog for PR #5250 [ci skip] --- html/changelogs/AutoChangeLog-pr-5250.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5250.yml diff --git a/html/changelogs/AutoChangeLog-pr-5250.yml b/html/changelogs/AutoChangeLog-pr-5250.yml new file mode 100644 index 000000000000..a2229e1fa453 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5250.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - imageadd: "Update weeded warrior sprites to be compatible with knight strain sprite" \ No newline at end of file From 72282fbe47e217181c185f2de52ab898db22df1f Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Wed, 20 Dec 2023 06:18:15 -0800 Subject: [PATCH 017/205] Eslint Setting Change (#5256) # About the pull request This is merely to address VSC's ESlint extension being so aggressive about forcing this setting change. # Explain why it's good for the game N/A # Testing Photographs and Procedure N/A # Changelog No player facing changes. --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 201562aaf7c7..c7b218b77591 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,7 @@ "**/.pnp.*": true }, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" }, "files.eol": "\n", "files.insertFinalNewline": true, From 06af79c1f5d029c22b503b2fb4f02933b75d6784 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 21 Dec 2023 01:10:22 +0000 Subject: [PATCH 018/205] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5160.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5250.yml | 4 ---- html/changelogs/archive/2023-12.yml | 5 +++++ 3 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5160.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5250.yml diff --git a/html/changelogs/AutoChangeLog-pr-5160.yml b/html/changelogs/AutoChangeLog-pr-5160.yml deleted file mode 100644 index 730a2bc41181..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5160.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - bugfix: "Lurker can tail jab over ledges and window frames." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5250.yml b/html/changelogs/AutoChangeLog-pr-5250.yml deleted file mode 100644 index a2229e1fa453..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5250.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - imageadd: "Update weeded warrior sprites to be compatible with knight strain sprite" \ No newline at end of file diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml index b0bde6fe0753..2e420ea0d778 100644 --- a/html/changelogs/archive/2023-12.yml +++ b/html/changelogs/archive/2023-12.yml @@ -403,3 +403,8 @@ realforest2001: - maptweak: Various doors around the Almayer will now close their opposites for better security. +2023-12-21: + Birdtalon: + - bugfix: Lurker can tail jab over ledges and window frames. + Drathek: + - imageadd: Update weeded warrior sprites to be compatible with knight strain sprite From 5057f4e286e1ede1e3d850254c9cf63fb3e365de Mon Sep 17 00:00:00 2001 From: Ben <91219575+Ben10083@users.noreply.github.com> Date: Wed, 20 Dec 2023 21:23:07 -0500 Subject: [PATCH 019/205] Working Joes can no longer Drink (#5259) # About the pull request Removes ability for Working Joes to drink # Explain why it's good for the game Oversight, they were already prevented from eating (#3828), but not drinking, same logic as why they cannot drink can be applied here. # Testing Photographs and Procedure ![image](https://github.com/cmss13-devs/cmss13/assets/91219575/db8a6709-106b-460b-ac8c-30a8926ecb07)

# Changelog :cl: del: Working Joes can no longer drink /:cl: --- .../items/reagent_containers/food/drinks.dm | 4 ++++ .../items/reagent_containers/food/snacks.dm | 14 +++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/code/game/objects/items/reagent_containers/food/drinks.dm b/code/game/objects/items/reagent_containers/food/drinks.dm index 9f88990e5350..db83723bc8df 100644 --- a/code/game/objects/items/reagent_containers/food/drinks.dm +++ b/code/game/objects/items/reagent_containers/food/drinks.dm @@ -23,6 +23,10 @@ to_chat(user, SPAN_DANGER("The [src.name] is empty!")) return FALSE + if(HAS_TRAIT(M, TRAIT_CANNOT_EAT)) + to_chat(user, SPAN_DANGER("[user == M ? "You are" : "[M] is"] unable to drink!")) + return FALSE + if(M == user) to_chat(M, SPAN_NOTICE(" You swallow a gulp from \the [src].")) if(reagents.total_volume) diff --git a/code/game/objects/items/reagent_containers/food/snacks.dm b/code/game/objects/items/reagent_containers/food/snacks.dm index 0a1d0e8aad07..927501286f13 100644 --- a/code/game/objects/items/reagent_containers/food/snacks.dm +++ b/code/game/objects/items/reagent_containers/food/snacks.dm @@ -42,7 +42,7 @@ ..() if (world.time <= user.next_move) - return + return FALSE attack(user, user, "head")//zone does not matter user.next_move += attack_speed @@ -51,24 +51,24 @@ to_chat(user, SPAN_DANGER("None of [src] left, oh no!")) M.drop_inv_item_on_ground(src) //so icons update :[ qdel(src) - return 0 + return FALSE if(package) to_chat(M, SPAN_WARNING("How do you expect to eat this with the package still on?")) - return 0 + return FALSE if(istype(M, /mob/living/carbon)) var/mob/living/carbon/C = M var/fullness = M.nutrition + (M.reagents.get_reagent_amount("nutriment") * 25) if(fullness > NUTRITION_HIGH && world.time < C.overeat_cooldown) to_chat(user, SPAN_WARNING("[user == M ? "You" : "They"] don't feel like eating more right now.")) - return + return FALSE if(issynth(C)) fullness = 200 //Synths never get full if(HAS_TRAIT(M, TRAIT_CANNOT_EAT)) //Do not feed the Working Joes to_chat(user, SPAN_DANGER("[user == M ? "You are" : "[M] is"] unable to eat!")) - return + return FALSE if(fullness > NUTRITION_HIGH) C.overeat_cooldown = world.time + OVEREAT_TIME @@ -120,9 +120,9 @@ reagents.trans_to_ingest(M, reagents.total_volume) bitecount++ On_Consume(M) - return 1 + return TRUE - return 0 + return FALSE /obj/item/reagent_container/food/snacks/afterattack(obj/target, mob/user, proximity) return ..() From 4158cdb980c7dcd2a7ea22349ad58ffd57d33932 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 21 Dec 2023 02:31:43 +0000 Subject: [PATCH 020/205] Automatic changelog for PR #5259 [ci skip] --- html/changelogs/AutoChangeLog-pr-5259.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5259.yml diff --git a/html/changelogs/AutoChangeLog-pr-5259.yml b/html/changelogs/AutoChangeLog-pr-5259.yml new file mode 100644 index 000000000000..037aa676912b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5259.yml @@ -0,0 +1,4 @@ +author: "Ben10083" +delete-after: True +changes: + - rscdel: " Working Joes can no longer drink" \ No newline at end of file From df6fce4ac691b23d23c3f1ceb1846b295463b30c Mon Sep 17 00:00:00 2001 From: Steelpoint <6595389+Steelpoint@users.noreply.github.com> Date: Thu, 21 Dec 2023 12:42:39 +0800 Subject: [PATCH 021/205] Separates Factions In Observe/Follow Tab (#5058) # About the pull request Separates the factions from a generic 'ERT Faction' tab into their own separate one's for each of the main factions, this includes. - WY - UPP - CLF - Freelancers - Mercenaries - Contractors - Dutch's Dozen - TWE RMC - CMB Marshals The remaining factions (mostly memes, unused or admin ones) are kept in the current 'ERT' panel. # Explain why it's good for the game Better gauge as a observer who the present factions are, helps in the uncommon circumstances where multiple factions are in play. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Factions are now properly separated in the observe menu as a ghost. /:cl: --------- Co-authored-by: Steelpoint --- code/__DEFINES/mode.dm | 10 +++- code/modules/gear_presets/contractor.dm | 2 +- code/modules/mob/dead/observer/orbit.dm | 36 +++++++++++++++ tgui/packages/tgui/interfaces/Orbit/index.tsx | 46 +++++++++++++++++++ tgui/packages/tgui/interfaces/Orbit/types.ts | 9 ++++ 5 files changed, 101 insertions(+), 2 deletions(-) diff --git a/code/__DEFINES/mode.dm b/code/__DEFINES/mode.dm index 94428ba7d9b3..0f04006859e9 100644 --- a/code/__DEFINES/mode.dm +++ b/code/__DEFINES/mode.dm @@ -241,8 +241,16 @@ GLOBAL_LIST_INIT(whitelist_hierarchy, list(WHITELIST_NORMAL, WHITELIST_COUNCIL, #define FACTION_LIST_MARINE list(FACTION_MARINE) #define FACTION_LIST_HUMANOID list(FACTION_MARINE, FACTION_PMC, FACTION_WY, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_MARSHAL, FACTION_UPP, FACTION_FREELANCER, FACTION_SURVIVOR, FACTION_NEUTRAL, FACTION_COLONIST, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_YAUTJA, FACTION_ZOMBIE, FACTION_TWE) -#define FACTION_LIST_ERT list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_CLF, FACTION_CONTRACTOR, FACTION_UPP, FACTION_FREELANCER, FACTION_MERCENARY, FACTION_DUTCH, FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO, FACTION_MARSHAL, FACTION_TWE) +#define FACTION_LIST_ERT list(FACTION_HEFA, FACTION_GLADIATOR, FACTION_PIRATE, FACTION_PIZZA, FACTION_SOUTO) #define FACTION_LIST_WY list(FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY) +#define FACTION_LIST_UPP list(FACTION_UPP) +#define FACTION_LIST_CLF list(FACTION_CLF) +#define FACTION_LIST_TWE list(FACTION_TWE) +#define FACTION_LIST_FREELANCER list(FACTION_FREELANCER) +#define FACTION_LIST_CONTRACTOR list(FACTION_CONTRACTOR) +#define FACTION_LIST_MERCENARY list(FACTION_MERCENARY) +#define FACTION_LIST_MARSHAL list(FACTION_MARSHAL) +#define FACTION_LIST_DUTCH list(FACTION_DUTCH) #define FACTION_LIST_MARINE_WY list(FACTION_MARINE, FACTION_PMC, FACTION_WY_DEATHSQUAD, FACTION_WY) #define FACTION_LIST_MARINE_UPP list(FACTION_MARINE, FACTION_UPP) #define FACTION_LIST_MARINE_TWE list(FACTION_MARINE, FACTION_TWE) diff --git a/code/modules/gear_presets/contractor.dm b/code/modules/gear_presets/contractor.dm index ea77fe4a4d0f..896771d26aca 100644 --- a/code/modules/gear_presets/contractor.dm +++ b/code/modules/gear_presets/contractor.dm @@ -4,7 +4,7 @@ rank = JOB_CONTRACTOR idtype = /obj/item/card/id/data faction = FACTION_CONTRACTOR - faction_group = FACTION_LIST_ERT + faction_group = list(FACTION_CONTRACTOR) languages = list(LANGUAGE_ENGLISH, LANGUAGE_SPANISH, LANGUAGE_RUSSIAN) var/human_versus_human = FALSE var/headset_type = /obj/item/device/radio/headset/distress/contractor diff --git a/code/modules/mob/dead/observer/orbit.dm b/code/modules/mob/dead/observer/orbit.dm index 5fe27c5e5167..50496cef31c5 100644 --- a/code/modules/mob/dead/observer/orbit.dm +++ b/code/modules/mob/dead/observer/orbit.dm @@ -53,6 +53,15 @@ var/list/survivors = list() var/list/xenos = list() var/list/ert_members = list() + var/list/upp = list() + var/list/clf = list() + var/list/wy = list() + var/list/twe = list() + var/list/freelancer = list() + var/list/contractor = list() + var/list/mercenary = list() + var/list/dutch = list() + var/list/marshal = list() var/list/synthetics = list() var/list/predators = list() var/list/animals = list() @@ -132,12 +141,30 @@ if(SSticker.mode.is_in_endgame == TRUE && !is_mainship_level(M.z) && !(human.faction in FACTION_LIST_ERT)) escaped += list(serialized) + else if(human.faction in FACTION_LIST_WY) + wy += list(serialized) else if(issynth(human) && !isinfiltratorsynthetic(human)) synthetics += list(serialized) else if(isyautja(human)) predators += list(serialized) else if(human.faction in FACTION_LIST_ERT) ert_members += list(serialized) + else if(human.faction in FACTION_LIST_UPP) + upp += list(serialized) + else if(human.faction in FACTION_LIST_CLF) + clf += list(serialized) + else if(human.faction in FACTION_LIST_TWE) + twe += list(serialized) + else if(human.faction in FACTION_LIST_FREELANCER) + freelancer += list(serialized) + else if(human.faction in FACTION_LIST_CONTRACTOR) + contractor += list(serialized) + else if(human.faction in FACTION_LIST_MERCENARY) + mercenary += list(serialized) + else if(human.faction in FACTION_LIST_MARSHAL) + marshal += list(serialized) + else if(human.faction in FACTION_LIST_DUTCH) + dutch += list(serialized) else if(human.faction in FACTION_LIST_MARINE) marines += list(serialized) else if(issurvivorjob(human.job)) @@ -156,6 +183,15 @@ data["survivors"] = survivors data["xenos"] = xenos data["ert_members"] = ert_members + data["upp"] = upp + data["clf"] = clf + data["wy"] = wy + data["twe"] = twe + data["freelancer"] = freelancer + data["contractor"] = contractor + data["mercenary"] = mercenary + data["dutch"] = dutch + data["marshal"] = marshal data["synthetics"] = synthetics data["predators"] = predators data["animals"] = animals diff --git a/tgui/packages/tgui/interfaces/Orbit/index.tsx b/tgui/packages/tgui/interfaces/Orbit/index.tsx index 83dfe3b361b2..899947e1bec9 100644 --- a/tgui/packages/tgui/interfaces/Orbit/index.tsx +++ b/tgui/packages/tgui/interfaces/Orbit/index.tsx @@ -118,6 +118,15 @@ const ObservableContent = (props, context) => { survivors = [], xenos = [], ert_members = [], + upp = [], + clf = [], + wy = [], + twe = [], + freelancer = [], + mercenary = [], + contractor = [], + dutch = [], + marshal = [], synthetics = [], predators = [], animals = [], @@ -145,6 +154,43 @@ const ObservableContent = (props, context) => { section={synthetics} title="Synthetics" /> + + + + + + + + + diff --git a/tgui/packages/tgui/interfaces/Orbit/types.ts b/tgui/packages/tgui/interfaces/Orbit/types.ts index 3fe11af8e625..afbed5b16468 100644 --- a/tgui/packages/tgui/interfaces/Orbit/types.ts +++ b/tgui/packages/tgui/interfaces/Orbit/types.ts @@ -7,6 +7,15 @@ export type OrbitData = { survivors: Observable[]; xenos: Observable[]; ert_members: Observable[]; + upp: Observable[]; + twe: Observable[]; + clf: Observable[]; + wy: Observable[]; + freelancer: Observable[]; + contractor: Observable[]; + mercenary: Observable[]; + dutch: Observable[]; + marshal: Observable[]; synthetics: Observable[]; predators: Observable[]; animals: Observable[]; From c6029588cb90e357ff1e99fde8851991b44aa65e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 21 Dec 2023 04:51:17 +0000 Subject: [PATCH 022/205] Automatic changelog for PR #5058 [ci skip] --- html/changelogs/AutoChangeLog-pr-5058.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5058.yml diff --git a/html/changelogs/AutoChangeLog-pr-5058.yml b/html/changelogs/AutoChangeLog-pr-5058.yml new file mode 100644 index 000000000000..6edfaed15ce4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5058.yml @@ -0,0 +1,4 @@ +author: "Steelpoint" +delete-after: True +changes: + - rscadd: "Factions are now properly separated in the observe menu as a ghost." \ No newline at end of file From 551c4936019ae31017d01445173761edfb15d913 Mon Sep 17 00:00:00 2001 From: InsaneRed <47158596+InsaneRed@users.noreply.github.com> Date: Thu, 21 Dec 2023 16:39:20 +0300 Subject: [PATCH 023/205] Converts some xeno abilities to SECONDS (#5241) # About the pull request Converts xeno code cooldown = to seconds # Explain why it's good for the game easier to read # Testing Photographs and Procedure
Screenshots & Videos its readable
# Changelog :cl: code: Converts xenomorph cooldowns into SECONDS /:cl: --------- Co-authored-by: InsaneRed --- .../abilities/boiler/boiler_abilities.dm | 8 +++---- .../abilities/crusher/crusher_abilities.dm | 2 +- .../abilities/defender/defender_abilities.dm | 4 ++-- .../facehugger/facehugger_abilities.dm | 2 +- .../abilities/lurker/lurker_abilities.dm | 4 ++-- .../praetorian/praetorian_abilities.dm | 22 +++++++++---------- .../abilities/ravager/ravager_abilities.dm | 4 ++-- .../abilities/runner/runner_abilities.dm | 4 ++-- .../abilities/spitter/spitter_abilities.dm | 2 +- .../abilities/warrior/warrior_abilities.dm | 6 ++--- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm index ea1c734d9482..e7f72e7e013e 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/boiler/boiler_abilities.dm @@ -13,7 +13,7 @@ macro_path = /datum/action/xeno_action/verb/verb_acid_lance action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 - xeno_cooldown = 190 + xeno_cooldown = 19 SECONDS // Config var/stack_time = 10 @@ -96,7 +96,7 @@ macro_path = /datum/action/xeno_action/verb/verb_boiler_trap action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_1 - xeno_cooldown = 205 + xeno_cooldown = 20.5 SECONDS /// Config var/trap_ttl = 100 @@ -112,7 +112,7 @@ macro_path = /datum/action/xeno_action/verb/verb_acid_mine action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 - xeno_cooldown = 55 + xeno_cooldown = 5.5 SECONDS var/empowered = FALSE @@ -127,7 +127,7 @@ macro_path = /datum/action/xeno_action/verb/verb_acid_shotgun action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_3 - xeno_cooldown = 130 + xeno_cooldown = 13 SECONDS var/ammo_type = /datum/ammo/xeno/acid_shotgun diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm index 87f58df34472..4691d70321c3 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_abilities.dm @@ -39,7 +39,7 @@ macro_path = /datum/action/xeno_action/verb/verb_crusher_stomp action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 - xeno_cooldown = 180 + xeno_cooldown = 18 SECONDS plasma_cost = 30 var/damage = 65 diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_abilities.dm index 3949e4ac9b80..22d5f4b57aa2 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_abilities.dm @@ -18,7 +18,7 @@ macro_path = /datum/action/xeno_action/verb/verb_headbutt action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 - xeno_cooldown = 40 + xeno_cooldown = 4 SECONDS /datum/action/xeno_action/onclick/tail_sweep name = "Tail Sweep" @@ -28,7 +28,7 @@ action_type = XENO_ACTION_ACTIVATE ability_primacy = XENO_PRIMARY_ACTION_3 plasma_cost = 10 - xeno_cooldown = 110 + xeno_cooldown = 11 SECONDS /datum/action/xeno_action/activable/fortify name = "Fortify" diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm index 91bda707ec45..ee1fed3094a7 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/facehugger/facehugger_abilities.dm @@ -5,7 +5,7 @@ macro_path = /datum/action/xeno_action/verb/verb_pounce action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_1 - xeno_cooldown = 30 + xeno_cooldown = 3 SECONDS plasma_cost = 0 // Config options diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_abilities.dm index 2facee1edc9d..fd525701b12d 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/lurker/lurker_abilities.dm @@ -2,7 +2,7 @@ macro_path = /datum/action/xeno_action/verb/verb_pounce action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_1 - xeno_cooldown = 60 + xeno_cooldown = 6 SECONDS plasma_cost = 20 // Config options @@ -70,7 +70,7 @@ macro_path = /datum/action/xeno_action/verb/verb_crippling_strike ability_primacy = XENO_PRIMARY_ACTION_3 action_type = XENO_ACTION_ACTIVATE - xeno_cooldown = 100 + xeno_cooldown = 10 SECONDS plasma_cost = 20 var/buff_duration = 50 diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm index 11317bed9af1..7327454ab74e 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm @@ -25,7 +25,7 @@ macro_path = /datum/action/xeno_action/verb/verb_dash action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 - xeno_cooldown = 110 + xeno_cooldown = 11 SECONDS plasma_cost = 50 // Config options @@ -51,7 +51,7 @@ macro_path = /datum/action/xeno_action/verb/verb_cleave ability_primacy = XENO_PRIMARY_ACTION_3 action_type = XENO_ACTION_CLICK - xeno_cooldown = 120 + xeno_cooldown = 12 SECONDS // Root config var/root_duration_unbuffed = 1 SECONDS @@ -138,7 +138,7 @@ macro_path = /datum/action/xeno_action/verb/verb_oppressor_punch action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 - xeno_cooldown = 100 + xeno_cooldown = 10 SECONDS plasma_cost = 55 // Configurables @@ -164,7 +164,7 @@ macro_path = /datum/action/xeno_action/verb/verb_crush ability_primacy = XENO_PRIMARY_ACTION_3 action_type = XENO_ACTION_CLICK - xeno_cooldown = 130 + xeno_cooldown = 13 SECONDS plasma_cost = 80 // Config @@ -180,7 +180,7 @@ macro_path = /datum/action/xeno_action/verb/verb_prae_impale ability_primacy = XENO_PRIMARY_ACTION_1 action_type = XENO_ACTION_CLICK - xeno_cooldown = 130 + xeno_cooldown = 13 SECONDS plasma_cost = 80 /datum/action/xeno_action/onclick/prae_dodge @@ -191,7 +191,7 @@ ability_primacy = XENO_PRIMARY_ACTION_2 action_type = XENO_ACTION_CLICK plasma_cost = 200 - xeno_cooldown = 190 + xeno_cooldown = 19 SECONDS // Config var/duration = 70 @@ -204,7 +204,7 @@ macro_path = /datum/action/xeno_action/verb/verb_prae_tail_trip ability_primacy = XENO_PRIMARY_ACTION_3 action_type = XENO_ACTION_CLICK - xeno_cooldown = 130 + xeno_cooldown = 13 SECONDS plasma_cost = 30 // Config @@ -224,7 +224,7 @@ macro_path = /datum/action/xeno_action/verb/verb_dash action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 - xeno_cooldown = 100 + xeno_cooldown = 10 SECONDS plasma_cost = 40 // Config options @@ -255,7 +255,7 @@ ability_primacy = XENO_PRIMARY_ACTION_4 plasma_cost = 80 - xeno_cooldown = 100 + xeno_cooldown = 10 SECONDS // Configurable options spray_type = ACID_SPRAY_LINE @@ -270,7 +270,7 @@ /datum/action/xeno_action/activable/spray_acid/prae_warden ability_primacy = XENO_PRIMARY_ACTION_2 plasma_cost = 130 - xeno_cooldown = 130 + xeno_cooldown = 13 SECONDS // Configurable options @@ -288,7 +288,7 @@ // todo: macro action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_3 - xeno_cooldown = 100 + xeno_cooldown = 10 SECONDS plasma_cost = 100 // Config diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_abilities.dm index 4f9c5f298637..3744fb7823e8 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_abilities.dm @@ -136,7 +136,7 @@ action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 plasma_cost = 0 - xeno_cooldown = 100 + xeno_cooldown = 10 SECONDS // Config var/shard_cost = 75 @@ -150,7 +150,7 @@ action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_3 plasma_cost = 0 - xeno_cooldown = 300 + xeno_cooldown = 30 SECONDS // Config values var/shard_cost = 50 diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_abilities.dm index 510f161d8a86..2880dd15eb5a 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_abilities.dm @@ -5,7 +5,7 @@ macro_path = /datum/action/xeno_action/verb/verb_pounce action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_1 - xeno_cooldown = 30 + xeno_cooldown = 3 SECONDS plasma_cost = 0 // Config options @@ -28,7 +28,7 @@ macro_path = /datum/action/xeno_action/verb/verb_runner_bonespurs action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 - xeno_cooldown = 110 + xeno_cooldown = 11 SECONDS plasma_cost = 0 var/ammo_type = /datum/ammo/xeno/bone_chips/spread/runner_skillshot diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_abilities.dm index abc1e43bfccd..20febc22c4a4 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/spitter/spitter_abilities.dm @@ -34,7 +34,7 @@ action_type = XENO_ACTION_CLICK plasma_cost = 50 - xeno_cooldown = 80 + xeno_cooldown = 8 SECONDS // Configurable options spray_type = ACID_SPRAY_LINE // Enum for the shape of spray to do diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm index 2c16477c1414..4f40e1914540 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_abilities.dm @@ -6,7 +6,7 @@ macro_path = /datum/action/xeno_action/verb/verb_fling action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_3 - xeno_cooldown = 60 + xeno_cooldown = 6 SECONDS // Configurables var/fling_distance = 4 @@ -22,7 +22,7 @@ macro_path = /datum/action/xeno_action/verb/verb_lunge action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_2 - xeno_cooldown = 100 + xeno_cooldown = 10 SECONDS // Configurables var/grab_range = 4 @@ -36,7 +36,7 @@ macro_path = /datum/action/xeno_action/verb/verb_punch action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_1 - xeno_cooldown = 45 + xeno_cooldown = 4.5 SECONDS // Configurables var/base_damage = 25 From 94ff96a6f6d127d278ba6d79ef76ebccb89b2b58 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 21 Dec 2023 13:47:31 +0000 Subject: [PATCH 024/205] Automatic changelog for PR #5241 [ci skip] --- html/changelogs/AutoChangeLog-pr-5241.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5241.yml diff --git a/html/changelogs/AutoChangeLog-pr-5241.yml b/html/changelogs/AutoChangeLog-pr-5241.yml new file mode 100644 index 000000000000..acb4b1887337 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5241.yml @@ -0,0 +1,4 @@ +author: "InsaneRed" +delete-after: True +changes: + - code_imp: "Converts xenomorph cooldowns into SECONDS" \ No newline at end of file From 53a08275f98fb37686d9b4c7ae143d0313f7c9c5 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Thu, 21 Dec 2023 09:46:01 -0800 Subject: [PATCH 025/205] Additional ui_act checks for tacmap (#5255) # About the pull request This PR adds additional checks for the ui_acts when using the tacmap interface. # Explain why it's good for the game Should shore up most flaws allowing weird usage of it. # Testing Photographs and Procedure
Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/efbf579c-814d-41fd-bea4-d2581b4bf4f7)
# Changelog No player facing changes. --- code/controllers/subsystem/minimap.dm | 80 ++++++++++++------- tgui/packages/tgui/interfaces/TacticalMap.tsx | 4 +- 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/code/controllers/subsystem/minimap.dm b/code/controllers/subsystem/minimap.dm index 50aec8845dd0..e2ebffe55959 100644 --- a/code/controllers/subsystem/minimap.dm +++ b/code/controllers/subsystem/minimap.dm @@ -1,3 +1,6 @@ +#define CANVAS_COOLDOWN_TIME 4 MINUTES +#define FLATTEN_MAP_COOLDOWN_TIME 3 MINUTES + /** * # Minimaps subsystem * @@ -438,11 +441,11 @@ SUBSYSTEM_DEF(minimaps) if(faction == FACTION_MARINE) if(!COOLDOWN_FINISHED(GLOB, uscm_flatten_map_icon_cooldown)) return FALSE - COOLDOWN_START(GLOB, uscm_flatten_map_icon_cooldown, flatten_map_cooldown_time) + COOLDOWN_START(GLOB, uscm_flatten_map_icon_cooldown, FLATTEN_MAP_COOLDOWN_TIME) else if(faction == XENO_HIVE_NORMAL) if(!COOLDOWN_FINISHED(GLOB, xeno_flatten_map_icon_cooldown)) return FALSE - COOLDOWN_START(GLOB, xeno_flatten_map_icon_cooldown, flatten_map_cooldown_time) + COOLDOWN_START(GLOB, xeno_flatten_map_icon_cooldown, FLATTEN_MAP_COOLDOWN_TIME) else return FALSE @@ -500,6 +503,8 @@ SUBSYSTEM_DEF(minimaps) qdel(svg_store_overlay) debug_log("SVG coordinates for [faction] are not implemented!") +#define can_draw(faction, user) ((faction == FACTION_MARINE && skillcheck(user, SKILL_LEADERSHIP, SKILL_LEAD_EXPERT)) || (faction == XENO_HIVE_NORMAL && isqueen(user))) + /datum/controller/subsystem/minimaps/proc/fetch_tacmap_datum(zlevel, flags) var/hash = "[zlevel]-[flags]" if(hashed_tacmaps[hash]) @@ -625,9 +630,6 @@ SUBSYSTEM_DEF(minimaps) var/toolbar_color_selection = "black" var/toolbar_updated_selection = "black" - var/canvas_cooldown_time = 4 MINUTES - var/flatten_map_cooldown_time = 3 MINUTES - /// boolean value to keep track if the canvas has been updated or not, the value is used in tgui state. var/updated_canvas = FALSE /// current flattend map @@ -740,7 +742,6 @@ SUBSYSTEM_DEF(minimaps) else data["canvasCooldown"] = max(GLOB.uscm_canvas_cooldown - world.time, 0) - data["nextCanvasTime"] = canvas_cooldown_time data["updatedCanvas"] = updated_canvas data["lastUpdateTime"] = last_update_time @@ -750,6 +751,7 @@ SUBSYSTEM_DEF(minimaps) /datum/tacmap/ui_static_data(mob/user) var/list/data = list() + data["mapRef"] = map_holder?.map_ref data["canDraw"] = FALSE data["canViewTacmap"] = TRUE @@ -761,6 +763,7 @@ SUBSYSTEM_DEF(minimaps) /datum/tacmap/drawing/ui_static_data(mob/user) var/list/data = list() + data["canvasCooldownDuration"] = CANVAS_COOLDOWN_TIME data["mapRef"] = map_holder?.map_ref data["canDraw"] = FALSE data["mapFallback"] = wiki_map_fallback @@ -773,7 +776,7 @@ SUBSYSTEM_DEF(minimaps) data["canViewTacmap"] = is_xeno data["canViewCanvas"] = faction == FACTION_MARINE || faction == XENO_HIVE_NORMAL - if(faction == FACTION_MARINE && skillcheck(user, SKILL_LEADERSHIP, SKILL_LEAD_EXPERT) || faction == XENO_HIVE_NORMAL && isqueen(user)) + if(can_draw(faction, user)) data["canDraw"] = TRUE data["canViewTacmap"] = TRUE @@ -781,6 +784,8 @@ SUBSYSTEM_DEF(minimaps) /datum/tacmap/drawing/status_tab_view/ui_static_data(mob/user) var/list/data = list() + + data["canvasCooldownDuration"] = CANVAS_COOLDOWN_TIME data["mapFallback"] = wiki_map_fallback data["canDraw"] = FALSE data["canViewTacmap"] = FALSE @@ -791,6 +796,8 @@ SUBSYSTEM_DEF(minimaps) /datum/tacmap/drawing/status_tab_view/xeno/ui_static_data(mob/user) var/list/data = list() + + data["canvasCooldownDuration"] = CANVAS_COOLDOWN_TIME data["mapFallback"] = wiki_map_fallback data["canDraw"] = FALSE data["canViewTacmap"] = FALSE @@ -814,16 +821,21 @@ SUBSYSTEM_DEF(minimaps) var/mob/user = ui.user var/mob/living/carbon/xenomorph/xeno = user var/faction = istype(xeno) ? xeno.hivenumber : user.faction - if(faction == FACTION_NEUTRAL && isobserver(user)) + var/is_observer = isobserver(user) + if(faction == FACTION_NEUTRAL && is_observer) faction = allowed_flags == MINIMAP_FLAG_XENO ? XENO_HIVE_NORMAL : FACTION_MARINE + var/drawing_allowed = !is_observer && can_draw(faction, user) - switch (action) - if ("menuSelect") + switch(action) + if("menuSelect") if(params["selection"] != "new canvas") if(updated_canvas) updated_canvas = FALSE toolbar_updated_selection = toolbar_color_selection // doing this if it == canvas can cause a latency issue with the stroke. else + if(!drawing_allowed) + msg_admin_niche("[key_name(user)] made an unauthorized attempt to 'menuSelect' the 'new canvas' panel of the [faction] tacmap!") + return FALSE distribute_current_map_png(faction) last_update_time = world.time // An attempt to get the image to load on first try in the interface, but doesn't seem always reliable @@ -832,60 +844,68 @@ SUBSYSTEM_DEF(minimaps) old_map = get_tacmap_data_png(faction) current_svg = get_tacmap_data_svg(faction) - if ("updateCanvas") - // forces state change, this will export the svg. + if("updateCanvas") toolbar_updated_selection = "export" updated_canvas = TRUE action_queue_change += 1 - if ("clearCanvas") + if("clearCanvas") toolbar_updated_selection = "clear" updated_canvas = FALSE action_queue_change += 1 - if ("undoChange") + if("undoChange") toolbar_updated_selection = "undo" updated_canvas = FALSE action_queue_change += 1 - if ("selectColor") + if("selectColor") var/newColor = params["color"] if(newColor) toolbar_color_selection = newColor toolbar_updated_selection = newColor action_queue_change += 1 - if ("onDraw") + if("onDraw") updated_canvas = FALSE - if ("selectAnnouncement") + if("selectAnnouncement") + if(!drawing_allowed) + msg_admin_niche("[key_name(user)] made an unauthorized attempt to 'selectAnnouncement' the [faction] tacmap!") + return FALSE + if(!istype(params["image"], /list)) // potentially very serious? return FALSE + var/cooldown_satisfied = FALSE if(faction == FACTION_MARINE) - GLOB.uscm_flat_tacmap_data += new_current_map + cooldown_satisfied = COOLDOWN_FINISHED(GLOB, uscm_canvas_cooldown) else if(faction == XENO_HIVE_NORMAL) - GLOB.xeno_flat_tacmap_data += new_current_map - - store_current_svg_coords(faction, params["image"], user) - current_svg = get_tacmap_data_svg(faction) - old_map = get_tacmap_data_png(faction) + cooldown_satisfied = COOLDOWN_FINISHED(GLOB, xeno_canvas_cooldown) + if(!cooldown_satisfied) + msg_admin_niche("[key_name(user)] attempted to 'selectAnnouncement' the [faction] tacmap while it is still on cooldown!") + return FALSE if(faction == FACTION_MARINE) - COOLDOWN_START(GLOB, uscm_canvas_cooldown, canvas_cooldown_time) - var/mob/living/carbon/human/human_leader = user + GLOB.uscm_flat_tacmap_data += new_current_map + COOLDOWN_START(GLOB, uscm_canvas_cooldown, CANVAS_COOLDOWN_TIME) for(var/datum/squad/current_squad in GLOB.RoleAuthority.squads) current_squad.send_maptext("Tactical map update in progress...", "Tactical Map:") + var/mob/living/carbon/human/human_leader = user human_leader.visible_message(SPAN_BOLDNOTICE("Tactical map update in progress...")) playsound_client(human_leader.client, "sound/effects/sos-morse-code.ogg") notify_ghosts(header = "Tactical Map", message = "The USCM tactical map has been updated.", ghost_sound = "sound/effects/sos-morse-code.ogg", notify_volume = 80, action = NOTIFY_USCM_TACMAP, enter_link = "uscm_tacmap=1", enter_text = "View", source = owner) - else if(faction == XENO_HIVE_NORMAL) - var/mutable_appearance/appearance = mutable_appearance(icon('icons/mob/hud/actions_xeno.dmi'), "toggle_queen_zoom") - COOLDOWN_START(GLOB, xeno_canvas_cooldown, canvas_cooldown_time) + GLOB.xeno_flat_tacmap_data += new_current_map + COOLDOWN_START(GLOB, xeno_canvas_cooldown, CANVAS_COOLDOWN_TIME) xeno_maptext("The Queen has updated our hive mind map", "We sense something unusual...", faction) + var/mutable_appearance/appearance = mutable_appearance(icon('icons/mob/hud/actions_xeno.dmi'), "toggle_queen_zoom") notify_ghosts(header = "Tactical Map", message = "The Xenomorph tactical map has been updated.", ghost_sound = "sound/voice/alien_distantroar_3.ogg", notify_volume = 50, action = NOTIFY_XENO_TACMAP, enter_link = "xeno_tacmap=1", enter_text = "View", source = user, alert_overlay = appearance) + store_current_svg_coords(faction, params["image"], user) + current_svg = get_tacmap_data_svg(faction) + old_map = get_tacmap_data_png(faction) + toolbar_updated_selection = toolbar_color_selection message_admins("[key_name(user)] has updated the tactical map for [faction].") updated_canvas = FALSE @@ -995,3 +1015,7 @@ SUBSYSTEM_DEF(minimaps) if(XENO_HIVE_RENEGADE) return MINIMAP_FLAG_XENO_RENEGADE return 0 + +#undef CANVAS_COOLDOWN_TIME +#undef FLATTEN_MAP_COOLDOWN_TIME +#undef can_draw diff --git a/tgui/packages/tgui/interfaces/TacticalMap.tsx b/tgui/packages/tgui/interfaces/TacticalMap.tsx index 92996038719f..0888212a83fb 100644 --- a/tgui/packages/tgui/interfaces/TacticalMap.tsx +++ b/tgui/packages/tgui/interfaces/TacticalMap.tsx @@ -23,7 +23,7 @@ interface TacMapProps { mapRef: string; currentMenu: string; lastUpdateTime: any; - nextCanvasTime: any; + canvasCooldownDuration: any; canvasCooldown: any; exportedTacMapImage: any; tacmapReady: number; @@ -192,7 +192,7 @@ const OldMapPanel = (props, context) => { const DrawMapPanel = (props, context) => { const { data, act } = useBackend(context); - const timeLeftPct = data.canvasCooldown / data.nextCanvasTime; + const timeLeftPct = data.canvasCooldown / data.canvasCooldownDuration; const canUpdate = data.canvasCooldown <= 0 && !data.updatedCanvas; const handleTacMapExport = (image: any) => { From 53b20cf4b58fe6c124fad03e811306eebc60a3e5 Mon Sep 17 00:00:00 2001 From: fira Date: Thu, 21 Dec 2023 18:50:52 +0100 Subject: [PATCH 026/205] Fix Santa Hats breaking due to map camouflage (#5268) # About the pull request Simple as it can be - the map camouflage was applied on santa helmets when they don't have camouflage variants # Explain why it's good for the game Spirit of holidays and all that # Testing Photographs and Procedure Spawn on a camo-enabled map # Changelog :cl: fix: Fix Xmas helmets getting overriden by map camouflage. /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/modules/decorators/christmas.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/decorators/christmas.dm b/code/modules/decorators/christmas.dm index 5c4126510056..6d3f52ffc0f6 100644 --- a/code/modules/decorators/christmas.dm +++ b/code/modules/decorators/christmas.dm @@ -51,6 +51,7 @@ helmet.icon_override = 'icons/mob/humans/onmob/head_0.dmi' helmet.flags_inv_hide = HIDEEARS|HIDEALLHAIR helmet.flags_marine_helmet = NO_FLAGS + helmet.flags_atom |= NO_SNOW_TYPE|NO_NAME_OVERRIDE if(prob(50)) helmet.icon_state = "santa_hat_red" else From 3ca6df62512b86326b7f221dbaf4d26378377056 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 21 Dec 2023 18:06:57 +0000 Subject: [PATCH 027/205] Automatic changelog for PR #5268 [ci skip] --- html/changelogs/AutoChangeLog-pr-5268.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5268.yml diff --git a/html/changelogs/AutoChangeLog-pr-5268.yml b/html/changelogs/AutoChangeLog-pr-5268.yml new file mode 100644 index 000000000000..1bed5f11b860 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5268.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fix Xmas helmets getting overriden by map camouflage." \ No newline at end of file From 002062e88b1a730af6bbd23a13056fe73f703a62 Mon Sep 17 00:00:00 2001 From: Cthulhu80 <122310258+Cthulhu80@users.noreply.github.com> Date: Thu, 21 Dec 2023 16:28:32 -0500 Subject: [PATCH 028/205] minor tacmap ui change (#5264) # About the pull request it's kind of been bothering me for a bit, just some minor tacmap ui changes. # Explain why it's good for the game I got ocd, please merge. # Testing Photographs and Procedure Screen Shot 2023-12-20 at 3 24 17 PM Screen Shot 2023-12-20 at 3 27 20 PM # Changelog :cl: ui: tacmap ui tweaks /:cl: --- code/controllers/subsystem/minimap.dm | 6 +++--- tgui/packages/tgui/interfaces/TacticalMap.tsx | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/controllers/subsystem/minimap.dm b/code/controllers/subsystem/minimap.dm index e2ebffe55959..a808e7e3fd85 100644 --- a/code/controllers/subsystem/minimap.dm +++ b/code/controllers/subsystem/minimap.dm @@ -826,9 +826,9 @@ SUBSYSTEM_DEF(minimaps) faction = allowed_flags == MINIMAP_FLAG_XENO ? XENO_HIVE_NORMAL : FACTION_MARINE var/drawing_allowed = !is_observer && can_draw(faction, user) - switch(action) - if("menuSelect") - if(params["selection"] != "new canvas") + switch (action) + if ("menuSelect") + if(params["selection"] != "Canvas") if(updated_canvas) updated_canvas = FALSE toolbar_updated_selection = toolbar_color_selection // doing this if it == canvas can cause a latency issue with the stroke. diff --git a/tgui/packages/tgui/interfaces/TacticalMap.tsx b/tgui/packages/tgui/interfaces/TacticalMap.tsx index 0888212a83fb..34f214b1d1d3 100644 --- a/tgui/packages/tgui/interfaces/TacticalMap.tsx +++ b/tgui/packages/tgui/interfaces/TacticalMap.tsx @@ -31,7 +31,7 @@ interface TacMapProps { const PAGES = [ { - title: 'tacmap', + title: 'Live Tacmap', canOpen: (data) => { return 1; }, @@ -42,7 +42,7 @@ const PAGES = [ }, }, { - title: 'old canvas', + title: 'Map View', canOpen: (data) => { return 1; }, @@ -53,7 +53,7 @@ const PAGES = [ }, }, { - title: 'new canvas', + title: 'Canvas', canOpen: (data) => { return data.tacmapReady; }, From 3b493e32fb898712eb83138beb2562d569ea4952 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 21 Dec 2023 21:36:37 +0000 Subject: [PATCH 029/205] Automatic changelog for PR #5264 [ci skip] --- html/changelogs/AutoChangeLog-pr-5264.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5264.yml diff --git a/html/changelogs/AutoChangeLog-pr-5264.yml b/html/changelogs/AutoChangeLog-pr-5264.yml new file mode 100644 index 000000000000..a7fef11f72b4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5264.yml @@ -0,0 +1,4 @@ +author: "Cthulhu80" +delete-after: True +changes: + - ui: "tacmap ui tweaks" \ No newline at end of file From d00463bf5ec2e797ef7a7bb8696a42d00a82ed56 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Thu, 21 Dec 2023 21:35:34 +0000 Subject: [PATCH 030/205] Hopefully fixes hijack bug (#5261) # About the pull request Will hopefully stop hijack ending the round prematurely. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Hijack should no longer end the round immediately. /:cl: --- code/__DEFINES/dcs/signals/signals_global.dm | 1 + code/controllers/subsystem/ticker.dm | 1 - code/modules/shuttle/dropship_hijack.dm | 2 ++ code/modules/shuttle/shuttles/dropship.dm | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 31e4c34e3016..5569ded71586 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -70,3 +70,4 @@ #define COMSIG_GLOB_GENERATOR_SET_OVERLOADING "!generator_set_overloading" #define COMSIG_GLOB_HIJACK_IMPACTED "!hijack_impacted" +#define COMSIG_GLOB_HIJACK_LANDED "!hijack_landed" diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 4b4468c08429..c6d6f008acd6 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -478,7 +478,6 @@ SUBSYSTEM_DEF(ticker) winset(C, null, "mainwindow.icon=[SSticker.mode.taskbar_icon]") - /datum/controller/subsystem/ticker/proc/hijack_ocurred() if(mode) mode.is_in_endgame = TRUE diff --git a/code/modules/shuttle/dropship_hijack.dm b/code/modules/shuttle/dropship_hijack.dm index c87dff348b3c..db9ff6907118 100644 --- a/code/modules/shuttle/dropship_hijack.dm +++ b/code/modules/shuttle/dropship_hijack.dm @@ -51,6 +51,7 @@ // Break the ultra-reinforced windows. // Break the briefing windows. SEND_GLOBAL_SIGNAL(COMSIG_GLOB_HIJACK_IMPACTED) + RegisterSignal(SSdcs, COMSIG_GLOB_HIJACK_LANDED, PROC_REF(finish_landing)) // Sleep while the explosions do their job var/explosion_alive = TRUE @@ -62,6 +63,7 @@ break sleep(10) +/datum/dropship_hijack/almayer/proc/finish_landing() SShijack.announce_status_on_crash() SSticker.hijack_ocurred() diff --git a/code/modules/shuttle/shuttles/dropship.dm b/code/modules/shuttle/shuttles/dropship.dm index ee91c9b9e5d4..105c0e122234 100644 --- a/code/modules/shuttle/shuttles/dropship.dm +++ b/code/modules/shuttle/shuttles/dropship.dm @@ -284,6 +284,7 @@ affected_mob.apply_effect(3, WEAKEN) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_HIJACK_LANDED) /datum/map_template/shuttle/alamo name = "Alamo" From c5dc4c5f10589e4280ba83016e7257e3fba63711 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 21 Dec 2023 21:49:34 +0000 Subject: [PATCH 031/205] Automatic changelog for PR #5261 [ci skip] --- html/changelogs/AutoChangeLog-pr-5261.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5261.yml diff --git a/html/changelogs/AutoChangeLog-pr-5261.yml b/html/changelogs/AutoChangeLog-pr-5261.yml new file mode 100644 index 000000000000..300ad1e4cd2e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5261.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - bugfix: "Hijack should no longer end the round immediately." \ No newline at end of file From 1f6e62aafee208eb46444565612b2f344fc32e40 Mon Sep 17 00:00:00 2001 From: forest2001 <41653574+realforest2001@users.noreply.github.com> Date: Thu, 21 Dec 2023 22:16:38 +0000 Subject: [PATCH 032/205] Ghost listening device preference (#5219) # About the pull request Ghosts can now toggle between hearing and not hearing listening devices. ## THIS DEFAULTS TO OFF # Explain why it's good for the game Bit of peace of mind, a lot of text can be duplicated by hearing listening devices as a ghost. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Ghosts can now toggle hearing listening devices or not. This is dependant on hearing radios and will not function to allow hearing devices without also hearing radios. /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/__DEFINES/__game.dm | 1 + code/game/machinery/telecomms/broadcaster.dm | 7 +++++-- code/game/objects/items/devices/radio/listening_bugs.dm | 2 +- code/game/objects/items/devices/radio/radio.dm | 6 +++--- code/modules/client/preferences.dm | 4 ++++ code/modules/client/preferences_toggles.dm | 9 +++++++++ 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index 765603df629c..11c6e335d932 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -124,6 +124,7 @@ block( \ #define CHAT_FFATTACKLOGS (1<<11) #define CHAT_GHOSTHIVEMIND (1<<12) #define CHAT_NICHELOGS (1<<13) +#define CHAT_LISTENINGBUG (1<<14) //toggles_ghost #define GHOST_HEALTH_SCAN (1<<0) diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index f8250fad271c..e992ef02f8a5 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -83,7 +83,7 @@ vmask, vmessage, obj/item/device/radio/radio, message, name, job, realname, vname, data, compression, list/level, freq, verbage = "says", - datum/language/speaking = null, volume = RADIO_VOLUME_QUIET) + datum/language/speaking = null, volume = RADIO_VOLUME_QUIET, listening_device = FALSE) /* ###### Prepare the radio connection ###### */ var/display_freq = freq @@ -175,13 +175,16 @@ volume = RADIO_VOLUME_CRITICAL for (var/mob/R in receive) + var/is_ghost = istype(R, /mob/dead/observer) /* --- Loop through the receivers and categorize them --- */ if (R.client && !(R.client.prefs.toggles_chat & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. continue if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes. continue // Ghosts hearing all radio chat don't want to hear syndicate intercepts, they're duplicates - if(data == 3 && istype(R, /mob/dead/observer) && R.client && (R.client.prefs.toggles_chat & CHAT_GHOSTRADIO)) + if(data == 3 && is_ghost && R.client && (R.client.prefs.toggles_chat & CHAT_GHOSTRADIO)) + continue + if(is_ghost && listening_device && !(R.client.prefs.toggles_chat & CHAT_LISTENINGBUG)) continue // --- Check for compression --- if(compression > 0) diff --git a/code/game/objects/items/devices/radio/listening_bugs.dm b/code/game/objects/items/devices/radio/listening_bugs.dm index 4a84df071c60..67a91de1bd56 100644 --- a/code/game/objects/items/devices/radio/listening_bugs.dm +++ b/code/game/objects/items/devices/radio/listening_bugs.dm @@ -90,7 +90,7 @@ var/processed_verb = "[SPAN_RED("\[LSTN [nametag]\]")] [verb]" if(broadcasting) if(get_dist(src, M) <= 7) - talk_into(M, msg,null,processed_verb,speaking) + talk_into(M, msg, null, processed_verb, speaking, listening_device = TRUE) /obj/item/device/radio/listening_bug/afterattack(atom/target_atom, mob/user as mob, proximity) if(!ready_to_disguise) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index c628758c74e8..43eb1810d700 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -206,7 +206,7 @@ // If we were to send to a channel we don't have, drop it. return null -/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, verb = "says", datum/language/speaking = null) +/obj/item/device/radio/talk_into(mob/living/M as mob, message, channel, verb = "says", datum/language/speaking = null, listening_device = FALSE) if(!on) return // the device has to be on // Fix for permacell radios, but kinda eh about actually fixing them. if(!M || !message) return @@ -297,11 +297,11 @@ if(use_volume) Broadcast_Message(connection, M, voicemask, pick(M.speak_emote), src, message, displayname, jobname, real_name, M.voice_name, - filter_type, 0, target_zs, connection.frequency, verb, speaking, volume) + filter_type, 0, target_zs, connection.frequency, verb, speaking, volume, listening_device) else Broadcast_Message(connection, M, voicemask, pick(M.speak_emote), src, message, displayname, jobname, real_name, M.voice_name, - filter_type, 0, target_zs, connection.frequency, verb, speaking, RADIO_VOLUME_QUIET) + filter_type, 0, target_zs, connection.frequency, verb, speaking, RADIO_VOLUME_QUIET, listening_device) /obj/item/device/radio/proc/get_target_zs(frequency) var/turf/position = get_turf(src) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 6c52b497f9a3..c11d35451656 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -573,6 +573,7 @@ GLOBAL_LIST_INIT(bgstate_options, list( dat += "Ghost Ears: [(toggles_chat & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" dat += "Ghost Sight: [(toggles_chat & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" dat += "Ghost Radio: [(toggles_chat & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" + dat += "Ghost Spy Radio: [(toggles_chat & CHAT_LISTENINGBUG) ? "Hear" : "Silence"] listening devices
" dat += "Ghost Hivemind: [(toggles_chat & CHAT_GHOSTHIVEMIND) ? "Show Hivemind" : "Hide Hivemind"]
" dat += "Abovehead Chat: [lang_chat_disabled ? "Hide" : "Show"]
" dat += "Abovehead Emotes: [(toggles_langchat & LANGCHAT_SEE_EMOTES) ? "Show" : "Hide"]
" @@ -1832,6 +1833,9 @@ GLOBAL_LIST_INIT(bgstate_options, list( if("ghost_radio") toggles_chat ^= CHAT_GHOSTRADIO + if("ghost_spyradio") + toggles_chat ^= CHAT_LISTENINGBUG + if("ghost_hivemind") toggles_chat ^= CHAT_GHOSTHIVEMIND diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 6fe334a2a0ab..d246a17bf5c0 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -602,6 +602,14 @@ to_chat(src,SPAN_BOLDNOTICE( "As a ghost, you will now [(prefs.toggles_chat & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"].")) prefs.save_preferences() +/client/proc/toggle_ghost_spyradio() + set name = "Toggle GhostSpyRadio" + set category = "Preferences.Ghost" + set desc = "Toggle between hearing listening devices or not." + prefs.toggles_chat ^= CHAT_LISTENINGBUG + to_chat(src,SPAN_BOLDNOTICE( "As a ghost, you will [(prefs.toggles_chat & CHAT_LISTENINGBUG) ? "now" : "no longer"] hear listening devices as a ghost.")) + prefs.save_preferences() + /client/proc/toggle_ghost_hud() set name = "Toggle Ghost HUDs" set category = "Preferences.Ghost" @@ -757,6 +765,7 @@ GLOBAL_LIST_INIT(ghost_prefs_verbs, list( /client/proc/toggle_ghost_ears, /client/proc/toggle_ghost_sight, /client/proc/toggle_ghost_radio, + /client/proc/toggle_ghost_spyradio, /client/proc/toggle_ghost_hivemind, /client/proc/deadchat, /client/proc/toggle_ghost_hud, From 3186aff5a9bd20cef5dfdf59e879e90609a691b3 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 21 Dec 2023 22:24:57 +0000 Subject: [PATCH 033/205] Automatic changelog for PR #5219 [ci skip] --- html/changelogs/AutoChangeLog-pr-5219.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5219.yml diff --git a/html/changelogs/AutoChangeLog-pr-5219.yml b/html/changelogs/AutoChangeLog-pr-5219.yml new file mode 100644 index 000000000000..701145dfe419 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5219.yml @@ -0,0 +1,4 @@ +author: "realforest2001" +delete-after: True +changes: + - rscadd: "Ghosts can now toggle hearing listening devices or not. This is dependant on hearing radios and will not function to allow hearing devices without also hearing radios." \ No newline at end of file From 05691b4849643499b572762d17823ca0e5068972 Mon Sep 17 00:00:00 2001 From: cuberound <122645057+cuberound@users.noreply.github.com> Date: Thu, 21 Dec 2023 23:38:38 +0100 Subject: [PATCH 034/205] Fixes NE DS doorgun deployment bug (#5213) # About the pull request fixes #5236 fixes the issue that makes DS doorgun deploy itself into DS when placed on NE gunslot # Explain why it's good for the game doorgun in wall bad # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: bad DS doorgun placement /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> Co-authored-by: harryob --- code/modules/cm_marines/dropship_equipment.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm index b50198095aab..bb3e642c4ac9 100644 --- a/code/modules/cm_marines/dropship_equipment.dm +++ b/code/modules/cm_marines/dropship_equipment.dm @@ -339,9 +339,10 @@ if(ship_base.base_category == DROPSHIP_WEAPON) switch(dir) if(NORTH) - if( istype(get_step(src, WEST), /turf/open) ) + var/step_contents = get_step(src, EAST).contents + if(locate(/obj/structure) in step_contents) deployed_mg.pixel_x = 5 - else if ( istype(get_step(src, EAST), /turf/open) ) + else deployed_mg.pixel_x = -5 if(EAST) deployed_mg.pixel_y = 9 @@ -368,12 +369,11 @@ if(ship_base.base_category == DROPSHIP_WEAPON) switch(dir) if(NORTH) - if( istype(get_step(src, WEST), /turf/open) ) + var/step_contents = get_step(src, EAST).contents + if(locate(/obj/structure) in step_contents) deployed_mg.forceMove(get_step(src, WEST)) - else if ( istype(get_step(src, EAST), /turf/open) ) - deployed_mg.forceMove(get_step(src, EAST)) else - deployed_mg.forceMove(get_step(src, NORTH)) + deployed_mg.forceMove(get_step(src, EAST)) if(EAST) deployed_mg.forceMove(get_step(src, SOUTH)) if(WEST) From 98a3b6f78e43fad3732498daf68b6301203b4ece Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 21 Dec 2023 22:49:18 +0000 Subject: [PATCH 035/205] Automatic changelog for PR #5213 [ci skip] --- html/changelogs/AutoChangeLog-pr-5213.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5213.yml diff --git a/html/changelogs/AutoChangeLog-pr-5213.yml b/html/changelogs/AutoChangeLog-pr-5213.yml new file mode 100644 index 000000000000..80fce0fb5c8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5213.yml @@ -0,0 +1,4 @@ +author: "cuberound" +delete-after: True +changes: + - bugfix: "bad DS doorgun placement" \ No newline at end of file From 425a5a130699f72d4137703d583dee751acc3211 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Fri, 22 Dec 2023 00:48:40 +0000 Subject: [PATCH 036/205] Fixes fire resist spamming (#5253) # About the pull request Fixes #5247 and fixes #5124 by changing the `if(!is_mob_incapacitated(TRUE))` check near the end of `/mob/living/verb/resist()` to `if(mobility_flags & MOBILITY_MOVE)`. This was causing the bug because `is_mob_incapacitated()` doesn't check for the `WEAKEN` effect, which is what is added by `resist_fire()`. (Editing `is_mob_incapacitated()` so that it checks for it would probably work too, but since TG uses the `MOBILITY_MOVE` thing and this system is ported from there, I figured I'd just go with that.) # Explain why it's good for the game Fixes fire being too easy to remove. # Testing Photographs and Procedure
Screenshots & Videos **Before:** https://github.com/cmss13-devs/cmss13/assets/57483089/0b5b6777-4286-4eb1-9293-09ffcaa4fb4b **After:** https://github.com/cmss13-devs/cmss13/assets/57483089/84097909-a081-4c4f-8400-59e955b8a443 (Ignore the "There are no pipes within range" message, that's from one of my macros.)
# Changelog :cl: fix: Fixed being able to remove multiple stacks of fire by spamming resist. /:cl: --- .../mob/living/carbon/xenomorph/Xenomorph.dm | 19 +++++++++---------- code/modules/mob/living/living_verbs.dm | 17 ++++------------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index 3095e805be6a..e54383a07b9d 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -1011,22 +1011,21 @@ SPAN_NOTICE("We extinguish ourselves."), null, 5) /mob/living/carbon/xenomorph/resist_restraints() + if(!legcuffed) + return var/breakouttime = legcuffed.breakouttime - next_move = world.time + 100 - last_special = world.time + 10 + next_move = world.time + 10 SECONDS + last_special = world.time + 1 SECONDS var/displaytime = max(1, round(breakouttime / 600)) //Minutes - to_chat(src, SPAN_WARNING("We attempt to remove [legcuffed]. (This will take around [displaytime] minute(s) and we must stand still)")) - for(var/mob/O in viewers(src)) - O.show_message(SPAN_DANGER("[usr] attempts to remove [legcuffed]!"), SHOW_MESSAGE_VISIBLE) - if(!do_after(src, breakouttime, INTERRUPT_NO_NEEDHAND^INTERRUPT_RESIST, BUSY_ICON_HOSTILE)) + visible_message(SPAN_DANGER("[src] attempts to remove [legcuffed]!"), + SPAN_WARNING("We attempt to remove [legcuffed]. (This will take around [displaytime] minute\s and we must stand still)")) + if(!do_after(src, breakouttime, INTERRUPT_NO_NEEDHAND ^ INTERRUPT_RESIST, BUSY_ICON_HOSTILE)) return if(!legcuffed || buckled) - return // time leniency for lag which also might make this whole thing pointless but the server - for(var/mob/O in viewers(src))// lags so hard that 40s isn't lenient enough - Quarxink - O.show_message(SPAN_DANGER("[src] manages to remove [legcuffed]!"), SHOW_MESSAGE_VISIBLE) - to_chat(src, SPAN_NOTICE(" We successfully remove [legcuffed].")) + return + visible_message(SPAN_DANGER("[src] manages to remove [legcuffed]!"), SPAN_NOTICE("We successfully remove [legcuffed].")) drop_inv_item_on_ground(legcuffed) /mob/living/carbon/xenomorph/IgniteMob() diff --git a/code/modules/mob/living/living_verbs.dm b/code/modules/mob/living/living_verbs.dm index 3a97725a6fc4..3f5f5403818a 100644 --- a/code/modules/mob/living/living_verbs.dm +++ b/code/modules/mob/living/living_verbs.dm @@ -170,25 +170,16 @@ return //breaking out of handcuffs & putting out fires - if(!is_mob_incapacitated(TRUE)) + if(mobility_flags & MOBILITY_MOVE) if(on_fire) resist_fire() - - var/on_acid = FALSE - for(var/datum/effects/acid/A in effects_list) - on_acid = TRUE - break - if(on_acid) + if(is_type_in_list(/datum/effects/acid, effects_list)) resist_acid() + if(last_special <= world.time) + resist_restraints() SEND_SIGNAL(src, COMSIG_MOB_RESISTED) - if(!iscarbon(src)) - return - var/mob/living/carbon/C = src - if((C.handcuffed || C.legcuffed) && (C.mobility_flags & MOBILITY_MOVE) && (C.last_special <= world.time)) - resist_restraints() - /mob/living/proc/resist_buckle() buckled.manual_unbuckle(src) From de541db9ede7dc37fc5571b68b88fda4349c25a0 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 22 Dec 2023 00:57:05 +0000 Subject: [PATCH 037/205] Automatic changelog for PR #5253 [ci skip] --- html/changelogs/AutoChangeLog-pr-5253.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5253.yml diff --git a/html/changelogs/AutoChangeLog-pr-5253.yml b/html/changelogs/AutoChangeLog-pr-5253.yml new file mode 100644 index 000000000000..1a95d882b7f3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5253.yml @@ -0,0 +1,4 @@ +author: "SabreML" +delete-after: True +changes: + - bugfix: "Fixed being able to remove multiple stacks of fire by spamming resist." \ No newline at end of file From c0c308fce87d4600c916ed228daf373cce12ad96 Mon Sep 17 00:00:00 2001 From: Doubleumc Date: Thu, 21 Dec 2023 19:57:13 -0500 Subject: [PATCH 038/205] Refactors Get_Angle() and related procs (#5212) # About the pull request To begin, fixes https://github.com/cmss13-devs/cmss13/issues/5206. `Get_Compass_Dir()` needed atoms with valid coordinates, but didn't test for them. Adding some checks and `get_turf`s resolved that issue. But then if `Get_Compass_Dir()` needed those checks, `Get_Angle()` did too. And `get_angle()` (lowercase!). And `get_angle_raw()`. And half of `Get_Compass_Dir()` was just duplicated code from `Get_Angle()`. And-- So I took inspiration from how TG and TGMC did it and refactored the lot. https://github.com/tgstation/tgstation/blob/32fb42d19e0c763f7e5e3dafb9844d0f05e86630/code/__HELPERS/maths.dm#L1-L17 https://github.com/tgstation/TerraGov-Marine-Corps/blob/3963b2d5b89dd60b88a7a1534ee77bd654abe953/code/__HELPERS/unsorted.dm#L99-L159 REMOVED: - `get_angle_raw()` - never used - `get_angle()` - used 3 places, identical use case to `Get_Angle()` - `get_pixel_angle()` - used once, replaced by `delta_to_angle()` ADDED: - `angle_to_dir()` - pulls out the only unique thing `Get_Compass_Dir()` actually did - only difference from TGMC is it retains our angle breakpoints instead of theirs - `delta_to_angle()` - the only thing that actually calculates an angle, uses the 2-argument version of `arctan()` CHANGED: - `Get_Angle()` - removed the `tile_bound` branch (never used), added checks and `get_turf`s, position deltas passed to `delta_to_angle()` - only difference from TGMC is it retains `return 0`s instead of `CRASH`es, retains `get_pixel_position_x`/`y`, and passing to `delta_to_angle()` - `Get_Compass_Dir()` - gutted, now just a convenience function of `Get_Angle()` piped into `angle_to_dir()` # Explain why it's good for the game Having multiple unused or barely used functions trying to do the same thing makes code maintenance harder. # Testing Photographs and Procedure - [x] doesn't crash - [x] security tuner APC detection works - [x] SL/queen tracker works - [x] bullets face the right way # Changelog :cl: fix: Fixed security tuner not dispalying direction to room's APC refactor: Refactored code handling angles /:cl: --- code/__HELPERS/#maths.dm | 44 +------------- code/__HELPERS/unsorted.dm | 57 ++++++++----------- code/modules/cm_marines/radar.dm | 2 +- code/modules/cm_marines/smartgun_mount.dm | 2 +- code/modules/projectiles/projectile.dm | 15 +---- code/modules/vehicles/hardpoints/hardpoint.dm | 2 +- 6 files changed, 31 insertions(+), 91 deletions(-) diff --git a/code/__HELPERS/#maths.dm b/code/__HELPERS/#maths.dm index ccd077003e62..6ea534a79923 100644 --- a/code/__HELPERS/#maths.dm +++ b/code/__HELPERS/#maths.dm @@ -8,12 +8,6 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, // MATH DEFINES -#define Atan2(x, y) (!x && !y ? 0 : \ - (y >= 0 ? \ - arccos(x / sqrt(x*x + y*y)) : \ - -(arccos(x / sqrt(x*x + y*y))) \ - ) \ - ) #define Ceiling(x) (-round(-x)) #define Clamp(val, min_val, max_val) (max(min_val, min(val, max_val))) #define CLAMP01(x) (clamp(x, 0, 1)) @@ -78,7 +72,7 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, // Convert to polar coordinates var/radius = sqrt(relative_coords[1]**2 + relative_coords[2]**2) - var/phi = Atan2(relative_coords[1], relative_coords[2]) + var/phi = arctan(relative_coords[1], relative_coords[2]) // Rotate the point around the axis phi += degrees @@ -106,42 +100,6 @@ GLOBAL_LIST_INIT(sqrtTable, list(1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, return "[round((powerused * 0.000001),0.001)] MW" return "[round((powerused * 0.000000001),0.0001)] GW" -///Calculate the angle between two movables and the west|east coordinate -/proc/get_angle(atom/movable/start, atom/movable/end)//For beams. - if(!start || !end) - return 0 - var/dy =(32 * end.y + end.pixel_y) - (32 * start.y + start.pixel_y) - var/dx =(32 * end.x + end.pixel_x) - (32 * start.x + start.pixel_x) - if(!dy) - return (dx >= 0) ? 90 : 270 - . = arctan(dx/dy) - if(dy < 0) - . += 180 - else if(dx < 0) - . += 360 - -/// Angle between two arbitrary points and horizontal line same as [/proc/get_angle] -/proc/get_angle_raw(start_x, start_y, start_pixel_x, start_pixel_y, end_x, end_y, end_pixel_x, end_pixel_y) - var/dy = (32 * end_y + end_pixel_y) - (32 * start_y + start_pixel_y) - var/dx = (32 * end_x + end_pixel_x) - (32 * start_x + start_pixel_x) - if(!dy) - return (dx >= 0) ? 90 : 270 - . = arctan(dx/dy) - if(dy < 0) - . += 180 - else if(dx < 0) - . += 360 - -///for getting the angle when animating something's pixel_x and pixel_y -/proc/get_pixel_angle(y, x) - if(!y) - return (x >= 0) ? 90 : 270 - . = arctan(x/y) - if(y < 0) - . += 180 - else if(x < 0) - . += 360 - /** * Get a list of turfs in a line from `starting_atom` to `ending_atom`. * diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 0782826a4dc9..7425046da7c7 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -99,38 +99,29 @@ var/atom/movable/big_subject = subject . += (big_subject.bound_height - world.icon_size) / 2 -/proc/Get_Angle(atom/start,atom/end, tile_bound = FALSE)//For beams. - if(!start || !end) return 0 - if(!start.z || !end.z) return 0 //Atoms are not on turfs. - var/dx - var/dy - if(tile_bound) - dy=end.y-start.y - dx=end.x-start.x - else - dy = get_pixel_position_y(end) - get_pixel_position_y(start) - dx = get_pixel_position_x(end) - get_pixel_position_x(start) - if(!dy) - return (dx>=0)?90:270 - .=arctan(dx/dy) - if(dy<0) - .+=180 - else if(dx<0) - .+=360 - -/proc/Get_Compass_Dir(atom/start,atom/end)//get_dir() only considers an object to be north/south/east/west if there is zero deviation. This uses rounding instead. - if(!start || !end) return 0 - if(!start.z || !end.z) return 0 //Atoms are not on turfs. - var/dy=end.y-start.y - var/dx=end.x-start.x - if(!dy) - return (dx>=0)?4:8 - var/angle=arctan(dx/dy) - if(dy<0) - angle+=180 - else if(dx<0) - angle+=360 - +/// Calculate the angle between two atoms. Uses north-clockwise convention: NORTH = 0, EAST = 90, etc. +/proc/Get_Angle(atom/start, atom/end)//For beams. + if(!start || !end) + return 0 + if(!start.z) + start = get_turf(start) + if(!start) + return 0 //Atoms are not on turfs. + if(!end.z) + end = get_turf(end) + if(!end) + return 0 //Atoms are not on turfs. + var/dy = get_pixel_position_y(end) - get_pixel_position_y(start) + var/dx = get_pixel_position_x(end) - get_pixel_position_x(start) + return delta_to_angle(dx, dy) + +/// Calculate the angle produced by a pair of x and y deltas. Uses north-clockwise convention: NORTH = 0, EAST = 90, etc. +/proc/delta_to_angle(dx, dy) + . = arctan(dy, dx) //y-then-x results in north-clockwise convention: https://en.wikipedia.org/wiki/Atan2#East-counterclockwise,_north-clockwise_and_south-clockwise_conventions,_etc. + if(. < 0) + . += 360 + +/proc/angle_to_dir(angle) switch(angle) //diagonal directions get priority over straight directions in edge cases if (22.5 to 67.5) return NORTHEAST @@ -151,6 +142,8 @@ else return NORTH +/proc/Get_Compass_Dir(atom/start, atom/end)//get_dir() only considers an object to be north/south/east/west if there is zero deviation. This uses rounding instead. + return angle_to_dir(Get_Angle(get_turf(start), get_turf(end))) // Among other things, used by flamethrower and boiler spray to calculate if flame/spray can pass through. // Returns an atom for specific effects (primarily flames and acid spray) that damage things upon contact diff --git a/code/modules/cm_marines/radar.dm b/code/modules/cm_marines/radar.dm index f6751a8fe913..d088b68919b0 100644 --- a/code/modules/cm_marines/radar.dm +++ b/code/modules/cm_marines/radar.dm @@ -95,7 +95,7 @@ if(get_dist_euclidian(here_turf, target_turf) > 24) userot = TRUE - rot = round(get_angle(here_turf, target_turf)) + rot = round(Get_Angle(here_turf, target_turf)) else if(target_turf.z > here_turf.z) pointer="caret-up" diff --git a/code/modules/cm_marines/smartgun_mount.dm b/code/modules/cm_marines/smartgun_mount.dm index 308fb79574f6..d4e84195b0ed 100644 --- a/code/modules/cm_marines/smartgun_mount.dm +++ b/code/modules/cm_marines/smartgun_mount.dm @@ -698,7 +698,7 @@ if(!istype(in_chamber, /obj/projectile)) return - var/angle = get_angle(T, U) + var/angle = Get_Angle(T, U) if((dir == NORTH) && (angle > 180) && (abs(360 - angle) > shoot_degree)) // If north and shooting to the left, we do some extra math return diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d6191898c8c2..38ee9c55b2a8 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -246,20 +246,9 @@ vis_source_pixel_x = process_start_pixel_x vis_source_pixel_y = process_start_pixel_y - angle = 0 // Stolen from Get_Angle() basically var/dx = p_x + aim_turf.x * 32 - source_turf.x * 32 // todo account for firer offsets var/dy = p_y + aim_turf.y * 32 - source_turf.y * 32 - if(!dy) - if(dx >= 0) - angle = 90 - else - angle = 280 - else - angle = arctan(dx/dy) - if(dy < 0) - angle += 180 - else if(dx < 0) - angle += 360 + angle = delta_to_angle(dx, dy) /obj/projectile/process(delta_time) . = PROC_RETURN_SLEEP @@ -301,7 +290,7 @@ //Change the bullet angle to its visual path - var/vis_angle = get_pixel_angle(x = pixel_x_target - pixel_x_source, y = pixel_y_target - pixel_y_source) //naming vars because the proc takes y then x and that's WEIRD + var/vis_angle = delta_to_angle(pixel_x_target - pixel_x_source, pixel_y_target - pixel_y_source) var/matrix/rotate = matrix() rotate.Turn(vis_angle) apply_transform(rotate) diff --git a/code/modules/vehicles/hardpoints/hardpoint.dm b/code/modules/vehicles/hardpoints/hardpoint.dm index acdefca18fd2..21e3e4b29f89 100644 --- a/code/modules/vehicles/hardpoints/hardpoint.dm +++ b/code/modules/vehicles/hardpoints/hardpoint.dm @@ -688,7 +688,7 @@ if(muzzle_turf == target_turf) return FALSE - var/angle_diff = SIMPLIFY_DEGREES(dir2angle(dir) - get_angle(muzzle_turf, target_turf)) + var/angle_diff = SIMPLIFY_DEGREES(dir2angle(dir) - Get_Angle(muzzle_turf, target_turf)) if(angle_diff < -180) angle_diff += 360 else if(angle_diff > 180) From 53229a73b1e8f3b24ac2120dc4776d0745cc122f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 22 Dec 2023 01:08:32 +0000 Subject: [PATCH 039/205] Automatic changelog for PR #5212 [ci skip] --- html/changelogs/AutoChangeLog-pr-5212.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5212.yml diff --git a/html/changelogs/AutoChangeLog-pr-5212.yml b/html/changelogs/AutoChangeLog-pr-5212.yml new file mode 100644 index 000000000000..13b3c1c55367 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5212.yml @@ -0,0 +1,5 @@ +author: "Doubleumc" +delete-after: True +changes: + - bugfix: "Fixed security tuner not dispalying direction to room's APC" + - refactor: "Refactored code handling angles" \ No newline at end of file From 9c6b56b59b252e02d6c9e41ca005da0f3de34138 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 22 Dec 2023 01:09:59 +0000 Subject: [PATCH 040/205] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5058.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5212.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5213.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5219.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5241.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5253.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5259.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5261.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5264.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5268.yml | 4 ---- html/changelogs/archive/2023-12.yml | 23 +++++++++++++++++++++++ 11 files changed, 23 insertions(+), 41 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5058.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5212.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5213.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5219.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5241.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5253.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5259.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5261.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5264.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5268.yml diff --git a/html/changelogs/AutoChangeLog-pr-5058.yml b/html/changelogs/AutoChangeLog-pr-5058.yml deleted file mode 100644 index 6edfaed15ce4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5058.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Steelpoint" -delete-after: True -changes: - - rscadd: "Factions are now properly separated in the observe menu as a ghost." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5212.yml b/html/changelogs/AutoChangeLog-pr-5212.yml deleted file mode 100644 index 13b3c1c55367..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5212.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Doubleumc" -delete-after: True -changes: - - bugfix: "Fixed security tuner not dispalying direction to room's APC" - - refactor: "Refactored code handling angles" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5213.yml b/html/changelogs/AutoChangeLog-pr-5213.yml deleted file mode 100644 index 80fce0fb5c8e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5213.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "cuberound" -delete-after: True -changes: - - bugfix: "bad DS doorgun placement" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5219.yml b/html/changelogs/AutoChangeLog-pr-5219.yml deleted file mode 100644 index 701145dfe419..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5219.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - rscadd: "Ghosts can now toggle hearing listening devices or not. This is dependant on hearing radios and will not function to allow hearing devices without also hearing radios." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5241.yml b/html/changelogs/AutoChangeLog-pr-5241.yml deleted file mode 100644 index acb4b1887337..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5241.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "InsaneRed" -delete-after: True -changes: - - code_imp: "Converts xenomorph cooldowns into SECONDS" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5253.yml b/html/changelogs/AutoChangeLog-pr-5253.yml deleted file mode 100644 index 1a95d882b7f3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5253.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - bugfix: "Fixed being able to remove multiple stacks of fire by spamming resist." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5259.yml b/html/changelogs/AutoChangeLog-pr-5259.yml deleted file mode 100644 index 037aa676912b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5259.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ben10083" -delete-after: True -changes: - - rscdel: " Working Joes can no longer drink" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5261.yml b/html/changelogs/AutoChangeLog-pr-5261.yml deleted file mode 100644 index 300ad1e4cd2e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5261.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "realforest2001" -delete-after: True -changes: - - bugfix: "Hijack should no longer end the round immediately." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5264.yml b/html/changelogs/AutoChangeLog-pr-5264.yml deleted file mode 100644 index a7fef11f72b4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5264.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cthulhu80" -delete-after: True -changes: - - ui: "tacmap ui tweaks" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5268.yml b/html/changelogs/AutoChangeLog-pr-5268.yml deleted file mode 100644 index 1bed5f11b860..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5268.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fix Xmas helmets getting overriden by map camouflage." \ No newline at end of file diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml index 2e420ea0d778..d1140d064c2a 100644 --- a/html/changelogs/archive/2023-12.yml +++ b/html/changelogs/archive/2023-12.yml @@ -408,3 +408,26 @@ - bugfix: Lurker can tail jab over ledges and window frames. Drathek: - imageadd: Update weeded warrior sprites to be compatible with knight strain sprite +2023-12-22: + Ben10083: + - rscdel: ' Working Joes can no longer drink' + Cthulhu80: + - ui: tacmap ui tweaks + Doubleumc: + - bugfix: Fixed security tuner not dispalying direction to room's APC + - refactor: Refactored code handling angles + InsaneRed: + - code_imp: Converts xenomorph cooldowns into SECONDS + SabreML: + - bugfix: Fixed being able to remove multiple stacks of fire by spamming resist. + Steelpoint: + - rscadd: Factions are now properly separated in the observe menu as a ghost. + cuberound: + - bugfix: bad DS doorgun placement + fira: + - bugfix: Fix Xmas helmets getting overriden by map camouflage. + realforest2001: + - bugfix: Hijack should no longer end the round immediately. + - rscadd: Ghosts can now toggle hearing listening devices or not. This is dependant + on hearing radios and will not function to allow hearing devices without also + hearing radios. From 706901af54f5d5eba9d52051f44118e3bdd63e3f Mon Sep 17 00:00:00 2001 From: BadAtThisGame <79063506+BadAtThisGame302@users.noreply.github.com> Date: Fri, 22 Dec 2023 19:33:02 +0200 Subject: [PATCH 041/205] Liason typo fix and Goon construction buff. (#5227) # About the pull request Liason is not spelt like that, fixes the USS Almayer area and the ICC path. Goon could not build cades due to skills = and not additional_skills allowing the parent, survivor, to give construction one to it's subpaths. # Explain why it's good for the game Spell check good I am pretty sure that the Goon is the only survivor not being able to build basic cades, I don't see why we restrict that considering that all the other security survivors are able to build them. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: rebalanced goon skillset to include construction 1 spellcheck: fixed Liason area typos to Liaison spellcheck: fixed the ICC Liason to ICC Liaison typo /:cl: --------- Co-authored-by: Jeff Watchson --- code/datums/skills/civilian.dm | 2 +- code/game/area/almayer.dm | 2 +- code/game/machinery/doors/shutters.dm | 2 +- .../survivors/corsat/preset_corsat.dm | 4 +- .../new_varadero/preset_new_varadero.dm | 4 +- .../gear_presets/survivors/survivors.dm | 6 +- maps/corsat.json | 2 +- maps/desert_dam.json | 2 +- .../LV522_Chances_Claim.dmm | 2 +- maps/map_files/LV624/LV624.dmm | 4 +- maps/map_files/USS_Almayer/USS_Almayer.dmm | 172 +++++++++--------- maps/new_varadero.json | 2 +- 12 files changed, 102 insertions(+), 102 deletions(-) diff --git a/code/datums/skills/civilian.dm b/code/datums/skills/civilian.dm index 9b55adc9b1f4..53b7cb8c2194 100644 --- a/code/datums/skills/civilian.dm +++ b/code/datums/skills/civilian.dm @@ -70,7 +70,7 @@ CIVILIAN /datum/skills/civilian/survivor/goon name = "Survivor Goon" - skills = list( + additional_skills = list( SKILL_CQC = SKILL_CQC_TRAINED, SKILL_POLICE = SKILL_POLICE_SKILLED, SKILL_FIREMAN = SKILL_FIREMAN_SKILLED, diff --git a/code/game/area/almayer.dm b/code/game/area/almayer.dm index d9ff42f4f55c..60be3bdfacb8 100644 --- a/code/game/area/almayer.dm +++ b/code/game/area/almayer.dm @@ -119,7 +119,7 @@ fake_zlevel = 1 // upperdeck flags_area = AREA_NOTUNNEL -/area/almayer/command/corporateliason +/area/almayer/command/corporateliaison name = "\improper Corporate Liaison Office" icon_state = "corporatespace" fake_zlevel = 1 // upperdeck diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 2abdf971d724..f91f1f48cade 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -179,7 +179,7 @@ //make a subtype for CL office so it as a proper name. /obj/structure/machinery/door/poddoor/shutters/almayer/cl - name = "\improper Corporate Liason Privacy Shutters" + name = "\improper Corporate Liaison Privacy Shutters" //adding a subtype for CL office to use to secure access to cl office. /obj/structure/machinery/door/poddoor/shutters/almayer/cl/office /obj/structure/machinery/door/poddoor/shutters/almayer/cl/office/door diff --git a/code/modules/gear_presets/survivors/corsat/preset_corsat.dm b/code/modules/gear_presets/survivors/corsat/preset_corsat.dm index f71439b9d7ac..f4267c4454b8 100644 --- a/code/modules/gear_presets/survivors/corsat/preset_corsat.dm +++ b/code/modules/gear_presets/survivors/corsat/preset_corsat.dm @@ -35,11 +35,11 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(new_human), WEAR_FEET) ..() -/datum/equipment_preset/survivor/interstellar_commerce_commission_liason/corsat +/datum/equipment_preset/survivor/interstellar_commerce_commission_liaison/corsat name = "Survivor - Interstellar Commerce Commission Liaison CORSAT" assignment = "Interstellar Commerce Commission Corporate Liaison" -/datum/equipment_preset/survivor/interstellar_commerce_commission_liason/corsat/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/survivor/interstellar_commerce_commission_liaison/corsat/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/formal(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/CMB/limited(new_human), WEAR_L_EAR) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(new_human), WEAR_HEAD) diff --git a/code/modules/gear_presets/survivors/new_varadero/preset_new_varadero.dm b/code/modules/gear_presets/survivors/new_varadero/preset_new_varadero.dm index daa3a8ec019b..077adf971092 100644 --- a/code/modules/gear_presets/survivors/new_varadero/preset_new_varadero.dm +++ b/code/modules/gear_presets/survivors/new_varadero/preset_new_varadero.dm @@ -38,11 +38,11 @@ new_human.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(new_human), WEAR_FEET) ..() -/datum/equipment_preset/survivor/interstellar_commerce_commission_liason/nv +/datum/equipment_preset/survivor/interstellar_commerce_commission_liaison/nv name = "Survivor - Interstellar Commerce Commission Liaison New Varadero" assignment = "Interstellar Commerce Commission Corporate Liaison" -/datum/equipment_preset/survivor/interstellar_commerce_commission_liason/nv/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/survivor/interstellar_commerce_commission_liaison/nv/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit/formal(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(new_human), WEAR_HEAD) new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/hazardvest/black(new_human), WEAR_JACKET) diff --git a/code/modules/gear_presets/survivors/survivors.dm b/code/modules/gear_presets/survivors/survivors.dm index f443b46bb177..d6654fdf4c67 100644 --- a/code/modules/gear_presets/survivors/survivors.dm +++ b/code/modules/gear_presets/survivors/survivors.dm @@ -420,7 +420,7 @@ Everything bellow is a parent used as a base for one or multiple maps. // ----- Interstellar Commerce Commission Survivor // Used in Trijent Dam and New Varadero. -/datum/equipment_preset/survivor/interstellar_commerce_commission_liason +/datum/equipment_preset/survivor/interstellar_commerce_commission_liaison name = "Survivor - Interstellar Commerce Commission Liaison" assignment = "Interstellar Commerce Commission Corporate Liaison" skills = /datum/skills/civilian/survivor @@ -431,11 +431,11 @@ Everything bellow is a parent used as a base for one or multiple maps. survivor_variant = CORPORATE_SURVIVOR -/datum/equipment_preset/survivor/interstellar_commerce_commission_liason/New() +/datum/equipment_preset/survivor/interstellar_commerce_commission_liaison/New() . = ..() access = get_access(ACCESS_LIST_CIVIL_LIAISON) -/datum/equipment_preset/survivor/interstellar_commerce_commission_liason/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/survivor/interstellar_commerce_commission_liaison/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/liaison_suit(new_human), WEAR_BODY) new_human.equip_to_slot_or_del(new /obj/item/device/radio/headset/distress/CMB/limited(new_human), WEAR_L_EAR) diff --git a/maps/corsat.json b/maps/corsat.json index 31df51cb5cb8..87a41e840d61 100644 --- a/maps/corsat.json +++ b/maps/corsat.json @@ -13,7 +13,7 @@ "/datum/equipment_preset/survivor/goon", "/datum/equipment_preset/survivor/doctor/corsat", "/datum/equipment_preset/survivor/security/corsat", - "/datum/equipment_preset/survivor/interstellar_commerce_commission_liason/corsat", + "/datum/equipment_preset/survivor/interstellar_commerce_commission_liaison/corsat", "/datum/equipment_preset/survivor/engineer/corsat", "/datum/equipment_preset/survivor/clf", "/datum/equipment_preset/survivor/civilian" diff --git a/maps/desert_dam.json b/maps/desert_dam.json index b4e535e893d6..6df419583cd3 100644 --- a/maps/desert_dam.json +++ b/maps/desert_dam.json @@ -7,7 +7,7 @@ "/datum/equipment_preset/survivor/doctor/trijent", "/datum/equipment_preset/survivor/roughneck", "/datum/equipment_preset/survivor/chaplain/trijent", - "/datum/equipment_preset/survivor/interstellar_commerce_commission_liason", + "/datum/equipment_preset/survivor/interstellar_commerce_commission_liaison", "/datum/equipment_preset/survivor/colonial_marshal", "/datum/equipment_preset/survivor/engineer/trijent", "/datum/equipment_preset/survivor/engineer/trijent/hydro", diff --git a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm index 9457ccbe9e9f..f4b3d26d3e93 100644 --- a/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm +++ b/maps/map_files/LV522_Chances_Claim/LV522_Chances_Claim.dmm @@ -62142,7 +62142,7 @@ /area/lv522/indoors/c_block/casino) "xHz" = ( /obj/structure/machinery/door/airlock/almayer/generic{ - name = "\improper Corporate Liason Office " + name = "\improper Corporate Liaison Office " }, /turf/open/floor/corsat{ icon_state = "marked" diff --git a/maps/map_files/LV624/LV624.dmm b/maps/map_files/LV624/LV624.dmm index ccaf5f201b6f..becac81a1897 100644 --- a/maps/map_files/LV624/LV624.dmm +++ b/maps/map_files/LV624/LV624.dmm @@ -12485,7 +12485,7 @@ "bnz" = ( /obj/structure/machinery/door/airlock/almayer/generic{ dir = 1; - name = "\improper Corporate Liason" + name = "\improper Corporate Liaison" }, /turf/open/floor{ icon_state = "white" @@ -20011,7 +20011,7 @@ "pQn" = ( /obj/structure/machinery/door/airlock/almayer/generic{ locked = 1; - name = "\improper Corporate Liason" + name = "\improper Corporate Liaison" }, /turf/open/floor{ icon_state = "white" diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index 1c56dc0400ee..a49857355f4f 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -7028,7 +7028,7 @@ /area/almayer/command/cic) "awE" = ( /turf/closed/wall/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "awF" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/living/numbertwobunks) @@ -9639,7 +9639,7 @@ /area/almayer/living/bridgebunks) "aGt" = ( /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "aGv" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 1 @@ -10753,7 +10753,7 @@ icon_state = "pottedplant_21" }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "aLS" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -11897,7 +11897,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "aRE" = ( /obj/structure/machinery/alarm/almayer{ dir = 1 @@ -12232,7 +12232,7 @@ "aSP" = ( /obj/structure/filingcabinet, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "aSY" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -13066,7 +13066,7 @@ pixel_y = 10 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "aWT" = ( /obj/structure/machinery/door/airlock/almayer/maint{ dir = 1 @@ -13507,7 +13507,7 @@ icon_state = "pipe-c" }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "aZK" = ( /obj/structure/pipes/vents/pump{ dir = 4 @@ -13602,12 +13602,12 @@ }, /obj/structure/machinery/faxmachine/corporate/liaison, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bac" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/emails, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bad" = ( /obj/structure/machinery/light, /turf/open/floor/almayer, @@ -13693,7 +13693,7 @@ "baD" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "baG" = ( /obj/structure/largecrate/random/barrel/blue, /turf/open/floor/almayer, @@ -15127,7 +15127,7 @@ "bhM" = ( /obj/structure/safe/cl_office, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bhT" = ( /obj/structure/cargo_container/lockmart/mid{ layer = 3.1; @@ -16477,7 +16477,7 @@ icon_state = "pipe-c" }, /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bpj" = ( /obj/structure/dropship_equipment/fulton_system, /turf/open/floor/almayer{ @@ -16681,11 +16681,11 @@ dir = 4 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bqw" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bqF" = ( /obj/structure/dropship_equipment/fuel/fuel_enhancer, /turf/open/floor/almayer{ @@ -16975,11 +16975,11 @@ }, /obj/structure/surface/table/woodentable/fancy, /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bse" = ( /obj/structure/machinery/computer/arcade, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bsj" = ( /obj/structure/machinery/line_nexter/med{ dir = 4 @@ -17293,7 +17293,7 @@ dir = 4 }, /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "btC" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -17565,7 +17565,7 @@ serial_number = 10 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bvd" = ( /obj/structure/machinery/constructable_frame, /turf/open/floor/almayer{ @@ -17588,7 +17588,7 @@ "bvl" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bvr" = ( /obj/structure/bed/chair/office/dark, /obj/effect/decal/warning_stripes{ @@ -17687,7 +17687,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bvV" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -18167,14 +18167,14 @@ dir = 8 }, /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "byq" = ( /obj/structure/machinery/light{ dir = 4 }, /obj/structure/disposalpipe/segment, /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "byr" = ( /obj/structure/largecrate/random/barrel/green, /turf/open/floor/almayer{ @@ -18345,7 +18345,7 @@ /obj/structure/window/reinforced/tinted/frosted, /obj/item/tool/soap/deluxe, /turf/open/floor/plating/plating_catwalk, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bzy" = ( /turf/closed/wall/almayer, /area/almayer/hallways/vehiclehangar) @@ -18747,7 +18747,7 @@ pixel_x = -32 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bBl" = ( /obj/structure/machinery/light{ dir = 4 @@ -23807,7 +23807,7 @@ /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/disposalpipe/segment, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bXw" = ( /obj/structure/machinery/bioprinter{ stored_metal = 125 @@ -23825,7 +23825,7 @@ pixel_y = 25 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bXH" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 4 @@ -23978,7 +23978,7 @@ /area/almayer/hull/upper_hull/u_a_s) "bYj" = ( /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "bYn" = ( /turf/closed/wall/almayer/outer, /area/almayer/engineering/upper_engineering/port) @@ -25388,7 +25388,7 @@ }, /obj/item/device/portable_vendor/corporate, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "cer" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/almayer{ @@ -27395,7 +27395,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "csz" = ( /turf/open/floor/almayer{ icon_state = "plate" @@ -27532,7 +27532,7 @@ dir = 1 }, /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "cvH" = ( /obj/structure/disposalpipe/segment{ dir = 8 @@ -29413,7 +29413,7 @@ }, /obj/item/device/camera, /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "dhR" = ( /obj/structure/machinery/door/poddoor/shutters/almayer/open{ dir = 4; @@ -29529,7 +29529,7 @@ icon_state = "pottedplant_10" }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "djM" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/reagentgrinder/industrial{ @@ -29852,7 +29852,7 @@ pixel_x = 24 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "dqb" = ( /obj/structure/sign/safety/security{ pixel_x = -16 @@ -31322,7 +31322,7 @@ /turf/open/floor/almayer{ icon_state = "dark_sterile" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "dTt" = ( /obj/structure/surface/table/almayer, /obj/item/device/camera, @@ -31774,7 +31774,7 @@ pixel_x = 2 }, /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "ecR" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -32279,7 +32279,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "ene" = ( /turf/open/floor/almayer{ dir = 4; @@ -33022,7 +33022,7 @@ pixel_y = -3 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "eCI" = ( /obj/structure/window/reinforced/ultra{ pixel_y = -12 @@ -33325,7 +33325,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "eHx" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/machinery/faxmachine/uscm/command, @@ -33454,7 +33454,7 @@ /turf/open/floor/almayer{ icon_state = "dark_sterile" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "eKM" = ( /obj/structure/surface/rack, /obj/effect/decal/cleanable/dirt, @@ -33778,7 +33778,7 @@ dir = 4 }, /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "eUZ" = ( /obj/structure/machinery/firealarm{ pixel_y = 28 @@ -34014,7 +34014,7 @@ "eYW" = ( /obj/structure/filingcabinet/security, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "eZi" = ( /obj/effect/projector{ name = "Almayer_Up4"; @@ -35166,7 +35166,7 @@ }, /obj/structure/machinery/light, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "fAr" = ( /obj/structure/closet/secure_closet/guncabinet/red/mp_armory_m39_submachinegun, /turf/open/floor/plating/plating_catwalk, @@ -35192,7 +35192,7 @@ dir = 4 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "fAS" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply, @@ -36435,7 +36435,7 @@ dir = 8 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "gcc" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -37184,7 +37184,7 @@ pixel_x = -32 }, /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "guS" = ( /obj/structure/reagent_dispensers/fueltank/custom, /turf/open/floor/almayer{ @@ -37641,7 +37641,7 @@ /obj/structure/window/framed/almayer, /obj/structure/machinery/door/poddoor/shutters/almayer/cl/quarter/window, /turf/open/floor/plating, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "gBW" = ( /obj/structure/machinery/floodlight/landing{ name = "bolted floodlight" @@ -37764,7 +37764,7 @@ icon_state = "pipe-c" }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "gFa" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -38750,7 +38750,7 @@ pixel_y = -3 }, /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "haM" = ( /obj/effect/decal/cleanable/blood/oil, /obj/structure/machinery/constructable_frame, @@ -39187,7 +39187,7 @@ dir = 1 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "hiM" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -40223,7 +40223,7 @@ dir = 8 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "hEV" = ( /obj/structure/pipes/vents/pump, /turf/open/floor/almayer, @@ -40338,7 +40338,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "hHR" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -41188,7 +41188,7 @@ pixel_x = 25 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "hZj" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -41264,7 +41264,7 @@ dir = 1 }, /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "ial" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -41497,7 +41497,7 @@ pixel_x = 5 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "igr" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out" @@ -41622,7 +41622,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "iiC" = ( /obj/structure/sign/safety/maint{ pixel_x = 8; @@ -41673,7 +41673,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "ijp" = ( /obj/structure/surface/rack, /obj/item/storage/toolbox/mechanical, @@ -41722,7 +41722,7 @@ pixel_y = 37 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "ikQ" = ( /obj/structure/surface/table/woodentable/fancy, /obj/item/tool/stamp/hop{ @@ -41760,7 +41760,7 @@ pixel_y = 6 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "ily" = ( /obj/structure/machinery/light, /turf/open/floor/almayer, @@ -42763,7 +42763,7 @@ pixel_y = 8 }, /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "iHF" = ( /obj/structure/largecrate/random, /obj/item/reagent_container/food/snacks/cheesecakeslice{ @@ -43869,7 +43869,7 @@ dir = 4 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "jdG" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -46035,7 +46035,7 @@ pixel_x = -25 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "jYR" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -46690,7 +46690,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "kmM" = ( /obj/structure/sink{ pixel_y = 24 @@ -47385,7 +47385,7 @@ /turf/open/floor/almayer{ icon_state = "dark_sterile" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "kAL" = ( /obj/structure/closet/secure_closet/brig, /turf/open/floor/almayer{ @@ -50381,7 +50381,7 @@ }, /obj/structure/machinery/door/poddoor/shutters/almayer/cl/office/window, /turf/open/floor/plating, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "lFm" = ( /turf/open/floor/almayer{ dir = 8; @@ -50842,7 +50842,7 @@ /turf/open/floor/almayer{ icon_state = "dark_sterile" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "lOr" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -51292,7 +51292,7 @@ dir = 1 }, /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "maw" = ( /obj/structure/disposalpipe/segment, /obj/structure/machinery/door/airlock/almayer/maint{ @@ -54776,7 +54776,7 @@ dir = 1 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "ntt" = ( /obj/item/stool, /obj/effect/decal/warning_stripes{ @@ -55220,7 +55220,7 @@ }, /obj/structure/surface/table/woodentable/fancy, /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "nDo" = ( /obj/structure/closet/l3closet/general, /obj/structure/window/reinforced{ @@ -56706,7 +56706,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "ojF" = ( /obj/structure/machinery/cm_vending/clothing/tl/charlie{ density = 0; @@ -57123,7 +57123,7 @@ pixel_y = 32 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "orH" = ( /turf/open/floor/almayer/uscm/directional{ dir = 10 @@ -60395,7 +60395,7 @@ pixel_y = 20 }, /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "pQy" = ( /obj/structure/window/framed/almayer, /turf/open/floor/plating, @@ -62153,7 +62153,7 @@ /obj/item/storage/photo_album, /obj/item/device/camera_film, /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "qyD" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/recharger, @@ -62670,7 +62670,7 @@ /obj/item/clothing/under/redpyjamas, /obj/item/bedsheet/orange, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "qJY" = ( /obj/structure/surface/table/almayer, /obj/item/reagent_container/food/drinks/bottle/orangejuice{ @@ -62867,7 +62867,7 @@ pixel_y = 28 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "qMf" = ( /obj/structure/bed/chair, /turf/open/floor/almayer{ @@ -63989,7 +63989,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "rjV" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/cameras/wooden_tv/prop{ @@ -64178,7 +64178,7 @@ /area/almayer/command/airoom) "rne" = ( /turf/open/floor/carpet, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "rnH" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -66071,7 +66071,7 @@ pixel_x = -17 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "scg" = ( /obj/structure/surface/rack, /obj/effect/spawner/random/toolbox, @@ -69185,7 +69185,7 @@ /obj/item/storage/box/drinkingglasses, /obj/item/storage/fancy/cigar, /turf/open/floor/almayer, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "tnY" = ( /obj/structure/machinery/cryopod{ pixel_y = 6 @@ -69456,7 +69456,7 @@ dir = 8 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "tsM" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -76479,7 +76479,7 @@ dir = 4 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "wfB" = ( /obj/structure/machinery/light{ unacidable = 1; @@ -76603,7 +76603,7 @@ pixel_y = -32 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "wie" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -77491,7 +77491,7 @@ pixel_x = 25 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "wzZ" = ( /obj/structure/machinery/door/airlock/almayer/medical/glass{ dir = 1; @@ -78255,7 +78255,7 @@ dir = 8 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "wQx" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -79085,7 +79085,7 @@ dir = 1 }, /turf/open/floor/wood/ship, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "xgx" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -79438,7 +79438,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "xnl" = ( /obj/structure/machinery/door/airlock/almayer/secure/reinforced{ name = "\improper Exterior Airlock"; @@ -80594,7 +80594,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/command/corporateliason) +/area/almayer/command/corporateliaison) "xJH" = ( /turf/open/floor/almayer{ icon_state = "cargo" diff --git a/maps/new_varadero.json b/maps/new_varadero.json index d695652d0ceb..ec90142c2295 100644 --- a/maps/new_varadero.json +++ b/maps/new_varadero.json @@ -11,7 +11,7 @@ "/datum/equipment_preset/survivor/chaplain/nv", "/datum/equipment_preset/survivor/engineer/nv", "/datum/equipment_preset/survivor/trucker/nv", - "/datum/equipment_preset/survivor/interstellar_commerce_commission_liason/nv", + "/datum/equipment_preset/survivor/interstellar_commerce_commission_liaison/nv", "/datum/equipment_preset/survivor/security/nv", "/datum/equipment_preset/survivor/beachbum", "/datum/equipment_preset/survivor/miner", From f60610a325a52ab2757e5a3d48b39aec9cc65e7a Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 22 Dec 2023 17:41:21 +0000 Subject: [PATCH 042/205] Automatic changelog for PR #5227 [ci skip] --- html/changelogs/AutoChangeLog-pr-5227.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5227.yml diff --git a/html/changelogs/AutoChangeLog-pr-5227.yml b/html/changelogs/AutoChangeLog-pr-5227.yml new file mode 100644 index 000000000000..20d4d6c8f3f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5227.yml @@ -0,0 +1,6 @@ +author: "BadAtThisGame302" +delete-after: True +changes: + - balance: "rebalanced goon skillset to include construction 1" + - spellcheck: "fixed Liason area typos to Liaison" + - spellcheck: "fixed the ICC Liason to ICC Liaison typo" \ No newline at end of file From 23c4c757ed097e1a28a871aa7196962e8cc407f2 Mon Sep 17 00:00:00 2001 From: private-tristan <54422837+private-tristan@users.noreply.github.com> Date: Fri, 22 Dec 2023 12:34:09 -0500 Subject: [PATCH 043/205] nerfs window frames (#5267) # About the pull request any xeno can now apply acid ~~or slash~~ reinforced/normal window frames # Explain why it's good for the game Currently, building as a drone is extremely difficult in maps such as New Valdero and Chances Claim due to your complete inability to clear window frames, forcing you to yell at the AFK warriors in hive to spend 5 minutes clicking on a window frame. I don't see a good reason for window frames to be completely invulnerable to smaller xenomorphs. # Testing Photographs and Procedure
# Changelog :cl: balance: xenos can now acid all window frames. /:cl: --- .../carbon/xenomorph/abilities/ability_helper_procs.dm | 5 ----- .../carbon/xenomorph/abilities/runner/runner_powers.dm | 6 ------ 2 files changed, 11 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm index 1fb0f3a92269..7f3d886deb3a 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm @@ -31,11 +31,6 @@ if(isobj(O)) I = O - if(istype(I, /obj/structure/window_frame)) - var/obj/structure/window_frame/WF = I - if(WF.reinforced && acid_type != /obj/effect/xenomorph/acid/strong) - to_chat(src, SPAN_WARNING("This [O.name] is too tough to be melted by our weak acid.")) - return wait_time = I.get_applying_acid_time() if(wait_time == -1) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm index dad3a992e404..b907a382dda1 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/runner/runner_powers.dm @@ -77,12 +77,6 @@ if(isobj(affected_atom)) object = affected_atom - if(istype(object, /obj/structure/window_frame)) - var/obj/structure/window_frame/window_frame = object - if(window_frame.reinforced && acid_type != /obj/effect/xenomorph/acid/strong) - to_chat(src, SPAN_WARNING("This [object.name] is too tough to be melted by our weak acid.")) - return - wait_time = object.get_applying_acid_time() if(wait_time == -1) to_chat(src, SPAN_WARNING("We cannot dissolve [object].")) From 01c730d345ec64dc45524ecd0d9539bfa1cf98f5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 22 Dec 2023 17:54:43 +0000 Subject: [PATCH 044/205] Automatic changelog for PR #5267 [ci skip] --- html/changelogs/AutoChangeLog-pr-5267.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5267.yml diff --git a/html/changelogs/AutoChangeLog-pr-5267.yml b/html/changelogs/AutoChangeLog-pr-5267.yml new file mode 100644 index 000000000000..2873f862892f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5267.yml @@ -0,0 +1,4 @@ +author: "private-tristan" +delete-after: True +changes: + - balance: "xenos can now acid all window frames." \ No newline at end of file From 9383e8f7cf2beac6ad5fd65df084c094344bf2af Mon Sep 17 00:00:00 2001 From: fira Date: Fri, 22 Dec 2023 22:07:20 +0100 Subject: [PATCH 045/205] Fix Xmas barricade decorator not working (#5270) # About the pull request Decorator changed the main icon of barricades. Not only this is bad due to the file not being up to date, but also wiring doesn't care and reuses the builtin icon file. # Explain why it's good for the game Event code not working # Testing Photographs and Procedure Spawn in, test # Changelog :cl: fix: Fixed X-mas barricade wiring not applying properly. /:cl: --------- Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/game/objects/structures/barricade/barricade.dm | 5 +++-- code/modules/decorators/christmas.dm | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/barricade/barricade.dm b/code/game/objects/structures/barricade/barricade.dm index 5a72ec33ea2a..b23e07f707f2 100644 --- a/code/game/objects/structures/barricade/barricade.dm +++ b/code/game/objects/structures/barricade/barricade.dm @@ -19,6 +19,7 @@ var/force_level_absorption = 5 //How much force an item needs to even damage it at all. var/barricade_hitsound var/barricade_type = "barricade" //"metal", "plasteel", etc. + var/wire_icon = 'icons/obj/structures/barricades.dmi' //! Icon file used for the wiring var/can_change_dmg_state = TRUE var/damage_state = BARRICADE_DMG_NONE var/closed = FALSE @@ -102,9 +103,9 @@ if(is_wired) if(!closed) - overlays += image('icons/obj/structures/barricades.dmi', icon_state = "[src.barricade_type]_wire") + overlays += image(wire_icon, icon_state = "[barricade_type]_wire") else - overlays += image('icons/obj/structures/barricades.dmi', icon_state = "[src.barricade_type]_closed_wire") + overlays += image(wire_icon, icon_state = "[barricade_type]_closed_wire") ..() diff --git a/code/modules/decorators/christmas.dm b/code/modules/decorators/christmas.dm index 6d3f52ffc0f6..290ac6302448 100644 --- a/code/modules/decorators/christmas.dm +++ b/code/modules/decorators/christmas.dm @@ -66,7 +66,7 @@ /datum/decorator/christmas/barricade/decorate(obj/structure/barricade/barricade) if(!istype(barricade)) return - barricade.icon = 'icons/obj/structures/barricades_christmas.dmi' + barricade.wire_icon = 'icons/obj/structures/barricades_christmas.dmi' barricade.update_icon() From 53f62c436dabcea7970fcfde1faaa1dcc37a4229 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 22 Dec 2023 21:15:33 +0000 Subject: [PATCH 046/205] Automatic changelog for PR #5270 [ci skip] --- html/changelogs/AutoChangeLog-pr-5270.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5270.yml diff --git a/html/changelogs/AutoChangeLog-pr-5270.yml b/html/changelogs/AutoChangeLog-pr-5270.yml new file mode 100644 index 000000000000..18db5356adb5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5270.yml @@ -0,0 +1,4 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed X-mas barricade wiring not applying properly." \ No newline at end of file From cddeb3ee4318b4f2b2e4da4b9beb8e987430bccf Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 23 Dec 2023 01:07:48 +0000 Subject: [PATCH 047/205] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5227.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5267.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5270.yml | 4 ---- html/changelogs/archive/2023-12.yml | 9 +++++++++ 4 files changed, 9 insertions(+), 14 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5227.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5267.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5270.yml diff --git a/html/changelogs/AutoChangeLog-pr-5227.yml b/html/changelogs/AutoChangeLog-pr-5227.yml deleted file mode 100644 index 20d4d6c8f3f5..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5227.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "BadAtThisGame302" -delete-after: True -changes: - - balance: "rebalanced goon skillset to include construction 1" - - spellcheck: "fixed Liason area typos to Liaison" - - spellcheck: "fixed the ICC Liason to ICC Liaison typo" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5267.yml b/html/changelogs/AutoChangeLog-pr-5267.yml deleted file mode 100644 index 2873f862892f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5267.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "private-tristan" -delete-after: True -changes: - - balance: "xenos can now acid all window frames." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5270.yml b/html/changelogs/AutoChangeLog-pr-5270.yml deleted file mode 100644 index 18db5356adb5..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5270.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "fira" -delete-after: True -changes: - - bugfix: "Fixed X-mas barricade wiring not applying properly." \ No newline at end of file diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml index d1140d064c2a..18530c16c539 100644 --- a/html/changelogs/archive/2023-12.yml +++ b/html/changelogs/archive/2023-12.yml @@ -431,3 +431,12 @@ - rscadd: Ghosts can now toggle hearing listening devices or not. This is dependant on hearing radios and will not function to allow hearing devices without also hearing radios. +2023-12-23: + BadAtThisGame302: + - balance: rebalanced goon skillset to include construction 1 + - spellcheck: fixed Liason area typos to Liaison + - spellcheck: fixed the ICC Liason to ICC Liaison typo + fira: + - bugfix: Fixed X-mas barricade wiring not applying properly. + private-tristan: + - balance: xenos can now acid all window frames. From bc2f0962e9e7cc33b9233ce02838ad4f5860d981 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Sat, 23 Dec 2023 13:28:42 +0000 Subject: [PATCH 048/205] Allows Xenomorphs to turn off the dropship's launch alarm (#5210) # About the pull request Allows Xenomorphs to turn off the dropship's launch alarm without the queen needing to launch. # Explain why it's good for the game Occasionally (2-3 times that I can think of, at least) someone turns on the dropship's launch alarm after the queen calls it down, resulting in a situation where if the queen wants to wait for evolutions or something else, the entire hive has to listen to a beeping noise for multiple minutes. # Testing Photographs and Procedure
Screenshots & Videos https://github.com/cmss13-devs/cmss13/assets/57483089/9014b2bb-a68a-4ef8-b7ee-1f3e03ce2575
# Changelog :cl: add: Allowed Xenomorphs to turn off the dropship's launch alarm by hitting the nav computer. /:cl: --- .../shuttle/computers/dropship_computer.dm | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm index 6301a4c5ea5b..b7a74d1780df 100644 --- a/code/modules/shuttle/computers/dropship_computer.dm +++ b/code/modules/shuttle/computers/dropship_computer.dm @@ -211,21 +211,31 @@ /obj/structure/machinery/computer/shuttle/dropship/flight/attack_alien(mob/living/carbon/xenomorph/xeno) - if(!is_ground_level(z)) - to_chat(xeno, SPAN_NOTICE("Lights flash from the terminal but we can't comprehend their meaning.")) - playsound(loc, 'sound/machines/terminal_error.ogg', KEYBOARD_SOUND_VOLUME, 1) - return + var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttleId) + // If the attacking xeno isn't the queen. if(xeno.hive_pos != XENO_QUEEN) - to_chat(xeno, SPAN_NOTICE("Lights flash from the terminal but we can't comprehend their meaning.")) - playsound(loc, 'sound/machines/terminal_error.ogg', KEYBOARD_SOUND_VOLUME, 1) - return + // If the 'about to launch' alarm is playing, a xeno can whack the computer to stop it. + if(dropship.playing_launch_announcement_alarm) + stop_playing_launch_announcement_alarm() + xeno.animation_attack_on(src) + to_chat(xeno, SPAN_XENONOTICE("We slash at [src], silencing its squawking!")) + playsound(loc, 'sound/machines/terminal_shutdown.ogg', 20) + else + to_chat(xeno, SPAN_NOTICE("Lights flash from the terminal but we can't comprehend their meaning.")) + playsound(loc, 'sound/machines/terminal_error.ogg', KEYBOARD_SOUND_VOLUME, TRUE) + return XENO_NONCOMBAT_ACTION + + if(!is_ground_level(z)) + // "you" rather than "we" for this one since non-queen castes will have returned above. + to_chat(xeno, SPAN_NOTICE("Lights flash from the terminal but you can't comprehend their meaning.")) + playsound(loc, 'sound/machines/terminal_error.ogg', KEYBOARD_SOUND_VOLUME, TRUE) + return XENO_NONCOMBAT_ACTION if(is_remote) groundside_alien_action(xeno) return - var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttleId) if(dropship.is_hijacked) return @@ -239,6 +249,7 @@ addtimer(CALLBACK(GLOB.almayer_orbital_cannon, TYPE_PROC_REF(/obj/structure/orbital_cannon, enable)), 10 MINUTES, TIMER_UNIQUE) if(!GLOB.resin_lz_allowed) set_lz_resin_allowed(TRUE) + stop_playing_launch_announcement_alarm() to_chat(xeno, SPAN_XENONOTICE("You override the doors.")) xeno_message(SPAN_XENOANNOUNCE("The doors of the metal bird have been overridden! Rejoice!"), 3, xeno.hivenumber) @@ -287,9 +298,6 @@ hijack.fire() GLOB.alt_ctrl_disabled = TRUE - dropship.alarm_sound_loop.stop() - dropship.playing_launch_announcement_alarm = FALSE - marine_announcement("Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.", "Dropship Alert", 'sound/AI/hijack.ogg', logging = ARES_LOG_SECURITY) log_ares_flight("Unknown", "Unscheduled dropship departure detected from operational area. Hijack likely. Shutting down autopilot.") From 58090655b269a5118a08db068f83d49754e33a3e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 23 Dec 2023 13:36:30 +0000 Subject: [PATCH 049/205] Automatic changelog for PR #5210 [ci skip] --- html/changelogs/AutoChangeLog-pr-5210.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5210.yml diff --git a/html/changelogs/AutoChangeLog-pr-5210.yml b/html/changelogs/AutoChangeLog-pr-5210.yml new file mode 100644 index 000000000000..3c4308328ca4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5210.yml @@ -0,0 +1,4 @@ +author: "SabreML" +delete-after: True +changes: + - rscadd: "Allowed Xenomorphs to turn off the dropship's launch alarm by hitting the nav computer." \ No newline at end of file From 84b9b7e5c61ee8d950336907cc2a09cdd61d55bb Mon Sep 17 00:00:00 2001 From: BadAtThisGame <79063506+BadAtThisGame302@users.noreply.github.com> Date: Sun, 24 Dec 2023 00:17:32 +0200 Subject: [PATCH 050/205] Fixes Flight Control Operator surv + gave him a windbreaker and one more access. (#5257) # About the pull request Gives him a jacket, some flight W-Y flight control access and fixed the type path. # Explain why it's good for the game I forgot to give him a jacket in the previous PR, fixes always good + he's a flight control operator and should have access to at least the WY flight control doors. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Added a windbreaker to the Flight Control Operator surv. add: Added W-Y Flight Control access to the Flight Control Operator surv. fix: fixed the Flight Control Operator path. /:cl: Co-authored-by: Jeff Watchson --- code/modules/gear_presets/survivors/survivors.dm | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/modules/gear_presets/survivors/survivors.dm b/code/modules/gear_presets/survivors/survivors.dm index d6654fdf4c67..0e98c60ca453 100644 --- a/code/modules/gear_presets/survivors/survivors.dm +++ b/code/modules/gear_presets/survivors/survivors.dm @@ -378,12 +378,13 @@ Everything bellow is a parent used as a base for one or multiple maps. skills = /datum/skills/civilian/survivor/trucker idtype = /obj/item/card/id/data flags = EQUIPMENT_PRESET_START_OF_ROUND - access = list(ACCESS_CIVILIAN_PUBLIC,ACCESS_CIVILIAN_LOGISTICS) + access = list(ACCESS_CIVILIAN_PUBLIC,ACCESS_CIVILIAN_LOGISTICS,ACCESS_WY_FLIGHT) -/datum/equipment_preset/survivor/engineer/load_gear(mob/living/carbon/human/new_human) +/datum/equipment_preset/survivor/flight_control_operator/load_gear(mob/living/carbon/human/new_human) new_human.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/bluesuit(new_human), WEAR_BODY) if(SSmapping.configs[GROUND_MAP].environment_traits[MAP_COLD]) add_ice_colony_survivor_equipment(new_human) + new_human.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/windbreaker/windbreaker_brown(new_human), WEAR_JACKET) new_human.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(new_human), WEAR_BACK) new_human.equip_to_slot_or_del(new /obj/item/device/binoculars(new_human), WEAR_IN_BACK) new_human.equip_to_slot_or_del(new /obj/item/clothing/head/headset(new_human), WEAR_HEAD) From 6f7c06ca443066b551a6e02bce40eed6f22f8488 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 23 Dec 2023 22:33:10 +0000 Subject: [PATCH 051/205] Automatic changelog for PR #5257 [ci skip] --- html/changelogs/AutoChangeLog-pr-5257.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5257.yml diff --git a/html/changelogs/AutoChangeLog-pr-5257.yml b/html/changelogs/AutoChangeLog-pr-5257.yml new file mode 100644 index 000000000000..97e3774b3fb2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5257.yml @@ -0,0 +1,6 @@ +author: "BadAtThisGame302" +delete-after: True +changes: + - rscadd: "Added a windbreaker to the Flight Control Operator surv." + - rscadd: "Added W-Y Flight Control access to the Flight Control Operator surv." + - bugfix: "fixed the Flight Control Operator path." \ No newline at end of file From 7fa7fc74b4472e34a1e07046074f42c7aebbaae8 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Sat, 23 Dec 2023 22:20:13 +0000 Subject: [PATCH 052/205] Camera console green-ness fix (#5271) # About the pull request Fixes #5077. This was caused by a green lighting filter which was accidentally included in #4940. If someone wants to add it properly then another PR could be opened after this, or maybe this one could be treated as a sort of 'reverse PR' and closed in order to keep the overlay. # Explain why it's good for the game It's technically a bug rather than a feature at the moment. # Testing Photographs and Procedure
Screenshots **Before:** ![UneAhPrK3C](https://github.com/cmss13-devs/cmss13/assets/57483089/3eb7fe0e-d526-4f56-aba8-09bafca8ad9c) **After:** ![GZ9ZBPx3n1](https://github.com/cmss13-devs/cmss13/assets/57483089/34ee98a9-05f5-473a-b158-2af44912586b)
# Changelog :cl: del: Removed the green overlay from camera consoles. /:cl: --- code/game/machinery/computer/camera_console.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/machinery/computer/camera_console.dm b/code/game/machinery/computer/camera_console.dm index ca8c8b2f1a34..cad4fd4fc747 100644 --- a/code/game/machinery/computer/camera_console.dm +++ b/code/game/machinery/computer/camera_console.dm @@ -40,8 +40,6 @@ instance.del_on_map_removal = FALSE if(instance.blend_mode_override) instance.blend_mode = instance.blend_mode_override - if(istype(instance, /atom/movable/screen/plane_master/lighting)) - instance.add_filter("awooga", 1, color_matrix_filter(color_matrix_from_string("#90ee90"))) instance.screen_loc = "[map_name]:CENTER" cam_plane_masters += instance From bf5ad6a3745284a8e17f8478bb6a7b038b008b93 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 23 Dec 2023 22:50:51 +0000 Subject: [PATCH 053/205] Automatic changelog for PR #5271 [ci skip] --- html/changelogs/AutoChangeLog-pr-5271.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5271.yml diff --git a/html/changelogs/AutoChangeLog-pr-5271.yml b/html/changelogs/AutoChangeLog-pr-5271.yml new file mode 100644 index 000000000000..753cca63c2c8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5271.yml @@ -0,0 +1,4 @@ +author: "SabreML" +delete-after: True +changes: + - rscdel: "Removed the green overlay from camera consoles." \ No newline at end of file From 3dabf9c2d2b58b502e3f3088dc748735aa0e036a Mon Sep 17 00:00:00 2001 From: Cthulhu80 <122310258+Cthulhu80@users.noreply.github.com> Date: Sat, 23 Dec 2023 17:37:36 -0500 Subject: [PATCH 054/205] adds forced scream emote after warrior lunge (#5273) # About the pull request ~~Created a new emote called panic, it's very similar to scream and inherits virtually all of its properties and methods however the ogg files are of course different.~~ Added a scream emote whenever a warrior lunges and grabs a human mob, also added one more ogg audio file to the scream list. # Explain why it's good for the game ~~Initially I just wanted to add a forced a scream emote whenever a warrior lunged at a human mob, but I sort of found the existing scream ogg sounds to be kind of lack luster. However, they are iconic in their own right and removing them or modifying them would be a detriment to the game. I chose to create a new emote entirely rather than adding audio files to the existing one. The emote which is similar to scream but the sounds are more "authentic" and erm, immersive. So far it's just two sounds for each gender but this will be changed once I find more audio files to add.~~ Warrior lunges at marines should be a traumatic experience that gives them ptsd. # Changelog :cl: add: human mobs now scream whenever they get lunged at by a warrior. soundadd: added a new scream sound and put it into the existing scream list. /:cl: --- code/game/sound.dm | 2 +- .../abilities/warrior/warrior_powers.dm | 2 ++ sound/voice/human_male_scream_6.ogg | Bin 0 -> 19778 bytes 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 sound/voice/human_male_scream_6.ogg diff --git a/code/game/sound.dm b/code/game/sound.dm index 6adaab109794..ac863a3bc51e 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -344,7 +344,7 @@ S = pick('sound/voice/alien_queen_command.ogg','sound/voice/alien_queen_command2.ogg','sound/voice/alien_queen_command3.ogg') // Human if("male_scream") - S = pick('sound/voice/human_male_scream_1.ogg','sound/voice/human_male_scream_2.ogg','sound/voice/human_male_scream_3.ogg','sound/voice/human_male_scream_4.ogg',5;'sound/voice/human_male_scream_5.ogg',5;'sound/voice/human_jackson_scream.ogg',5;'sound/voice/human_ack_scream.ogg') + S = pick('sound/voice/human_male_scream_1.ogg','sound/voice/human_male_scream_2.ogg','sound/voice/human_male_scream_3.ogg','sound/voice/human_male_scream_4.ogg',5;'sound/voice/human_male_scream_5.ogg',5;'sound/voice/human_jackson_scream.ogg',5;'sound/voice/human_ack_scream.ogg','sound/voice/human_male_scream_6.ogg') if("male_pain") S = pick('sound/voice/human_male_pain_1.ogg','sound/voice/human_male_pain_2.ogg','sound/voice/human_male_pain_3.ogg',5;'sound/voice/tomscream.ogg',5;'sound/voice/human_bobby_pain.ogg',5;'sound/voice/human_tantrum_scream.ogg', 5;'sound/voice/human_male_pain_rare_1.ogg') if("male_fragout") diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm index c25b7e5fc49f..be550e50f0e2 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm @@ -37,6 +37,8 @@ if (xeno.Adjacent(carbon)) xeno.start_pulling(carbon,1) + if(ishuman(carbon)) + INVOKE_ASYNC(carbon, TYPE_PROC_REF(/mob, emote), "scream") else xeno.visible_message(SPAN_XENOWARNING("[xeno]'s claws twitch."), SPAN_XENOWARNING("Our claws twitch as we lunge but are unable to grab onto our target. Wait a moment to try again.")) diff --git a/sound/voice/human_male_scream_6.ogg b/sound/voice/human_male_scream_6.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0005a26bf7ac4d4a05330589150dd35e7267c1fc GIT binary patch literal 19778 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 literal 0 HcmV?d00001 From 336406ac50507832055b8ab516d4f024e4235373 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 23 Dec 2023 23:11:25 +0000 Subject: [PATCH 055/205] Automatic changelog for PR #5273 [ci skip] --- html/changelogs/AutoChangeLog-pr-5273.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5273.yml diff --git a/html/changelogs/AutoChangeLog-pr-5273.yml b/html/changelogs/AutoChangeLog-pr-5273.yml new file mode 100644 index 000000000000..9c9775123e9c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5273.yml @@ -0,0 +1,5 @@ +author: "Cthulhu80" +delete-after: True +changes: + - rscadd: "human mobs now scream whenever they get lunged at by a warrior." + - soundadd: "added a new scream sound and put it into the existing scream list." \ No newline at end of file From ac2ebc8af896ce2383a8812b6fc8d60d5c5201ff Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sat, 23 Dec 2023 15:11:20 -0800 Subject: [PATCH 056/205] Fix Crusher Pass Flags (#5266) # About the pull request This PR is a followup to #5175 that overlooked that the usage of throw_atom will by default add either `PASS_OVER_THROW_MOB` or `PASS_OVER_THROW_ITEM` to the pass flags unless `LOW_LAUNCH` is used instead. # Explain why it's good for the game Fixes #5220 # Testing Photographs and Procedure
Screenshots & Videos ![croosh](https://github.com/cmss13-devs/cmss13/assets/76988376/dac2e275-e261-475a-b52d-8823e14d0bc4)
# Changelog :cl: Drathek fix: Fix crusher charge and tumble abilities going over unwired cades /:cl: --- .../living/carbon/xenomorph/abilities/crusher/crusher_powers.dm | 2 +- .../mob/living/carbon/xenomorph/abilities/general_powers.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm index d661f2112a4d..4ac166c58c69 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/crusher/crusher_powers.dm @@ -306,7 +306,7 @@ var/target = get_step(get_step(Xeno, target_dir), target_dir) var/list/collision_callbacks = list(/mob/living/carbon/human = CALLBACK(src, PROC_REF(handle_mob_collision))) var/list/end_throw_callbacks = list(CALLBACK(src, PROC_REF(on_end_throw), start_charging)) - Xeno.throw_atom(target, target_dist, SPEED_FAST, pass_flags = PASS_CRUSHER_CHARGE, end_throw_callbacks = end_throw_callbacks, collision_callbacks = collision_callbacks) + Xeno.throw_atom(target, target_dist, SPEED_FAST, launch_type = LOW_LAUNCH, pass_flags = PASS_CRUSHER_CHARGE, end_throw_callbacks = end_throw_callbacks, collision_callbacks = collision_callbacks) apply_cooldown() return ..() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm index 81f500245a41..f57bd7990293 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm @@ -433,7 +433,7 @@ pre_pounce_effects() X.pounce_distance = get_dist(X, A) - X.throw_atom(A, distance, throw_speed, X, pass_flags = pounce_pass_flags, collision_callbacks = pounce_callbacks) + X.throw_atom(A, distance, throw_speed, X, launch_type = LOW_LAUNCH, pass_flags = pounce_pass_flags, collision_callbacks = pounce_callbacks) X.update_icons() additional_effects_always() From 17cbbf539ce1d3d58074cca9609196db9b872fbb Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 23 Dec 2023 23:25:29 +0000 Subject: [PATCH 057/205] Automatic changelog for PR #5266 [ci skip] --- html/changelogs/AutoChangeLog-pr-5266.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5266.yml diff --git a/html/changelogs/AutoChangeLog-pr-5266.yml b/html/changelogs/AutoChangeLog-pr-5266.yml new file mode 100644 index 000000000000..c8cf8dbf72b6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5266.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fix crusher charge and tumble abilities going over unwired cades" \ No newline at end of file From bf41565f9f3daf2c6ad64684347c81325d4af726 Mon Sep 17 00:00:00 2001 From: ihatethisengine <115417687+ihatethisengine@users.noreply.github.com> Date: Sun, 24 Dec 2023 02:41:17 +0300 Subject: [PATCH 058/205] New Healer Drone Ability: Sacrifice, another go (#5173) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # About the pull request New healer drone skill — sacrifice. If things get really bad, the healer can instantly transfer 75% of its current health, but for the great cost of the healer’s own life. The sacrifice ability is an emergency button. You don’t have to use it, but at some point you may find that sacrifice is a right thing to do, so it’s a nice option to have. I want to emphasize that this skill is not a necessary part of the healer gameplay. You don’t have to trade your life for the life of another xeno. But you can if you are willing to. Also healer drones gets a counter of the health it has transferred. If healer drone transfers at least 10 000 health points, it will be able to respawn after using the sacrifice ability (like acid runner after kaboom). # Explain why it's good for the game Saving fellow xenos is the most satisfying part of healer drone’s gameplay. This ability allows to save others in really dire situations, but for the great cost. It’s still fitting, because drone already can use heal ability until it goes into crit or dies, in some situations it’s a worthy risk. Also rewards long living healer drones with the opportunity to use the ability without dying. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: ihatethisengine balance: New healer drone ability — sacrifice. Healer drone can instantly transfer 75% of its current health, but for the great cost of the healer’s own life. /:cl: --------- Co-authored-by: ihatethisengine Co-authored-by: harryob Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- .../xenomorph/abilities/general_abilities.dm | 2 +- .../living/carbon/xenomorph/castes/Queen.dm | 6 +- .../mutators/strains/drone/healer.dm | 131 +++++++++++++++++- 3 files changed, 134 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm index 80e4130fccb9..460a561fa801 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm @@ -424,7 +424,7 @@ action_type = XENO_ACTION_CLICK ability_primacy = XENO_PRIMARY_ACTION_5 -/datum/action/xeno_action/activable/place_construction/queen_macro //so it doesn't screw other macros up +/datum/action/xeno_action/activable/place_construction/not_primary //so it doesn't screw other macros up ability_primacy = XENO_NOT_PRIMARY_ACTION /datum/action/xeno_action/activable/xeno_spit diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm index fb61996f2f12..7e5d6ea4efb3 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Queen.dm @@ -292,7 +292,7 @@ /datum/action/xeno_action/onclick/regurgitate, /datum/action/xeno_action/watch_xeno, /datum/action/xeno_action/activable/tail_stab, - /datum/action/xeno_action/activable/place_construction/queen_macro, //normally fifth macro but not as important for queen + /datum/action/xeno_action/activable/place_construction/not_primary, //normally fifth macro but not as important for queen /datum/action/xeno_action/activable/corrosive_acid, /datum/action/xeno_action/onclick/emit_pheromones, /datum/action/xeno_action/onclick/queen_word, @@ -325,7 +325,7 @@ /datum/action/xeno_action/onclick/regurgitate, /datum/action/xeno_action/watch_xeno, /datum/action/xeno_action/activable/tail_stab, - /datum/action/xeno_action/activable/place_construction/queen_macro, //normally fifth macro but not as important for queen + /datum/action/xeno_action/activable/place_construction/not_primary, //normally fifth macro but not as important for queen /datum/action/xeno_action/activable/corrosive_acid, /datum/action/xeno_action/onclick/emit_pheromones, /datum/action/xeno_action/onclick/queen_word, @@ -820,7 +820,7 @@ // These already have their placement locked in: /datum/action/xeno_action/onclick/regurgitate, /datum/action/xeno_action/watch_xeno, - /datum/action/xeno_action/activable/place_construction/queen_macro, + /datum/action/xeno_action/activable/place_construction/not_primary, /datum/action/xeno_action/onclick/emit_pheromones, /datum/action/xeno_action/onclick/queen_word, /datum/action/xeno_action/onclick/psychic_whisper, diff --git a/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/healer.dm b/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/healer.dm index 9015c0bc84ad..86f50b47e080 100644 --- a/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/healer.dm +++ b/code/modules/mob/living/carbon/xenomorph/mutators/strains/drone/healer.dm @@ -9,11 +9,16 @@ /datum/action/xeno_action/activable/secrete_resin, /datum/action/xeno_action/onclick/choose_resin, /datum/action/xeno_action/activable/transfer_plasma, + /datum/action/xeno_action/activable/place_construction, // so it doesn't use fifth macro + /datum/action/xeno_action/onclick/plant_weeds, // so it doesn't break order ) mutator_actions_to_add = list( + /datum/action/xeno_action/activable/place_construction/not_primary, // so it doesn't use fifth macro + /datum/action/xeno_action/onclick/plant_weeds, // so it doesn't break order /datum/action/xeno_action/onclick/plant_resin_fruit, // Second macro. Resin fruits belong to Gardener, but Healer has a minor variant. /datum/action/xeno_action/activable/apply_salve, //Third macro, heal over time ability. /datum/action/xeno_action/activable/transfer_plasma/healer, //Fourth macro, an improved plasma transfer. + /datum/action/xeno_action/activable/healer_sacrifice, //Fifth macro, the ultimate ability to sacrifice yourself ) keystone = TRUE behavior_delegate_type = /datum/behavior_delegate/drone_healer @@ -137,8 +142,10 @@ to_chat(target_xeno, SPAN_XENOWARNING("[src] covers our wounds with a regenerative resin salve. We feel reinvigorated!")) to_chat(src, SPAN_XENOWARNING("We regurgitate our vital fluids and some plasma to create a regenerative resin salve and apply it to [target_xeno]'s wounds. We feel weakened...")) playsound(src, "alien_drool", 25) - var/datum/behavior_delegate/drone_healer/healer_delegate = src.behavior_delegate + var/datum/behavior_delegate/drone_healer/healer_delegate = behavior_delegate healer_delegate.salve_applied_recently = TRUE + if(target_xeno.mutation_type != DRONE_HEALER && !isfacehugger(target_xeno)) // no cheap grinding + healer_delegate.modify_transferred(amount * damage_taken_mod) update_icons() addtimer(CALLBACK(healer_delegate, /datum/behavior_delegate/drone_healer/proc/un_salve), 10 SECONDS, TIMER_OVERRIDE|TIMER_UNIQUE) @@ -148,6 +155,9 @@ var/salve_applied_recently = FALSE var/mutable_appearance/salve_applied_icon + var/transferred_amount = 0 + var/required_transferred_amount = 7500 + /datum/behavior_delegate/drone_healer/on_update_icons() if(!salve_applied_icon) salve_applied_icon = mutable_appearance('icons/mob/xenos/drone_strain_overlays.dmi',"Healer Drone Walking") @@ -173,3 +183,122 @@ /datum/behavior_delegate/drone_healer/proc/un_salve() salve_applied_recently = FALSE bound_xeno.update_icons() + +/* + SACRIFICE +*/ + +/datum/behavior_delegate/drone_healer/proc/modify_transferred(amount) + transferred_amount += amount + +/datum/behavior_delegate/drone_healer/append_to_stat() + . = list() + . += "Transferred health amount: [transferred_amount]/[required_transferred_amount]" + if(transferred_amount >= required_transferred_amount) + . += "Sacrifice will grant you new life." + +/datum/behavior_delegate/drone_healer/on_life() + if(!bound_xeno) + return + if(bound_xeno.stat == DEAD) + return + var/image/holder = bound_xeno.hud_list[PLASMA_HUD] + holder.overlays.Cut() + var/percentage_transferred = min(round((transferred_amount / required_transferred_amount) * 100, 10), 100) + if(percentage_transferred) + holder.overlays += image('icons/mob/hud/hud.dmi', "xenoenergy[percentage_transferred]") + +/datum/behavior_delegate/drone_healer/handle_death(mob/M) + var/image/holder = bound_xeno.hud_list[PLASMA_HUD] + holder.overlays.Cut() + +/datum/action/xeno_action/activable/healer_sacrifice + name = "Sacrifice" + action_icon_state = "screech" + ability_name = "sacrifice" + var/max_range = 1 + var/transfer_mod = 0.75 // only transfers 75% of current healer's health + macro_path = /datum/action/xeno_action/verb/verb_healer_sacrifice + action_type = XENO_ACTION_CLICK + ability_primacy = XENO_PRIMARY_ACTION_5 + +/datum/action/xeno_action/verb/verb_healer_sacrifice() + set category = "Alien" + set name = "Sacrifice" + set hidden = TRUE + var/action_name = "Sacrifice" + handle_xeno_macro(src, action_name) + +/datum/action/xeno_action/activable/healer_sacrifice/use_ability(atom/atom) + var/mob/living/carbon/xenomorph/xeno = owner + var/mob/living/carbon/xenomorph/target = atom + + if(!istype(target)) + return + + if(target == xeno) + to_chat(xeno, "We can't heal ourself!") + return + + if(isfacehugger(target) || islesserdrone(target)) + to_chat(xeno, "It would be a waste...") + return + + if(!xeno.check_state()) + return + + if(!xeno.can_not_harm(target)) //so we can heal only allies + to_chat(xeno, SPAN_WARNING("[target] is an enemy of our hive!")) + return + + if(target.stat == DEAD) + to_chat(xeno, SPAN_WARNING("[target] is already dead!")) + return + + if(target.health >= target.maxHealth) + to_chat(xeno, SPAN_WARNING("[target] is already at max health!")) + return + + if(!isturf(xeno.loc)) + to_chat(xeno, SPAN_WARNING("We cannot transfer health from here!")) + return + + if(get_dist(xeno, target) > max_range) + to_chat(xeno, SPAN_WARNING("We need to be closer to [target].")) + return + + xeno.say(";MY LIFE FOR THE QUEEN!!!") + + target.gain_health(xeno.health * transfer_mod) + target.updatehealth() + + target.xeno_jitter(1 SECONDS) + target.flick_heal_overlay(3 SECONDS, "#44253d") + + target.visible_message(SPAN_XENONOTICE("[xeno] explodes in a deluge of regenerative resin salve, covering [target] in it!")) + xeno_message(SPAN_XENOANNOUNCE("[xeno] sacrifices itself to heal [target]!"), 2, target.hive.hivenumber) + + var/datum/behavior_delegate/drone_healer/behavior_delegate = xeno.behavior_delegate + if(istype(behavior_delegate) && behavior_delegate.transferred_amount >= behavior_delegate.required_transferred_amount && xeno.client && xeno.hive) + var/datum/hive_status/hive_status = xeno.hive + var/turf/spawning_turf = get_turf(xeno) + if(!hive_status.hive_location) + addtimer(CALLBACK(xeno.hive, TYPE_PROC_REF(/datum/hive_status, respawn_on_turf), xeno.client, spawning_turf), 0.5 SECONDS) + else + addtimer(CALLBACK(xeno.hive, TYPE_PROC_REF(/datum/hive_status, free_respawn), xeno.client), 5 SECONDS) + + xeno.gib(create_cause_data("sacrificing itself", src)) + +/datum/action/xeno_action/activable/healer_sacrifice/action_activate() + ..() + var/mob/living/carbon/xenomorph/xeno = owner + if(xeno.selected_ability != src) + return + var/datum/behavior_delegate/drone_healer/behavior_delegate = xeno.behavior_delegate + if(!istype(behavior_delegate)) + return + if(behavior_delegate.transferred_amount < behavior_delegate.required_transferred_amount) + to_chat(xeno, SPAN_HIGHDANGER("Warning: [name] is a last measure skill. Using it will kill us.")) + else + to_chat(xeno, SPAN_HIGHDANGER("Warning: [name] is a last measure skill. Using it will kill us, but new life will be granted for our hard work for the hive.")) + From d194aa69bc842e856a6fb05187411ab50e410d58 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 23 Dec 2023 23:49:37 +0000 Subject: [PATCH 059/205] Automatic changelog for PR #5173 [ci skip] --- html/changelogs/AutoChangeLog-pr-5173.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5173.yml diff --git a/html/changelogs/AutoChangeLog-pr-5173.yml b/html/changelogs/AutoChangeLog-pr-5173.yml new file mode 100644 index 000000000000..215fa4e7928d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5173.yml @@ -0,0 +1,4 @@ +author: "ihatethisengine" +delete-after: True +changes: + - balance: "New healer drone ability — sacrifice. Healer drone can instantly transfer 75% of its current health, but for the great cost of the healer’s own life." \ No newline at end of file From 61e8a488634a7d9589c3b7d85fca62f2f093b9dc Mon Sep 17 00:00:00 2001 From: cuberound <122645057+cuberound@users.noreply.github.com> Date: Sun, 24 Dec 2023 01:20:05 +0100 Subject: [PATCH 060/205] DS doorgun no longer drops the gun when destroyed (#5211) # About the pull request this bug has been around for a looong time, someone might be tempted to abuse it with the MG changes # Explain why it's good for the game moveable m56d with 1500 rounds that can shoot over cover is not intended # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: DS doorgun no longer drops the gun when destroyed /:cl: --------- Co-authored-by: vincibrv Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/modules/cm_marines/dropship_equipment.dm | 6 +++++- code/modules/cm_marines/smartgun_mount.dm | 12 ++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm index bb3e642c4ac9..510b9305a2a6 100644 --- a/code/modules/cm_marines/dropship_equipment.dm +++ b/code/modules/cm_marines/dropship_equipment.dm @@ -300,6 +300,10 @@ deployed_mg = new(src) deployed_mg.deployment_system = src +/obj/structure/dropship_equipment/mg_holder/Destroy() + QDEL_NULL(deployed_mg) + . = ..() + /obj/structure/dropship_equipment/mg_holder/get_examine_text(mob/user) . = ..() if(!deployed_mg) @@ -360,7 +364,7 @@ deployed_mg.forceMove(src) deployed_mg.setDir(dir) else - icon_state = "mg_system_destroyed" + icon_state = "sentry_system_destroyed" /obj/structure/dropship_equipment/mg_holder/proc/deploy_mg(mob/user) if(deployed_mg) diff --git a/code/modules/cm_marines/smartgun_mount.dm b/code/modules/cm_marines/smartgun_mount.dm index d4e84195b0ed..765f7a673812 100644 --- a/code/modules/cm_marines/smartgun_mount.dm +++ b/code/modules/cm_marines/smartgun_mount.dm @@ -1082,6 +1082,18 @@ zoom = 1 ammo = /datum/ammo/bullet/machinegun/doorgun +/obj/structure/machinery/m56d_hmg/mg_turret/update_health(amount) //Negative values restores health. + health -= amount + if(health <= 0) + playsound(src.loc, 'sound/items/Welder2.ogg', 25, 1) + qdel(src) + return + + if(health > health_max) + health = health_max + update_damage_state() + update_icon() + /obj/structure/machinery/m56d_hmg/mg_turret/dropship name = "\improper scoped M56D heavy machine gun" desc = "A scoped M56D heavy machine gun mounted behind a metal shield. Drag its sprite onto yourself to man it. Ctrl-click it to toggle burst fire." From 767a07c613b172c57a169b629af9be2418bda4ed Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 24 Dec 2023 00:29:39 +0000 Subject: [PATCH 061/205] Automatic changelog for PR #5211 [ci skip] --- html/changelogs/AutoChangeLog-pr-5211.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5211.yml diff --git a/html/changelogs/AutoChangeLog-pr-5211.yml b/html/changelogs/AutoChangeLog-pr-5211.yml new file mode 100644 index 000000000000..f2dfd34b23f6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5211.yml @@ -0,0 +1,4 @@ +author: "cuberound" +delete-after: True +changes: + - bugfix: "DS doorgun no longer drops the gun when destroyed" \ No newline at end of file From df9eedb8979cce3dbb0ce19631929a8f163146f3 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Sun, 24 Dec 2023 00:22:09 +0000 Subject: [PATCH 062/205] Makes `xenoboldnotice` actually bold (#5279) # About the pull request Makes the `xenoboldnotice` span class actually bold, rather than italic. Interestingly, it's correct on the 'old chat' stylesheet, so presumably it just got missed when TG-chat was added. https://github.com/cmss13-devs/cmss13/blob/53f62c436dabcea7970fcfde1faaa1dcc37a4229/code/stylesheet.dm#L102 # Explain why it's good for the game The class called 'xenoboldnotice' should be bold. # Testing Photographs and Procedure
Screenshots & Videos **Before:** ![before](https://github.com/cmss13-devs/cmss13/assets/57483089/46fa54cc-1ee6-4046-ba86-2f75deadc7fe) **After:** ![after](https://github.com/cmss13-devs/cmss13/assets/57483089/896a8119-fcec-4c9f-be11-86e7cd95ac44)
**Current 'old chat' version, for reference:** ![old](https://github.com/cmss13-devs/cmss13/assets/57483089/d14538d4-7abf-4b20-8b83-076863248cfc)
# Changelog :cl: spellcheck: Made the `xenoboldnotice` span class bold rather than italic. /:cl: --- tgui/packages/tgui-panel/styles/goon/chat-dark.scss | 2 +- tgui/packages/tgui-panel/styles/goon/chat-light.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss index b4e59f32c121..a0dd2608befc 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-dark.scss @@ -1101,7 +1101,7 @@ em { .xenoboldnotice { color: #51a16c; - font-style: italic; + font-weight: bold; } .xenowarning { diff --git a/tgui/packages/tgui-panel/styles/goon/chat-light.scss b/tgui/packages/tgui-panel/styles/goon/chat-light.scss index 8501d0b9526c..07fc0504e890 100644 --- a/tgui/packages/tgui-panel/styles/goon/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/goon/chat-light.scss @@ -1133,7 +1133,7 @@ h2.alert { .xenoboldnotice { color: #2a623d; - font-style: italic; + font-weight: bold; } .xenowarning { From 88b034f05583cf71aaa608dd08cae52197e89135 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 24 Dec 2023 00:44:13 +0000 Subject: [PATCH 063/205] Automatic changelog for PR #5279 [ci skip] --- html/changelogs/AutoChangeLog-pr-5279.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5279.yml diff --git a/html/changelogs/AutoChangeLog-pr-5279.yml b/html/changelogs/AutoChangeLog-pr-5279.yml new file mode 100644 index 000000000000..a0d972a32c60 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5279.yml @@ -0,0 +1,4 @@ +author: "SabreML" +delete-after: True +changes: + - spellcheck: "Made the `xenoboldnotice` span class bold rather than italic." \ No newline at end of file From 60a087bbb129f78fea136df8b574245cde34c361 Mon Sep 17 00:00:00 2001 From: Julian56 <117036822+Huffie56@users.noreply.github.com> Date: Sun, 24 Dec 2023 02:00:14 +0100 Subject: [PATCH 064/205] Areas almayer qol (#5254) # About the pull request added some more areas to almayer reworked lower engi areas position giving them parent for being lower etc... remove an extra light # Explain why it's good for the game More areas allow to make it easier to navigate the ship and make the localisation system more efficient... better parent avoid repeating lines of code and make it easier to maintain/change it in the future. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: removed an extra light in bravo cryo room(to do just saw it) maptweak: added more areas (stern_point_defense, Lower Deck Stern Hull, Upper Deck port Hallway Upper Deck starboard Hallway) /:cl: --------- Co-authored-by: Julien --- code/controllers/subsystem/hijack.dm | 8 +- code/game/area/almayer.dm | 149 +- code/modules/shuttle/dropship_hijack.dm | 2 +- maps/map_files/USS_Almayer/USS_Almayer.dmm | 2320 ++++++++++++-------- 4 files changed, 1439 insertions(+), 1040 deletions(-) diff --git a/code/controllers/subsystem/hijack.dm b/code/controllers/subsystem/hijack.dm index ee3e86e6095e..ed9eba2bc6c3 100644 --- a/code/controllers/subsystem/hijack.dm +++ b/code/controllers/subsystem/hijack.dm @@ -325,22 +325,22 @@ SUBSYSTEM_DEF(hijack) /datum/controller/subsystem/hijack/proc/heat_engine_room() engine_room_heated = TRUE - var/area/engine_room = GLOB.areas_by_type[/area/almayer/engineering/engine_core] + var/area/engine_room = GLOB.areas_by_type[/area/almayer/engineering/lower/engine_core] engine_room.firealert() engine_room.temperature = T90C for(var/mob/current_mob as anything in GLOB.mob_list) var/area/mob_area = get_area(current_mob) - if(istype(mob_area, /area/almayer/engineering/engine_core)) + if(istype(mob_area, /area/almayer/engineering/lower/engine_core)) to_chat(current_mob, SPAN_BOLDWARNING("You feel the heat of the room increase as the fusion engines whirr louder.")) /datum/controller/subsystem/hijack/proc/superheat_engine_room() engine_room_superheated = TRUE - var/area/engine_room = GLOB.areas_by_type[/area/almayer/engineering/engine_core] + var/area/engine_room = GLOB.areas_by_type[/area/almayer/engineering/lower/engine_core] engine_room.firealert() engine_room.temperature = T120C //slowly deals burn at this temp for(var/mob/current_mob as anything in GLOB.mob_list) var/area/mob_area = get_area(current_mob) - if(istype(mob_area, /area/almayer/engineering/engine_core)) + if(istype(mob_area, /area/almayer/engineering/lower/engine_core)) to_chat(current_mob, SPAN_BOLDWARNING("The room feels incredibly hot, you can't take much more of this!")) /datum/controller/subsystem/hijack/proc/announce_sd_halfway() diff --git a/code/game/area/almayer.dm b/code/game/area/almayer.dm index 60be3bdfacb8..5267798cfe3b 100644 --- a/code/game/area/almayer.dm +++ b/code/game/area/almayer.dm @@ -129,9 +129,40 @@ icon_state = "selfdestruct" fake_zlevel = 1 // upperdeck +// engineering + /area/almayer/engineering minimap_color = MINIMAP_AREA_ENGI +// lower deck + +/area/almayer/engineering/lower + name = "\improper Lower Deck Engineering" + icon_state = "lowerengineering" + fake_zlevel = 2 // lowerdeck + +/area/almayer/engineering/lower/engine_monitoring//this is not used so could be remove? + name = "\improper Lower Deck Engine Reactor Monitoring" + icon_state = "lowermonitoring" + +/area/almayer/engineering/lower/workshop + name = "\improper Lower Deck Engineering Workshop" + icon_state = "workshop" + +/area/almayer/engineering/lower/workshop/hangar + name = "\improper Ordnance workshop" + +/area/almayer/engineering/lower/engine_core + name = "\improper Engine Reactor Core Room" + icon_state = "coreroom" + soundscape_playlist = SCAPE_PL_ENG + soundscape_interval = 15 + hijack_evacuation_area = TRUE + hijack_evacuation_weight = 0.2 + hijack_evacuation_type = EVACUATION_TYPE_ADDITIVE + +// upper deck + /area/almayer/engineering/upper_engineering name = "\improper Upper Deck Engineering" icon_state = "upperengineering" @@ -151,34 +182,6 @@ icon_state = "ceroom" fake_zlevel = 1 // upperdeck -/area/almayer/engineering/lower_engine_monitoring - name = "\improper Lower Deck Engine Reactor Monitoring" - icon_state = "lowermonitoring" - fake_zlevel = 2 // lowerdeck - -/area/almayer/engineering/lower_engineering - name = "\improper Lower Deck Engineering" - icon_state = "lowerengineering" - fake_zlevel = 2 // lowerdeck - -/area/almayer/engineering/engineering_workshop - name = "\improper Lower Deck Engineering Workshop" - icon_state = "workshop" - fake_zlevel = 2 // lowerdeck - -/area/almayer/engineering/engineering_workshop/hangar - name = "\improper Ordnance workshop" - -/area/almayer/engineering/engine_core - name = "\improper Engine Reactor Core Room" - icon_state = "coreroom" - fake_zlevel = 2 // lowerdeck - soundscape_playlist = SCAPE_PL_ENG - soundscape_interval = 15 - hijack_evacuation_area = TRUE - hijack_evacuation_weight = 0.2 - hijack_evacuation_type = EVACUATION_TYPE_ADDITIVE - /area/almayer/engineering/starboard_atmos name = "\improper Upper Deck Starboard Atmospherics" icon_state = "starboardatmos" @@ -238,6 +241,13 @@ icon_state = "portpd" fake_zlevel = 2 // lowerdeck +/area/almayer/shipboard/stern_point_defense + name = "\improper Lower Deck Stern Point Defense" + icon_state = "portpd" + fake_zlevel = 2 // lowerdeck + +// brig + /area/almayer/shipboard/brig name = "\improper Brig" icon_state = "brig" @@ -245,51 +255,38 @@ /area/almayer/shipboard/brig/lobby name = "\improper Brig Lobby" - icon_state = "brig" /area/almayer/shipboard/brig/armory name = "\improper Brig Armory" - icon_state = "brig" /area/almayer/shipboard/brig/main_office name = "\improper Brig Main Office" - icon_state = "brig" /area/almayer/shipboard/brig/perma name = "\improper Brig Perma Cells" - icon_state = "brig" /area/almayer/shipboard/brig/cryo name = "\improper Brig Cryo Pods" - icon_state = "brig" /area/almayer/shipboard/brig/surgery name = "\improper Brig Surgery" - icon_state = "brig" /area/almayer/shipboard/brig/general_equipment name = "\improper Brig General Equipment" - icon_state = "brig" /area/almayer/shipboard/brig/evidence_storage name = "\improper Brig Evidence Storage" - icon_state = "brig" /area/almayer/shipboard/brig/execution name = "\improper Brig Execution Room" - icon_state = "brig" /area/almayer/shipboard/brig/cic_hallway name = "\improper Brig CiC Hallway" - icon_state = "brig" /area/almayer/shipboard/brig/dress name = "\improper CIC Dress Uniform Room" - icon_state = "brig" - /area/almayer/shipboard/brig/processing name = "\improper Brig Processing and Holding" - icon_state = "brig" /area/almayer/shipboard/brig/cells name = "\improper Brig Cells" @@ -393,6 +390,19 @@ icon_state = "starboard" fake_zlevel = 2 // lowerdeck +//new hallways areas + +/area/almayer/hallways/upper + fake_zlevel = 1 // upperdeck + +/area/almayer/hallways/upper/port + name = "\improper Upper Deck Port Hallway" + icon_state = "port" + +/area/almayer/hallways/upper/starboard + name = "\improper Upper Deck Starboard Hallway" + icon_state = "starboard" + /area/almayer/stair_clone name = "\improper Lower Deck Stairs" icon_state = "stairs_lowerdeck" @@ -404,11 +414,38 @@ icon_state = "stairs_upperdeck" fake_zlevel = 1 // upperdeck +// hull areas. + +// lower deck hull areas + /area/almayer/hull/lower_hull name = "\improper Lower Deck Hull" icon_state = "lowerhull" fake_zlevel = 2 // lowerdeck +/area/almayer/hull/lower_hull/stern + name = "\improper Lower Deck Stern Hull" + +/area/almayer/hull/lower_hull/l_f_s + name = "\improper Lower Deck Starboard-Fore Hull" + +/area/almayer/hull/lower_hull/l_m_s + name = "\improper Lower Deck Starboard-Midship Hull" + +/area/almayer/hull/lower_hull/l_a_s + name = "\improper Lower Deck Starboard Hull" + +/area/almayer/hull/lower_hull/l_f_p + name = "\improper Lower Deck Port-Fore Hull" + +/area/almayer/hull/lower_hull/l_m_p + name = "\improper Lower Deck Port-Midship Hull" + +/area/almayer/hull/lower_hull/l_a_p + name = "\improper Lower Deck Port-Aft Hull" + +// upper deck hull areas + /area/almayer/hull/upper_hull name = "\improper Upper Deck Hull" icon_state = "upperhull" @@ -416,51 +453,21 @@ /area/almayer/hull/upper_hull/u_f_s name = "\improper Upper Deck Fore-Starboard Hull" - icon_state = "upperhull" /area/almayer/hull/upper_hull/u_m_s name = "\improper Upper Deck Starboard-Midship Hull" - icon_state = "upperhull" /area/almayer/hull/upper_hull/u_a_s name = "\improper Upper Deck Starboard-Aft Hull" - icon_state = "upperhull" /area/almayer/hull/upper_hull/u_f_p name = "\improper Upper Deck Port-Fore Hull" - icon_state = "upperhull" /area/almayer/hull/upper_hull/u_m_p name = "\improper Upper Deck Port-Midship Hull" - icon_state = "upperhull" /area/almayer/hull/upper_hull/u_a_p name = "\improper Upper Deck Port-Aft Hull" - icon_state = "upperhull" - -/area/almayer/hull/lower_hull/l_f_s - name = "\improper Lower Deck Starboard-Fore Hull" - icon_state = "upperhull" - -/area/almayer/hull/lower_hull/l_m_s - name = "\improper Lower Deck Starboard-Midship Hull" - icon_state = "upperhull" - -/area/almayer/hull/lower_hull/l_a_s - name = "\improper Lower Deck Starboard Hull" - icon_state = "upperhull" - -/area/almayer/hull/lower_hull/l_f_p - name = "\improper Lower Deck Port-Fore Hull" - icon_state = "upperhull" - -/area/almayer/hull/lower_hull/l_m_p - name = "\improper Lower Deck Port-Midship Hull" - icon_state = "upperhull" - -/area/almayer/hull/lower_hull/l_a_p - name = "\improper Lower Deck Port-Aft Hull" - icon_state = "upperhull" /area/almayer/living/cryo_cells name = "\improper Lower Deck Cryo Cells" diff --git a/code/modules/shuttle/dropship_hijack.dm b/code/modules/shuttle/dropship_hijack.dm index db9ff6907118..c01445be5b5b 100644 --- a/code/modules/shuttle/dropship_hijack.dm +++ b/code/modules/shuttle/dropship_hijack.dm @@ -212,7 +212,7 @@ turfs += get_area_turfs(/area/almayer/squads/req) if("Lower deck Aftship") turfs += get_area_turfs(/area/almayer/living/cryo_cells) - turfs += get_area_turfs(/area/almayer/engineering/engineering_workshop) + turfs += get_area_turfs(/area/almayer/engineering/lower/workshop) else CRASH("Crash site [ship_section] unknown.") return pick(turfs) diff --git a/maps/map_files/USS_Almayer/USS_Almayer.dmm b/maps/map_files/USS_Almayer/USS_Almayer.dmm index a49857355f4f..e64aed9cf1c9 100644 --- a/maps/map_files/USS_Almayer/USS_Almayer.dmm +++ b/maps/map_files/USS_Almayer/USS_Almayer.dmm @@ -59,7 +59,7 @@ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "aak" = ( /obj/effect/step_trigger/teleporter/random{ affect_ghosts = 1; @@ -187,7 +187,7 @@ dir = 8; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "aax" = ( /obj/effect/projector{ name = "Almayer_Down2"; @@ -256,7 +256,7 @@ /turf/open/floor/almayer{ allow_construction = 0 }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "aaH" = ( /obj/effect/step_trigger/teleporter_vector{ name = "Almayer_Down1"; @@ -278,7 +278,7 @@ allow_construction = 0; icon_state = "plate" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "aaJ" = ( /obj/structure/stairs{ dir = 1; @@ -295,7 +295,7 @@ /turf/open/floor/plating/almayer{ allow_construction = 0 }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "aaK" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -348,7 +348,7 @@ /turf/open/floor/almayer{ icon_state = "mono" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "aaY" = ( /obj/structure/lattice, /turf/open/space, @@ -418,7 +418,7 @@ dir = 9; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "abp" = ( /obj/effect/step_trigger/clone_cleaner, /turf/closed/wall/almayer, @@ -430,7 +430,7 @@ /obj/structure/disposalpipe/segment, /obj/structure/disposalpipe/segment, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "abu" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -440,7 +440,7 @@ dir = 10; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "abw" = ( /obj/structure/window/framed/almayer/hull, /turf/open/floor/plating, @@ -476,7 +476,7 @@ /turf/open/floor/plating/almayer{ allow_construction = 0 }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "abE" = ( /turf/closed/wall/almayer, /area/almayer/living/basketball) @@ -528,7 +528,7 @@ dir = 8; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "abQ" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -589,7 +589,7 @@ /turf/open/floor/almayer{ icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "ach" = ( /obj/effect/step_trigger/clone_cleaner, /obj/structure/machinery/door/airlock/almayer/maint, @@ -754,7 +754,7 @@ dir = 6; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "acu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -812,10 +812,13 @@ icon_state = "N"; pixel_y = 1 }, +/obj/structure/machinery/power/apc/almayer{ + dir = 1 + }, /turf/open/floor/almayer{ icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "acH" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 4; @@ -828,7 +831,7 @@ dir = 4; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "acI" = ( /obj/structure/desertdam/decals/road_edge{ pixel_x = -12 @@ -905,7 +908,7 @@ dir = 10; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "acP" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -919,7 +922,7 @@ dir = 6; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "acS" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -1034,7 +1037,7 @@ dir = 1; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "adj" = ( /obj/effect/step_trigger/teleporter_vector{ name = "Almayer_Down1"; @@ -1107,7 +1110,7 @@ icon_state = "S" }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "adC" = ( /obj/structure/surface/rack, /obj/item/stock_parts/manipulator/nano{ @@ -1210,7 +1213,7 @@ dir = 6; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "aea" = ( /obj/structure/machinery/light{ dir = 1 @@ -1319,7 +1322,7 @@ /turf/open/floor/almayer{ icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "aez" = ( /obj/structure/bed/chair, /turf/open/floor/almayer{ @@ -1615,7 +1618,7 @@ dir = 4; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "afr" = ( /turf/open/floor/almayer{ dir = 9; @@ -1885,7 +1888,7 @@ /obj/effect/step_trigger/clone_cleaner, /obj/structure/disposalpipe/segment, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "agn" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 6 @@ -2035,7 +2038,7 @@ id = "almayerlink" }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "agO" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /turf/open/floor/almayer{ @@ -2267,7 +2270,7 @@ dir = 1; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "ahJ" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -2692,7 +2695,7 @@ dir = 4; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "ajr" = ( /turf/open/floor/almayer{ dir = 1; @@ -2888,7 +2891,7 @@ dir = 4; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "ajT" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -4514,7 +4517,7 @@ pixel_x = 32 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "apB" = ( /obj/structure/surface/rack, /obj/item/reagent_container/food/snacks/wrapped/booniebars{ @@ -4576,21 +4579,21 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "apO" = ( /obj/structure/machinery/cm_vending/sorted/tech/electronics_storage, /turf/open/floor/almayer{ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "apP" = ( /obj/structure/machinery/autolathe, /turf/open/floor/almayer{ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "apR" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -4637,7 +4640,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "apU" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ dir = 4; @@ -4657,7 +4660,7 @@ dir = 8 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "apW" = ( /obj/structure/machinery/telecomms/server/presets/common, /turf/open/floor/almayer{ @@ -4723,7 +4726,7 @@ pixel_y = 28 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aqe" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -4893,7 +4896,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aqF" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_10" @@ -4989,7 +4992,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aqU" = ( /turf/closed/wall/almayer/reinforced, /area/almayer/command/airoom) @@ -5008,7 +5011,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aqY" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer, @@ -5027,7 +5030,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "are" = ( /obj/structure/machinery/computer/demo_sim{ dir = 4; @@ -5040,7 +5043,7 @@ pixel_y = -8 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "arf" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -5197,13 +5200,13 @@ dir = 4; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "arE" = ( /obj/structure/pipes/vents/pump{ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "arF" = ( /obj/structure/machinery/light{ dir = 1 @@ -5237,7 +5240,7 @@ dir = 9; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "arK" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 8; @@ -5302,7 +5305,7 @@ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "asc" = ( /turf/open/floor/almayer{ dir = 1; @@ -5343,7 +5346,7 @@ dir = 4; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "asj" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -5368,7 +5371,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "asl" = ( /obj/structure/machinery/light{ dir = 1 @@ -5404,7 +5407,7 @@ dir = 8; icon_state = "orangecorner" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "asp" = ( /obj/structure/machinery/firealarm{ pixel_y = 28 @@ -5426,7 +5429,7 @@ "ast" = ( /obj/structure/surface/table/almayer, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "asu" = ( /obj/structure/sign/safety/hazard{ pixel_x = 32; @@ -5449,7 +5452,7 @@ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "asw" = ( /obj/structure/machinery/light{ dir = 8 @@ -5471,14 +5474,14 @@ /turf/open/floor/plating/almayer{ allow_construction = 0 }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "asy" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ dir = 4; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "asA" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, @@ -5491,7 +5494,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "asD" = ( /obj/effect/step_trigger/clone_cleaner, /obj/structure/machinery/door_control{ @@ -5507,7 +5510,7 @@ /area/almayer/command/airoom) "asE" = ( /turf/closed/wall/almayer/reinforced, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "asF" = ( /obj/structure/machinery/door/airlock/almayer/secure/reinforced{ access_modified = 1; @@ -5707,14 +5710,14 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "ate" = ( /obj/structure/surface/rack, /obj/item/reagent_container/glass/bucket/janibucket, /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "atf" = ( /obj/structure/surface/table/almayer, /obj/item/tool/pen, @@ -5740,13 +5743,13 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "ati" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "atj" = ( /obj/effect/projector{ name = "Almayer_Down3"; @@ -5853,7 +5856,7 @@ }, /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "atx" = ( /obj/structure/closet/secure_closet/guncabinet/red/cic_armory_shotgun, /turf/open/floor/almayer{ @@ -5883,7 +5886,7 @@ req_one_access_txt = "35" }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "atC" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -5907,7 +5910,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "atF" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/machinery/door/poddoor/shutters/almayer{ @@ -5918,7 +5921,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "atG" = ( /obj/structure/bed/chair/comfy/beige{ dir = 4 @@ -5946,7 +5949,7 @@ dir = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "atK" = ( /turf/open/floor/almayer{ dir = 10; @@ -6046,14 +6049,14 @@ pixel_y = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aua" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; pixel_y = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aub" = ( /obj/structure/machinery/light{ dir = 1 @@ -6086,7 +6089,7 @@ }, /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aue" = ( /obj/effect/projector{ name = "Almayer_Up3"; @@ -6121,7 +6124,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aui" = ( /obj/structure/machinery/telecomms/hub/preset, /turf/open/floor/almayer{ @@ -6217,7 +6220,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aur" = ( /obj/structure/reagent_dispensers/oxygentank{ anchored = 1 @@ -6229,7 +6232,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aus" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -6239,7 +6242,7 @@ pixel_x = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aut" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -6249,7 +6252,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "auu" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -6279,7 +6282,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "aux" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -6292,7 +6295,7 @@ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "auy" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -6326,7 +6329,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "auD" = ( /obj/structure/bed/chair{ dir = 8 @@ -6350,11 +6353,11 @@ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "auF" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "auG" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; @@ -6389,7 +6392,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "auK" = ( /obj/structure/stairs/perspective{ icon_state = "p_stair_sn_full_cap" @@ -6420,7 +6423,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "auN" = ( /obj/structure/reagent_dispensers/fueltank{ anchored = 1 @@ -6428,7 +6431,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "auO" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -6441,7 +6444,7 @@ icon_state = "W" }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "auQ" = ( /obj/structure/window/framed/almayer, /turf/open/floor/plating, @@ -6500,7 +6503,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "auZ" = ( /obj/structure/machinery/light, /obj/effect/decal/cleanable/dirt, @@ -6521,7 +6524,7 @@ unslashable = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "avb" = ( /obj/structure/reagent_dispensers/fueltank/gas/methane{ anchored = 1 @@ -6533,7 +6536,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "avc" = ( /obj/structure/stairs/perspective{ dir = 4; @@ -6567,13 +6570,13 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "avi" = ( /obj/structure/reagent_dispensers/fueltank/custom, /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "avj" = ( /turf/open/floor/almayer{ icon_state = "blue" @@ -6589,7 +6592,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "avl" = ( /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_s) @@ -6808,7 +6811,7 @@ dir = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "avU" = ( /obj/effect/landmark/start/crew_chief, /turf/open/floor/plating/plating_catwalk, @@ -7600,14 +7603,14 @@ pixel_x = -17 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "ayH" = ( /obj/effect/decal/warning_stripes{ icon_state = "E"; pixel_x = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "ayI" = ( /obj/structure/surface/rack, /obj/item/storage/toolbox/mechanical{ @@ -8061,7 +8064,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "aAd" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -8799,7 +8802,7 @@ pixel_y = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "aCZ" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk, @@ -9223,7 +9226,7 @@ dir = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "aEK" = ( /obj/structure/machinery/status_display{ pixel_y = 30 @@ -9718,7 +9721,7 @@ dir = 8; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "aGS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -10186,7 +10189,7 @@ /turf/open/floor/almayer{ icon_state = "redfull" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "aJc" = ( /obj/structure/machinery/door/airlock/almayer/command{ name = "\improper Commanding Officer's Mess" @@ -10219,7 +10222,7 @@ dir = 10; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "aJf" = ( /obj/structure/machinery/floodlight, /obj/structure/machinery/floodlight, @@ -10535,7 +10538,7 @@ dir = 1; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "aKC" = ( /obj/effect/step_trigger/clone_cleaner, /obj/effect/decal/warning_stripes{ @@ -10546,7 +10549,7 @@ dir = 9; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "aKE" = ( /obj/structure/machinery/light, /turf/open/floor/almayer, @@ -10615,7 +10618,7 @@ /turf/open/floor/plating/almayer{ allow_construction = 0 }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "aKN" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/item/clothing/accessory/red, @@ -10782,7 +10785,7 @@ allow_construction = 0; icon_state = "plate" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "aLZ" = ( /obj/structure/surface/table/almayer, /obj/item/tool/pen, @@ -12613,7 +12616,7 @@ /area/almayer/living/captain_mess) "aUx" = ( /turf/closed/wall/almayer/outer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "aUC" = ( /obj/structure/machinery/light{ dir = 4 @@ -12715,7 +12718,7 @@ /area/almayer/living/captain_mess) "aVl" = ( /turf/closed/wall/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "aVo" = ( /obj/structure/machinery/light{ dir = 1 @@ -12728,7 +12731,7 @@ dir = 10 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "aVr" = ( /obj/structure/closet/secure_closet/freezer/meat, /obj/structure/sign/safety/fridge{ @@ -12972,7 +12975,7 @@ "aWr" = ( /obj/structure/window/framed/almayer/hull, /turf/open/floor/plating, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "aWs" = ( /obj/structure/machinery/power/apc/almayer{ dir = 4 @@ -13168,7 +13171,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "aXS" = ( /obj/structure/machinery/alarm/almayer{ dir = 1 @@ -13865,7 +13868,7 @@ /turf/open/floor/almayer{ allow_construction = 0 }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "bbr" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer{ @@ -14243,12 +14246,6 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_m_s) -"bdo" = ( -/turf/open/floor/almayer{ - dir = 5; - icon_state = "plating" - }, -/area/almayer/hull/lower_hull/l_a_s) "bdr" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/squads/alpha) @@ -14634,7 +14631,7 @@ dir = 1; icon_state = "orangecorner" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bft" = ( /obj/structure/disposalpipe/junction{ dir = 4 @@ -14701,7 +14698,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bfC" = ( /obj/structure/machinery/alarm/almayer{ dir = 1 @@ -15073,11 +15070,11 @@ dir = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bhw" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bhx" = ( /obj/structure/bed/chair/wood/normal{ dir = 1 @@ -15088,7 +15085,7 @@ /area/almayer/living/chapel) "bhB" = ( /turf/closed/wall/almayer/reinforced, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bhC" = ( /obj/structure/machinery/light/small{ dir = 1 @@ -15105,7 +15102,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/shipboard/stern_point_defense) "bhG" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -15270,7 +15267,7 @@ dir = 8; icon_state = "orangecorner" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bje" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 1 @@ -15279,10 +15276,10 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bjg" = ( /turf/open/floor/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bjk" = ( /obj/structure/machinery/door_control{ id = "perma_lockdown_2"; @@ -15303,7 +15300,7 @@ dir = 4 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bjn" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/machinery/door/airlock/multi_tile/almayer/engidoor{ @@ -15312,7 +15309,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bjs" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk, @@ -15332,7 +15329,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "bjA" = ( /turf/open/floor/almayer{ dir = 9; @@ -15478,7 +15475,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bky" = ( /obj/structure/machinery/cryo_cell, /obj/structure/pipes/standard/cap/hidden, @@ -15608,7 +15605,7 @@ /area/almayer/hallways/starboard_hallway) "bkZ" = ( /turf/closed/wall/almayer, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "blb" = ( /obj/structure/sign/safety/hvac_old{ pixel_x = 15; @@ -15623,7 +15620,7 @@ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "blf" = ( /obj/structure/machinery/power/apc/almayer{ dir = 1 @@ -15672,7 +15669,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bln" = ( /obj/structure/sign/safety/cryo{ pixel_x = 3; @@ -15688,7 +15685,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "blp" = ( /obj/structure/surface/table/almayer, /obj/item/clipboard, @@ -15971,13 +15968,13 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bmN" = ( /obj/structure/machinery/power/apc/almayer{ dir = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bmO" = ( /obj/structure/disposalpipe/segment{ dir = 1; @@ -15997,7 +15994,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bmR" = ( /obj/structure/machinery/cm_vending/sorted/tech/tool_storage, /obj/structure/machinery/status_display{ @@ -16006,7 +16003,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bmW" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -16028,16 +16025,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) -"bne" = ( -/obj/structure/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/almayer{ - dir = 5; - icon_state = "plating" - }, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/engineering/lower/engine_core) "bng" = ( /obj/structure/machinery/vending/cigarette{ density = 0; @@ -16358,10 +16346,10 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "boI" = ( /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "boL" = ( /turf/open/floor/almayer, /area/almayer/living/starboard_garden) @@ -16388,7 +16376,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "boU" = ( /obj/structure/platform{ dir = 4; @@ -16402,7 +16390,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "boV" = ( /obj/structure/cargo_container/wy/left, /obj/structure/prop/almayer/minigun_crate{ @@ -16630,7 +16618,7 @@ /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer, /turf/open/floor/plating, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bpY" = ( /obj/structure/surface/table/almayer, /obj/item/frame/table, @@ -16639,7 +16627,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bpZ" = ( /obj/structure/surface/table/almayer, /obj/item/cell/crap, @@ -16648,25 +16636,25 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bqa" = ( /turf/open/floor/almayer{ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bqe" = ( /obj/structure/pipes/vents/scrubber{ dir = 8 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bqf" = ( /obj/structure/machinery/autolathe, /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bqm" = ( /obj/structure/closet/boxinggloves, /turf/open/floor/almayer{ @@ -16851,12 +16839,12 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "brx" = ( /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bry" = ( /obj/structure/sign/poster{ pixel_y = 32 @@ -16887,7 +16875,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "brH" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -16911,7 +16899,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "brJ" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out" @@ -16920,7 +16908,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "brO" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -17200,7 +17188,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "btc" = ( /obj/structure/bed/chair{ dir = 8; @@ -17245,7 +17233,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "btn" = ( /obj/structure/machinery/light{ dir = 1 @@ -17255,7 +17243,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "btp" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 4 @@ -17408,7 +17396,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "buq" = ( /obj/structure/machinery/door/airlock/almayer/maint{ dir = 1 @@ -17486,7 +17474,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "buM" = ( /obj/structure/machinery/cm_vending/clothing/smartgun/bravo, /turf/open/floor/almayer{ @@ -17520,7 +17508,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "buS" = ( /obj/structure/machinery/cm_vending/gear/engi, /turf/open/floor/almayer{ @@ -17545,7 +17533,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bvb" = ( /obj/structure/machinery/light{ dir = 8 @@ -17633,20 +17621,20 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bvK" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/almayer{ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bvL" = ( /turf/open/floor/almayer{ dir = 4; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bvO" = ( /obj/structure/largecrate/random/barrel/white, /turf/open/floor/almayer{ @@ -17660,7 +17648,7 @@ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bvS" = ( /obj/structure/machinery/door/airlock/almayer/maint, /turf/open/floor/almayer{ @@ -17773,7 +17761,7 @@ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bwl" = ( /obj/effect/decal/warning_stripes{ icon_state = "NE-out"; @@ -17822,6 +17810,15 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/lower_medical_medbay) +"bwO" = ( +/obj/structure/sign/safety/hvac_old{ + pixel_x = 8; + pixel_y = -32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/stern) "bwQ" = ( /obj/structure/machinery/light{ dir = 4 @@ -17942,13 +17939,13 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bxr" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bxs" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -17958,7 +17955,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bxx" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /turf/open/floor/almayer{ @@ -18016,13 +18013,13 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bxF" = ( /obj/structure/machinery/alarm/almayer{ dir = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bxG" = ( /obj/structure/pipes/standard/simple/visible{ dir = 6 @@ -18033,7 +18030,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bxH" = ( /obj/structure/pipes/standard/simple/visible{ dir = 4 @@ -18041,7 +18038,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bxI" = ( /obj/structure/pipes/binary/pump/on{ dir = 4 @@ -18049,7 +18046,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bxX" = ( /obj/structure/sign/safety/hvac_old{ pixel_x = 8; @@ -18109,7 +18106,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "byh" = ( /obj/structure/pipes/standard/simple/visible{ dir = 5 @@ -18118,7 +18115,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "byk" = ( /obj/structure/pipes/valve/digital/open{ dir = 4 @@ -18131,7 +18128,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "byl" = ( /obj/structure/pipes/standard/simple/visible{ dir = 9 @@ -18144,7 +18141,7 @@ dir = 1; icon_state = "orangecorner" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bym" = ( /obj/structure/disposalpipe/segment{ dir = 2; @@ -18222,11 +18219,11 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "byA" = ( /obj/structure/machinery/alarm/almayer, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "byC" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 4; @@ -18239,7 +18236,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "byF" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/disposalpipe/segment{ @@ -18263,21 +18260,21 @@ "byJ" = ( /obj/structure/surface/table/almayer, /turf/open/floor/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "byK" = ( /obj/structure/pipes/standard/simple/visible{ dir = 5 }, /obj/structure/machinery/light, /turf/open/floor/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "byL" = ( /obj/structure/machinery/meter, /obj/structure/pipes/standard/simple/visible{ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "byM" = ( /obj/structure/pipes/standard/simple/hidden/universal{ dir = 4 @@ -18285,7 +18282,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "byN" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 @@ -18293,7 +18290,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "byO" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/general_air_control/large_tank_control{ @@ -18302,20 +18299,20 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "byQ" = ( /obj/structure/machinery/suit_storage_unit/carbon_unit, /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "byR" = ( /obj/structure/machinery/suit_storage_unit/carbon_unit, /obj/structure/machinery/light, /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bzg" = ( /obj/structure/pipes/vents/pump{ dir = 8; @@ -18330,7 +18327,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bzo" = ( /obj/structure/machinery/power/apc/almayer, /turf/open/floor/almayer{ @@ -18411,7 +18408,7 @@ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bzQ" = ( /obj/structure/largecrate/random/case, /turf/open/floor/plating/plating_catwalk, @@ -18438,7 +18435,7 @@ dir = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bzV" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -18470,7 +18467,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bzY" = ( /obj/structure/machinery/light, /turf/open/floor/almayer{ @@ -18510,7 +18507,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bAg" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ @@ -18550,7 +18547,7 @@ "bAF" = ( /obj/effect/step_trigger/clone_cleaner, /turf/open/floor/almayer, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "bAH" = ( /obj/structure/largecrate/random/case, /turf/open/floor/almayer{ @@ -18680,7 +18677,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bBd" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -18758,13 +18755,13 @@ /turf/open/floor/almayer{ icon_state = "orangecorner" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bBp" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bBq" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -18775,7 +18772,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bBu" = ( /obj/structure/surface/rack, /turf/open/floor/almayer{ @@ -19046,7 +19043,7 @@ dir = 4 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bCJ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -19055,7 +19052,7 @@ dir = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bCM" = ( /obj/structure/machinery/cryopod, /turf/open/floor/almayer{ @@ -19089,7 +19086,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "bCS" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 9 @@ -19368,7 +19365,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bEl" = ( /obj/structure/machinery/computer/supply_drop_console/limited, /turf/closed/wall/almayer, @@ -19393,7 +19390,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bEo" = ( /obj/structure/bed/sofa/south/grey/right{ pixel_y = 12 @@ -19654,14 +19651,14 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bEV" = ( /obj/structure/closet/firecloset, /turf/open/floor/almayer{ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bFa" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -19682,7 +19679,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bFe" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/cm_vending/sorted/medical/wall_med{ @@ -19693,7 +19690,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bFf" = ( /obj/structure/surface/table/almayer, /obj/item/book/manual/atmospipes, @@ -19702,7 +19699,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bFg" = ( /obj/structure/surface/table/almayer, /obj/item/frame/fire_alarm, @@ -19710,7 +19707,7 @@ dir = 5; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bFj" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -20144,7 +20141,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bHv" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/power/apc/almayer{ @@ -20163,7 +20160,7 @@ dir = 4; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bHy" = ( /obj/structure/surface/table/almayer, /obj/item/storage/belt/utility/full, @@ -20171,7 +20168,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bHz" = ( /obj/structure/surface/table/almayer, /obj/item/fuelCell, @@ -20183,7 +20180,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bHB" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -20531,13 +20528,13 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bJk" = ( /obj/structure/machinery/light, /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bJl" = ( /obj/structure/machinery/door/airlock/almayer/generic{ access_modified = 1; @@ -20601,7 +20598,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bJH" = ( /obj/structure/surface/table/almayer, /obj/item/facepaint/black{ @@ -20614,13 +20611,13 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bJK" = ( /obj/structure/closet/radiation, /turf/open/floor/almayer{ icon_state = "test_floor5" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bJM" = ( /obj/structure/machinery/alarm/almayer{ dir = 1 @@ -20629,7 +20626,7 @@ dir = 9; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bJN" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -20640,7 +20637,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bJO" = ( /obj/structure/machinery/light/small, /obj/structure/sign/safety/nonpress_0g{ @@ -20662,7 +20659,7 @@ dir = 5; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bJQ" = ( /obj/structure/surface/table/almayer, /obj/item/fuelCell, @@ -20670,7 +20667,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bJR" = ( /obj/structure/surface/table/almayer, /obj/item/fuelCell, @@ -20679,7 +20676,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bJS" = ( /obj/structure/surface/rack, /obj/item/tool/wrench, @@ -20884,7 +20881,7 @@ dir = 2 }, /turf/open/floor/plating, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bKQ" = ( /obj/structure/bed/chair{ dir = 8 @@ -20897,7 +20894,7 @@ dir = 4; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bKU" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -20909,7 +20906,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bKV" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -20917,11 +20914,11 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bKW" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bKX" = ( /obj/structure/surface/table/almayer, /obj/item/storage/box/masks, @@ -20950,24 +20947,24 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bLd" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bLe" = ( /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bLf" = ( /turf/open/floor/almayer{ dir = 5; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bLg" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out" @@ -20976,7 +20973,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/shipboard/stern_point_defense) "bLh" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -21310,7 +21307,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bMC" = ( /turf/open/floor/almayer{ dir = 9; @@ -21335,7 +21332,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bMJ" = ( /obj/structure/machinery/light, /obj/structure/machinery/portable_atmospherics/canister/oxygen, @@ -21353,11 +21350,11 @@ /area/almayer/engineering/airmix) "bMM" = ( /turf/open/floor/almayer, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bMN" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bMO" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/prop/almayer/CICmap, @@ -21379,7 +21376,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bMR" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 4 @@ -21430,7 +21427,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bMW" = ( /obj/structure/machinery/power/fusion_engine{ name = "\improper S-52 fusion reactor 13" @@ -21442,19 +21439,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) -"bMX" = ( -/obj/structure/machinery/light/small{ - dir = 8 - }, -/obj/effect/decal/warning_stripes{ - icon_state = "W" - }, -/turf/open/floor/almayer{ - dir = 5; - icon_state = "plating" - }, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/engineering/lower/engine_core) "bMY" = ( /obj/structure/mirror{ pixel_x = 28 @@ -21698,6 +21683,16 @@ icon_state = "plating_striped" }, /area/almayer/squads/req) +"bNR" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/turf/open/floor/almayer{ + dir = 10; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "bNS" = ( /obj/structure/machinery/prop/almayer/computer{ dir = 1 @@ -21738,7 +21733,7 @@ dir = 4 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bOc" = ( /obj/structure/platform{ dir = 1 @@ -21750,7 +21745,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bOe" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -21777,7 +21772,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bOi" = ( /obj/structure/machinery/light{ dir = 1 @@ -21786,7 +21781,7 @@ dir = 9; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bOk" = ( /obj/structure/machinery/power/fusion_engine{ name = "\improper S-52 fusion reactor 2" @@ -21794,7 +21789,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bOl" = ( /obj/structure/machinery/power/fusion_engine{ name = "\improper S-52 fusion reactor 8" @@ -21802,7 +21797,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bOm" = ( /obj/structure/machinery/power/fusion_engine{ name = "\improper S-52 fusion reactor 14" @@ -21810,25 +21805,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) -"bOn" = ( -/obj/structure/machinery/door/airlock/almayer/secure/reinforced{ - name = "\improper Exterior Airlock"; - req_access = null - }, -/turf/open/floor/almayer{ - icon_state = "test_floor4" - }, -/area/almayer/hull/lower_hull/l_a_s) -"bOo" = ( -/obj/effect/decal/warning_stripes{ - icon_state = "W" - }, -/turf/open/floor/almayer{ - dir = 5; - icon_state = "plating" - }, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/engineering/lower/engine_core) "bOq" = ( /obj/structure/prop/almayer/cannon_cables, /turf/open/floor/almayer{ @@ -22007,13 +21984,13 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bPe" = ( /obj/structure/machinery/portable_atmospherics/powered/pump, /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bPg" = ( /obj/vehicle/powerloader, /obj/structure/machinery/light{ @@ -22213,7 +22190,7 @@ /turf/open/floor/almayer{ icon_state = "orangefull" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bPS" = ( /obj/structure/largecrate/random/case/small, /turf/open/floor/almayer{ @@ -22251,7 +22228,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bQa" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out" @@ -22260,7 +22237,7 @@ /turf/open/floor/almayer{ icon_state = "orangefull" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bQc" = ( /obj/structure/machinery/door/airlock/almayer/generic{ dir = 1 @@ -22291,13 +22268,13 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bQi" = ( /turf/open/floor/almayer{ dir = 1; icon_state = "orangecorner" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bQk" = ( /obj/structure/machinery/power/smes/buildable, /obj/structure/machinery/status_display{ @@ -22314,13 +22291,13 @@ /turf/open/floor/almayer{ icon_state = "tcomms" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bQm" = ( /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bQt" = ( /obj/structure/machinery/light, /turf/open/floor/almayer{ @@ -22333,7 +22310,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bQz" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/almayer{ @@ -22484,7 +22461,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bRj" = ( /obj/structure/ladder{ height = 1; @@ -22494,7 +22471,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bRk" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -22505,13 +22482,13 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bRr" = ( /obj/structure/machinery/fuelcell_recycler, /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bRs" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/sign/safety/bridge{ @@ -22538,7 +22515,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bRx" = ( /obj/structure/machinery/door/poddoor/railing{ id = "vehicle_elevator_railing_aux" @@ -22714,7 +22691,7 @@ /turf/open/floor/almayer{ icon_state = "orangefull" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bSl" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -22723,7 +22700,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bSm" = ( /obj/effect/decal/warning_stripes{ icon_state = "NW-out"; @@ -22733,7 +22710,7 @@ /turf/open/floor/almayer{ icon_state = "orangefull" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bSn" = ( /obj/structure/machinery/cm_vending/gear/tl{ density = 0; @@ -22757,7 +22734,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bSv" = ( /turf/closed/wall/almayer, /area/almayer/living/tankerbunks) @@ -22766,10 +22743,10 @@ dir = 8; icon_state = "orangecorner" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bSy" = ( /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bSD" = ( /obj/item/reagent_container/glass/bucket{ pixel_x = -4; @@ -22794,7 +22771,7 @@ /turf/open/floor/almayer{ icon_state = "tcomms" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bSJ" = ( /turf/closed/wall/almayer, /area/almayer/squads/delta) @@ -22891,7 +22868,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bTl" = ( /obj/structure/machinery/power/fusion_engine{ name = "\improper S-52 fusion reactor 4" @@ -22899,7 +22876,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bTn" = ( /obj/structure/machinery/cryopod/right{ layer = 3.1; @@ -22918,7 +22895,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bTq" = ( /obj/structure/machinery/door/airlock/almayer/secure/reinforced{ name = "\improper Evacuation Airlock PL-3"; @@ -22964,7 +22941,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "bTA" = ( /turf/open/floor/almayer, /area/almayer/squads/delta) @@ -23271,7 +23248,7 @@ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bUJ" = ( /obj/structure/platform_decoration{ dir = 4 @@ -23280,14 +23257,14 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bUL" = ( /obj/structure/platform_decoration, /turf/open/floor/almayer{ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bUM" = ( /turf/open/floor/almayer{ dir = 8; @@ -23340,7 +23317,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bUX" = ( /obj/structure/machinery/power/fusion_engine{ name = "\improper S-52 fusion reactor 11" @@ -23348,7 +23325,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bUY" = ( /obj/structure/machinery/power/fusion_engine{ name = "\improper S-52 fusion reactor 17" @@ -23360,7 +23337,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bUZ" = ( /obj/effect/decal/warning_stripes{ icon_state = "NW-out" @@ -23369,7 +23346,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "bVb" = ( /turf/open/floor/almayer{ icon_state = "blue" @@ -23608,14 +23585,14 @@ /turf/open/floor/almayer{ icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "bWw" = ( /obj/structure/pipes/vents/pump{ dir = 8; id_tag = "mining_outpost_pump" }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "bWC" = ( /obj/effect/decal/warning_stripes{ icon_state = "NW-out"; @@ -23624,13 +23601,13 @@ /turf/open/floor/almayer{ icon_state = "redfull" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/lifeboat_pumps/south2) "bWE" = ( /turf/open/floor/almayer{ dir = 10; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/lifeboat_pumps/south2) "bWJ" = ( /obj/structure/machinery/shower{ dir = 4 @@ -23652,7 +23629,7 @@ /area/almayer/squads/req) "bWM" = ( /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "bWP" = ( /obj/effect/decal/warning_stripes{ icon_state = "SW-out" @@ -23674,7 +23651,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "bWT" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -23712,7 +23689,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "bXe" = ( /turf/open/floor/plating/plating_catwalk, /area/almayer/lifeboat_pumps/south2) @@ -23736,7 +23713,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXm" = ( /obj/structure/stairs/perspective{ dir = 1; @@ -23746,7 +23723,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXn" = ( /obj/structure/stairs/perspective{ dir = 8; @@ -23759,7 +23736,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXo" = ( /obj/structure/ladder{ height = 1; @@ -23780,7 +23757,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXs" = ( /obj/structure/machinery/light{ dir = 1 @@ -23794,7 +23771,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXu" = ( /obj/structure/machinery/power/fusion_engine{ name = "\improper S-52 fusion reactor 18" @@ -23802,7 +23779,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXv" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/disposalpipe/segment, @@ -23846,7 +23823,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23857,7 +23834,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXR" = ( /obj/structure/stairs/perspective{ icon_state = "p_stair_sn_full_cap" @@ -23869,7 +23846,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXS" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -23878,7 +23855,7 @@ dir = 4 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXU" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -23894,7 +23871,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXV" = ( /obj/structure/machinery/light{ dir = 1 @@ -23908,7 +23885,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bXX" = ( /obj/structure/machinery/light{ dir = 8 @@ -24025,7 +24002,7 @@ dir = 5; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "bYz" = ( /obj/structure/sign/safety/south{ pixel_x = 32; @@ -24057,7 +24034,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bYK" = ( /obj/structure/sign/safety/ladder{ pixel_x = 8; @@ -24067,11 +24044,11 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bYM" = ( /obj/structure/pipes/vents/pump, /turf/open/floor/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bYO" = ( /obj/structure/pipes/vents/pump{ dir = 1 @@ -24079,7 +24056,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bYP" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -24088,7 +24065,7 @@ dir = 6; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "bYQ" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -24097,7 +24074,7 @@ dir = 4; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "bYS" = ( /obj/structure/pipes/vents/scrubber{ dir = 1 @@ -24105,12 +24082,12 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bYU" = ( /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bYV" = ( /obj/item/fuelCell, /obj/item/fuelCell, @@ -24120,7 +24097,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bYW" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 1; @@ -24130,7 +24107,7 @@ dir = 6; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bYY" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/disposalpipe/segment, @@ -24235,7 +24212,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bZD" = ( /obj/structure/surface/table/almayer, /obj/item/fuelCell, @@ -24248,7 +24225,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "bZE" = ( /obj/structure/pipes/binary/pump/on{ dir = 4 @@ -24264,7 +24241,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "bZH" = ( /obj/structure/machinery/firealarm{ dir = 8; @@ -24469,7 +24446,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "caz" = ( /obj/structure/surface/table/almayer, /obj/item/storage/firstaid/toxin{ @@ -24480,7 +24457,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "caA" = ( /obj/structure/surface/table/almayer, /obj/item/storage/firstaid/fire, @@ -24488,7 +24465,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "caB" = ( /obj/structure/surface/table/almayer, /obj/item/device/flashlight, @@ -24497,7 +24474,7 @@ dir = 6; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "caC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -24539,7 +24516,7 @@ dir = 1; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "caM" = ( /obj/structure/largecrate/random/barrel/blue, /turf/open/floor/almayer{ @@ -24710,7 +24687,7 @@ pixel_y = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "cbH" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/effect/decal/warning_stripes{ @@ -24720,7 +24697,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "cbM" = ( /obj/structure/closet/crate, /obj/item/clothing/glasses/welding, @@ -24735,7 +24712,7 @@ dir = 9; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "cbO" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -24748,7 +24725,7 @@ dir = 5; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "cbQ" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -24883,7 +24860,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccf" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -24891,7 +24868,7 @@ /turf/open/floor/almayer{ icon_state = "redfull" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "ccg" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -24978,7 +24955,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccy" = ( /obj/structure/machinery/firealarm{ pixel_y = 28 @@ -24987,7 +24964,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccz" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 5 @@ -24995,7 +24972,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccA" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -25003,7 +24980,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccB" = ( /obj/structure/machinery/alarm/almayer{ dir = 1 @@ -25017,7 +24994,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccC" = ( /obj/structure/machinery/light{ dir = 1 @@ -25032,7 +25009,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccD" = ( /obj/structure/pipes/standard/simple/visible{ dir = 10 @@ -25045,7 +25022,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccE" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/general_air_control/large_tank_control{ @@ -25054,7 +25031,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccG" = ( /obj/structure/largecrate/random/secure, /obj/effect/decal/warning_stripes{ @@ -25097,7 +25074,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccS" = ( /obj/structure/pipes/standard/simple/visible{ dir = 4 @@ -25105,7 +25082,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccT" = ( /obj/structure/pipes/trinary/mixer{ dir = 4; @@ -25114,7 +25091,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccU" = ( /obj/structure/pipes/vents/pump{ dir = 8; @@ -25130,12 +25107,12 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccW" = ( /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccX" = ( /obj/structure/pipes/binary/pump/high_power/on{ dir = 1 @@ -25143,7 +25120,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ccY" = ( /obj/effect/decal/warning_stripes{ icon_state = "NE-out"; @@ -25153,7 +25130,7 @@ dir = 10; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "cdb" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -25227,7 +25204,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "cdu" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out"; @@ -25237,7 +25214,7 @@ dir = 9; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "cdw" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating/plating_catwalk, @@ -25394,7 +25371,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ces" = ( /obj/structure/machinery/door/airlock/almayer/maint, /turf/open/floor/almayer{ @@ -25461,6 +25438,9 @@ icon_state = "plate" }, /area/almayer/living/bridgebunks) +"ceM" = ( +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/stern) "ceQ" = ( /obj/structure/machinery/status_display{ pixel_y = 30 @@ -25686,7 +25666,7 @@ /turf/open/floor/almayer{ icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "cgJ" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -26798,7 +26778,7 @@ /area/almayer/squads/req) "cmp" = ( /turf/closed/wall/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "cmq" = ( /obj/effect/landmark/yautja_teleport, /turf/open/floor/plating/plating_catwalk, @@ -27504,6 +27484,12 @@ icon_state = "plate" }, /area/almayer/hallways/hangar) +"cuA" = ( +/turf/open/floor/almayer{ + dir = 10; + icon_state = "red" + }, +/area/almayer/lifeboat_pumps/north2) "cuC" = ( /turf/closed/wall/almayer/outer, /area/almayer/engineering/upper_engineering/starboard) @@ -27545,6 +27531,15 @@ }, /turf/open/floor/almayer, /area/almayer/shipboard/brig/cells) +"cvY" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "cvZ" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -27565,7 +27560,7 @@ dir = 4; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "cwo" = ( /obj/structure/largecrate/random/mini/chest{ pixel_x = 4 @@ -27627,7 +27622,16 @@ }, /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) +"cxg" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "red" + }, +/area/almayer/hallways/upper/port) "cxk" = ( /obj/structure/machinery/light, /turf/open/floor/almayer, @@ -27665,6 +27669,16 @@ allow_construction = 0 }, /area/almayer/hallways/port_hallway) +"cyT" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "cyU" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 5 @@ -27928,7 +27942,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "cDn" = ( /obj/structure/surface/table/almayer, /obj/item/ashtray/glass{ @@ -28034,7 +28048,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "cEC" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28180,7 +28194,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "cHP" = ( /obj/structure/machinery/light/small, /obj/effect/decal/warning_stripes{ @@ -28248,7 +28262,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "cIU" = ( /obj/structure/sign/safety/hvac_old{ pixel_x = 8; @@ -28399,7 +28413,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "cLA" = ( /obj/structure/machinery/cryopod/right{ pixel_y = 6 @@ -28716,7 +28730,7 @@ dir = 4; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "cSQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -28759,7 +28773,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "cUv" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 1 @@ -28859,7 +28873,7 @@ dir = 4; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "cWv" = ( /turf/open/floor/almayer{ dir = 8; @@ -29031,7 +29045,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "cZV" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/item/storage/fancy/cigarettes/wypacket, @@ -29072,7 +29086,7 @@ icon_state = "SE-out" }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "dac" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -29209,10 +29223,16 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_a_p) +"ddi" = ( +/turf/open/floor/almayer{ + dir = 9; + icon_state = "red" + }, +/area/almayer/lifeboat_pumps/north2) "ddj" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "ddk" = ( /obj/structure/surface/table/almayer, /turf/open/floor/almayer{ @@ -29236,7 +29256,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "deg" = ( /obj/structure/platform_decoration{ dir = 1 @@ -29469,7 +29489,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "diJ" = ( /obj/structure/window/reinforced{ dir = 8; @@ -29520,7 +29540,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "djL" = ( /obj/structure/machinery/light{ dir = 4 @@ -29538,7 +29558,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "djQ" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -30149,7 +30169,7 @@ pixel_y = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "dwl" = ( /obj/structure/machinery/light, /turf/open/floor/almayer, @@ -30235,7 +30255,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "dya" = ( /obj/structure/machinery/door/poddoor/almayer/locked{ dir = 2; @@ -30550,7 +30570,7 @@ dir = 4; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "dDp" = ( /obj/effect/decal/warning_stripes{ icon_state = "W"; @@ -30750,7 +30770,7 @@ dir = 5; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "dGz" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30815,7 +30835,7 @@ dir = 6; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "dHu" = ( /obj/structure/desertdam/decals/road_edge{ pixel_x = 2; @@ -31052,7 +31072,7 @@ "dNx" = ( /obj/structure/pipes/vents/pump, /turf/open/floor/almayer, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "dNB" = ( /obj/structure/largecrate/random/barrel/yellow, /turf/open/floor/almayer{ @@ -31096,6 +31116,10 @@ icon_state = "plate" }, /area/almayer/command/lifeboat) +"dPn" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/upper/port) "dPC" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 9 @@ -31134,6 +31158,9 @@ icon_state = "silver" }, /area/almayer/command/airoom) +"dQm" = ( +/turf/closed/wall/almayer, +/area/almayer/shipboard/stern_point_defense) "dQp" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/effect/decal/warning_stripes{ @@ -31244,6 +31271,16 @@ icon_state = "red" }, /area/almayer/hallways/starboard_hallway) +"dRN" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "SE-out"; + pixel_x = 1 + }, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "dRT" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 4 @@ -31279,7 +31316,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/shipboard/stern_point_defense) "dSA" = ( /obj/structure/largecrate/random/case/small, /turf/open/floor/plating/plating_catwalk, @@ -31444,7 +31481,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "dWg" = ( /obj/effect/landmark/start/cargo, /obj/structure/machinery/light, @@ -31703,7 +31740,7 @@ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "ebN" = ( /turf/closed/wall/almayer/white/reinforced, /area/almayer/command/airoom) @@ -31742,7 +31779,7 @@ dir = 6; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "ecM" = ( /obj/structure/bed/chair{ dir = 4 @@ -32027,6 +32064,20 @@ icon_state = "plate" }, /area/almayer/living/port_emb) +"ehT" = ( +/obj/effect/step_trigger/clone_cleaner, +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/obj/structure/machinery/light{ + dir = 4 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "ehX" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -32335,7 +32386,7 @@ dir = 10; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "epu" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/machinery/door/poddoor/almayer/open{ @@ -32796,6 +32847,24 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_p) +"eyA" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/obj/structure/sign/safety/maint{ + pixel_x = 8; + pixel_y = 32 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/upper/starboard) "eyG" = ( /obj/structure/platform, /turf/open/floor/almayer{ @@ -33257,6 +33326,15 @@ icon_state = "bluecorner" }, /area/almayer/hallways/aft_hallway) +"eGo" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "eGr" = ( /obj/structure/machinery/door/airlock/almayer/security/glass/reinforced{ dir = 1; @@ -33274,7 +33352,7 @@ /turf/open/floor/almayer{ icon_state = "cargo_arrow" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "eGz" = ( /obj/structure/sign/safety/storage{ pixel_x = -17 @@ -33593,6 +33671,16 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_a_s) +"ePt" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + dir = 10; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "ePA" = ( /obj/structure/machinery/light{ dir = 1 @@ -33607,7 +33695,7 @@ id_tag = "mining_outpost_pump" }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "eQi" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/sign/safety/maint{ @@ -33625,7 +33713,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "eRe" = ( /obj/structure/bed/chair/comfy/orange{ dir = 8 @@ -34117,6 +34205,16 @@ icon_state = "test_floor4" }, /area/almayer/command/cichallway) +"faZ" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/structure/machinery/power/apc/almayer, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "fbb" = ( /obj/effect/decal/warning_stripes{ icon_state = "NE-out"; @@ -34211,7 +34309,7 @@ dir = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "fcM" = ( /obj/structure/machinery/camera/autoname/almayer{ name = "ship-grade camera" @@ -34398,7 +34496,7 @@ layer = 2.5 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "fgR" = ( /obj/structure/machinery/door/poddoor/almayer/open{ id = "Brig Lockdown Shutters"; @@ -34455,7 +34553,7 @@ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "fjO" = ( /obj/item/tool/wet_sign, /obj/effect/decal/cleanable/blood, @@ -34493,6 +34591,16 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_a_p) +"flH" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/structure/machinery/light, +/turf/open/floor/almayer{ + dir = 9; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "flP" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 4; @@ -34648,7 +34756,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "fpO" = ( /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, @@ -35019,7 +35127,7 @@ pixel_x = 8 }, /turf/closed/wall/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "fxz" = ( /obj/structure/prop/invuln/overhead_pipe{ pixel_x = 12 @@ -35071,7 +35179,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "fxZ" = ( /obj/structure/disposalpipe/segment{ dir = 8; @@ -35333,7 +35441,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "fEk" = ( /turf/open/floor/almayer{ icon_state = "test_floor4" @@ -35510,7 +35618,7 @@ icon_state = "NW-out" }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "fHF" = ( /turf/open/floor/almayer{ icon_state = "greenfull" @@ -35534,7 +35642,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "fIH" = ( /obj/structure/largecrate/random/barrel/blue, /turf/open/floor/almayer{ @@ -35642,7 +35750,7 @@ "fKg" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/hull/lower_hull/stern) "fKi" = ( /obj/structure/bed/chair/comfy/black{ dir = 4 @@ -35753,7 +35861,7 @@ pixel_y = -32 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "fMe" = ( /obj/structure/surface/table/almayer, /obj/item/device/flashlight/lamp{ @@ -35822,6 +35930,12 @@ icon_state = "green" }, /area/almayer/hallways/aft_hallway) +"fMX" = ( +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/stern) "fNg" = ( /obj/structure/largecrate/random/barrel/yellow, /turf/open/floor/plating/plating_catwalk, @@ -35944,6 +36058,17 @@ icon_state = "test_floor4" }, /area/almayer/command/airoom) +"fPN" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "NW-out"; + pixel_y = 1 + }, +/obj/effect/decal/warning_stripes{ + icon_state = "NE-out"; + pixel_y = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/upper/starboard) "fQk" = ( /obj/structure/largecrate/random, /turf/open/floor/plating/plating_catwalk, @@ -36162,7 +36287,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "fXd" = ( /obj/structure/machinery/light/small{ dir = 4 @@ -36255,7 +36380,7 @@ dir = 10; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "fYZ" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -36457,7 +36582,7 @@ pixel_y = 12 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/hull/lower_hull/stern) "gcN" = ( /obj/structure/machinery/door/airlock/almayer/command{ access_modified = 1; @@ -36698,7 +36823,7 @@ /area/almayer/squads/bravo) "gir" = ( /turf/closed/wall/almayer/reinforced, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "giB" = ( /obj/structure/machinery/alarm/almayer{ dir = 1 @@ -36917,19 +37042,6 @@ icon_state = "red" }, /area/almayer/lifeboat_pumps/south1) -"gnz" = ( -/obj/structure/sign/safety/hazard{ - pixel_x = 32; - pixel_y = 7 - }, -/obj/structure/sign/safety/airlock{ - pixel_x = 32; - pixel_y = -8 - }, -/turf/open/floor/almayer{ - icon_state = "plate" - }, -/area/almayer/hull/lower_hull/l_a_s) "gob" = ( /obj/structure/closet/fireaxecabinet{ pixel_y = 32 @@ -37003,6 +37115,12 @@ icon_state = "test_floor4" }, /area/almayer/hallways/hangar) +"gpm" = ( +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "gpI" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply, @@ -37067,7 +37185,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "gsg" = ( /obj/structure/pipes/vents/pump, /obj/structure/mirror{ @@ -37350,7 +37468,7 @@ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "gwY" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ dir = 1; @@ -37523,7 +37641,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "gzw" = ( /obj/structure/closet/hydrant{ pixel_x = 30 @@ -37988,7 +38106,7 @@ dir = 4; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "gJP" = ( /obj/structure/machinery/light, /obj/structure/disposalpipe/segment{ @@ -38190,7 +38308,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "gNp" = ( /turf/open/floor/almayer{ dir = 9; @@ -38301,7 +38419,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "gQF" = ( /obj/structure/bed/chair/comfy{ buckling_y = 2; @@ -38420,7 +38538,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "gUL" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -38543,7 +38661,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "gXs" = ( /obj/effect/step_trigger/ares_alert/terminals, /obj/structure/machinery/door/poddoor/shutters/almayer{ @@ -38566,7 +38684,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "gXx" = ( /obj/structure/bed/chair{ dir = 8 @@ -38593,7 +38711,7 @@ dir = 10; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "gYe" = ( /obj/structure/machinery/vending/sea, /turf/open/floor/almayer{ @@ -38808,7 +38926,7 @@ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "hcf" = ( /obj/item/bedsheet/brown{ layer = 3.2 @@ -38869,7 +38987,7 @@ id = "almayerlink_OT_req" }, /turf/closed/wall/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "hcI" = ( /obj/structure/machinery/cryopod{ pixel_y = 6 @@ -38905,7 +39023,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "hdh" = ( /obj/effect/decal/warning_stripes{ icon_state = "W" @@ -38970,7 +39088,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "heo" = ( /obj/structure/machinery/power/apc/almayer{ cell_type = /obj/item/cell/hyper; @@ -38992,6 +39110,13 @@ icon_state = "plate" }, /area/almayer/shipboard/brig/armory) +"heA" = ( +/obj/effect/step_trigger/clone_cleaner, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "heK" = ( /obj/structure/machinery/door/airlock/almayer/maint{ dir = 1; @@ -39045,7 +39170,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "hfQ" = ( /obj/structure/window/framed/almayer, /turf/open/floor/almayer{ @@ -39081,7 +39206,7 @@ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "hgB" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/computer/intel, @@ -39660,7 +39785,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "hsg" = ( /obj/structure/pipes/vents/pump{ dir = 4 @@ -39845,7 +39970,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "hxG" = ( /obj/structure/pipes/vents/pump{ dir = 4 @@ -40450,7 +40575,7 @@ /turf/open/floor/almayer{ icon_state = "cargo_arrow" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "hLB" = ( /obj/structure/machinery/light/small{ dir = 1 @@ -40526,7 +40651,7 @@ icon_state = "SE-out" }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "hLS" = ( /obj/structure/machinery/door/airlock/almayer/marine/delta{ dir = 1 @@ -40539,6 +40664,14 @@ icon_state = "test_floor4" }, /area/almayer/living/briefing) +"hMa" = ( +/obj/structure/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/stern) "hMc" = ( /obj/structure/bed/chair/comfy/orange{ dir = 8 @@ -40620,7 +40753,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/hull/lower_hull/stern) "hOR" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -40687,6 +40820,10 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/hydroponics) +"hPP" = ( +/obj/effect/step_trigger/clone_cleaner, +/turf/open/floor/almayer, +/area/almayer/hallways/upper/starboard) "hPT" = ( /obj/structure/largecrate/random/case/small, /turf/open/floor/almayer{ @@ -40895,7 +41032,7 @@ pixel_x = 2 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "hTF" = ( /obj/structure/machinery/suit_storage_unit/compression_suit/uscm{ isopen = 1; @@ -42528,7 +42665,7 @@ dir = 9; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "iCu" = ( /obj/structure/machinery/door/poddoor/almayer/open{ dir = 4; @@ -42974,6 +43111,10 @@ icon_state = "sterile_green_corner" }, /area/almayer/medical/lower_medical_lobby) +"iLz" = ( +/obj/effect/step_trigger/clone_cleaner, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/upper/starboard) "iLG" = ( /obj/structure/disposalpipe/junction{ dir = 1; @@ -43016,6 +43157,12 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/lower_medical_medbay) +"iNp" = ( +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "iNY" = ( /obj/structure/machinery/status_display{ pixel_x = 32; @@ -43747,15 +43894,6 @@ icon_state = "mono" }, /area/almayer/lifeboat_pumps/south2) -"jbB" = ( -/obj/structure/sign/safety/nonpress_0g{ - pixel_x = 32 - }, -/turf/open/floor/almayer{ - dir = 5; - icon_state = "plating" - }, -/area/almayer/hull/lower_hull/l_a_s) "jbH" = ( /obj/structure/machinery/light{ dir = 8 @@ -43831,7 +43969,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/hull/lower_hull/stern) "jcP" = ( /turf/open/floor/almayer{ icon_state = "plating_striped" @@ -43863,7 +44001,7 @@ pixel_y = 32 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/hull/lower_hull/stern) "jdF" = ( /obj/structure/machinery/light{ dir = 4 @@ -43996,7 +44134,7 @@ dir = 8; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "jfY" = ( /obj/structure/surface/table/almayer, /obj/effect/landmark/map_item, @@ -44521,7 +44659,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "jnk" = ( /obj/structure/largecrate/random/case/double, /turf/open/floor/almayer{ @@ -44885,7 +45023,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "jyE" = ( /obj/structure/machinery/light, /turf/open/floor/wood/ship, @@ -45737,7 +45875,7 @@ pixel_y = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "jTi" = ( /obj/item/reagent_container/glass/bucket/janibucket{ pixel_x = -1; @@ -45793,7 +45931,7 @@ req_one_access_txt = "2;35" }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "jUq" = ( /obj/structure/machinery/firealarm{ pixel_y = -28 @@ -45816,7 +45954,7 @@ pixel_x = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "jUx" = ( /obj/structure/machinery/door/airlock/almayer/secure/reinforced{ dir = 2; @@ -45866,7 +46004,7 @@ /turf/open/floor/almayer{ icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "jUY" = ( /turf/open/floor/almayer{ icon_state = "silver" @@ -46269,6 +46407,15 @@ /obj/structure/machinery/camera/autoname/almayer, /turf/open/floor/almayer, /area/almayer/shipboard/brig/cells) +"kcb" = ( +/obj/structure/sign/safety/water{ + pixel_x = 8; + pixel_y = 32 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/stern) "kcl" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -46525,7 +46672,7 @@ icon_state = "SW-out" }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "kiM" = ( /obj/structure/surface/table/reinforced/almayer_B, /turf/open/floor/almayer{ @@ -46621,7 +46768,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "klH" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 4 @@ -46785,7 +46932,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "kpc" = ( /obj/structure/reagent_dispensers/watertank, /turf/open/floor/plating, @@ -46798,6 +46945,9 @@ icon_state = "mono" }, /area/almayer/lifeboat_pumps/south2) +"kpN" = ( +/turf/closed/wall/almayer/outer, +/area/almayer/hull/lower_hull/stern) "kpQ" = ( /obj/structure/machinery/door_control{ id = "engidorm"; @@ -46821,7 +46971,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/hull/lower_hull/stern) "kpY" = ( /obj/structure/surface/table/almayer, /obj/item/clothing/head/hardhat{ @@ -46849,7 +46999,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "kqf" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -46864,7 +47014,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "kqt" = ( /obj/structure/machinery/door/poddoor/almayer/open{ dir = 4; @@ -47059,7 +47209,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "ktP" = ( /obj/structure/curtain/red, /turf/open/floor/almayer{ @@ -47125,7 +47275,7 @@ /turf/open/floor/almayer{ icon_state = "tcomms" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "kvU" = ( /obj/structure/surface/table/almayer, /turf/open/floor/plating/plating_catwalk, @@ -47653,7 +47803,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "kFs" = ( /obj/structure/machinery/light{ dir = 4 @@ -47747,7 +47897,7 @@ pixel_y = 25 }, /turf/open/floor/almayer, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "kHa" = ( /turf/closed/wall/almayer, /area/almayer/shipboard/brig/surgery) @@ -47770,6 +47920,11 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hallways/starboard_hallway) +"kHD" = ( +/turf/open/floor/almayer{ + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "kHS" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -47837,7 +47992,7 @@ dir = 8 }, /turf/open/floor/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "kJG" = ( /obj/item/toy/deck{ pixel_y = 12 @@ -48132,7 +48287,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "kPx" = ( /obj/structure/surface/table/almayer, /obj/item/device/mass_spectrometer, @@ -48587,7 +48742,7 @@ dir = 10; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "kXN" = ( /obj/item/clothing/glasses/sunglasses/aviator{ pixel_x = -1; @@ -48719,7 +48874,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "lau" = ( /obj/structure/sign/safety/autoopenclose{ pixel_x = 7; @@ -48727,6 +48882,12 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/upper_hull/u_m_p) +"laE" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/upper/port) "laO" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -48983,7 +49144,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "lgy" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/firedoor/border_only/almayer{ @@ -49562,6 +49723,12 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_m_s) +"lqe" = ( +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/almayer/lifeboat_pumps/north2) "lqF" = ( /turf/open/floor/almayer{ dir = 9; @@ -49636,7 +49803,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "lrF" = ( /obj/structure/machinery/light, /obj/structure/surface/table/almayer, @@ -49908,6 +50075,18 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/main_office) +"lxm" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/machinery/power/apc/almayer{ + dir = 8 + }, +/turf/open/floor/almayer{ + dir = 5; + icon_state = "plating" + }, +/area/almayer/shipboard/stern_point_defense) "lxo" = ( /obj/structure/sign/safety/hazard{ pixel_x = -17; @@ -50058,7 +50237,7 @@ dir = 5; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "lzY" = ( /obj/structure/machinery/cm_vending/sorted/medical/wall_med{ pixel_y = -25 @@ -50140,7 +50319,7 @@ dir = 4; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "lBv" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -50186,7 +50365,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "lCp" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -50217,7 +50396,7 @@ dir = 1; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "lCE" = ( /obj/structure/bed/chair/comfy/delta, /obj/effect/decal/cleanable/dirt, @@ -50233,7 +50412,7 @@ /turf/open/floor/almayer{ icon_state = "mono" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/lifeboat_pumps/north2) "lDg" = ( /obj/structure/machinery/door/poddoor/shutters/almayer{ id = "laddernorthwest"; @@ -50349,7 +50528,7 @@ "lEW" = ( /obj/structure/disposalpipe/segment, /turf/closed/wall/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "lFb" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -50613,7 +50792,7 @@ dir = 5 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "lJg" = ( /obj/structure/largecrate/random/barrel/white, /turf/open/floor/almayer{ @@ -50785,7 +50964,7 @@ /turf/open/floor/almayer{ icon_state = "mono" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/lifeboat_pumps/north2) "lMY" = ( /obj/structure/machinery/camera/autoname/almayer{ dir = 4; @@ -51173,6 +51352,9 @@ icon_state = "plate" }, /area/almayer/engineering/upper_engineering) +"lXu" = ( +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/upper/starboard) "lXF" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/sign/safety/cryo{ @@ -51334,7 +51516,7 @@ /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "mce" = ( /turf/open/floor/almayer{ icon_state = "greencorner" @@ -51675,7 +51857,7 @@ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "mki" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 @@ -52459,7 +52641,7 @@ dir = 4; icon_state = "orangecorner" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "mzR" = ( /obj/structure/sign/safety/distribution_pipes{ pixel_x = 8; @@ -53060,7 +53242,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "mKY" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -53234,6 +53416,14 @@ "mOi" = ( /turf/closed/wall/almayer/outer, /area/almayer/command/airoom) +"mOq" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer{ + dir = 2 + }, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/upper/starboard) "mOr" = ( /obj/structure/surface/table/almayer, /obj/item/clipboard, @@ -53242,7 +53432,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "mOL" = ( /obj/structure/sign/safety/maint{ pixel_x = 8; @@ -53259,6 +53449,11 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_p) +"mOY" = ( +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/stern) "mPf" = ( /turf/open/floor/almayer/uscm/directional{ dir = 6 @@ -53613,7 +53808,13 @@ dir = 9 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) +"mVe" = ( +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/almayer/hallways/upper/port) "mVE" = ( /obj/effect/decal/warning_stripes{ icon_state = "NW-out"; @@ -53711,7 +53912,7 @@ dir = 9; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/lifeboat_pumps/south2) "mYs" = ( /obj/structure/machinery/light{ dir = 4 @@ -53984,7 +54185,7 @@ }, /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "new" = ( /obj/item/reagent_container/glass/bucket/janibucket, /obj/item/reagent_container/glass/bucket/janibucket{ @@ -54432,7 +54633,7 @@ pixel_y = 32 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "nmh" = ( /obj/structure/sign/safety/distribution_pipes{ pixel_x = -17 @@ -55005,6 +55206,14 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_f_p) +"nxC" = ( +/obj/structure/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/stern) "nxK" = ( /obj/structure/sign/safety/high_voltage{ pixel_y = -32 @@ -56782,7 +56991,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "okD" = ( /obj/structure/prop/almayer/name_stencil{ icon_state = "almayer6" @@ -56791,6 +57000,18 @@ icon_state = "outerhull_dir" }, /area/space) +"okM" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/obj/structure/machinery/status_display{ + pixel_y = 30 + }, +/turf/open/floor/almayer{ + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "olM" = ( /obj/structure/bed/chair{ can_buckle = 0; @@ -57197,7 +57418,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/hull/lower_hull/stern) "osT" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/prop/ice_colony/hula_girl{ @@ -57231,7 +57452,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "oug" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/pipes/standard/simple/hidden/supply, @@ -57302,7 +57523,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "ovp" = ( /obj/structure/surface/table/reinforced/almayer_B, /obj/structure/flora/pottedplant{ @@ -57441,7 +57662,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "ozq" = ( /obj/structure/machinery/door/firedoor/border_only/almayer, /obj/structure/disposalpipe/segment{ @@ -57513,7 +57734,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "oAB" = ( /obj/structure/platform{ dir = 8; @@ -57687,6 +57908,12 @@ icon_state = "test_floor4" }, /area/almayer/lifeboat_pumps/north1) +"oEn" = ( +/obj/effect/landmark/yautja_teleport, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/stern) "oEo" = ( /obj/effect/landmark/start/marine/medic/delta, /obj/effect/landmark/late_join/delta, @@ -58206,7 +58433,7 @@ /turf/open/floor/almayer{ icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "oPE" = ( /turf/open/floor/almayer{ dir = 1; @@ -58655,6 +58882,13 @@ icon_state = "cargo" }, /area/almayer/shipboard/brig/cryo) +"paz" = ( +/obj/structure/disposalpipe/segment, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "red" + }, +/area/almayer/hallways/upper/port) "paI" = ( /obj/structure/sign/safety/debark_lounge{ pixel_x = 15; @@ -58808,7 +59042,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "peO" = ( /obj/structure/sign/safety/medical{ pixel_x = -17; @@ -58848,7 +59082,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "pfp" = ( /obj/effect/step_trigger/teleporter_vector{ name = "Almayer_Up4"; @@ -59000,7 +59234,7 @@ dir = 8; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "pje" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/structure/disposalpipe/segment, @@ -59051,7 +59285,7 @@ icon_state = "SW-out" }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "pjR" = ( /obj/structure/disposalpipe/segment{ dir = 4; @@ -59082,7 +59316,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "plI" = ( /obj/structure/machinery/cm_vending/sorted/medical/blood, /turf/open/floor/almayer{ @@ -59195,7 +59429,7 @@ dir = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "poq" = ( /obj/item/pipe{ dir = 4; @@ -59311,6 +59545,14 @@ icon_state = "plate" }, /area/almayer/living/captain_mess) +"prF" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/hallways/upper/starboard) "prY" = ( /obj/structure/surface/table/almayer, /obj/item/trash/USCMtray, @@ -59339,7 +59581,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "psy" = ( /obj/structure/machinery/door/airlock/almayer/security{ dir = 2; @@ -59438,7 +59680,7 @@ dir = 5; icon_state = "orange" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "puv" = ( /obj/structure/sign/safety/maint{ pixel_x = -17 @@ -59763,6 +60005,13 @@ icon_state = "mono" }, /area/almayer/hallways/stern_hallway) +"pDd" = ( +/obj/effect/step_trigger/clone_cleaner, +/obj/structure/sign/safety/maint{ + pixel_x = -17 + }, +/turf/open/floor/almayer, +/area/almayer/hallways/upper/starboard) "pDh" = ( /obj/structure/machinery/power/monitor{ name = "Core Power Monitoring" @@ -59913,7 +60162,7 @@ dir = 4; icon_state = "orangecorner" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "pFM" = ( /obj/structure/machinery/light/small{ dir = 8 @@ -59970,7 +60219,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "pGP" = ( /obj/structure/surface/table/almayer, /obj/item/storage/box/lights/bulbs{ @@ -60017,7 +60266,7 @@ }, /obj/structure/pipes/standard/manifold/hidden/supply, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "pIk" = ( /obj/structure/ladder{ height = 1; @@ -60270,7 +60519,7 @@ pixel_y = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "pOi" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/almayer, @@ -60314,6 +60563,16 @@ icon_state = "plate" }, /area/almayer/living/grunt_rnr) +"pPr" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "E"; + pixel_x = 1 + }, +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "pPv" = ( /obj/structure/closet/cabinet, /obj/item/reagent_container/food/drinks/bottle/wine, @@ -60383,7 +60642,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "pQr" = ( /obj/structure/bed, /turf/open/floor/almayer{ @@ -60708,7 +60967,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "pWr" = ( /obj/structure/surface/rack, /obj/item/tool/minihoe{ @@ -60759,7 +61018,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "pXl" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -60949,6 +61208,13 @@ icon_state = "redcorner" }, /area/almayer/living/briefing) +"qbJ" = ( +/obj/structure/sign/safety/hvac_old{ + pixel_x = 8; + pixel_y = -32 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/stern) "qbO" = ( /turf/open/floor/almayer{ dir = 6; @@ -61530,7 +61796,7 @@ dir = 5; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "qmy" = ( /obj/structure/surface/table/almayer, /obj/structure/machinery/door_control{ @@ -61841,7 +62107,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/shipboard/stern_point_defense) "qsL" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer, @@ -62407,6 +62673,10 @@ icon_state = "red" }, /area/almayer/shipboard/brig/cells) +"qES" = ( +/obj/structure/machinery/light/small, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/stern) "qEW" = ( /obj/structure/sign/poster/ad{ pixel_x = 30 @@ -62479,7 +62749,7 @@ dir = 5; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "qFW" = ( /obj/structure/sign/safety/storage{ pixel_x = 8; @@ -63298,7 +63568,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "qXE" = ( /obj/structure/machinery/brig_cell/perma_1{ pixel_x = 32 @@ -63521,7 +63791,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/hull/lower_hull/stern) "rbv" = ( /obj/structure/machinery/light/small{ dir = 1 @@ -63927,7 +64197,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "riE" = ( /obj/structure/pipes/standard/simple/hidden/supply, /obj/effect/decal/warning_stripes{ @@ -63969,7 +64239,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "rjn" = ( /obj/structure/machinery/light, /obj/structure/reagent_dispensers/water_cooler/stacks, @@ -65096,7 +65366,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "rFy" = ( /turf/open/floor/almayer{ dir = 1; @@ -65843,6 +66113,9 @@ }, /turf/open/floor/plating, /area/almayer/shipboard/brig/chief_mp_office) +"rWr" = ( +/turf/closed/wall/almayer, +/area/almayer/hull/lower_hull/stern) "rWs" = ( /obj/structure/disposalpipe/segment, /obj/structure/pipes/standard/simple/hidden/supply{ @@ -66006,13 +66279,13 @@ dir = 6; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "saB" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "saW" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -66027,7 +66300,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "sbq" = ( /obj/structure/machinery/door/poddoor/almayer/locked{ icon_state = "almayer_pdoor"; @@ -66221,7 +66494,7 @@ dir = 8 }, /turf/open/floor/almayer, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "sgc" = ( /obj/structure/closet/crate/freezer/cooler{ pixel_x = -7 @@ -66332,7 +66605,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "sgR" = ( /obj/structure/surface/table/almayer, /obj/item/toy/deck{ @@ -66352,7 +66625,7 @@ "shb" = ( /obj/effect/decal/cleanable/blood/oil, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "shh" = ( /obj/structure/machinery/autolathe, /turf/open/floor/almayer, @@ -66543,7 +66816,7 @@ dir = 6 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "smZ" = ( /obj/structure/window/framed/almayer/hull/hijack_bustable, /obj/structure/machinery/door/poddoor/shutters/almayer/open{ @@ -66785,7 +67058,7 @@ dir = 5; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "sqa" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -67001,7 +67274,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "svf" = ( /obj/structure/machinery/light{ dir = 1 @@ -67180,7 +67453,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "szE" = ( /obj/effect/decal/warning_stripes{ icon_state = "NE-out"; @@ -67191,6 +67464,15 @@ icon_state = "test_floor4" }, /area/almayer/living/offices) +"szL" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "szM" = ( /obj/structure/flora/pottedplant{ desc = "It is made of Fiberbush(tm). It contains asbestos."; @@ -67891,7 +68173,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "sPF" = ( /obj/structure/bed/chair{ can_buckle = 0; @@ -68018,7 +68300,7 @@ /turf/open/floor/almayer{ icon_state = "redfull" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/lifeboat_pumps/south2) "sSY" = ( /obj/structure/pipes/vents/scrubber{ dir = 8 @@ -68271,7 +68553,7 @@ dir = 5; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "sYh" = ( /turf/open/floor/almayer{ dir = 1; @@ -68544,12 +68826,13 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating/plating_catwalk, /area/almayer/hull/lower_hull/l_m_p) -"tce" = ( -/obj/structure/closet/emcloset, -/turf/open/floor/almayer{ - icon_state = "plate" +"tbT" = ( +/obj/structure/sign/safety/water{ + pixel_x = 8; + pixel_y = -32 }, -/area/almayer/hull/lower_hull/l_a_s) +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/stern) "tcZ" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -68593,7 +68876,7 @@ /turf/open/floor/almayer{ icon_state = "orangecorner" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "tdy" = ( /obj/structure/bed/sofa/south/grey/right, /obj/structure/sign/safety/restrictedarea{ @@ -68641,6 +68924,9 @@ icon_state = "test_floor4" }, /area/almayer/hallways/port_umbilical) +"tdR" = ( +/turf/closed/wall/almayer/outer, +/area/almayer/shipboard/stern_point_defense) "tdT" = ( /obj/structure/bed/chair/comfy/beige{ dir = 1 @@ -68775,7 +69061,7 @@ pixel_x = -17 }, /turf/open/floor/almayer, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "tgV" = ( /obj/structure/bed, /obj/item/bedsheet/medical, @@ -68980,6 +69266,20 @@ icon_state = "sterile_green_side" }, /area/almayer/medical/medical_science) +"tju" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "S" + }, +/obj/item/device/radio/intercom{ + freerange = 1; + name = "General Listening Channel"; + pixel_y = -28 + }, +/turf/open/floor/almayer{ + dir = 1; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "tjw" = ( /obj/structure/machinery/cm_vending/clothing/vehicle_crew{ density = 0; @@ -69101,7 +69401,7 @@ dir = 9; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "tmB" = ( /obj/structure/pipes/standard/manifold/hidden/supply{ dir = 1 @@ -69795,7 +70095,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "tzL" = ( /obj/structure/sign/safety/waterhazard{ pixel_x = 8; @@ -70333,7 +70633,7 @@ dir = 6; icon_state = "orange" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "tLM" = ( /obj/structure/sign/safety/storage{ pixel_x = -17 @@ -70351,7 +70651,7 @@ dir = 6; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "tMH" = ( /obj/structure/machinery/door/airlock/almayer/security/glass/reinforced{ name = "\improper Warden's Office"; @@ -70418,7 +70718,7 @@ icon_state = "NW-out" }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "tOr" = ( /obj/effect/decal/warning_stripes{ icon_state = "N"; @@ -70539,6 +70839,18 @@ icon_state = "plate" }, /area/almayer/hull/lower_hull/l_m_s) +"tRs" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/machinery/status_display{ + pixel_x = -32 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "tRD" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -70580,7 +70892,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "tSp" = ( /obj/item/device/radio/intercom{ freerange = 1; @@ -70932,7 +71244,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "tZP" = ( /obj/structure/surface/rack, /obj/item/clothing/glasses/meson, @@ -71446,7 +71758,7 @@ "uku" = ( /obj/structure/window/framed/almayer/hull/hijack_bustable, /turf/open/floor/plating, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "ukU" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 1 @@ -71644,7 +71956,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "upt" = ( /obj/structure/machinery/light/small{ dir = 1 @@ -71793,7 +72105,7 @@ dir = 4 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "usy" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -71960,7 +72272,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/shipboard/stern_point_defense) "uvP" = ( /obj/structure/machinery/light{ unacidable = 1; @@ -72140,7 +72452,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/hull/lower_hull/l_a_s) +/area/almayer/hull/lower_hull/stern) "uzy" = ( /obj/item/reagent_container/glass/bucket, /obj/effect/decal/cleanable/blood/oil, @@ -72366,7 +72678,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "uEv" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -72468,7 +72780,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "uGt" = ( /obj/effect/decal/warning_stripes{ icon_state = "SE-out" @@ -72685,7 +72997,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "uLW" = ( /obj/item/tool/mop{ pixel_x = -6; @@ -72772,6 +73084,9 @@ icon_state = "blue" }, /area/almayer/living/basketball) +"uNR" = ( +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hallways/upper/port) "uNV" = ( /obj/structure/flora/pottedplant{ icon_state = "pottedplant_22" @@ -72883,7 +73198,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "uRs" = ( /obj/structure/machinery/light{ dir = 8 @@ -72985,7 +73300,7 @@ dir = 1; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "uSS" = ( /obj/structure/pipes/standard/simple/hidden/supply, /turf/open/floor/almayer{ @@ -73007,6 +73322,12 @@ icon_state = "mono" }, /area/almayer/living/pilotbunks) +"uTO" = ( +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/almayer/hallways/upper/port) "uTU" = ( /obj/structure/machinery/door/firedoor/border_only/almayer{ dir = 2 @@ -73152,7 +73473,7 @@ /turf/open/floor/almayer{ icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "uVV" = ( /obj/structure/machinery/light{ dir = 4 @@ -73309,6 +73630,9 @@ }, /turf/closed/wall/almayer, /area/almayer/hallways/starboard_umbilical) +"vam" = ( +/turf/open/floor/almayer, +/area/almayer/hallways/upper/starboard) "vbf" = ( /obj/structure/machinery/landinglight/ds2/delaytwo{ dir = 8 @@ -73414,6 +73738,12 @@ icon_state = "test_floor4" }, /area/almayer/medical/lower_medical_lobby) +"vct" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/stern) "vcu" = ( /obj/effect/landmark/start/engineering, /turf/open/floor/plating/plating_catwalk, @@ -73828,7 +74158,7 @@ pixel_y = 32 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/hull/lower_hull/stern) "vit" = ( /turf/open/floor/almayer{ icon_state = "dark_sterile" @@ -74568,6 +74898,9 @@ icon_state = "redcorner" }, /area/almayer/shipboard/weapon_room) +"vve" = ( +/turf/open/floor/almayer, +/area/almayer/hallways/upper/port) "vvp" = ( /obj/structure/pipes/vents/pump, /obj/structure/sign/safety/intercom{ @@ -74918,6 +75251,12 @@ icon_state = "silver" }, /area/almayer/living/briefing) +"vBu" = ( +/obj/structure/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/stern) "vBJ" = ( /obj/structure/surface/table/almayer, /obj/item/tool/pen, @@ -75510,7 +75849,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "vNW" = ( /turf/open/floor/almayer/uscm/directional{ dir = 9 @@ -76051,7 +76390,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "vXd" = ( /obj/structure/window/framed/almayer, /obj/structure/machinery/door/poddoor/shutters/almayer{ @@ -76215,7 +76554,7 @@ pixel_y = 1 }, /turf/open/floor/plating/plating_catwalk, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "wbh" = ( /obj/structure/machinery/light{ dir = 4 @@ -76235,7 +76574,7 @@ dir = 10; icon_state = "red" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "wbu" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/machinery/camera/autoname/almayer{ @@ -76612,7 +76951,7 @@ }, /obj/structure/machinery/cm_vending/sorted/tech/circuits, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "wiz" = ( /obj/structure/bed/chair{ dir = 4 @@ -76846,7 +77185,7 @@ /turf/open/floor/almayer{ icon_state = "cargo" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "wlp" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -77244,7 +77583,7 @@ dir = 1; icon_state = "orange" }, -/area/almayer/engineering/lower_engineering) +/area/almayer/engineering/lower) "wup" = ( /obj/structure/supply_drop/echo, /turf/open/floor/almayer, @@ -77394,6 +77733,12 @@ icon_state = "orange" }, /area/almayer/engineering/upper_engineering/starboard) +"wxk" = ( +/turf/open/floor/almayer{ + dir = 8; + icon_state = "red" + }, +/area/almayer/lifeboat_pumps/south2) "wxq" = ( /obj/effect/decal/warning_stripes{ icon_state = "S" @@ -77552,6 +77897,12 @@ icon_state = "plate" }, /area/almayer/living/briefing) +"wCA" = ( +/obj/structure/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/stern) "wCI" = ( /turf/open/floor/almayer{ dir = 4; @@ -77973,6 +78324,14 @@ icon_state = "plate" }, /area/almayer/hull/upper_hull/u_m_s) +"wKE" = ( +/obj/structure/prop/invuln/overhead_pipe{ + pixel_x = 12 + }, +/turf/open/floor/almayer{ + icon_state = "plate" + }, +/area/almayer/hull/lower_hull/stern) "wKF" = ( /obj/structure/machinery/power/apc/almayer{ cell_type = /obj/item/cell/hyper; @@ -78734,7 +79093,7 @@ pixel_y = -32 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "wZE" = ( /obj/structure/surface/table/reinforced/prison, /obj/item/book/manual/surgery, @@ -78842,7 +79201,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/starboard) "xaM" = ( /obj/structure/surface/table/almayer, /obj/item/newspaper{ @@ -78921,7 +79280,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "xct" = ( /obj/item/reagent_container/food/snacks/wrapped/barcardine, /obj/structure/surface/rack, @@ -78995,7 +79354,7 @@ /turf/open/floor/almayer{ icon_state = "tcomms" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "xfk" = ( /obj/structure/surface/rack, /obj/item/stack/cable_coil, @@ -79147,6 +79506,12 @@ icon_state = "mono" }, /area/almayer/lifeboat_pumps/south1) +"xhw" = ( +/obj/structure/machinery/door/firedoor/border_only/almayer, +/turf/open/floor/almayer{ + icon_state = "test_floor4" + }, +/area/almayer/hallways/upper/starboard) "xhx" = ( /obj/structure/machinery/disposal, /obj/structure/disposalpipe/trunk{ @@ -79216,7 +79581,7 @@ dir = 4 }, /turf/open/floor/almayer, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "xjb" = ( /obj/structure/machinery/door/airlock/multi_tile/almayer/generic{ access_modified = 1; @@ -79250,7 +79615,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "xjD" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 10 @@ -79381,7 +79746,7 @@ /turf/open/floor/almayer{ icon_state = "plate" }, -/area/almayer/engineering/engineering_workshop) +/area/almayer/engineering/lower/workshop) "xmg" = ( /obj/structure/surface/table/almayer, /obj/structure/flora/pottedplant{ @@ -79447,7 +79812,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hull/lower_hull/l_a_p) +/area/almayer/shipboard/stern_point_defense) "xns" = ( /obj/structure/machinery/door_control{ id = "ARES JoeCryo"; @@ -79470,6 +79835,12 @@ icon_state = "red" }, /area/almayer/command/lifeboat) +"xnA" = ( +/obj/structure/machinery/power/apc/almayer{ + dir = 1 + }, +/turf/open/floor/plating/plating_catwalk, +/area/almayer/hull/lower_hull/stern) "xnI" = ( /obj/effect/landmark/start/requisition, /turf/open/floor/plating/plating_catwalk, @@ -79583,6 +79954,18 @@ }, /turf/open/floor/almayer, /area/almayer/hull/upper_hull/u_f_p) +"xpF" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "W" + }, +/obj/structure/sign/safety/escapepod{ + pixel_x = -17 + }, +/turf/open/floor/almayer{ + dir = 4; + icon_state = "red" + }, +/area/almayer/hallways/upper/starboard) "xpI" = ( /obj/structure/stairs{ dir = 4 @@ -79659,7 +80042,7 @@ pixel_x = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "xrq" = ( /obj/structure/closet/firecloset, /obj/item/clothing/mask/gas, @@ -79836,7 +80219,7 @@ dir = 5; icon_state = "plating" }, -/area/almayer/engineering/engine_core) +/area/almayer/engineering/lower/engine_core) "xuY" = ( /obj/structure/sign/safety/escapepod{ pixel_x = 8; @@ -79951,7 +80334,7 @@ /turf/open/floor/almayer{ icon_state = "test_floor4" }, -/area/almayer/hallways/aft_hallway) +/area/almayer/hallways/upper/port) "xxa" = ( /obj/item/stack/sheet/cardboard{ amount = 50 @@ -80616,6 +80999,15 @@ }, /turf/open/floor/plating/plating_catwalk, /area/almayer/shipboard/brig/cells) +"xKf" = ( +/obj/effect/decal/warning_stripes{ + icon_state = "N"; + pixel_y = 1 + }, +/turf/open/floor/almayer{ + icon_state = "redfull" + }, +/area/almayer/hallways/upper/starboard) "xKM" = ( /obj/structure/machinery/status_display{ pixel_x = 16; @@ -81215,7 +81607,7 @@ /turf/open/floor/almayer{ icon_state = "redfull" }, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "xVS" = ( /obj/structure/pipes/standard/simple/hidden/supply{ dir = 4 @@ -81893,7 +82285,7 @@ pixel_x = 1 }, /turf/open/floor/almayer, -/area/almayer/engineering/engineering_workshop/hangar) +/area/almayer/engineering/lower/workshop/hangar) "yiW" = ( /obj/structure/machinery/cryopod/right{ layer = 3.1; @@ -118227,7 +118619,7 @@ abC abC abC jUW -tgS +pDd ady aar aIZ @@ -118430,7 +118822,7 @@ abC abC abC acg -bAF +hPP ady aar aar @@ -118633,15 +119025,15 @@ abC abC abC act -ajS +heA afq lzW buk fgF bYP -lBi +xpF acH -cwd +tRs bYy tOd adT @@ -118836,19 +119228,19 @@ lYA lYA lYA aey -azY -azY +iLz +iLz adi -atC -abx -acC -abx -abx -abx +mOq +lXu +kHD +lXu +lXu +lXu adi -abx -acC -atC +lXu +kHD +mOq abg abg abg @@ -118881,14 +119273,14 @@ aZE aZE aZE xwG -chu -aZE +paz +dPn cgI abt -aZE -aZE -chu -aZE +dPn +dPn +paz +dPn xwG cgI agl @@ -119039,18 +119431,18 @@ bRK aao aiv aaW -pjb +ehT abM iCe cLp cZZ ccY -aJs -cdu -aaw -abl +gpm +dRN +pPr +cyT jUs -abu +bNR xaF aaL aJs @@ -119089,7 +119481,7 @@ wba abu aaw wbj -aJs +uTO cdu ayH uGo @@ -119247,9 +119639,9 @@ aar aar aar aar -acG -abg -caF +szL +vam +faZ aar aar lIl @@ -119292,7 +119684,7 @@ qVM qVM qVM acG -abg +vve caF qVM qVM @@ -119451,8 +119843,8 @@ aIZ aLC aar bWs -abg -caF +vam +eGo aar vUk sTB @@ -119494,8 +119886,8 @@ vGk vGk adI qVM -acG -abg +cxg +vve caF qVM iBt @@ -119653,9 +120045,9 @@ aIZ aIZ aIZ aar -acO -aJs -cbN +ePt +gpm +cvY aar fQY aap @@ -119698,7 +120090,7 @@ vGk xHG qVM aJd -aJs +uTO cbN qVM iBt @@ -119857,7 +120249,7 @@ aIZ aIZ aba pNQ -abx +lXu hTy aar thR @@ -119901,7 +120293,7 @@ vGk csz qVM jSY -abx +uNR hLO ceD iBt @@ -120060,7 +120452,7 @@ aIZ aIZ aar acP -bUE +iNp qFQ aar xtQ @@ -120104,7 +120496,7 @@ vGk csz qVM sah -bUE +mVe cbO qVM iBt @@ -120262,9 +120654,9 @@ aIZ aIZ aIZ aar -acG -abx -caF +szL +lXu +eGo aar com aap @@ -120306,8 +120698,8 @@ vzl vGk csz qVM -acG -abx +cxg +uNR caF qVM iBt @@ -120465,9 +120857,9 @@ aar aar aar aar -oPD -abx -lCz +okM +lXu +tju aar tAV sTB @@ -120510,7 +120902,7 @@ xeG qVM qVM oPD -abx +uNR lCz qVM qVM @@ -120668,9 +121060,9 @@ aIZ aIZ aLC aar -acG -abx -caF +szL +lXu +eGo aar lIl aar @@ -120712,8 +121104,8 @@ xWF vGk yji qVM -acG -abx +cxg +uNR caF qVM iBt @@ -120825,7 +121217,7 @@ vra cmd cmh wAR -aLB +bGb uaa uaa uaa @@ -120871,9 +121263,9 @@ aIZ aIZ aIZ aar -acO -aJs -arJ +ePt +gpm +flH aar aao aao @@ -120916,7 +121308,7 @@ vGk csz qVM acO -aJs +uTO arJ qVM iBt @@ -121028,7 +121420,7 @@ vra ajX ajX ajX -aLB +bGb uaa uaa uaa @@ -121074,8 +121466,8 @@ aIZ aIZ aIZ bWh -jSY -abx +fPN +lXu hTy aar hLB @@ -121119,7 +121511,7 @@ vGk csz qVM jSY -abx +uNR hLO cix iBt @@ -121278,7 +121670,7 @@ aIZ aIZ aar acP -bUE +iNp qFQ aar xYe @@ -121322,7 +121714,7 @@ vGk xHG qVM sah -bUE +mVe cbO qVM iBt @@ -121480,9 +121872,9 @@ aIZ aIZ aIZ aar -aJa -abg -ccf +xKf +vam +prF aar mko uaZ @@ -121525,7 +121917,7 @@ yji uso qVM aJa -abg +vve ccf qVM iBt @@ -121683,8 +122075,8 @@ aar aar aar aar -eQi -atL +eyA +xhw kOG aar aar @@ -121728,7 +122120,7 @@ qVM qVM qVM eQi -atL +laE pef qVM qVM @@ -121887,7 +122279,7 @@ aap ahg aiv lMM -abg +aeA lCS aiv ahg @@ -121931,7 +122323,7 @@ aip vzl xCX bWC -abg +lJY sSR xCX weU @@ -122089,9 +122481,9 @@ aar aar aar aar -bWE -aJs -mXU +cuA +lqe +ddi aar aar aar @@ -122134,7 +122526,7 @@ qVM qVM qVM bWE -aJs +wxk mXU qVM qVM @@ -130724,7 +131116,7 @@ aQL aQL ksp rou -rou +ksp aQL aLG aZl @@ -133368,8 +133760,8 @@ aWZ byh byQ aVl -hlz -rdK +mOY +rWr bFf aVp ddj @@ -133387,8 +133779,8 @@ kJC mbn mUZ caA -haq -cAH +rWr +mOY aVl ccC ccW @@ -133571,8 +133963,8 @@ ggQ aAb byR aVl -eFH -rdK +ceM +rWr bFg bHv bjg @@ -133590,8 +133982,8 @@ bzP bjg gJq caB -haq -vuR +rWr +ceM aVl ccD ccX @@ -133774,8 +134166,8 @@ aep byk byQ aVl -eFH -rdK +ceM +rWr bhB bhB uEc @@ -133793,8 +134185,8 @@ bXP bjn bhB bhB -haq -mHR +rWr +qbJ aVl ccE bjd @@ -133977,8 +134369,8 @@ bwj byl bzj aVl -eFH -eFH +ceM +ceM bhB bfA bLe @@ -133996,8 +134388,8 @@ bXQ bLe psp bhB -cAH -vuR +mOY +ceM aVl bzj cHO @@ -134180,8 +134572,8 @@ aUx aUx aUx aUx -hlz -hlz +mOY +mOY bhB bHy bLe @@ -134200,7 +134592,7 @@ bLe bHy bhB kpX -lGr +wKE aUx aUx aUx @@ -134382,9 +134774,9 @@ aah aag aag aag -wVb -iDm -eFH +kpN +wCA +ceM bhB ozi bJF @@ -134403,8 +134795,8 @@ bYO bZD bhB vim -woG -vTK +qES +kpN aag aag aag @@ -134585,9 +134977,9 @@ bdH aad aag aag -wVb -hlz -hlz +kpN +mOY +mOY bhB bJQ bLe @@ -134605,9 +134997,9 @@ bXS bLe bJR bhB -cAH -cAH -vTK +mOY +mOY +kpN aag aag ajZ @@ -134788,9 +135180,9 @@ bdH aad aag aag -wVb -eFH -eFH +kpN +ceM +ceM bhB bHz bJI @@ -134808,9 +135200,9 @@ bzU bYS bJR bhB -cAH -cAH -vTK +mOY +mOY +kpN aag aag ajZ @@ -134991,9 +135383,9 @@ bdH aad aag aag -wVb -hlz -eFH +kpN +mOY +ceM bhB bhB hxp @@ -135011,9 +135403,9 @@ bXQ bJR bhB bhB -vuR -mHR -vTK +ceM +qbJ +kpN aag aag ajZ @@ -135194,10 +135586,10 @@ bdH aad aag aag -wVb -hlz -hlz -hlz +kpN +mOY +mOY +mOY bhB bYV bKV @@ -135214,9 +135606,9 @@ bXU bYV bhB jcK -cAH -cAH -vTK +mOY +mOY +kpN aag aag ajZ @@ -135397,10 +135789,10 @@ bdH aad aag aag -wVb -eFH -eFH -eFH +kpN +ceM +ceM +ceM bhB bJK bLc @@ -135417,9 +135809,9 @@ bXV bJK bhB rbp -vuR +ceM rbp -vTK +kpN aag aag ajZ @@ -135600,10 +135992,10 @@ bdH aad aag aag -wVb -wVb -rVo -hlz +kpN +kpN +hMa +mOY bhB bJK bKV @@ -135620,9 +136012,9 @@ bXQ bJK bhB kpX -emG -vTK -vTK +fMX +kpN +kpN aag aag ajZ @@ -135804,9 +136196,9 @@ aad aag aag aag -wVb -qnP -uia +kpN +kpX +wKE bhB bhB blm @@ -135822,9 +136214,9 @@ bhB bzX bhB bhB -ybr -vuR -vTK +kcb +ceM +kpN aag aag aag @@ -136007,9 +136399,9 @@ aad aag aag aag -wVb -hlz -moE +kpN +mOY +tbT bhB bJM bLd @@ -136025,9 +136417,9 @@ ebJ xiC fYG bhB -vuR -woG -vTK +ceM +qES +kpN aag aag aag @@ -136210,9 +136602,9 @@ aad aag aag aag -wVb -eFH -eFH +kpN +ceM +ceM bhB bJN bLd @@ -136229,8 +136621,8 @@ bLd bYU bhB jdy -cAH -vTK +mOY +kpN aag aag aag @@ -136413,9 +136805,9 @@ aad aag aag aag -wVb -hlz -hlz +kpN +mOY +mOY bhB bJP mzO @@ -136431,9 +136823,9 @@ bMN tdx bYW bhB -vuR -ydx -vTK +ceM +bwO +kpN aag aag aag @@ -136616,9 +137008,9 @@ aad aag aag aag -wVb -eFH -eFH +kpN +ceM +ceM bhB hrX fIx @@ -136634,9 +137026,9 @@ bMM bYU gNd bhB -cAH -cAH -vTK +mOY +mOY +kpN aag aag aag @@ -136819,9 +137211,9 @@ aad aag aag aag -wVb -hlz -hlz +kpN +mOY +mOY bhB sgM fIx @@ -136837,9 +137229,9 @@ bMM bYU upe bhB -vuR -vuR -vTK +ceM +ceM +kpN aag aag aag @@ -137022,9 +137414,9 @@ aad aag aag aag -wVb -eFH -eFH +kpN +ceM +ceM bhB svd bLf @@ -137040,9 +137432,9 @@ dCS tLy svd bhB -cAH -cAH -vTK +mOY +mOY +kpN aag aag aag @@ -137225,9 +137617,9 @@ aad aag aag aag -wVb -hlz -eFH +kpN +mOY +ceM bhB bhB bhB @@ -137243,9 +137635,9 @@ bhB bhB bhB bhB -vuR -vuR -vTK +ceM +ceM +kpN aag aag aag @@ -137428,11 +137820,11 @@ aad aag aag aag -wVb -hlz -eFH +kpN +mOY +ceM fKg -tce +osE bhB heg lfQ @@ -137445,10 +137837,10 @@ ktO heg bhB osE -gai -cAH -cAH -vTK +vct +mOY +mOY +kpN aag aag aag @@ -137631,11 +138023,11 @@ aad aag aag aag -wVb -hlz -hlz -hlz -hlz +kpN +mOY +mOY +mOY +mOY bhB heg mKX @@ -137647,11 +138039,11 @@ aut riA heg bhB -pFP -cAH -cAH -cAH -vTK +oEn +mOY +mOY +mOY +kpN aag aag aag @@ -137834,11 +138226,11 @@ aad aag aag aag -wVb -wVb +kpN +kpN gcK -jPf -jPf +fMX +fMX bhB dVZ jyi @@ -137850,11 +138242,11 @@ bTp jyi cDj bhB -vuR -vuR -woG -vTK -vTK +xnA +ceM +qES +kpN +kpN aag aag aag @@ -138038,9 +138430,9 @@ aag aag aag aag -wVb -hlz -eFH +kpN +mOY +ceM uzg bhB bhB @@ -138053,10 +138445,10 @@ bhB bhB bhB bhB -cAH -cAH -cAH -vTK +mOY +mOY +mOY +kpN aag aag aag @@ -138241,25 +138633,25 @@ aag aag aag aag -wVb -hlz -eFH -hlz -eFH -wul -hlz -gnz -eFH -eFH -vuR +kpN +mOY +ceM +mOY +ceM +vBu +mOY hOe -cAH -fXd -vuR -vuR -vuR -cAH -vTK +ceM +ceM +ceM +hOe +mOY +nxC +ceM +ceM +ceM +mOY +kpN aag aag aag @@ -138444,25 +138836,25 @@ aag aag aag aag -wVb -wVb -rdK -rdK -rdK -rdK -bOn -rdK -rdK -rdK -haq -haq +tdR +tdR +dQm +dQm +dQm +dQm xnl -haq -haq -haq -haq -vTK -vTK +dQm +dQm +dQm +dQm +dQm +xnl +dQm +dQm +dQm +dQm +tdR +tdR aag aag aag @@ -138647,16 +139039,16 @@ aah aah aah aah -wVb -wVb -bdo -bdo +tdR +tdR +ovn +ovn bLg -bMX -bOo +tZF +koT uvG dSs -bOo +lxm otX cII koT @@ -138664,8 +139056,8 @@ tZF bUZ ovn ovn -vTK -vTK +tdR +tdR aah aah aah @@ -138851,15 +139243,15 @@ aaa aaa aaa aaa -wVb +tdR qsF -bdo -bdo -bdo -bdo -bdo -bdo -bdo +ovn +ovn +ovn +ovn +ovn +ovn +ovn ovn ovn ovn @@ -138867,7 +139259,7 @@ ovn ovn bjy aXQ -vTK +tdR aaa aaa aaa @@ -139054,15 +139446,7 @@ aaa aaa aaa aaa -wVb -bdo -bdo -bdo -bdo -bdo -bdo -bdo -bdo +tdR ovn ovn ovn @@ -139070,7 +139454,15 @@ ovn ovn ovn ovn -vTK +ovn +ovn +ovn +ovn +ovn +ovn +ovn +ovn +tdR aaa aaa aaa @@ -139257,15 +139649,7 @@ aaa aaa aaa aaa -wVb -bdo -bdo -bdo -bdo -bdo -bdo -bdo -bdo +tdR ovn ovn ovn @@ -139273,7 +139657,15 @@ ovn ovn ovn ovn -vTK +ovn +ovn +ovn +ovn +ovn +ovn +ovn +ovn +tdR aaa aaa aaa @@ -139460,15 +139852,15 @@ aaa aaa aaa aaa -wVb +tdR bhD -bdo -bdo -bdo -bdo -bdo -bdo -bdo +ovn +ovn +ovn +ovn +ovn +ovn +ovn ovn ovn ovn @@ -139476,7 +139868,7 @@ ovn ovn ovn bCR -vTK +tdR aaa aaa aaa @@ -139663,15 +140055,7 @@ aaa aaa aaa aaa -wVb -bdo -bdo -bdo -bdo -bdo -bdo -bdo -bdo +tdR ovn ovn ovn @@ -139679,7 +140063,15 @@ ovn ovn ovn ovn -vTK +ovn +ovn +ovn +ovn +ovn +ovn +ovn +ovn +tdR aaa aaa aaa @@ -139866,15 +140258,7 @@ aaa aaa aaa aaa -wVb -bdo -bdo -bdo -bdo -bdo -bdo -bdo -bdo +tdR ovn ovn ovn @@ -139882,7 +140266,15 @@ ovn ovn ovn ovn -vTK +ovn +ovn +ovn +ovn +ovn +ovn +ovn +ovn +tdR aaa aaa aaa @@ -140069,15 +140461,15 @@ aaa aaa aaa aaa -wVb +tdR qsF -bdo -bdo -bdo -bdo -bdo -bdo -bdo +ovn +ovn +ovn +ovn +ovn +ovn +ovn ovn ovn ovn @@ -140085,7 +140477,7 @@ ovn ovn ovn aXQ -vTK +tdR aaa aaa aaa @@ -140272,15 +140664,7 @@ aaa aaa aaa aaa -wVb -bdo -jbB -bdo -bne -bdo -jbB -bdo -bne +tdR ovn gXv ovn @@ -140288,7 +140672,15 @@ grX ovn gXv ovn -vTK +grX +ovn +gXv +ovn +grX +ovn +gXv +ovn +tdR aaa aaa aaa @@ -140475,23 +140867,23 @@ aaa aaa aaa aaa -wVb -wVb -wVb -wVb -wVb -wVb -wVb -wVb -wVb -vTK -vTK -vTK -vTK -vTK -vTK -vTK -vTK +tdR +tdR +tdR +tdR +tdR +tdR +tdR +tdR +tdR +tdR +tdR +tdR +tdR +tdR +tdR +tdR +tdR aaa aaa aaa From 796b12c7672617e6151cdcd502568aa755a16c62 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 24 Dec 2023 01:10:12 +0000 Subject: [PATCH 065/205] Automatic changelog for PR #5254 [ci skip] --- html/changelogs/AutoChangeLog-pr-5254.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5254.yml diff --git a/html/changelogs/AutoChangeLog-pr-5254.yml b/html/changelogs/AutoChangeLog-pr-5254.yml new file mode 100644 index 000000000000..6c557a335b79 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5254.yml @@ -0,0 +1,5 @@ +author: "Huffie56" +delete-after: True +changes: + - bugfix: "removed an extra light in bravo cryo room(to do just saw it)" + - maptweak: "added more areas (stern_point_defense, Lower Deck Stern Hull, Upper Deck port Hallway Upper Deck starboard Hallway)" \ No newline at end of file From 59ce96d05e3dfeb2a351bddecaf481418f465cf2 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 24 Dec 2023 01:14:39 +0000 Subject: [PATCH 066/205] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5173.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5210.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5211.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5254.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5257.yml | 6 ------ html/changelogs/AutoChangeLog-pr-5266.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5271.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5273.yml | 5 ----- html/changelogs/AutoChangeLog-pr-5279.yml | 4 ---- html/changelogs/archive/2023-12.yml | 25 +++++++++++++++++++++++ 10 files changed, 25 insertions(+), 40 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5173.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5210.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5211.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5254.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5257.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5266.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5271.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5273.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5279.yml diff --git a/html/changelogs/AutoChangeLog-pr-5173.yml b/html/changelogs/AutoChangeLog-pr-5173.yml deleted file mode 100644 index 215fa4e7928d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5173.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ihatethisengine" -delete-after: True -changes: - - balance: "New healer drone ability — sacrifice. Healer drone can instantly transfer 75% of its current health, but for the great cost of the healer’s own life." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5210.yml b/html/changelogs/AutoChangeLog-pr-5210.yml deleted file mode 100644 index 3c4308328ca4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5210.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - rscadd: "Allowed Xenomorphs to turn off the dropship's launch alarm by hitting the nav computer." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5211.yml b/html/changelogs/AutoChangeLog-pr-5211.yml deleted file mode 100644 index f2dfd34b23f6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5211.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "cuberound" -delete-after: True -changes: - - bugfix: "DS doorgun no longer drops the gun when destroyed" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5254.yml b/html/changelogs/AutoChangeLog-pr-5254.yml deleted file mode 100644 index 6c557a335b79..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5254.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Huffie56" -delete-after: True -changes: - - bugfix: "removed an extra light in bravo cryo room(to do just saw it)" - - maptweak: "added more areas (stern_point_defense, Lower Deck Stern Hull, Upper Deck port Hallway Upper Deck starboard Hallway)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5257.yml b/html/changelogs/AutoChangeLog-pr-5257.yml deleted file mode 100644 index 97e3774b3fb2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5257.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "BadAtThisGame302" -delete-after: True -changes: - - rscadd: "Added a windbreaker to the Flight Control Operator surv." - - rscadd: "Added W-Y Flight Control access to the Flight Control Operator surv." - - bugfix: "fixed the Flight Control Operator path." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5266.yml b/html/changelogs/AutoChangeLog-pr-5266.yml deleted file mode 100644 index c8cf8dbf72b6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5266.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fix crusher charge and tumble abilities going over unwired cades" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5271.yml b/html/changelogs/AutoChangeLog-pr-5271.yml deleted file mode 100644 index 753cca63c2c8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5271.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - rscdel: "Removed the green overlay from camera consoles." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5273.yml b/html/changelogs/AutoChangeLog-pr-5273.yml deleted file mode 100644 index 9c9775123e9c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5273.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Cthulhu80" -delete-after: True -changes: - - rscadd: "human mobs now scream whenever they get lunged at by a warrior." - - soundadd: "added a new scream sound and put it into the existing scream list." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5279.yml b/html/changelogs/AutoChangeLog-pr-5279.yml deleted file mode 100644 index a0d972a32c60..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5279.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - spellcheck: "Made the `xenoboldnotice` span class bold rather than italic." \ No newline at end of file diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml index 18530c16c539..d00e4e209432 100644 --- a/html/changelogs/archive/2023-12.yml +++ b/html/changelogs/archive/2023-12.yml @@ -440,3 +440,28 @@ - bugfix: Fixed X-mas barricade wiring not applying properly. private-tristan: - balance: xenos can now acid all window frames. +2023-12-24: + BadAtThisGame302: + - rscadd: Added a windbreaker to the Flight Control Operator surv. + - rscadd: Added W-Y Flight Control access to the Flight Control Operator surv. + - bugfix: fixed the Flight Control Operator path. + Cthulhu80: + - rscadd: human mobs now scream whenever they get lunged at by a warrior. + - soundadd: added a new scream sound and put it into the existing scream list. + Drathek: + - bugfix: Fix crusher charge and tumble abilities going over unwired cades + Huffie56: + - bugfix: removed an extra light in bravo cryo room(to do just saw it) + - maptweak: added more areas (stern_point_defense, Lower Deck Stern Hull, Upper + Deck port Hallway Upper Deck starboard Hallway) + SabreML: + - rscdel: Removed the green overlay from camera consoles. + - rscadd: Allowed Xenomorphs to turn off the dropship's launch alarm by hitting + the nav computer. + - spellcheck: Made the `xenoboldnotice` span class bold rather than italic. + cuberound: + - bugfix: DS doorgun no longer drops the gun when destroyed + ihatethisengine: + - balance: "New healer drone ability \u2014 sacrifice. Healer drone can instantly\ + \ transfer 75% of its current health, but for the great cost of the healer\u2019\ + s own life." From de09e86742dfc7b7d67bc8ecee29ce4b93e2b2bd Mon Sep 17 00:00:00 2001 From: InsaneRed <47158596+InsaneRed@users.noreply.github.com> Date: Mon, 25 Dec 2023 03:50:37 +0300 Subject: [PATCH 067/205] Further vanguard tweaks that drop the root from 2.5 to 1.8 (#5215) # About the pull request I believe the latest buff pr i overtuned the root a bit too much, thinking it wouldnt be too hard since you can still technically act. # Explain why it's good for the game 2.5 root is a bit too much currently so im bringing it down to 1.8 so its still good but not busted like 2.5 # Testing Photographs and Procedure
it works
# Changelog :cl: balance: Tweaks down the buffed root of vanguard down to 1.8 from 2.5 /:cl: Co-authored-by: InsaneRed --- .../xenomorph/abilities/praetorian/praetorian_abilities.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm index 7327454ab74e..c2fbd6b9d8c4 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_abilities.dm @@ -55,7 +55,7 @@ // Root config var/root_duration_unbuffed = 1 SECONDS - var/root_duration_buffed = 2.5 SECONDS + var/root_duration_buffed = 1.8 SECONDS // Fling config var/fling_dist_unbuffed = 3 From bf17e4706c5649741a635b7a697ce8f28ac41ba1 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Mon, 25 Dec 2023 01:05:39 +0000 Subject: [PATCH 068/205] Automatic changelog for PR #5215 [ci skip] --- html/changelogs/AutoChangeLog-pr-5215.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5215.yml diff --git a/html/changelogs/AutoChangeLog-pr-5215.yml b/html/changelogs/AutoChangeLog-pr-5215.yml new file mode 100644 index 000000000000..9bb18ad46d64 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5215.yml @@ -0,0 +1,4 @@ +author: "InsaneRed" +delete-after: True +changes: + - balance: "Tweaks down the buffed root of vanguard down to 1.8 from 2.5" \ No newline at end of file From 65f2581657dfc9b5e65984e0644c77c50665475d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 25 Dec 2023 01:12:01 +0000 Subject: [PATCH 069/205] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5215.yml | 4 ---- html/changelogs/archive/2023-12.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5215.yml diff --git a/html/changelogs/AutoChangeLog-pr-5215.yml b/html/changelogs/AutoChangeLog-pr-5215.yml deleted file mode 100644 index 9bb18ad46d64..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5215.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "InsaneRed" -delete-after: True -changes: - - balance: "Tweaks down the buffed root of vanguard down to 1.8 from 2.5" \ No newline at end of file diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml index d00e4e209432..2f1249ec934b 100644 --- a/html/changelogs/archive/2023-12.yml +++ b/html/changelogs/archive/2023-12.yml @@ -465,3 +465,6 @@ - balance: "New healer drone ability \u2014 sacrifice. Healer drone can instantly\ \ transfer 75% of its current health, but for the great cost of the healer\u2019\ s own life." +2023-12-25: + InsaneRed: + - balance: Tweaks down the buffed root of vanguard down to 1.8 from 2.5 From bc787f6225b007c47097cf0930e630214d7c29f2 Mon Sep 17 00:00:00 2001 From: Paul Mullen <101871009+mullenpaul@users.noreply.github.com> Date: Mon, 25 Dec 2023 02:38:47 +0000 Subject: [PATCH 070/205] Dropship weapons console TGUI (#4812) # About the pull request Migrates the dropship weapons panel to TGUI. Design is primarily inspired by the MultiFunction Displays used in modern aircraft. The UI consists of two identical and independent panels. The pilot can choose which panels to display. Code wise this PR introduces the MFD which is a reusable component. # Explain why it's good for the game nanoui bad tgui good # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags. ## Update - Some styling improvements Improving the overall look and feel, making the background a dark grey over a black, rounding the edges. Making inactive buttons appear greyed out. ![image](https://github.com/cmss13-devs/cmss13/assets/101871009/0965b5cb-21b0-4b7f-84ea-40651e83a02e) ## Welcome screen - blurb for lore ![image](https://github.com/cmss13-devs/cmss13/assets/101871009/5872dcb6-ba87-485e-a736-8de0b3e5e36d) ## Equipment panel and map ![image](https://github.com/cmss13-devs/cmss13/assets/101871009/85fde5cc-e4a8-439e-8c55-d010a4780d8c) ## Equipment panel with camera ![image](https://github.com/cmss13-devs/cmss13/assets/101871009/034a2833-d37c-4c6b-8b08-64e3e09aefb0) ## Weapon panel and Camera ![image](https://github.com/cmss13-devs/cmss13/assets/101871009/ce246258-a879-4220-b481-3d5fbc800651) ## Target Acquisition with camera ![image](https://github.com/cmss13-devs/cmss13/assets/101871009/2778b9da-76f9-4c37-b3ba-9d45a1bdc625) ## Medevac lift with stretcher camera ![image](https://github.com/cmss13-devs/cmss13/assets/101871009/7e9ef10b-811c-4922-9f24-ae805bae24d9)
# Changelog :cl: ui: tgui dropship weapons console refactor: added MFD panel refactor: creates datum component to manage camera code qol: CAS weapons operator can see camera in UI add: CAS can offset in X and Y coordinates refactor: CAS can offset in different direction to attack vector /:cl: --------- Co-authored-by: fira --- code/__DEFINES/__game.dm | 1 + .../dcs/signals/atom/signals_item.dm | 9 + .../__DEFINES/dcs/signals/atom/signals_obj.dm | 2 + code/__DEFINES/layers.dm | 1 + code/_onclick/hud/rendering/plane_master.dm | 8 + code/game/camera_manager/camera_manager.dm | 235 +++ .../cas_manager/datums/cas_fire_envelope.dm | 139 +- .../cas_manager/datums/cas_fire_mission.dm | 70 +- .../machinery/computer/dropship_weapons.dm | 1259 +++++++++-------- .../structures/stool_bed_chair_nest/bed.dm | 9 + code/modules/client/client_procs.dm | 8 +- code/modules/cm_marines/dropship_equipment.dm | 224 ++- .../dropships/attach_points/attach_point.dm | 2 +- .../dropships/cas/fire_mission_record.dm | 5 + .../shuttle/computers/dropship_computer.dm | 2 +- code/modules/shuttle/shuttles/dropship.dm | 16 + colonialmarines.dme | 1 + maps/shuttles/dropship_alamo.dmm | 145 +- maps/shuttles/dropship_normandy.dmm | 124 +- nano/templates/dropship_weapons_console.tmpl | 245 ---- tgui/packages/tgui/interfaces/CasSim.js | 109 -- tgui/packages/tgui/interfaces/CasSim.tsx | 106 ++ tgui/packages/tgui/interfaces/CrtPanel.tsx | 20 + .../interfaces/DropshipWeaponsConsole.tsx | 366 +++++ .../tgui/interfaces/MfdPanels/CameraPanel.tsx | 37 + .../interfaces/MfdPanels/EquipmentPanel.tsx | 350 +++++ .../interfaces/MfdPanels/FiremissionPanel.tsx | 580 ++++++++ .../tgui/interfaces/MfdPanels/FultonPanel.tsx | 161 +++ .../tgui/interfaces/MfdPanels/MGPanel.tsx | 69 + .../tgui/interfaces/MfdPanels/MapPanel.tsx | 37 + .../interfaces/MfdPanels/MedevacPanel.tsx | 208 +++ .../MfdPanels/MultifunctionDisplay.tsx | 152 ++ .../tgui/interfaces/MfdPanels/SentryPanel.tsx | 89 ++ .../interfaces/MfdPanels/SpotlightPanel.tsx | 60 + .../interfaces/MfdPanels/SupportPanel.tsx | 62 + .../interfaces/MfdPanels/TargetAquisition.tsx | 519 +++++++ .../tgui/interfaces/MfdPanels/WeaponPanel.tsx | 179 +++ .../interfaces/MfdPanels/stateManagers.ts | 109 ++ .../tgui/interfaces/MfdPanels/types.ts | 112 ++ tgui/packages/tgui/interfaces/common/Dpad.tsx | 113 ++ .../tgui/styles/interfaces/CasSim.scss | 17 + .../tgui/styles/interfaces/CrtPanel.scss | 72 + .../styles/interfaces/DropshipWeapons.scss | 253 ++++ .../tgui/styles/interfaces/SidePanel.scss | 21 + .../tgui/styles/interfaces/common/Dpad.scss | 26 + .../tgui/styles/layouts/SplitWindow.scss | 13 + tgui/packages/tgui/styles/main.scss | 6 + 47 files changed, 5142 insertions(+), 1209 deletions(-) create mode 100644 code/game/camera_manager/camera_manager.dm delete mode 100644 nano/templates/dropship_weapons_console.tmpl delete mode 100644 tgui/packages/tgui/interfaces/CasSim.js create mode 100644 tgui/packages/tgui/interfaces/CasSim.tsx create mode 100644 tgui/packages/tgui/interfaces/CrtPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/DropshipWeaponsConsole.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/CameraPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/EquipmentPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/FiremissionPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/FultonPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/MGPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/MapPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/MedevacPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/MultifunctionDisplay.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/SentryPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/SpotlightPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/SupportPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/TargetAquisition.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/WeaponPanel.tsx create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/stateManagers.ts create mode 100644 tgui/packages/tgui/interfaces/MfdPanels/types.ts create mode 100644 tgui/packages/tgui/interfaces/common/Dpad.tsx create mode 100644 tgui/packages/tgui/styles/interfaces/CasSim.scss create mode 100644 tgui/packages/tgui/styles/interfaces/CrtPanel.scss create mode 100644 tgui/packages/tgui/styles/interfaces/DropshipWeapons.scss create mode 100644 tgui/packages/tgui/styles/interfaces/SidePanel.scss create mode 100644 tgui/packages/tgui/styles/interfaces/common/Dpad.scss create mode 100644 tgui/packages/tgui/styles/layouts/SplitWindow.scss diff --git a/code/__DEFINES/__game.dm b/code/__DEFINES/__game.dm index 11c6e335d932..7cb7440ba8da 100644 --- a/code/__DEFINES/__game.dm +++ b/code/__DEFINES/__game.dm @@ -392,6 +392,7 @@ block( \ #define FIRE_MISSION_WEAPON_REMOVED 8 #define FIRE_MISSION_WEAPON_UNUSABLE 16 #define FIRE_MISSION_WEAPON_OUT_OF_AMMO 32 +#define FIRE_MISSION_BAD_DIRECTION 64 #define FIRE_MISSION_NOT_EXECUTABLE -1 //Defines for firemission state diff --git a/code/__DEFINES/dcs/signals/atom/signals_item.dm b/code/__DEFINES/dcs/signals/atom/signals_item.dm index 6024c0524992..7b3b218e658a 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_item.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_item.dm @@ -68,3 +68,12 @@ //from /datum/authority/branch/role/proc/equip_role() #define COMSIG_POST_SPAWN_UPDATE "post_spawn_update" + +#define COMSIG_CAMERA_MAPNAME_ASSIGNED "camera_manager_mapname_assigned" +#define COMSIG_CAMERA_REGISTER_UI "camera_manager_register_ui" +#define COMSIG_CAMERA_UNREGISTER_UI "camera_manager_unregister_ui" +#define COMSIG_CAMERA_SET_NVG "camera_manager_set_nvg" +#define COMSIG_CAMERA_CLEAR_NVG "camera_manager_clear_nvg" +#define COMSIG_CAMERA_SET_TARGET "camera_manager_set_target" +#define COMSIG_CAMERA_SET_AREA "camera_manager_set_area" +#define COMSIG_CAMERA_CLEAR "camera_manager_clear_target" diff --git a/code/__DEFINES/dcs/signals/atom/signals_obj.dm b/code/__DEFINES/dcs/signals/atom/signals_obj.dm index 93579e068ec7..b5f2bb3ff6a9 100644 --- a/code/__DEFINES/dcs/signals/atom/signals_obj.dm +++ b/code/__DEFINES/dcs/signals/atom/signals_obj.dm @@ -30,4 +30,6 @@ /// from /obj/proc/afterbuckle() #define COSMIG_OBJ_AFTER_BUCKLE "signal_obj_after_buckle" +#define COMSIG_DROPSHIP_ADD_EQUIPMENT "dropship_add_equipment" +#define COMSIG_DROPSHIP_REMOVE_EQUIPMENT "dropship_remove_equipment" #define COMSIG_STRUCTURE_CRATE_SQUAD_LAUNCHED "structure_crate_squad_launched" diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm index c0ccd5164b0b..5628395d7ffb 100644 --- a/code/__DEFINES/layers.dm +++ b/code/__DEFINES/layers.dm @@ -230,6 +230,7 @@ ///--------------- FULLSCREEN RUNECHAT BUBBLES ------------ #define LIGHTING_PLANE 100 #define EXTERIOR_LIGHTING_PLANE 101 +#define NVG_PLANE 110 ///Popup Chat Messages #define RUNECHAT_PLANE 501 diff --git a/code/_onclick/hud/rendering/plane_master.dm b/code/_onclick/hud/rendering/plane_master.dm index 91c0e24fae1f..d4181d7e9953 100644 --- a/code/_onclick/hud/rendering/plane_master.dm +++ b/code/_onclick/hud/rendering/plane_master.dm @@ -149,6 +149,14 @@ remove_filter("AO") add_filter("AO", 1, drop_shadow_filter(x = 0, y = -2, size = 4, color = "#04080FAA")) +/atom/movable/screen/plane_master/nvg_plane + name = "NVG plane" + plane = NVG_PLANE + render_relay_plane = RENDER_PLANE_GAME + blend_mode_override = BLEND_MULTIPLY + //icon = 'icons/mob/hud/screen1.dmi' + //icon_state = "noise" + /atom/movable/screen/plane_master/fullscreen name = "fullscreen alert plane" plane = FULLSCREEN_PLANE diff --git a/code/game/camera_manager/camera_manager.dm b/code/game/camera_manager/camera_manager.dm new file mode 100644 index 000000000000..93d56aca443c --- /dev/null +++ b/code/game/camera_manager/camera_manager.dm @@ -0,0 +1,235 @@ +#define DEFAULT_MAP_SIZE 15 + +#define RENDER_MODE_TARGET 1 +#define RENDER_MODE_AREA 2 + +/datum/component/camera_manager + var/map_name + var/obj/structure/machinery/camera/current + var/datum/shape/rectangle/current_area + var/atom/movable/screen/map_view/cam_screen + var/atom/movable/screen/background/cam_background + var/list/range_turfs = list() + /// The turf where the camera was last updated. + var/turf/last_camera_turf + var/target_x + var/target_y + var/target_z + var/target_width + var/target_height + var/list/cam_plane_masters + var/isXRay = FALSE + var/render_mode = RENDER_MODE_TARGET + +/datum/component/camera_manager/Initialize() + . = ..() + map_name = "camera_manager_[REF(src)]_map" + cam_screen = new + cam_screen.name = "screen" + cam_screen.assigned_map = map_name + cam_screen.del_on_map_removal = FALSE + cam_screen.screen_loc = "[map_name]:1,1" + cam_background = new + cam_background.assigned_map = map_name + cam_background.del_on_map_removal = FALSE + + cam_plane_masters = list() + for(var/plane in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/blackness) + var/atom/movable/screen/plane_master/instance = new plane() + add_plane(instance) + +/datum/component/camera_manager/Destroy(force, ...) + . = ..() + range_turfs = null + current_area = null + cam_plane_masters = null + QDEL_NULL(cam_background) + QDEL_NULL(cam_screen) + if(current) + UnregisterSignal(current, COMSIG_PARENT_QDELETING) + +/datum/component/camera_manager/proc/add_plane(atom/movable/screen/plane_master/instance) + instance.assigned_map = map_name + instance.del_on_map_removal = FALSE + if(instance.blend_mode_override) + instance.blend_mode = instance.blend_mode_override + instance.screen_loc = "[map_name]:CENTER" + cam_plane_masters["[instance.plane]"] = instance + +/datum/component/camera_manager/proc/register(source, mob/user) + SIGNAL_HANDLER + var/client/user_client = user.client + if(!user_client) + return + user_client.register_map_obj(cam_background) + user_client.register_map_obj(cam_screen) + for(var/plane_id in cam_plane_masters) + user_client.register_map_obj(cam_plane_masters[plane_id]) + +/datum/component/camera_manager/proc/unregister(source, mob/user) + SIGNAL_HANDLER + var/client/user_client = user.client + if(!user_client) + return + user_client.clear_map(cam_background) + user_client.clear_map(cam_screen) + for(var/plane_id in cam_plane_masters) + user_client.clear_map(cam_plane_masters[plane_id]) + +/datum/component/camera_manager/RegisterWithParent() + . = ..() + START_PROCESSING(SSdcs, src) + SEND_SIGNAL(parent, COMSIG_CAMERA_MAPNAME_ASSIGNED, map_name) + RegisterSignal(parent, COMSIG_CAMERA_REGISTER_UI, PROC_REF(register)) + RegisterSignal(parent, COMSIG_CAMERA_UNREGISTER_UI, PROC_REF(unregister)) + RegisterSignal(parent, COMSIG_CAMERA_SET_NVG, PROC_REF(enable_nvg)) + RegisterSignal(parent, COMSIG_CAMERA_CLEAR_NVG, PROC_REF(disable_nvg)) + RegisterSignal(parent, COMSIG_CAMERA_SET_AREA, PROC_REF(set_camera_rect)) + RegisterSignal(parent, COMSIG_CAMERA_SET_TARGET, PROC_REF(set_camera)) + RegisterSignal(parent, COMSIG_CAMERA_CLEAR, PROC_REF(clear_camera)) + +/datum/component/camera_manager/UnregisterFromParent() + . = ..() + STOP_PROCESSING(SSdcs, src) + + UnregisterSignal(parent, COMSIG_CAMERA_REGISTER_UI) + UnregisterSignal(parent, COMSIG_CAMERA_UNREGISTER_UI) + UnregisterSignal(parent, COMSIG_CAMERA_SET_NVG) + UnregisterSignal(parent, COMSIG_CAMERA_CLEAR_NVG) + UnregisterSignal(parent, COMSIG_CAMERA_SET_AREA) + UnregisterSignal(parent, COMSIG_CAMERA_SET_TARGET) + UnregisterSignal(parent, COMSIG_CAMERA_CLEAR) + +/datum/component/camera_manager/proc/clear_camera() + SIGNAL_HANDLER + if(current) + UnregisterSignal(current, COMSIG_PARENT_QDELETING) + current_area = null + current = null + target_x = null + target_y = null + target_z = null + target_width = null + target_height = null + show_camera_static() + +/datum/component/camera_manager/proc/set_camera(source, atom/target, w, h) + SIGNAL_HANDLER + render_mode = RENDER_MODE_TARGET + if(current) + UnregisterSignal(current, COMSIG_PARENT_QDELETING) + current = target + target_width = w + target_height = h + RegisterSignal(current, COMSIG_PARENT_QDELETING, PROC_REF(show_camera_static)) + update_target_camera() + +/datum/component/camera_manager/proc/set_camera_rect(source, x, y, z, w, h) + SIGNAL_HANDLER + render_mode = RENDER_MODE_AREA + if(current) + UnregisterSignal(current, COMSIG_PARENT_QDELETING) + current = null + current_area = RECT(x, y, w, h) + target_x = x + target_y = y + target_z = z + update_area_camera() + +/datum/component/camera_manager/proc/enable_nvg(source, power, matrixcol) + SIGNAL_HANDLER + for(var/plane_id in cam_plane_masters) + var/atom/movable/screen/plane_master/plane = cam_plane_masters["[plane_id]"] + plane.add_filter("nvg", 1, color_matrix_filter(color_matrix_from_string(matrixcol))) + sync_lighting_plane_alpha(LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + +/datum/component/camera_manager/proc/disable_nvg() + SIGNAL_HANDLER + for(var/plane_id in cam_plane_masters) + var/atom/movable/screen/plane_master/plane = cam_plane_masters["[plane_id]"] + plane.remove_filter("nvg") + sync_lighting_plane_alpha(LIGHTING_PLANE_ALPHA_VISIBLE) + +/datum/component/camera_manager/proc/sync_lighting_plane_alpha(lighting_alpha) + var/atom/movable/screen/plane_master/lighting/lighting = cam_plane_masters["[LIGHTING_PLANE]"] + if (lighting) + lighting.alpha = lighting_alpha + var/atom/movable/screen/plane_master/lighting/exterior_lighting = cam_plane_masters["[EXTERIOR_LIGHTING_PLANE]"] + if (exterior_lighting) + exterior_lighting.alpha = min(GLOB.minimum_exterior_lighting_alpha, lighting_alpha) + +/** + * Set the displayed camera to the static not-connected. + */ +/datum/component/camera_manager/proc/show_camera_static() + cam_screen.vis_contents.Cut() + last_camera_turf = null + cam_background.icon_state = "scanline2" + cam_background.fill_rect(1, 1, DEFAULT_MAP_SIZE, DEFAULT_MAP_SIZE) + +/datum/component/camera_manager/proc/update_target_camera() + // Show static if can't use the camera + if(!current?.can_use()) + show_camera_static() + return + + // Is this camera located in or attached to a living thing, Vehicle or helmet? If so, assume the camera's loc is the living (or non) thing. + var/cam_location = current + if(isliving(current.loc) || isVehicle(current.loc)) + cam_location = current.loc + else if(istype(current.loc, /obj/item/clothing/head/helmet/marine)) + var/obj/item/clothing/head/helmet/marine/helmet = current.loc + cam_location = helmet.loc + + // If we're not forcing an update for some reason and the cameras are in the same location, + // we don't need to update anything. + // Most security cameras will end here as they're not moving. + var/newturf = get_turf(cam_location) + if(last_camera_turf == newturf) + return + + // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs. + last_camera_turf = get_turf(cam_location) + + var/list/visible_things = current.isXRay() ? range(current.view_range, cam_location) : view(current.view_range, cam_location) + render_objects(visible_things) + +/datum/component/camera_manager/proc/update_area_camera() + // Show static if can't use the camera + if(!current_area || !target_z) + show_camera_static() + return + + // If we're not forcing an update for some reason and the cameras are in the same location, + // we don't need to update anything. + // Most security cameras will end here as they're not moving. + var/turf/new_location = locate(target_x, target_y, target_z) + if(last_camera_turf == new_location) + return + + // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs. + last_camera_turf = new_location + + var/x_size = current_area.width + var/y_size = current_area.height + var/turf/target = locate(current_area.center_x, current_area.center_y, target_z) + + var/list/visible_things = isXRay ? range("[x_size]x[y_size]", target) : view("[x_size]x[y_size]", target) + src.render_objects(visible_things) + +/datum/component/camera_manager/proc/render_objects(list/visible_things) + var/list/visible_turfs = list() + for(var/turf/visible_turf in visible_things) + visible_turfs += visible_turf + + var/list/bbox = get_bbox_of_atoms(visible_turfs) + var/size_x = bbox[3] - bbox[1] + 1 + var/size_y = bbox[4] - bbox[2] + 1 + + cam_screen.vis_contents = visible_turfs + cam_background.icon_state = "clear" + cam_background.fill_rect(1, 1, size_x, size_y) + +#undef DEFAULT_MAP_SIZE +#undef RENDER_MODE_TARGET +#undef RENDER_MODE_AREA diff --git a/code/game/cas_manager/datums/cas_fire_envelope.dm b/code/game/cas_manager/datums/cas_fire_envelope.dm index 330521f34e36..04cd688194dd 100644 --- a/code/game/cas_manager/datums/cas_fire_envelope.dm +++ b/code/game/cas_manager/datums/cas_fire_envelope.dm @@ -1,7 +1,6 @@ /datum/cas_fire_envelope var/obj/structure/machinery/computer/dropship_weapons/linked_console var/list/datum/cas_fire_mission/missions - var/max_mission_len = 5 var/fire_length var/grace_period //how much time you have after initiating fire mission and before you can't change firemissions var/flyto_period //how much time it takes from sound alarm start to first hit. CAS is vulnerable here @@ -30,35 +29,36 @@ linked_console = null return ..() +/datum/cas_fire_envelope/ui_data(mob/user) + . = list() + .["missions"] = list() + for(var/datum/cas_fire_mission/mission in missions) + .["missions"] += list(mission.ui_data(user)) + + /datum/cas_fire_envelope/proc/get_total_duration() return grace_period+flyto_period+flyoff_period +/datum/cas_fire_envelope/proc/update_weapons(list/obj/structure/dropship_equipment/weapon/weapons) + for(var/datum/cas_fire_mission/mission in missions) + mission.update_weapons(weapons, fire_length) + /datum/cas_fire_envelope/proc/generate_mission(firemission_name, length) - if(!missions || !linked_console || missions.len>max_mission_len || !fire_length) + if(!missions || !linked_console || !fire_length) return null - var/list/obj/structure/dropship_equipment/weapons = list() - for(var/X in linked_console.shuttle_equipments) - var/obj/structure/dropship_equipment/E = X - if(E.is_weapon) - weapons += E + var/shuttle_tag = linked_console.shuttle_tag + var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttle_tag) + for(var/obj/structure/dropship_equipment/equipment as anything in dropship.equipments) + if(equipment.is_weapon) + weapons += equipment var/datum/cas_fire_mission/fm = new() - - if(weapons.len==0) - return null //why bother? - for(var/obj/structure/dropship_equipment/weapon/wp in weapons) - var/datum/cas_fire_mission_record/record = new() - record.weapon = wp - record.offsets = new /list(fire_length) - for(var/idx = 1; idx<=fire_length; idx++) - record.offsets[idx] = "-" - fm.records += record + fm.build_new_record(wp, fire_length) fm.name = firemission_name fm.mission_length = length - missions += fm return fm @@ -67,67 +67,61 @@ mission_error = null if(stat > FIRE_MISSION_STATE_IN_TRANSIT && stat < FIRE_MISSION_STATE_COOLDOWN) mission_error = "Fire Mission is under way already." - return 0 + return FIRE_MISSION_NOT_EXECUTABLE if(!missions[mission_id]) - return -1 + return FIRE_MISSION_NOT_EXECUTABLE var/datum/cas_fire_mission/mission = missions[mission_id] if(!mission) - return -1 - if(!mission.records[weapon_id]) - return -1 - var/datum/cas_fire_mission_record/fmr = mission.records[weapon_id] + return FIRE_MISSION_NOT_EXECUTABLE + + var/datum/cas_fire_mission_record/fmr = mission.record_for_weapon(weapon_id) + if(!fmr) + return FIRE_MISSION_NOT_EXECUTABLE if(!fmr.offsets || isnull(fmr.offsets[offset_step])) - return -1 + return FIRE_MISSION_NOT_EXECUTABLE var/old_offset = fmr.offsets[offset_step] + if(offset == null) + offset = "-" fmr.offsets[offset_step] = offset var/check_result = mission.check(linked_console) if(check_result == FIRE_MISSION_CODE_ERROR) - return -1 + return FIRE_MISSION_NOT_EXECUTABLE if(check_result == FIRE_MISSION_ALL_GOOD) - return 1 + return FIRE_MISSION_ALL_GOOD if(check_result == FIRE_MISSION_WEAPON_OUT_OF_AMMO) - return 1 + return FIRE_MISSION_ALL_GOOD mission_error = mission.error_message(check_result) if(skip_checks) - return 0 + return FIRE_MISSION_ALL_GOOD //we have mission error. Fill the thing and restore previous state fmr.offsets[offset_step] = old_offset - return 0 + return FIRE_MISSION_ALL_GOOD -/datum/cas_fire_envelope/proc/execute_firemission(datum/cas_signal/target_turf, offset, dir, mission_id) - if(!istype(target_turf)) - mission_error = "No target." - return 0 +/datum/cas_fire_envelope/proc/execute_firemission(datum/cas_signal/signal, target_turf,dir, mission_id) if(stat != FIRE_MISSION_STATE_IDLE) mission_error = "Fire Mission is under way already." - return 0 + return FIRE_MISSION_NOT_EXECUTABLE if(!missions[mission_id]) - return -1 - if(offset<0) - mission_error = "Can't have negative offsets." - return 0 - if(offset>max_offset) - mission_error = "[max_offset] is the maximum possible offset." - return 0 + return FIRE_MISSION_NOT_EXECUTABLE if(dir!=NORTH && dir!=SOUTH && dir!=WEST && dir!=EAST) mission_error = "Incorrect direction." - return 0 + return FIRE_MISSION_BAD_DIRECTION mission_error = null var/datum/cas_fire_mission/mission = missions[mission_id] var/check_result = mission.check(linked_console) if(check_result == FIRE_MISSION_CODE_ERROR) - return -1 + return FIRE_MISSION_CODE_ERROR if(check_result != FIRE_MISSION_ALL_GOOD) mission_error = mission.error_message(check_result) - return 0 + return FIRE_MISSION_CODE_ERROR //actual firemission code - execute_firemission_unsafe(target_turf, offset, dir, mission) - return 1 + execute_firemission_unsafe(signal, target_turf, dir, mission) + return FIRE_MISSION_ALL_GOOD /datum/cas_fire_envelope/proc/firemission_status_message() switch(stat) @@ -167,6 +161,7 @@ if(!guidance) guidance = new /obj/effect/firemission_guidance() guidance.forceMove(location) + guidance.updateCameras(linked_console) /datum/cas_fire_envelope/proc/user_is_guided(user) return guidance && (user in guidance.users) @@ -183,7 +178,6 @@ guidance.users += user RegisterSignal(user, COMSIG_MOB_RESISTED, PROC_REF(exit_cam_resist)) - /datum/cas_fire_envelope/proc/apply_upgrade(user) var/mob/M = user if(linked_console.upgraded == MATRIX_NVG) @@ -193,8 +187,6 @@ M.overlay_fullscreen("matrix", /atom/movable/screen/fullscreen/flash/noise/nvg) M.lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE M.sync_lighting_plane_alpha() - else if (linked_console.upgraded == MATRIX_WIDE) - M.client?.change_view(linked_console.power + 5, M) /datum/cas_fire_envelope/proc/remove_upgrades(user) @@ -221,6 +213,7 @@ remove_upgrades(user) guidance.users -= user UnregisterSignal(user, COMSIG_MOB_RESISTED) + guidance.clearCameras(linked_console) /datum/cas_fire_envelope/proc/exit_cam_resist(mob/user) SIGNAL_HANDLER @@ -231,54 +224,36 @@ /datum/cas_fire_envelope/proc/check_firemission_loc(datum/cas_signal/target_turf) return TRUE //redefined in child class -/datum/cas_fire_envelope/proc/execute_firemission_unsafe(datum/cas_signal/target_turf, offset, dir, datum/cas_fire_mission/mission) - var/sx = 0 - var/sy = 0 - - recorded_dir = dir - recorded_offset = offset - +/** + * Execute firemission. + */ +/datum/cas_fire_envelope/proc/execute_firemission_unsafe(datum/cas_signal/signal, turf/target_turf, dir, datum/cas_fire_mission/mission) stat = FIRE_MISSION_STATE_IN_TRANSIT + to_chat(usr, SPAN_ALERT("Firemission underway!")) sleep(grace_period) stat = FIRE_MISSION_STATE_ON_TARGET - switch(recorded_dir) - if(NORTH) //default direction - sx = 0 - sy = 1 - if(SOUTH) - sx = 0 - sy = -1 - if(EAST) - sx = 1 - sy = 0 - if(WEST) - sx = -1 - sy = 0 if(!target_turf) stat = FIRE_MISSION_STATE_IDLE mission_error = "Target Lost." return - var/turf/tt_turf = get_turf(target_turf.signal_loc) - if(!tt_turf || !check_firemission_loc(target_turf)) + if(!target_turf || !check_firemission_loc(signal)) stat = FIRE_MISSION_STATE_IDLE mission_error = "Target is off bounds or obstructed." return - var/turf/shootloc = locate(tt_turf.x + sx*recorded_offset, tt_turf.y + sy*recorded_offset,tt_turf.z) - if(!shootloc || !istype(shootloc)) - stat = FIRE_MISSION_STATE_IDLE - mission_error = "Target is off bounds." - return - change_current_loc(shootloc) - playsound(shootloc, soundeffect, 70, TRUE, 50) + change_current_loc(target_turf) + playsound(target_turf, soundeffect, 70, TRUE, 50) sleep(flyto_period) stat = FIRE_MISSION_STATE_FIRING - mission.execute_firemission(linked_console, shootloc, recorded_dir, fire_length, step_delay, src) + mission.execute_firemission(linked_console, target_turf, dir, fire_length, step_delay, src) stat = FIRE_MISSION_STATE_OFF_TARGET sleep(flyoff_period) stat = FIRE_MISSION_STATE_COOLDOWN sleep(cooldown_period) stat = FIRE_MISSION_STATE_IDLE +/** + * Change attack vector for firemission + */ /datum/cas_fire_envelope/proc/change_direction(new_dir) if(stat > FIRE_MISSION_STATE_IN_TRANSIT) mission_error = "Fire Mission is under way already." @@ -346,13 +321,13 @@ /obj/structure/machinery/computer/dropship_weapons/proc/update_mission(mission_id, weapon_id, offset_step, offset) var/result = firemission_envelope.update_mission(mission_id, weapon_id, offset_step, offset) - if(result<1) + if(result != FIRE_MISSION_ALL_GOOD) return firemission_envelope.mission_error return "OK" // Used in the simulation room for firemission testing. /obj/structure/machinery/computer/dropship_weapons/proc/execute_firemission(obj/location, offset, dir, mission_id) var/result = firemission_envelope.execute_firemission(get_turf(location), offset, dir, mission_id) - if(result<1) + if(result != FIRE_MISSION_ALL_GOOD) return firemission_envelope.mission_error return "OK" diff --git a/code/game/cas_manager/datums/cas_fire_mission.dm b/code/game/cas_manager/datums/cas_fire_mission.dm index cb43caec30bb..ece78042ac25 100644 --- a/code/game/cas_manager/datums/cas_fire_mission.dm +++ b/code/game/cas_manager/datums/cas_fire_mission.dm @@ -1,17 +1,83 @@ /obj/effect/firemission_guidance invisibility = 101 - var/list/users + var/list/mob/users + var/camera_width = 11 + var/camera_height = 11 + var/view_range = 7 /obj/effect/firemission_guidance/New() ..() users = list() +/obj/effect/firemission_guidance/Destroy(force) + . = ..() + users = null + +/obj/effect/firemission_guidance/proc/can_use() + return TRUE + +/obj/effect/firemission_guidance/proc/isXRay() + return FALSE + +/obj/effect/firemission_guidance/proc/updateCameras(atom/target) + SEND_SIGNAL(target, COMSIG_CAMERA_SET_TARGET, src, camera_width, camera_height) + +/obj/effect/firemission_guidance/proc/clearCameras(atom/target) + SEND_SIGNAL(target, COMSIG_CAMERA_CLEAR) + /datum/cas_fire_mission var/mission_length = 3 //can be 3,4,6 or 12 var/list/datum/cas_fire_mission_record/records = list() var/obj/structure/dropship_equipment/weapon/error_weapon var/name = "Unnamed Firemission" +/datum/cas_fire_mission/ui_data(mob/user) + . = list() + .["name"] = sanitize(copytext(name, 1, MAX_MESSAGE_LEN)) + .["records"] = list() + for(var/datum/cas_fire_mission_record/record as anything in records) + .["records"] += list(record.ui_data(user)) + +/datum/cas_fire_mission/proc/build_new_record(obj/structure/dropship_equipment/weapon/weap, fire_length) + var/datum/cas_fire_mission_record/record = new() + record.weapon = weap + record.offsets = new /list(fire_length) + for(var/idx = 1; idx<=fire_length; idx++) + record.offsets[idx] = "-" + records += record + +/datum/cas_fire_mission/proc/update_weapons(list/obj/structure/dropship_equipment/weapon/weapons, fire_length) + var/list/datum/cas_fire_mission_record/bad_records = list() + var/list/obj/structure/dropship_equipment/weapon/missing_weapons = list() + for(var/datum/cas_fire_mission_record/record in records) + // if weapon appears in weapons list but not in record + // > add empty record for new weapon + var/found = FALSE + for(var/obj/structure/dropship_equipment/weapon/weap in weapons) + if(record.weapon == weap) + found=TRUE + break + if(!found) + bad_records.Add(record) + for(var/obj/structure/dropship_equipment/weapon/weap in weapons) + var/found = FALSE + for(var/datum/cas_fire_mission_record/record in records) + if(record.weapon == weap) + found=TRUE + break + if(!found) + missing_weapons.Add(weap) + for(var/datum/cas_fire_mission_record/record in bad_records) + records -= record + for(var/obj/structure/dropship_equipment/weapon/weap in missing_weapons) + build_new_record(weap, fire_length) + +/datum/cas_fire_mission/proc/record_for_weapon(weapon_id) + for(var/datum/cas_fire_mission_record/record as anything in records) + if(record.weapon.ship_base.attach_id == weapon_id) + return record + return null + /datum/cas_fire_mission/proc/check(obj/structure/machinery/computer/dropship_weapons/linked_console) error_weapon = null if(records.len == 0) @@ -165,7 +231,7 @@ var/step = 1 for(step = 1; step<=steps; step++) if(step > next_step) - current_turf = get_step(current_turf,direction) + current_turf = get_step(current_turf, direction) next_step += tally_step if(envelope) envelope.change_current_loc(current_turf) diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm index d86b9fc28a28..2f9047abc63c 100644 --- a/code/game/machinery/computer/dropship_weapons.dm +++ b/code/game/machinery/computer/dropship_weapons.dm @@ -11,7 +11,6 @@ exproof = TRUE var/shuttle_tag // Used to know which shuttle we're linked to. var/obj/structure/dropship_equipment/selected_equipment //the currently selected equipment installed on the shuttle this console controls. - var/list/shuttle_equipments = list() //list of the equipments on the shuttle this console controls var/cavebreaker = FALSE //ignore caves and other restrictions? var/datum/cas_fire_envelope/firemission_envelope var/datum/cas_fire_mission/selected_firemission @@ -25,15 +24,41 @@ var/datum/simulator/simulation var/datum/cas_fire_mission/configuration + // groundside maps + var/datum/tacmap/tacmap + var/minimap_type = MINIMAP_FLAG_USCM + + // Cameras + var/camera_target_id + var/camera_width = 11 + var/camera_height = 11 + var/camera_map_name + + var/registered = FALSE + /obj/structure/machinery/computer/dropship_weapons/Initialize() . = ..() simulation = new() + tacmap = new(src, minimap_type) + + RegisterSignal(src, COMSIG_CAMERA_MAPNAME_ASSIGNED, PROC_REF(camera_mapname_update)) + + // camera setup + AddComponent(/datum/component/camera_manager) + SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR) /obj/structure/machinery/computer/dropship_weapons/New() ..() if(firemission_envelope) firemission_envelope.linked_console = src +/obj/structure/machinery/computer/dropship_weapons/proc/camera_mapname_update(source, value) + camera_map_name = value + +/obj/structure/machinery/computer/dropship_weapons/Destroy() + . = ..() + UnregisterSignal(src, COMSIG_CAMERA_MAPNAME_ASSIGNED) + /obj/structure/machinery/computer/dropship_weapons/attack_hand(mob/user) if(..()) return @@ -43,7 +68,7 @@ to_chat(user, SPAN_WARNING("Weapons modification access denied, attempting to launch simulation.")) if(!selected_firemission) - to_chat(usr, SPAN_WARNING("Firemission must be selected before attempting to run the simulation")) + to_chat(user, SPAN_WARNING("Firemission must be selected before attempting to run the simulation")) return tgui_interact(user) @@ -54,139 +79,41 @@ /obj/structure/machinery/computer/dropship_weapons/attackby(obj/item/W, mob/user as mob) if(istype(W, /obj/item/frame/matrix_frame)) - var/obj/item/frame/matrix_frame/MATRIX = W - if(MATRIX.state == ASSEMBLY_LOCKED) + var/obj/item/frame/matrix_frame/matrix = W + if(matrix.state == ASSEMBLY_LOCKED) user.drop_held_item(W, src) W.forceMove(src) to_chat(user, SPAN_NOTICE("You swap the matrix in the dropship guidance camera system, destroying the older part in the process")) - upgraded = MATRIX.upgrade - matrixcol = MATRIX.matrixcol - power = MATRIX.power + upgraded = matrix.upgrade + matrixcol = matrix.matrixcol + power = matrix.power else to_chat(user, SPAN_WARNING("Matrix is not complete!")) +/obj/structure/machinery/computer/dropship_weapons/proc/equipment_update(obj/docking_port/mobile/marine_dropship/dropship) + SIGNAL_HANDLER + var/list/obj/structure/dropship_equipment/weapons = list() + for(var/obj/structure/dropship_equipment/weapon/weap as anything in dropship.equipments) + weapons.Add(weap) + firemission_envelope.update_weapons(weapons) + /obj/structure/machinery/computer/dropship_weapons/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 0) - var/data[0] var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttle_tag) if (!istype(dropship)) return - var/shuttle_state - switch(dropship.mode) - if(SHUTTLE_IDLE) - shuttle_state = "idle" - if(SHUTTLE_IGNITING) - shuttle_state = "warmup" - if(SHUTTLE_CALL) - shuttle_state = "in_transit" - if(SHUTTLE_CRASHED) - shuttle_state = "crashed" - - - var/list/equipment_data = list() - var/list/targets_data = list() - var/list/firemission_data = list() - var/list/firemission_edit_data = list() - var/list/firemission_edit_timeslices = list() - - for(var/ts = 1; ts<=firemission_envelope.fire_length; ts++) - firemission_edit_timeslices += ts - - var/current_mission_error = null - if(!faction) - return //no faction, no weapons - - var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] - - if(!cas_group) - return //broken group. No fighting - - for(var/X in cas_group.cas_signals) - var/datum/cas_signal/LT = X - if(!istype(LT) || !LT.valid_signal()) - continue - var/area/laser_area = get_area(LT.signal_loc) - targets_data += list(list("target_name" = "[LT.name] ([laser_area.name])", "target_tag" = LT.target_id)) - shuttle_equipments = dropship.equipments - var/element_nbr = 1 - for(var/X in dropship.equipments) - var/obj/structure/dropship_equipment/E = X - equipment_data += list(list("name"= sanitize(copytext(E.name,1,MAX_MESSAGE_LEN)), "eqp_tag" = element_nbr, "is_weapon" = E.is_weapon, "is_interactable" = E.is_interactable)) - element_nbr++ - E.linked_console = src - - - var/selected_eqp_name = "" - var/selected_eqp_ammo_name = "" - var/selected_eqp_ammo_amt = 0 - var/selected_eqp_max_ammo_amt = 0 var/screen_mode = 0 - var/fm_length = 0 - var/fm_offset = 0 - var/fm_direction = "" - var/fm_step_text = "" - var/firemission_signal - var/firemission_stat = 0 - if(selected_equipment) - selected_eqp_name = sanitize(copytext(selected_equipment.name,1,MAX_MESSAGE_LEN)) - if(selected_equipment.ammo_equipped) - selected_eqp_ammo_name = sanitize(copytext(selected_equipment.ammo_equipped.name,1,MAX_MESSAGE_LEN)) - selected_eqp_ammo_amt = selected_equipment.ammo_equipped.ammo_count - selected_eqp_max_ammo_amt = selected_equipment.ammo_equipped.max_ammo_count - screen_mode = selected_equipment.screen_mode - - var/firemission_id = 1 - var/found_selected = FALSE if(firemission_envelope) - firemission_stat = firemission_envelope.stat - fm_step_text = firemission_envelope.firemission_status_message() - for(var/datum/cas_fire_mission/X in firemission_envelope.missions) - if(!istype(X)) - continue //the fuck - var/error_code = X.check(src) - - var/selected = X == selected_firemission - if(error_code != FIRE_MISSION_ALL_GOOD && selected) - selected = FALSE - selected_firemission = null - var/can_edit = error_code != FIRE_MISSION_CODE_ERROR && !selected - - if(selected) - found_selected = TRUE - var/can_interact = firemission_envelope.stat == FIRE_MISSION_STATE_IDLE && error_code == FIRE_MISSION_ALL_GOOD - firemission_data += list(list("name"= sanitize(copytext(X.name,1,MAX_MESSAGE_LEN)), "mission_tag" = firemission_id, "can_edit" = can_edit, "can_interact" = can_interact, "selected" = selected)) - firemission_id++ - if(!istype(editing_firemission)) editing_firemission = null - //the fuck if(editing_firemission) var/error_code = editing_firemission.check(src) var/can_edit = error_code != FIRE_MISSION_CODE_ERROR - if(error_code != FIRE_MISSION_ALL_GOOD) - current_mission_error = editing_firemission.error_message(error_code) - else - current_mission_error = null if(!can_edit) editing_firemission = null //abort - else - screen_mode = 2 - for(var/datum/cas_fire_mission_record/firerec in editing_firemission.records) - var/gimbal = firerec.get_offsets() - var/ammo = firerec.get_ammo() - var/offsets = new /list(firerec.offsets.len) - for(var/idx = 1; idx < firerec.offsets.len; idx++) - offsets[idx] = firerec.offsets[idx] == null ? "-" : firerec.offsets[idx] - firemission_edit_data += list(list("name" = sanitize(copytext(firerec.weapon.name, 1, 50)), "ammo" = ammo, "gimbal" = gimbal, "offsets" = firerec.offsets)) - - if(!found_selected) - selected_firemission = null - - if(editing_firemission) - fm_length = editing_firemission.mission_length if((screen_mode != 0 && in_firemission_mode) || !selected_firemission) in_firemission_mode = FALSE @@ -196,497 +123,664 @@ selected_firemission = null if(selected_firemission && in_firemission_mode) screen_mode = 3 - fm_offset = firemission_envelope.recorded_offset - fm_direction = dir2text(firemission_envelope.recorded_dir) if(firemission_envelope.recorded_loc && (!firemission_envelope.recorded_loc.signal_loc || !firemission_envelope.recorded_loc.signal_loc:loc)) firemission_envelope.recorded_loc = null - firemission_signal = firemission_envelope.recorded_loc?firemission_envelope.recorded_loc.get_name() : "NOT SELECTED" - if(!fm_direction) - fm_direction = "NOT SELECTED" - - if(screen_mode != 3 || !selected_firemission || shuttle_state != "in_transit") - update_location(null) - // /if(firemission_envelope) - - data = list( - "shuttle_state" = shuttle_state, - "fire_mission_enabled" = dropship.in_flyby, - "equipment_data" = equipment_data, - "targets_data" = targets_data, - "selected_eqp" = selected_eqp_name, - "selected_eqp_ammo_name" = selected_eqp_ammo_name, - "selected_eqp_ammo_amt" = selected_eqp_ammo_amt, - "selected_eqp_max_ammo_amt" = selected_eqp_max_ammo_amt, - "screen_mode" = screen_mode, - "firemission_data" = firemission_data, - "editing_firemission" = editing_firemission, - "editing_firemission_length" = fm_length, - "firemission_edit_data" = firemission_edit_data, - "current_mission_error" = current_mission_error, - "firemission_edit_timeslices" = firemission_edit_timeslices, - "has_firemission" = !!firemission_envelope, - "can_firemission" = !!selected_firemission && shuttle_state == "in_transit", - "can_launch_firemission" = !!selected_firemission && shuttle_state == "in_transit" && firemission_stat != FIRE_MISSION_STATE_IDLE, - //firemission related stuff - "firemission_name" = (selected_firemission ? selected_firemission.name : ""), - "firemission_selected_laser" = firemission_signal, - "firemission_offset" = fm_offset, - "firemission_direction" = fm_direction, - "firemission_message" = fm_step_text, - "firemission_step" = firemission_stat, - ) + if(screen_mode != 3 || !selected_firemission || dropship.mode != SHUTTLE_CALL) + update_location(user, null) - ui = SSnano.nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui_data(user) + if(!tacmap.map_holder) + var/level = SSmapping.levels_by_trait(tacmap.targeted_ztrait) + tacmap.map_holder = SSminimaps.fetch_tacmap_datum(level[1], tacmap.allowed_flags) + user.client.register_map_obj(tacmap.map_holder.map) + tgui_interact(user) + +/obj/structure/machinery/computer/dropship_weapons/tgui_interact(mob/user, datum/tgui/ui) + if(!registered) + var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttle_tag) + RegisterSignal(dropship, COMSIG_DROPSHIP_ADD_EQUIPMENT, PROC_REF(equipment_update)) + RegisterSignal(dropship, COMSIG_DROPSHIP_REMOVE_EQUIPMENT, PROC_REF(equipment_update)) + registered=TRUE + ui = SStgui.try_update_ui(user, src, ui) if (!ui) - ui = new(user, src, ui_key, "dropship_weapons_console.tmpl", "Weapons Control", 800, 600) - ui.set_initial_data(data) + SEND_SIGNAL(src, COMSIG_CAMERA_REGISTER_UI, user) + ui = new(user, src, "DropshipWeaponsConsole", "Weapons Console") ui.open() - ui.set_auto_update(1) -/obj/structure/machinery/computer/dropship_weapons/Topic(href, href_list) - if(..()) - return +/obj/structure/machinery/computer/dropship_weapons/ui_close(mob/user) + . = ..() + SEND_SIGNAL(src, COMSIG_CAMERA_UNREGISTER_UI, user) + if(simulation.looking_at_simulation) + simulation.stop_watching(user) + +/obj/structure/machinery/computer/dropship_weapons/ui_status(mob/user, datum/ui_state/state) + . = ..() + if(inoperable()) + return UI_CLOSE + if(!faction) + return UI_CLOSE + + var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] + if(!cas_group) + return UI_CLOSE + +/obj/structure/machinery/computer/dropship_weapons/ui_state(mob/user) + return GLOB.not_incapacitated_and_adjacent_strict_state - add_fingerprint(usr) +/obj/structure/machinery/computer/dropship_weapons/ui_static_data(mob/user) + . = list() + .["tactical_map_ref"] = tacmap.map_holder.map_ref + .["camera_map_ref"] = camera_map_name +/obj/structure/machinery/computer/dropship_weapons/ui_data(mob/user) + . = list() var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttle_tag) if (!istype(dropship)) return - if(href_list["equip_interact"]) - var/base_tag = text2num(href_list["equip_interact"]) - var/obj/structure/dropship_equipment/E = shuttle_equipments[base_tag] - E.linked_console = src - E.equipment_interact(usr) - - if(href_list["open_fire"]) - var/targ_id = text2num(href_list["open_fire"]) - var/mob/M = usr - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.allow_gun_usage) - to_chat(H, SPAN_WARNING("Your programming prevents you from operating dropship weaponry!")) - return - var/obj/structure/dropship_equipment/weapon/DEW = selected_equipment - if(!selected_equipment || !selected_equipment.is_weapon) - to_chat(usr, SPAN_WARNING("No weapon selected.")) - return - if(!skillcheck(M, SKILL_PILOT, DEW.skill_required)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("You don't have the training to fire this weapon!")) - return + var/datum/cas_signal/sig = get_cas_signal(camera_target_id) + if(camera_target_id && !sig) + set_camera_target(null) - if(!faction) - return //no faction, no weapons - - var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] - - if(!cas_group) - return //broken group. No fighting - - for(var/X in cas_group.cas_signals) - var/datum/cas_signal/LT = X - if(LT.target_id == targ_id && LT.valid_signal()) - if(dropship.mode != SHUTTLE_CALL) - to_chat(usr, SPAN_WARNING("Dropship can only fire while in flight.")) - return - if(dropship.door_override) - return - if(!selected_equipment || !selected_equipment.is_weapon) - to_chat(usr, SPAN_WARNING("No weapon selected.")) - return - DEW = selected_equipment // for if the weapon somehow changes - if(!skillcheck(M, SKILL_PILOT, DEW.skill_required)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("You don't have the training to fire this weapon!")) - return - if(!dropship.in_flyby && DEW.fire_mission_only) - to_chat(usr, SPAN_WARNING("[DEW] requires a fire mission flight type to be fired.")) - return - - if(!DEW.ammo_equipped || DEW.ammo_equipped.ammo_count <= 0) - to_chat(usr, SPAN_WARNING("[DEW] has no ammo.")) - return - if(DEW.last_fired > world.time - DEW.firing_delay) - to_chat(usr, SPAN_WARNING("[DEW] just fired, wait for it to cool down.")) - return - if(!LT.signal_loc) - return - var/turf/TU = get_turf(LT.signal_loc) - var/area/targ_area = get_area(LT.signal_loc) - var/is_outside = FALSE - if(is_ground_level(TU.z)) - switch(targ_area.ceiling) - if(CEILING_NONE) - is_outside = TRUE - if(CEILING_GLASS) - is_outside = TRUE - if(!is_outside && !cavebreaker) //cavebreaker doesn't care - to_chat(usr, SPAN_WARNING("INVALID TARGET: target must be visible from high altitude.")) - return - if (protected_by_pylon(TURF_PROTECTION_CAS, TU)) - to_chat(usr, SPAN_WARNING("INVALID TARGET: biological-pattern interference with signal.")) - return - if(!DEW.ammo_equipped.can_fire_at(TU, usr)) - return - - DEW.open_fire(LT.signal_loc) - break - - if(href_list["deselect"]) - var/mob/M = usr - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - selected_equipment = null + .["screen_mode"] = get_screen_mode() - if(href_list["create_mission"]) - var/mob/M = usr - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - if(firemission_envelope.max_mission_len <= firemission_envelope.missions.len) - to_chat(usr, SPAN_WARNING("Cannot store more than [firemission_envelope.max_mission_len] Fire Missions.")) - return - var/fm_name = stripped_input(usr, "", "Enter Fire Mission Name", "Fire Mission [firemission_envelope.missions.len+1]", 50) - if(!fm_name || length(fm_name) < 5) - to_chat(usr, SPAN_WARNING("Name too short (at least 5 symbols).")) - return - var/fm_length = stripped_input(usr, "Enter length of the Fire Mission. Has to be less than [firemission_envelope.fire_length]. Use something that divides [firemission_envelope.fire_length] for optimal performance.", "Fire Mission Length (in tiles)", "[firemission_envelope.fire_length]", 5) - var/fm_length_n = text2num(fm_length) - if(!fm_length_n) - to_chat(usr, SPAN_WARNING("Incorrect input format.")) - return - if(fm_length_n > firemission_envelope.fire_length) - to_chat(usr, SPAN_WARNING("Fire Mission is longer than allowed by this vehicle.")) - return - if(firemission_envelope.stat != FIRE_MISSION_STATE_IDLE) - to_chat(usr, SPAN_WARNING("Vehicle has to be idle to allow Fire Mission editing and creation.")) - return - //everything seems to be fine now - firemission_envelope.generate_mission(fm_name, fm_length_n) - - if(href_list["mission_tag_delete"]) - var/ref = text2num(href_list["mission_tag_delete"]) - var/mob/M = usr - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - if(ref>firemission_envelope.missions.len) - to_chat(usr, SPAN_WARNING("Fire Mission ID corrupted or already deleted.")) - return - if(selected_firemission == firemission_envelope.missions[ref]) - to_chat(usr, SPAN_WARNING("Can't delete selected Fire Mission.")) - return - var/result = firemission_envelope.delete_firemission(ref) - if(result != 1) - to_chat(usr, SPAN_WARNING("Unable to delete Fire Mission while in combat.")) - return + // dropship info + .["shuttle_state"] = dropship.mode + .["fire_mission_enabled"] = dropship.in_flyby - if(href_list["mission_tag"]) - var/ref = text2num(href_list["mission_tag"]) - var/mob/M = usr - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - if(ref>firemission_envelope.missions.len) - to_chat(usr, SPAN_WARNING("Fire Mission ID corrupted or deleted.")) - return - if(firemission_envelope.stat > FIRE_MISSION_STATE_IN_TRANSIT && firemission_envelope.stat < FIRE_MISSION_STATE_COOLDOWN) - to_chat(usr, SPAN_WARNING("Fire Mission already underway.")) - return - if(selected_firemission == firemission_envelope.missions[ref]) - selected_firemission = null - else - selected_firemission = firemission_envelope.missions[ref] + // equipment info + .["equipment_data"] = get_sanitised_equipment(user, dropship) - if(href_list["mission_tag_edit"]) - var/ref = text2num(href_list["mission_tag_edit"]) - var/mob/M = usr - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - if(ref>firemission_envelope.missions.len) - to_chat(usr, SPAN_WARNING("Fire Mission ID corrupted or deleted.")) - return - if(selected_firemission == firemission_envelope.missions[ref]) - to_chat(usr, SPAN_WARNING("Can't edit selected Fire Mission.")) - return - if(firemission_envelope.stat > FIRE_MISSION_STATE_IN_TRANSIT && firemission_envelope.stat < FIRE_MISSION_STATE_COOLDOWN) - to_chat(usr, SPAN_WARNING("Fire Mission already underway.")) - return - editing_firemission = firemission_envelope.missions[ref] + // medevac targets + .["medevac_targets"] = list() + for(var/obj/structure/dropship_equipment/equipment as anything in dropship.equipments) + if (istype(equipment, /obj/structure/dropship_equipment/medevac_system)) + var/obj/structure/dropship_equipment/medevac_system/medevac = equipment + .["medevac_targets"] += medevac.ui_data(user) + // fultons - if(href_list["leave_firemission_editing"]) - editing_firemission = null + .["fulton_targets"] = list() + for(var/obj/structure/dropship_equipment/equipment as anything in dropship.equipments) + if (istype(equipment, /obj/structure/dropship_equipment/fulton_system)) + var/obj/structure/dropship_equipment/fulton_system/fult = equipment + .["fulton_targets"] += fult.ui_data(user) - if(href_list["switch_to_firemission"]) - var/mob/M = usr - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - in_firemission_mode = TRUE + .["targets_data"] = get_targets() + .["camera_target"] = camera_target_id - if(href_list["switch_to_simulation"]) - if(!selected_firemission) - to_chat(usr, SPAN_WARNING("Select a firemission before attempting to run the simulation")) - return + if(selected_equipment) + .["selected_eqp"] = selected_equipment.ship_base.attach_id + if(selected_equipment.ammo_equipped) + var/obj/structure/ship_ammo/ammo_equipped = selected_equipment.ammo_equipped + .["selected_eqp_ammo_name"] = sanitize(copytext(ammo_equipped.name, 1, MAX_MESSAGE_LEN)) + .["selected_eqp_ammo_amt"] = ammo_equipped.ammo_count + .["selected_eqp_max_ammo_amt"] = ammo_equipped.max_ammo_count + + // firemission info + .["has_firemission"] = !!firemission_envelope + .["can_firemission"] = !!selected_firemission && dropship.mode == SHUTTLE_CALL + if(editing_firemission) + .["editing_firemission"] = editing_firemission + .["editing_firemission_length"] = editing_firemission ? editing_firemission.mission_length : 0 + var/error_code = editing_firemission.check(src) + .["current_mission_error"] = error_code != FIRE_MISSION_ALL_GOOD ? editing_firemission.error_message(error_code) : null + .["firemission_edit_data"] = get_edit_firemission_data() - configuration = selected_firemission + if(firemission_envelope) + .["can_launch_firemission"] = !!selected_firemission && dropship.mode == SHUTTLE_CALL && firemission_envelope.stat != FIRE_MISSION_STATE_IDLE + .["firemission_data"] = get_firemission_data(user) + .["firemission_state"] = firemission_envelope.stat + .["firemission_offset"] = firemission_envelope.recorded_offset + .["firemission_message"] = firemission_envelope.firemission_status_message() + .["firemission_name"] = selected_firemission ? selected_firemission.name : "" + .["firemission_step"] = firemission_envelope.stat + .["firemission_selected_laser"] = firemission_envelope.recorded_loc ? firemission_envelope.recorded_loc.get_name() : "NOT SELECTED" + + .["configuration"] = configuration + .["looking"] = simulation.looking_at_simulation + .["dummy_mode"] = simulation.dummy_mode + .["worldtime"] = world.time + .["nextdetonationtime"] = simulation.detonation_cooldown + .["detonation_cooldown"] = simulation.detonation_cooldown_time - // simulation mode - tgui_interact(usr) +/obj/structure/machinery/computer/dropship_weapons/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + var/obj/docking_port/mobile/marine_dropship/shuttle = SSshuttle.getShuttle(shuttle_tag) + if(shuttle.is_hijacked) + return - if(href_list["leave_firemission_execution"]) - var/mob/M = usr - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - firemission_envelope.remove_user_from_tracking(usr) - in_firemission_mode = FALSE + var/mob/user = ui.user + switch(action) + if("button_push") + playsound(src, get_sfx("terminal_button"), 25, FALSE) + return TRUE - if(href_list["change_direction"]) - var/mob/M = usr - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - var/list/directions = list(dir2text(NORTH), dir2text(SOUTH), dir2text(EAST), dir2text(WEST)) - var/chosen = tgui_input_list(usr, "Select new Direction for the strafing run", "Select Direction", directions) + if("select_equipment") + var/base_tag = params["equipment_id"] + ui_equip_interact(user, base_tag) + return TRUE - var/chosen_dir = text2dir(chosen) - if(!chosen_dir) - to_chat(usr, SPAN_WARNING("Error with direction detected.")) - return + if("start_watching") + simulation.start_watching(user) + . = TRUE - update_direction(chosen_dir) + if("stop_watching") + simulation.stop_watching(user) + . = TRUE - if(href_list["change_offset"]) - var/mob/M = usr - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return + if("execute_simulated_firemission") + if(!configuration) + to_chat(user, SPAN_WARNING("No configured firemission")) + return + simulate_firemission(user) + . = TRUE - var/chosen = stripped_input(usr, "Select Fire Mission length, from 0 to [firemission_envelope.max_offset]", "Select Offset", "[firemission_envelope.recorded_offset]", 2) - var/chosen_offset = text2num(chosen) + if("switch_firemission") + configuration = tgui_input_list(user, "Select firemission to simulate", "Select firemission", firemission_envelope.missions, 30 SECONDS) + if(!selected_firemission) + to_chat(user, SPAN_WARNING("No configured firemission")) + return + if(!configuration) + configuration = selected_firemission + . = TRUE - if(chosen_offset == null) - to_chat(usr, SPAN_WARNING("Error with offset detected.")) - return + if("switchmode") + simulation.dummy_mode = tgui_input_list(user, "Select target type to simulate", "Target type", simulation.target_types, 30 SECONDS) + if(!simulation.dummy_mode) + simulation.dummy_mode = CLF_MODE + . = TRUE - update_offset(chosen_offset) + if("set-camera") + var/target_camera = params["equipment_id"] + set_camera_target(target_camera) + return TRUE + + if("set-camera-sentry") + var/equipment_tag = params["equipment_id"] + for(var/obj/structure/dropship_equipment/equipment as anything in shuttle.equipments) + var/mount_point = equipment.ship_base.attach_id + if(mount_point != equipment_tag) + continue + if (istype(equipment, /obj/structure/dropship_equipment/sentry_holder)) + var/obj/structure/dropship_equipment/sentry_holder/sentry = equipment + var/obj/structure/machinery/defenses/sentry/defense = sentry.deployed_turret + if (defense.has_camera) + defense.set_range() + var/datum/shape/rectangle/current_bb = defense.range_bounds + SEND_SIGNAL(src, COMSIG_CAMERA_SET_AREA, current_bb.center_x, current_bb.center_y, defense.loc.z, current_bb.width, current_bb.height) + return TRUE + + if("clear-camera") + set_camera_target(null) + return TRUE + + if("medevac-target") + var/equipment_tag = params["equipment_id"] + for(var/obj/structure/dropship_equipment/equipment as anything in shuttle.equipments) + var/mount_point = equipment.ship_base.attach_id + if(mount_point != equipment_tag) + continue + if (istype(equipment, /obj/structure/dropship_equipment/medevac_system)) + var/obj/structure/dropship_equipment/medevac_system/medevac = equipment + var/target_ref = params["ref"] + medevac.automate_interact(user, target_ref) + if(medevac.linked_stretcher) + SEND_SIGNAL(src, COMSIG_CAMERA_SET_TARGET, medevac.linked_stretcher, 5, 5) + return TRUE + if("fulton-target") + var/equipment_tag = params["equipment_id"] + for(var/obj/structure/dropship_equipment/equipment as anything in shuttle.equipments) + var/mount_point = equipment.ship_base.attach_id + if(mount_point != equipment_tag) + continue + if (istype(equipment, /obj/structure/dropship_equipment/fulton_system)) + var/obj/structure/dropship_equipment/fulton_system/fulton = equipment + var/target_ref = params["ref"] + fulton.automate_interact(user, target_ref) + return TRUE + if("fire-weapon") + var/weapon_tag = params["eqp_tag"] + var/obj/structure/dropship_equipment/weapon/DEW = get_weapon(weapon_tag) + if(!DEW) + return FALSE + + var/datum/cas_signal/sig = get_cas_signal(camera_target_id) + + if(!sig) + return FALSE + + selected_equipment = DEW + ui_open_fire(user, shuttle, camera_target_id) + return TRUE + if("deploy-equipment") + var/equipment_tag = params["equipment_id"] + for(var/obj/structure/dropship_equipment/equipment as anything in shuttle.equipments) + var/mount_point = equipment.ship_base.attach_id + if(mount_point != equipment_tag) + continue + equipment.equipment_interact(user) + return TRUE + + if("firemission-create") + var/name = params["firemission_name"] + var/length = params["firemission_length"] + var/length_n = text2num(length) + if(!length_n) + to_chat(user, SPAN_WARNING("Incorrect input format.")) + return FALSE + ui_create_firemission(user, name, length_n) + return TRUE + + if("firemission-delete") + var/name = params["firemission_name"] + ui_delete_firemission(user, name) + return TRUE + + if("firemission-dual-offset-camera") + var/target_id = params["target_id"] + + var/x_offset_value = params["x_offset_value"] + var/y_offset_value = params["y_offset_value"] + + var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] + var/datum/cas_signal/cas_sig + for(var/X in cas_group.cas_signals) + var/datum/cas_signal/LT = X + if(LT.target_id == target_id && LT.valid_signal()) + cas_sig = LT + break + // we don't want rapid offset changes to trigger admin warnings + // and block the user from accessing TGUI + // we change the minute_count + user.client.reduce_minute_count() + if(!cas_sig) + return TRUE + + // find position of cas_sig with offset dir and value applied + var/dx = text2num(x_offset_value) + var/dy = text2num(y_offset_value) + + var/obj/current = cas_sig.signal_loc + var/obj/new_target = locate( + current.x + dx, + current.y + dy, + current.z) + + firemission_envelope.change_current_loc(new_target) + + return TRUE + if("nvg-enable") + SEND_SIGNAL(src, COMSIG_CAMERA_SET_NVG, 5, "#7aff7a") + return TRUE + if("nvg-disable") + SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR_NVG) + return TRUE + + if("firemission-edit") + var/fm_tag = text2num(params["tag"]) + var/weapon_id = text2num(params["weapon_id"]) + var/offset_id = text2num(params["offset_id"]) + var/offset_value = text2num(params["offset_value"]) + return ui_firemission_change_offset(user, fm_tag, weapon_id, offset_id + 1, offset_value) + + if("firemission-execute") + var/fm_tag = text2num(params["tag"]) + var/direction = params["direction"] + var/target_id = params["target_id"] + var/offset_x_value = params["offset_x_value"] + var/offset_y_value = params["offset_y_value"] + + if(!ui_select_firemission(user, fm_tag)) + playsound(src, 'sound/machines/terminal_error.ogg', 5, 1) + return FALSE + if(!update_direction(user, text2num(direction))) + playsound(src, 'sound/machines/terminal_error.ogg', 5, 1) + return FALSE + if(!ui_select_laser_firemission(user, shuttle, target_id)) + playsound(src, 'sound/machines/terminal_error.ogg', 5, 1) + return FALSE + + initiate_firemission(user, fm_tag, direction, text2num(offset_x_value), text2num(offset_y_value)) + return TRUE + +/obj/structure/machinery/computer/dropship_weapons/proc/get_weapon(eqp_tag) + var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttle_tag) + for(var/obj/structure/dropship_equipment/equipment in dropship.equipments) + if(istype(equipment, /obj/structure/dropship_equipment/weapon)) + //is weapon + if(selected_equipment == equipment) + return equipment + return + +/obj/structure/machinery/computer/dropship_weapons/proc/get_cas_signal(target_ref) + if(!target_ref) + return - if(href_list["select_laser_firemission"]) - var/mob/M = usr - var/targ_id = text2num(href_list["select_laser_firemission"]) - if(!targ_id) - to_chat(usr, SPAN_WARNING("Bad Target.")) - return - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - if(firemission_envelope.stat > FIRE_MISSION_STATE_IN_TRANSIT && firemission_envelope.stat < FIRE_MISSION_STATE_COOLDOWN) - to_chat(usr, SPAN_WARNING("Fire Mission already underway.")) - return - if(dropship.mode != SHUTTLE_CALL) - to_chat(usr, SPAN_WARNING("Shuttle has to be in orbit.")) - return - var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] - var/datum/cas_signal/cas_sig - for(var/X in cas_group.cas_signals) - var/datum/cas_signal/LT = X - if(LT.target_id == targ_id && LT.valid_signal()) - cas_sig = LT - if(!cas_sig) - to_chat(usr, SPAN_WARNING("Target lost or obstructed.")) - return + var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] + for(var/datum/cas_signal/sig in cas_group.cas_signals) + if(sig.target_id == target_ref) + return sig - update_location(cas_sig) - if(href_list["execute_firemission"]) - var/mob/M = usr - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(!H.allow_gun_usage) - to_chat(H, SPAN_WARNING("Your programming prevents you from operating dropship weaponry!")) - return - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - if(firemission_envelope.stat != FIRE_MISSION_STATE_IDLE) - to_chat(usr, SPAN_WARNING("Fire Mission already underway.")) - return - if(dropship.mode != SHUTTLE_CALL) - to_chat(usr, SPAN_WARNING("Shuttle has to be in orbit.")) - return - if(!firemission_envelope.recorded_loc) - to_chat(usr, SPAN_WARNING("Target is not selected or lost.")) - return +/obj/structure/machinery/computer/dropship_weapons/proc/set_camera_target(target_ref) + var/datum/cas_signal/target = get_cas_signal(target_ref) + camera_target_id = target_ref + if(!target) + SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR) + return - initiate_firemission() + var/cam_width = camera_width + var/cam_height = camera_height + if(upgraded == MATRIX_WIDE) + cam_width = cam_width * 1.5 + cam_height = cam_height * 1.5 - if(href_list["fm_weapon_id"]) - var/weap_ref = text2num(href_list["fm_weapon_id"])+1 - var/offset_ref = text2num(href_list["fm_offset_id"])+1 - var/mob/M = usr - if(!skillcheck(M, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. - to_chat(usr, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) - return - if(!editing_firemission) - to_chat(usr, SPAN_WARNING("You are no longer editing Fire Mission.")) - return - if(!editing_firemission.records || editing_firemission.records.len FIRE_MISSION_STATE_IN_TRANSIT && firemission_envelope.stat < FIRE_MISSION_STATE_COOLDOWN) - to_chat(usr, SPAN_WARNING("Fire Mission already underway.")) - return - var/list/gimb = record.get_offsets() - var/min = gimb["min"] - var/max = gimb["max"] - var/offset_value = stripped_input(usr, "Enter offset for the [record.weapon.name]. It has to be between [min] and [max]. Enter '-' to remove fire order on this time stamp.", "Firing offset", "[record.offsets[offset_ref]]", 2) - if(offset_value == null) - return - if(offset_value == "-") - offset_value = "-" - else - offset_value = text2num(offset_value) - if(offset_value == null) - to_chat(usr, SPAN_WARNING("Incorrect offset value.")) - return - var/result = firemission_envelope.update_mission(firemission_envelope.missions.Find(editing_firemission), weap_ref, offset_ref, offset_value, TRUE) - if(result == 0) - to_chat(usr, SPAN_WARNING("Update caused an error: [firemission_envelope.mission_error]")) - if(result == -1) - to_chat(usr, SPAN_WARNING("System Error. Delete this Fire Mission.")) - - if(href_list["firemission_camera"]) - if(dropship.mode != SHUTTLE_CALL) - to_chat(usr, SPAN_WARNING("Shuttle has to be in orbit.")) - return + SEND_SIGNAL(src, COMSIG_CAMERA_SET_TARGET, target.linked_cam, cam_width, cam_height) - if(!firemission_envelope.guidance) - to_chat(usr, SPAN_WARNING("Guidance is not selected or lost.")) - return +/obj/structure/machinery/computer/dropship_weapons/proc/get_screen_mode() + . = 0 + if(selected_equipment) + . = selected_equipment.screen_mode + if(editing_firemission && editing_firemission.check(src) != FIRE_MISSION_CODE_ERROR) + . = 2 + if(selected_firemission && in_firemission_mode) + . = 3 +/obj/structure/machinery/computer/dropship_weapons/proc/get_firemission_data(mob/user) + . = list() + var/firemission_id = 1 + for(var/datum/cas_fire_mission/firemission in firemission_envelope.missions) + var/error_code = firemission.check(src) - firemission_envelope.add_user_to_tracking(usr) + var/selected = firemission == selected_firemission + var/can_edit = error_code != FIRE_MISSION_CODE_ERROR && !selected - to_chat(usr, "You peek through the guidance camera.") + var/can_interact = firemission_envelope.stat == FIRE_MISSION_STATE_IDLE && error_code == FIRE_MISSION_ALL_GOOD + var/list/fm_data = firemission.ui_data(user) + fm_data["mission_tag"] = firemission_id + fm_data["can_edit"] = can_edit + fm_data["can_interact"] = can_interact + fm_data["selected"] = selected + . += list(fm_data) - if(href_list["cas_camera"]) - if(!ishuman(usr)) - to_chat(usr, SPAN_WARNING("You have no idea how to do that!")) - return - if(dropship.mode != SHUTTLE_CALL) - to_chat(usr, SPAN_WARNING("Shuttle has to be in orbit.")) - return + firemission_id++ - if(!faction) - to_chat(usr, SPAN_DANGER("Bug encountered, this console doesn't have a faction set, report this to a coder!")) - return +/obj/structure/machinery/computer/dropship_weapons/proc/get_edit_firemission_data() + . = list() + if(!editing_firemission) + return + for(var/datum/cas_fire_mission_record/firerec as anything in editing_firemission.records) + var/gimbal = firerec.get_offsets() + var/ammo = firerec.get_ammo() + var/offsets = new /list(firerec.offsets.len) + for(var/idx = 1; idx < firerec.offsets.len; idx++) + offsets[idx] = firerec.offsets[idx] == null ? "-" : firerec.offsets[idx] + . += list( + "name" = sanitize(copytext(firerec.weapon.name, 1, 50)), + "ammo" = ammo, + "gimbal" = gimbal, + "offsets" = firerec.offsets + ) + +/obj/structure/machinery/computer/dropship_weapons/proc/get_sanitised_equipment(mob/user, obj/docking_port/mobile/marine_dropship/dropship) + . = list() + var/element_nbr = 1 + for(var/obj/structure/dropship_equipment/equipment in dropship.equipments) + var/list/data = list( + "name"= equipment.name, + "shorthand" = equipment.shorthand, + "eqp_tag" = element_nbr, + "is_weapon" = equipment.is_weapon, + "is_interactable" = equipment.is_interactable, + "mount_point" = equipment.ship_base.attach_id, + "is_missile" = istype(equipment, /obj/structure/dropship_equipment/weapon/rocket_pod), + "ammo_name" = equipment.ammo_equipped?.name, + "ammo" = equipment.ammo_equipped?.ammo_count, + "max_ammo" = equipment.ammo_equipped?.max_ammo_count, + "firemission_delay" = equipment.ammo_equipped?.fire_mission_delay, + "burst" = equipment.ammo_equipped?.ammo_used_per_firing, + "data" = equipment.ui_data(user) + ) + + . += list(data) - var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] - if(!cas_group) - to_chat(usr, SPAN_DANGER("Bug encountered, no CAS group exists for this console, report this to a coder!")) - return + element_nbr++ + equipment.linked_console = src - var/targ_id = text2num(href_list["cas_camera"]) - var/datum/cas_signal/new_signal - for(var/datum/cas_signal/LT as anything in cas_group.cas_signals) - if(LT.target_id == targ_id && LT.valid_signal()) - new_signal = LT - break +/obj/structure/machinery/computer/dropship_weapons/proc/get_targets() + . = list() + var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] + for(var/datum/cas_signal/LT as anything in cas_group.cas_signals) + if(!istype(LT) || !LT.valid_signal()) + continue + var/area/laser_area = get_area(LT.signal_loc) + . += list( + list( + "target_name" = "[LT.name] ([laser_area.name])", + "target_tag" = LT.target_id + ) + ) + +/obj/structure/machinery/computer/dropship_weapons/proc/ui_equip_interact(mob/user, base_tag) + var/obj/docking_port/mobile/marine_dropship/shuttle = SSshuttle.getShuttle(shuttle_tag) + var/obj/structure/dropship_equipment/E = shuttle.equipments[base_tag] + E.linked_console = src + E.equipment_interact(user) + +/obj/structure/machinery/computer/dropship_weapons/proc/ui_open_fire(mob/weapon_operator, obj/docking_port/mobile/marine_dropship/dropship, targ_id) + if(ishuman(weapon_operator)) + var/mob/living/carbon/human/human_operator = weapon_operator + if(!human_operator.allow_gun_usage) + to_chat(human_operator, SPAN_WARNING("Your programming prevents you from operating dropship weaponry!")) + return FALSE + var/obj/structure/dropship_equipment/weapon/DEW = selected_equipment + if(!selected_equipment || !selected_equipment.is_weapon) + to_chat(weapon_operator, SPAN_WARNING("No weapon selected.")) + return FALSE + if(!skillcheck(weapon_operator, SKILL_PILOT, DEW.skill_required)) //only pilots can fire dropship weapons. + to_chat(weapon_operator, SPAN_WARNING("You don't have the training to fire this weapon!")) + return FALSE + if(dropship.mode != SHUTTLE_CALL) + to_chat(weapon_operator, SPAN_WARNING("Dropship can only fire while in flight.")) + return FALSE + if(!faction) + return FALSE//no faction, no weapons + if(!selected_equipment || !selected_equipment.is_weapon) + to_chat(weapon_operator, SPAN_WARNING("No weapon selected.")) + return FALSE + if(dropship.door_override) + return FALSE + if(!skillcheck(weapon_operator, SKILL_PILOT, DEW.skill_required)) //only pilots can fire dropship weapons. + to_chat(weapon_operator, SPAN_WARNING("You don't have the training to fire this weapon!")) + return FALSE + if(!dropship.in_flyby && DEW.fire_mission_only) + to_chat(weapon_operator, SPAN_WARNING("[DEW] requires a fire mission flight type to be fired.")) + return FALSE + + if(!DEW.ammo_equipped || DEW.ammo_equipped.ammo_count <= 0) + to_chat(weapon_operator, SPAN_WARNING("[DEW] has no ammo.")) + return FALSE + if(DEW.last_fired > world.time - DEW.firing_delay) + to_chat(weapon_operator, SPAN_WARNING("[DEW] just fired, wait for it to cool down.")) + return FALSE - if(!new_signal) - to_chat(usr, SPAN_WARNING("Target lost or obstructed.")) - return + var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] - if(usr in selected_cas_signal?.linked_cam?.viewing_users) // Reset previous cam - remove_from_view(usr) + if(!cas_group) + return FALSE//broken group. No fighting - selected_cas_signal = new_signal - if(selected_cas_signal && selected_cas_signal.linked_cam) - selected_cas_signal.linked_cam.view_directly(usr) - else - to_chat(usr, SPAN_WARNING("Error!")) - return - give_action(usr, /datum/action/human_action/cancel_view) - RegisterSignal(usr, COMSIG_MOB_RESET_VIEW, PROC_REF(remove_from_view)) - RegisterSignal(usr, COMSIG_MOB_RESISTED, PROC_REF(remove_from_view)) - firemission_envelope.apply_upgrade(usr) - to_chat(usr, SPAN_NOTICE("You peek through the guidance camera.")) - - ui_interact(usr) - -/obj/structure/machinery/computer/dropship_weapons/proc/remove_from_view(mob/living/carbon/human/user) - UnregisterSignal(user, COMSIG_MOB_RESET_VIEW) - UnregisterSignal(user, COMSIG_MOB_RESISTED) - if(selected_cas_signal && selected_cas_signal.linked_cam) - selected_cas_signal.linked_cam.remove_from_view(user) - firemission_envelope.remove_upgrades(user) - -/obj/structure/machinery/computer/dropship_weapons/proc/initiate_firemission() + for(var/datum/cas_signal/LT in cas_group.cas_signals) + if(LT.target_id != targ_id || !LT.valid_signal()) + continue + if(!LT.signal_loc) + return FALSE + var/turf/TU = get_turf(LT.signal_loc) + var/area/targ_area = get_area(LT.signal_loc) + var/is_outside = FALSE + if(is_ground_level(TU.z)) + switch(targ_area.ceiling) + if(CEILING_NONE) + is_outside = TRUE + if(CEILING_GLASS) + is_outside = TRUE + if(!is_outside && !cavebreaker) //cavebreaker doesn't care + to_chat(weapon_operator, SPAN_WARNING("INVALID TARGET: target must be visible from high altitude.")) + return FALSE + if (protected_by_pylon(TURF_PROTECTION_CAS, TU)) + to_chat(weapon_operator, SPAN_WARNING("INVALID TARGET: biological-pattern interference with signal.")) + return FALSE + if(!DEW.ammo_equipped.can_fire_at(TU, weapon_operator)) + return FALSE + + DEW.open_fire(LT.signal_loc) + return TRUE + return FALSE + +/obj/structure/machinery/computer/dropship_weapons/proc/ui_create_firemission(mob/weapon_operator, firemission_name, firemission_length) + if(!skillcheck(weapon_operator, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. + to_chat(weapon_operator, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) + return FALSE + // Check name + if(!firemission_name || length(firemission_name) < 1) + to_chat(weapon_operator, SPAN_WARNING("Name too short (at least 1 symbols).")) + return FALSE + // Check length + if(!firemission_length) + to_chat(weapon_operator, SPAN_WARNING("Incorrect input format.")) + return FALSE + if(firemission_length > firemission_envelope.fire_length) + to_chat(weapon_operator, SPAN_WARNING("Fire Mission is longer than allowed by this vehicle.")) + return FALSE + if(firemission_envelope.stat != FIRE_MISSION_STATE_IDLE) + to_chat(weapon_operator, SPAN_WARNING("Vehicle has to be idle to allow Fire Mission editing and creation.")) + return FALSE + + for(var/datum/cas_fire_mission/mission in firemission_envelope.missions) + if(firemission_name == mission.name) + to_chat(weapon_operator, SPAN_WARNING("Fire Mission name must be unique.")) + return FALSE + //everything seems to be fine now + firemission_envelope.generate_mission(firemission_name, firemission_length) + return TRUE + +/obj/structure/machinery/computer/dropship_weapons/proc/ui_delete_firemission(mob/weapon_operator, firemission_tag) + if(!skillcheck(weapon_operator, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. + to_chat(weapon_operator, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) + return FALSE + if(firemission_tag > firemission_envelope.missions.len) + to_chat(weapon_operator, SPAN_WARNING("Fire Mission ID corrupted or already deleted.")) + return FALSE + if(selected_firemission == firemission_envelope.missions[firemission_tag]) + to_chat(weapon_operator, SPAN_WARNING("Can't delete selected Fire Mission.")) + return FALSE + var/result = firemission_envelope.delete_firemission(firemission_tag) + if(result != 1) + to_chat(weapon_operator, SPAN_WARNING("Unable to delete Fire Mission while in combat.")) + return FALSE + return TRUE + +/obj/structure/machinery/computer/dropship_weapons/proc/ui_select_firemission(mob/weapon_operator, firemission_tag) + if(!skillcheck(weapon_operator, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. + to_chat(weapon_operator, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) + return FALSE + if(firemission_envelope.stat > FIRE_MISSION_STATE_IN_TRANSIT && firemission_envelope.stat < FIRE_MISSION_STATE_COOLDOWN) + to_chat(weapon_operator, SPAN_WARNING("Fire Mission already underway.")) + return FALSE + if(firemission_tag > firemission_envelope.missions.len) + to_chat(weapon_operator, SPAN_WARNING("Fire Mission ID corrupted or deleted.")) + return FALSE + if(selected_firemission == firemission_envelope.missions[firemission_tag]) + selected_firemission = null + else + selected_firemission = firemission_envelope.missions[firemission_tag] + return TRUE + +/obj/structure/machinery/computer/dropship_weapons/proc/ui_firemission_change_offset(mob/weapons_operator, fm_tag, weapon_id, offset_id, offset_value) + if(!skillcheck(weapons_operator, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. + to_chat(weapons_operator, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) + return FALSE + + var/result = firemission_envelope.update_mission(fm_tag, weapon_id, offset_id, offset_value) + if(result != FIRE_MISSION_ALL_GOOD) + playsound(src, 'sound/machines/terminal_error.ogg', 5, 1) + return TRUE + +/obj/structure/machinery/computer/dropship_weapons/proc/ui_select_laser_firemission(mob/weapons_operator, obj/docking_port/mobile/marine_dropship/dropship, laser) + if(!laser) + to_chat(weapons_operator, SPAN_WARNING("Bad Target.")) + return FALSE + if(!skillcheck(weapons_operator, SKILL_PILOT, SKILL_PILOT_TRAINED)) //only pilots can fire dropship weapons. + to_chat(weapons_operator, SPAN_WARNING("A screen with graphics and walls of physics and engineering values open, you immediately force it closed.")) + return FALSE + if(firemission_envelope.stat > FIRE_MISSION_STATE_IN_TRANSIT && firemission_envelope.stat < FIRE_MISSION_STATE_COOLDOWN) + to_chat(weapons_operator, SPAN_WARNING("Fire Mission already underway.")) + return FALSE + if(dropship.mode != SHUTTLE_CALL) + to_chat(weapons_operator, SPAN_WARNING("Shuttle has to be in orbit.")) + return FALSE + var/datum/cas_iff_group/cas_group = GLOB.cas_groups[faction] + var/datum/cas_signal/cas_sig + for(var/X in cas_group.cas_signals) + var/datum/cas_signal/LT = X + if(LT.target_id == laser && LT.valid_signal()) + cas_sig = LT + if(!cas_sig) + to_chat(weapons_operator, SPAN_WARNING("Target lost or obstructed.")) + return FALSE + + update_location(weapons_operator, cas_sig) + return TRUE + +/obj/structure/machinery/computer/dropship_weapons/proc/initiate_firemission(mob/user, fmId, dir, offset_x, offset_y) set waitfor = 0 var/obj/docking_port/mobile/marine_dropship/dropship = SSshuttle.getShuttle(shuttle_tag) if (!istype(dropship)) - return - if (dropship.timer && dropship.timeLeft(1) < firemission_envelope.get_total_duration()) - to_chat(usr, "Not enough time to complete the Fire Mission") - return + return FALSE if (!dropship.in_flyby || dropship.mode != SHUTTLE_CALL) - to_chat(usr, "Has to be in Fly By mode") - return - - var/fmid = firemission_envelope.missions.Find(selected_firemission) - if(!fmid) - to_chat(usr, "No Firemission selected") - return - - var/result = firemission_envelope.execute_firemission(firemission_envelope.recorded_loc, firemission_envelope.recorded_offset, firemission_envelope.recorded_dir, fmid) - if(result<1) - to_chat(usr, "Screen beeps with an error: "+ firemission_envelope.mission_error) - else - update_trace_loc() - -/obj/structure/machinery/computer/dropship_weapons/proc/update_offset(new_offset) - var/result = firemission_envelope.change_offset(new_offset) - if(result<1) - to_chat(usr, "Screen beeps with an error: "+ firemission_envelope.mission_error) - else - update_trace_loc() + to_chat(user, SPAN_WARNING("Has to be in Fly By mode")) + return FALSE + if (dropship.timer && dropship.timeLeft(1) < firemission_envelope.get_total_duration()) + to_chat(user, SPAN_WARNING("Not enough time to complete the Fire Mission")) + return FALSE + var/datum/cas_signal/recorded_loc = firemission_envelope.recorded_loc + var/obj/source = recorded_loc.signal_loc + var/turf/target = locate( + source.x + offset_x, + source.y + offset_y, + source.z + ) + var/result = firemission_envelope.execute_firemission(recorded_loc, target, dir, fmId) + if(result != FIRE_MISSION_ALL_GOOD) + to_chat(user, SPAN_WARNING("Screen beeps with an error: [firemission_envelope.mission_error]")) + return TRUE -/obj/structure/machinery/computer/dropship_weapons/proc/update_location(new_location) +/obj/structure/machinery/computer/dropship_weapons/proc/update_location(mob/user, new_location) var/result = firemission_envelope.change_target_loc(new_location) if(result<1) - to_chat(usr, "Screen beeps with an error: "+ firemission_envelope.mission_error) - else - update_trace_loc() + to_chat(user, SPAN_WARNING("Screen beeps with an error: [firemission_envelope.mission_error]")) + return FALSE + return TRUE -/obj/structure/machinery/computer/dropship_weapons/proc/update_direction(new_direction) +/obj/structure/machinery/computer/dropship_weapons/proc/update_direction(mob/user, new_direction) var/result = firemission_envelope.change_direction(new_direction) if(result<1) - to_chat(usr, "Screen beeps with an error: " + firemission_envelope.mission_error) - else - update_trace_loc() - -/obj/structure/machinery/computer/dropship_weapons/on_unset_interaction(mob/user) - ..() - if(firemission_envelope && firemission_envelope.guidance) - firemission_envelope.remove_user_from_tracking(user) + to_chat(user, SPAN_WARNING("Screen beeps with an error: [firemission_envelope.mission_error]")) + return FALSE + return TRUE -/obj/structure/machinery/computer/dropship_weapons/proc/update_trace_loc() +/obj/structure/machinery/computer/dropship_weapons/proc/update_trace_loc(mob/user) if(!firemission_envelope) return if(firemission_envelope.recorded_loc == null || firemission_envelope.recorded_dir == null || firemission_envelope.recorded_offset == null) return if(firemission_envelope.recorded_loc.obstructed_signal()) - if(firemission_envelope.user_is_guided(usr)) - to_chat(usr, SPAN_WARNING("Signal Obstructed. You have to go in blind.")) + if(firemission_envelope.user_is_guided(user)) + to_chat(user, SPAN_WARNING("Signal Obstructed. You have to go in blind.")) return var/sx = 0 var/sy = 0 @@ -711,108 +805,29 @@ return var/area/laser_area = get_area(shootloc) if(!istype(laser_area) || CEILING_IS_PROTECTED(laser_area.ceiling, CEILING_PROTECTION_TIER_1)) - if(firemission_envelope.user_is_guided(usr)) - to_chat(usr, SPAN_WARNING("Vision Obstructed. You have to go in blind.")) + if(firemission_envelope.user_is_guided(user)) + to_chat(user, SPAN_WARNING("Vision Obstructed. You have to go in blind.")) firemission_envelope.change_current_loc() else firemission_envelope.change_current_loc(shootloc) + return TRUE /obj/structure/machinery/computer/dropship_weapons/dropship1 name = "\improper 'Alamo' weapons controls" req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP, ACCESS_WY_FLIGHT) firemission_envelope = new /datum/cas_fire_envelope/uscm_dropship() - -/obj/structure/machinery/computer/dropship_weapons/dropship1/New() - ..() shuttle_tag = DROPSHIP_ALAMO /obj/structure/machinery/computer/dropship_weapons/dropship2 name = "\improper 'Normandy' weapons controls" req_one_access = list(ACCESS_MARINE_LEADER, ACCESS_MARINE_DROPSHIP, ACCESS_WY_FLIGHT) firemission_envelope = new /datum/cas_fire_envelope/uscm_dropship() - -/obj/structure/machinery/computer/dropship_weapons/dropship2/New() - ..() shuttle_tag = DROPSHIP_NORMANDY /obj/structure/machinery/computer/dropship_weapons/Destroy() . = ..() - QDEL_NULL(firemission_envelope) - -// CAS TGUI SHIT \\ - -/obj/structure/machinery/computer/dropship_weapons/tgui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "CasSim", "[src.name]") - ui.open() - -/obj/structure/machinery/computer/dropship_weapons/ui_state(mob/user) // we gotta do custom shit here so that it always closes instead of suspending - return GLOB.not_incapacitated_and_adjacent_strict_state - -/obj/structure/machinery/computer/dropship_weapons/ui_status(mob/user, datum/ui_state/state) - . = ..() - if(inoperable()) - return UI_CLOSE - -/obj/structure/machinery/computer/dropship_weapons/ui_data(mob/user) - var/list/data = list() - - data["configuration"] = configuration - data["looking"] = simulation.looking_at_simulation - data["dummy_mode"] = simulation.dummy_mode - - data["worldtime"] = world.time - data["nextdetonationtime"] = simulation.detonation_cooldown - data["detonation_cooldown"] = simulation.detonation_cooldown_time - - return data - -/obj/structure/machinery/computer/dropship_weapons/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - var/user = ui.user - - switch(action) - if("start_watching") - simulation.start_watching(user) - . = TRUE - - if("stop_watching") - simulation.stop_watching(user) - . = TRUE - - if("execute_simulated_firemission") - if(!configuration) - to_chat(user, SPAN_WARNING("No configured firemission")) - return - simulate_firemission(user) - . = TRUE - - if("switch_firemission") - configuration = tgui_input_list(user, "Select firemission to simulate", "Select firemission", firemission_envelope.missions, 30 SECONDS) - if(!selected_firemission) - to_chat(user, SPAN_WARNING("No configured firemission")) - return - if(!configuration) - configuration = selected_firemission - . = TRUE - - if("switchmode") - simulation.dummy_mode = tgui_input_list(user, "Select target type to simulate", "Target type", simulation.target_types, 30 SECONDS) - if(!simulation.dummy_mode) - simulation.dummy_mode = CLF_MODE - . = TRUE - -/obj/structure/machinery/computer/dropship_weapons/ui_close(mob/user) - . = ..() - if(simulation.looking_at_simulation) - simulation.stop_watching(user) - -// CAS TGUI SHIT END \\ + QDEL_NULL(tacmap) /obj/structure/machinery/computer/dropship_weapons/proc/simulate_firemission(mob/living/user) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 34b0fb01e9d6..ee2c2bcee882 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -322,6 +322,7 @@ GLOBAL_LIST_EMPTY(activated_medevac_stretchers) base_bed_icon = "stretcher" accepts_bodybag = TRUE var/stretcher_activated + var/view_range = 5 var/obj/structure/dropship_equipment/medevac_system/linked_medevac surgery_duration_multiplier = SURGERY_SURFACE_MULT_AWFUL //On the one hand, it's a big stretcher. On the other hand, you have a big sheet covering the patient and those damned Fulton hookups everywhere. @@ -352,6 +353,14 @@ GLOBAL_LIST_EMPTY(activated_medevac_stretchers) toggle_medevac_beacon(usr) +// Used to pretend to be a camera +/obj/structure/bed/medevac_stretcher/proc/can_use() + return TRUE + +// Used to pretend to be a camera +/obj/structure/bed/medevac_stretcher/proc/isXRay() + return FALSE + /obj/structure/bed/medevac_stretcher/proc/toggle_medevac_beacon(mob/user) if(!ishuman(user)) return diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 171cade3ed4e..6d5efba2645f 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -15,7 +15,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( "1548" = "bug breaking the \"alpha\" functionality in the game, allowing clients to be able to see things/mobs they should not be able to see.", )) -#define LIMITER_SIZE 5 +#define LIMITER_SIZE 12 #define CURRENT_SECOND 1 #define SECOND_COUNT 2 #define CURRENT_MINUTE 3 @@ -57,6 +57,12 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( /client/proc/set_eye_blur_type, )) +/client/proc/reduce_minute_count() + if (!topiclimiter) + topiclimiter = new(LIMITER_SIZE) + if(topiclimiter[MINUTE_COUNT] > 0) + topiclimiter[MINUTE_COUNT] -= 1 + /client/Topic(href, href_list, hsrc) if(!usr || usr != mob) //stops us calling Topic for somebody else's client. Also helps prevent usr=null return diff --git a/code/modules/cm_marines/dropship_equipment.dm b/code/modules/cm_marines/dropship_equipment.dm index 510b9305a2a6..036b6ecf8330 100644 --- a/code/modules/cm_marines/dropship_equipment.dm +++ b/code/modules/cm_marines/dropship_equipment.dm @@ -6,6 +6,8 @@ icon = 'icons/obj/structures/props/almayer_props.dmi' climbable = TRUE layer = ABOVE_OBJ_LAYER //so they always appear above attach points when installed + var/shorthand + var/list/equip_categories //on what kind of base this can be installed. var/obj/effect/attach_point/ship_base //the ship base the equipment is currently installed on. var/uses_ammo = FALSE //whether it uses ammo @@ -22,7 +24,7 @@ /obj/structure/dropship_equipment/Destroy() QDEL_NULL(ammo_equipped) if(linked_shuttle) - linked_shuttle.equipments -= src + SEND_SIGNAL(linked_shuttle, COMSIG_DROPSHIP_REMOVE_EQUIPMENT, src) linked_shuttle = null if(ship_base) ship_base.installed_equipment = null @@ -122,7 +124,7 @@ ship_base.installed_equipment = null ship_base = null if(linked_shuttle) - linked_shuttle.equipments -= src + SEND_SIGNAL(linked_shuttle, COMSIG_DROPSHIP_REMOVE_EQUIPMENT, src) linked_shuttle = null if(linked_console && linked_console.selected_equipment == src) linked_console.selected_equipment = null @@ -160,6 +162,7 @@ icon_state = "sentry_system" is_interactable = TRUE point_cost = 500 + shorthand = "Sentry" var/deployment_cooldown var/obj/structure/machinery/defenses/sentry/premade/dropship/deployed_turret combat_equipment = FALSE @@ -176,6 +179,28 @@ if(!deployed_turret) . += "Its turret is missing." +/obj/structure/dropship_equipment/sentry_holder/ui_data(mob/user) + var/obj/structure/machinery/defenses/defense = deployed_turret + . = list() + var/is_deployed = deployed_turret.loc != src + .["name"] = defense.name + .["area"] = get_area(defense) + .["active"] = defense.turned_on + .["nickname"] = defense.nickname + .["camera_available"] = defense.has_camera && is_deployed + .["selection_state"] = list() + .["kills"] = defense.kills + .["iff_status"] = defense.faction_group + .["health"] = defense.health + .["health_max"] = defense.health_max + .["deployed"] = is_deployed + + if(istype(defense, /obj/structure/machinery/defenses/sentry)) + var/obj/structure/machinery/defenses/sentry/sentrygun = defense + .["rounds"] = sentrygun.ammo.current_rounds + .["max_rounds"] = sentrygun.ammo.max_rounds + .["engaged"] = length(sentrygun.targets) + /obj/structure/dropship_equipment/sentry_holder/on_launch() if(ship_base && ship_base.base_category == DROPSHIP_WEAPON) //only external sentires are automatically undeployed undeploy_sentry() @@ -290,6 +315,7 @@ equip_categories = list(DROPSHIP_WEAPON, DROPSHIP_CREW_WEAPON) icon_state = "mg_system" point_cost = 50 + shorthand = "MG" var/deployment_cooldown var/obj/structure/machinery/m56d_hmg/mg_turret/dropship/deployed_mg combat_equipment = FALSE @@ -304,6 +330,17 @@ QDEL_NULL(deployed_mg) . = ..() +/obj/structure/dropship_equipment/mg_holder/ui_data(mob/user) + . = list() + var/is_deployed = deployed_mg.loc == src + .["name"] = name + .["selection_state"] = list() + .["health"] = health + .["health_max"] = 100 + .["rounds"] = deployed_mg.rounds + .["max_rounds"] = deployed_mg.rounds_max + .["deployed"] = is_deployed + /obj/structure/dropship_equipment/mg_holder/get_examine_text(mob/user) . = ..() if(!deployed_mg) @@ -334,6 +371,9 @@ ..() +/obj/structure/dropship_equipment/mg_holder/equipment_interact(mob/user) + attack_hand(user) + /obj/structure/dropship_equipment/mg_holder/update_equipment() if(ship_base) setDir(ship_base.dir) @@ -450,6 +490,7 @@ /obj/structure/dropship_equipment/electronics/spotlights name = "\improper AN/LEN-15 Spotlight" + shorthand = "Spotlight" icon_state = "spotlights" desc = "A set of high-powered spotlights to illuminate large areas. Fits on electronics attach points of dropships. Moving this will require a powerloader." is_interactable = TRUE @@ -500,6 +541,7 @@ /obj/structure/dropship_equipment/electronics/targeting_system name = "\improper AN/AAQ-178 Weapon Targeting System" + shorthand = "Targeting" icon_state = "targeting_system" desc = "A targeting system for dropships. It improves firing accuracy on laser targets. Fits on electronics attach points. You need a powerloader to lift this." point_cost = 800 @@ -512,7 +554,8 @@ /obj/structure/dropship_equipment/electronics/landing_zone_detector name = "\improper AN/AVD-60 LZ detector" - desc = "An electronic device linked to the dropship's camera system that lets you observe your landing zone." + shorthand = "LZ Detector" + desc = "An electronic device linked to the dropship's camera system that lets you observe your landing zone mid-flight." icon_state = "lz_detector" point_cost = 50 var/obj/structure/machinery/computer/cameras/dropship/linked_cam_console @@ -694,6 +737,7 @@ point_cost = 400 skill_required = SKILL_PILOT_TRAINED fire_mission_only = FALSE + shorthand = "GAU" /obj/structure/dropship_equipment/weapon/heavygun/update_icon() if(ammo_equipped) @@ -710,6 +754,7 @@ firing_sound = 'sound/effects/rocketpod_fire.ogg' firing_delay = 5 point_cost = 600 + shorthand = "MSL" /obj/structure/dropship_equipment/weapon/rocket_pod/deplete_ammo() ammo_equipped = null //nothing left to empty after firing @@ -731,6 +776,7 @@ firing_sound = 'sound/effects/rocketpod_fire.ogg' firing_delay = 10 //1 seconds point_cost = 600 + shorthand = "RKT" /obj/structure/dropship_equipment/weapon/minirocket_pod/update_icon() if(ammo_equipped && ammo_equipped.ammo_count) @@ -754,6 +800,7 @@ point_cost = 500 skill_required = SKILL_PILOT_TRAINED fire_mission_only = FALSE + shorthand = "LZR" /obj/structure/dropship_equipment/weapon/laser_beam_gun/update_icon() if(ammo_equipped && ammo_equipped.ammo_count) @@ -772,6 +819,7 @@ bound_height = 32 equip_categories = list(DROPSHIP_CREW_WEAPON) //fits inside the central spot of the dropship point_cost = 400 + shorthand = "LCH" /obj/structure/dropship_equipment/weapon/launch_bay/update_equipment() if(ship_base) @@ -785,6 +833,7 @@ /obj/structure/dropship_equipment/medevac_system name = "\improper RMU-4M Medevac System" + shorthand = "Medevac" desc = "A winch system to lift injured marines on medical stretchers onto the dropship. Acquire lift target through the dropship equipment console." equip_categories = list(DROPSHIP_CREW_WEAPON) icon_state = "medevac_system" @@ -810,24 +859,8 @@ linked_stretcher = null icon_state = "medevac_system" - -/obj/structure/dropship_equipment/medevac_system/equipment_interact(mob/user) - if(!linked_shuttle) - return - - if(linked_shuttle.mode != SHUTTLE_CALL) - to_chat(user, SPAN_WARNING("[src] can only be used while in flight.")) - return - - if(busy_winch) - to_chat(user, SPAN_WARNING(" The winch is already in motion.")) - return - - if(world.time < medevac_cooldown) - to_chat(user, SPAN_WARNING("[src] was just used, you need to wait a bit before using it again.")) - return - - var/list/possible_stretchers = list() +/obj/structure/dropship_equipment/medevac_system/proc/get_targets() + . = list() for(var/obj/structure/bed/medevac_stretcher/MS in GLOB.activated_medevac_stretchers) var/area/AR = get_area(MS) var/evaccee_name @@ -854,20 +887,32 @@ if (evaccee_triagecard_color && evaccee_triagecard_color == "none") evaccee_triagecard_color = null - possible_stretchers["[evaccee_name] [evaccee_triagecard_color ? "\[" + uppertext(evaccee_triagecard_color) + "\]" : ""] ([AR.name])"] = MS + .["[evaccee_name] [evaccee_triagecard_color ? "\[" + uppertext(evaccee_triagecard_color) + "\]" : ""] ([AR.name])"] = MS - if(!possible_stretchers.len) - to_chat(user, SPAN_WARNING("No active medevac stretcher detected.")) - return +/obj/structure/dropship_equipment/medevac_system/proc/can_medevac(mob/user) + if(!linked_shuttle) + return FALSE - var/stretcher_choice = tgui_input_list(usr, "Which emitting stretcher would you like to link with?", "Available stretchers", possible_stretchers) - if(!stretcher_choice) - return + if(linked_shuttle.mode != SHUTTLE_CALL) + to_chat(user, SPAN_WARNING("[src] can only be used while in flight.")) + return FALSE - var/obj/structure/bed/medevac_stretcher/selected_stretcher = possible_stretchers[stretcher_choice] - if(!selected_stretcher) - return + if(busy_winch) + to_chat(user, SPAN_WARNING(" The winch is already in motion.")) + return FALSE + if(world.time < medevac_cooldown) + to_chat(user, SPAN_WARNING("[src] was just used, you need to wait a bit before using it again.")) + return FALSE + + var/list/possible_stretchers = get_targets() + + if(!possible_stretchers.len) + to_chat(user, SPAN_WARNING("No active medevac stretcher detected.")) + return FALSE + return TRUE + +/obj/structure/dropship_equipment/medevac_system/proc/position_dropship(mob/user, obj/structure/bed/medevac_stretcher/selected_stretcher) if(!ship_base) //system was uninstalled midway return @@ -917,6 +962,31 @@ linked_stretcher.linked_medevac = src linked_stretcher.visible_message(SPAN_NOTICE("[linked_stretcher] detects a dropship overhead.")) +/obj/structure/dropship_equipment/medevac_system/proc/automate_interact(mob/user, stretcher_choice) + if(!can_medevac(user)) + return + + var/list/possible_stretchers = get_targets() + + var/obj/structure/bed/medevac_stretcher/selected_stretcher = possible_stretchers[stretcher_choice] + if(!selected_stretcher) + return + position_dropship(user, selected_stretcher) + +/obj/structure/dropship_equipment/medevac_system/equipment_interact(mob/user) + if(!can_medevac(user)) + return + + var/list/possible_stretchers = get_targets() + + var/stretcher_choice = tgui_input_list(usr, "Which emitting stretcher would you like to link with?", "Available stretchers", possible_stretchers) + if(!stretcher_choice) + return + + var/obj/structure/bed/medevac_stretcher/selected_stretcher = possible_stretchers[stretcher_choice] + if(!selected_stretcher) + return + position_dropship(user, selected_stretcher) //on arrival we break any link @@ -962,6 +1032,35 @@ activate_winch(user) +/obj/structure/dropship_equipment/medevac_system/ui_data(mob/user) + var/list/stretchers = get_targets() + + . = list() + for(var/stretcher_ref in stretchers) + var/obj/structure/bed/medevac_stretcher/stretcher = stretchers[stretcher_ref] + + var/area/AR = get_area(stretcher) + var/list/target_data = list() + target_data["area"] = AR + target_data["ref"] = stretcher_ref + + var/mob/living/carbon/human/occupant = stretcher.buckled_mob + if(occupant) + target_data["occupant"] = occupant.name + target_data["time_of_death"] = occupant.tod + target_data["damage"] = list( + "hp" = occupant.health, + "brute" = occupant.bruteloss, + "oxy" = occupant.oxyloss, + "tox" = occupant.toxloss, + "fire" = occupant.fireloss + ) + if(ishuman(occupant)) + target_data["damage"]["undefib"] = occupant.undefibbable + target_data["triage_card"] = occupant.holo_card_color + + . += list(target_data) + /obj/structure/dropship_equipment/medevac_system/proc/activate_winch(mob/user) set waitfor = 0 var/old_stretcher = linked_stretcher @@ -1017,6 +1116,7 @@ /obj/structure/dropship_equipment/fulton_system name = "\improper RMU-19 Fulton Recovery System" + shorthand = "Fulton" desc = "A winch system to collect any fulton recovery balloons in high altitude. Make sure you turn it on!" equip_categories = list(DROPSHIP_CREW_WEAPON) icon_state = "fulton_system" @@ -1033,7 +1133,26 @@ icon_state = "fulton_system" -/obj/structure/dropship_equipment/fulton_system/equipment_interact(mob/user) +/obj/structure/dropship_equipment/fulton_system/proc/automate_interact(mob/user, fulton_choice) + if(!can_fulton(user)) + return + + var/list/possible_fultons = get_targets() + + var/obj/item/stack/fulton/fult = possible_fultons[fulton_choice] + if(!fulton_choice) + return + + if(!ship_base) //system was uninstalled midway + return + + if(is_ground_level(fult.z)) //in case the fulton popped during our input() + return + + if(!fult.attached_atom) + to_chat(user, SPAN_WARNING("This balloon stretcher is empty.")) + return + if(!linked_shuttle) return @@ -1049,14 +1168,50 @@ to_chat(user, SPAN_WARNING("[src] was just used, you need to wait a bit before using it again.")) return - var/list/possible_fultons = list() + to_chat(user, SPAN_NOTICE(" You move your dropship above the selected balloon's beacon.")) + + activate_winch(user, fult) + + +/obj/structure/dropship_equipment/fulton_system/proc/can_fulton(mob/user) + if(!linked_shuttle) + return FALSE + + if(linked_shuttle.mode != SHUTTLE_CALL) + to_chat(user, SPAN_WARNING("[src] can only be used while in flight.")) + return FALSE + + if(busy_winch) + to_chat(user, SPAN_WARNING(" The winch is already in motion.")) + return FALSE + + if(world.time < fulton_cooldown) + to_chat(user, SPAN_WARNING("[src] was just used, you need to wait a bit before using it again.")) + return FALSE + return TRUE + +/obj/structure/dropship_equipment/fulton_system/ui_data(mob/user) + var/list/targets = get_targets() + . = list() + for(var/i in targets) + . += list(i) + + +/obj/structure/dropship_equipment/fulton_system/proc/get_targets() + . = list() for(var/obj/item/stack/fulton/F in GLOB.deployed_fultons) var/recovery_object if(F.attached_atom) recovery_object = F.attached_atom.name else recovery_object = "Empty" - possible_fultons["[recovery_object]"] = F + .["[recovery_object]"] = F + +/obj/structure/dropship_equipment/fulton_system/equipment_interact(mob/user) + if(!can_fulton(user)) + return + + var/list/possible_fultons = get_targets() if(!possible_fultons.len) to_chat(user, SPAN_WARNING("No active balloons detected.")) @@ -1134,6 +1289,7 @@ // Rappel deployment system /obj/structure/dropship_equipment/rappel_system name = "\improper HPU-1 Rappel Deployment System" + shorthand = "Rappel" equip_categories = list(DROPSHIP_CREW_WEAPON) icon_state = "rappel_module_packaged" point_cost = 50 diff --git a/code/modules/dropships/attach_points/attach_point.dm b/code/modules/dropships/attach_points/attach_point.dm index 6724f5d18bd2..cee26f0b13f2 100644 --- a/code/modules/dropships/attach_points/attach_point.dm +++ b/code/modules/dropships/attach_points/attach_point.dm @@ -60,7 +60,7 @@ for(var/obj/docking_port/mobile/marine_dropship/shuttle in SSshuttle.mobile) if(shuttle.id == ship_tag) SE.linked_shuttle = shuttle - shuttle.equipments += SE + SEND_SIGNAL(shuttle, COMSIG_DROPSHIP_ADD_EQUIPMENT, SE) break SE.update_equipment() diff --git a/code/modules/dropships/cas/fire_mission_record.dm b/code/modules/dropships/cas/fire_mission_record.dm index 093a1509b2ad..2887ec92c24a 100644 --- a/code/modules/dropships/cas/fire_mission_record.dm +++ b/code/modules/dropships/cas/fire_mission_record.dm @@ -5,6 +5,11 @@ /// List of transverse offsets for each firing step - null meaning not shooting var/list/offsets +/datum/cas_fire_mission_record/ui_data(mob/user) + . = list() + .["weapon"] = weapon.ship_base.attach_id + .["offsets"] = offsets + /// Get offset range allowed when firing weapon in this configuration /datum/cas_fire_mission_record/proc/get_offsets() if(!weapon?.ship_base) diff --git a/code/modules/shuttle/computers/dropship_computer.dm b/code/modules/shuttle/computers/dropship_computer.dm index b7a74d1780df..86c0c86abfc2 100644 --- a/code/modules/shuttle/computers/dropship_computer.dm +++ b/code/modules/shuttle/computers/dropship_computer.dm @@ -419,7 +419,7 @@ update_equipment(is_optimised, FALSE) var/list/local_data = ui_data(user) var/found = FALSE - playsound(loc, get_sfx("terminal_button"), KEYBOARD_SOUND_VOLUME, 1) + playsound(loc, get_sfx("terminal_button"), 5, 1) for(var/destination in local_data["destinations"]) if(destination["id"] == dock_id) found = TRUE diff --git a/code/modules/shuttle/shuttles/dropship.dm b/code/modules/shuttle/shuttles/dropship.dm index 105c0e122234..f741df301bbb 100644 --- a/code/modules/shuttle/shuttles/dropship.dm +++ b/code/modules/shuttle/shuttles/dropship.dm @@ -30,6 +30,7 @@ var/automated_delay var/automated_timer + /obj/docking_port/mobile/marine_dropship/Initialize(mapload) . = ..() door_control = new() @@ -43,15 +44,28 @@ if("aft_door") door_control.add_door(air, "aft") + RegisterSignal(src, COMSIG_DROPSHIP_ADD_EQUIPMENT, PROC_REF(add_equipment)) + RegisterSignal(src, COMSIG_DROPSHIP_REMOVE_EQUIPMENT, PROC_REF(remove_equipment)) + /obj/docking_port/mobile/marine_dropship/Destroy(force) . = ..() qdel(door_control) + UnregisterSignal(src, COMSIG_DROPSHIP_ADD_EQUIPMENT) + UnregisterSignal(src, COMSIG_DROPSHIP_REMOVE_EQUIPMENT) /obj/docking_port/mobile/marine_dropship/proc/send_for_flyby() in_flyby = TRUE var/obj/docking_port/stationary/dockedAt = get_docked() SSshuttle.moveShuttle(src.id, dockedAt.id, TRUE) +/obj/docking_port/mobile/marine_dropship/proc/add_equipment(obj/docking_port/mobile/marine_dropship/dropship, obj/structure/dropship_equipment/equipment) + SIGNAL_HANDLER + equipments += equipment + +/obj/docking_port/mobile/marine_dropship/proc/remove_equipment(obj/docking_port/mobile/marine_dropship/dropship, obj/structure/dropship_equipment/equipment) + SIGNAL_HANDLER + equipments -= equipment + /obj/docking_port/mobile/marine_dropship/proc/get_door_data() return door_control.get_data() @@ -107,10 +121,12 @@ /obj/docking_port/mobile/marine_dropship/alamo name = "Alamo" id = DROPSHIP_ALAMO + preferred_direction = SOUTH /obj/docking_port/mobile/marine_dropship/normandy name = "Normandy" id = DROPSHIP_NORMANDY + preferred_direction = SOUTH /obj/docking_port/mobile/marine_dropship/check() . = ..() diff --git a/colonialmarines.dme b/colonialmarines.dme index 64f1338244b4..ca8e80ef5067 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -723,6 +723,7 @@ #include "code\game\area\techtree.dm" #include "code\game\area\varadero.dm" #include "code\game\area\WhiskeyOutpost.dm" +#include "code\game\camera_manager\camera_manager.dm" #include "code\game\cas_manager\datums\cas_fire_envelope.dm" #include "code\game\cas_manager\datums\cas_fire_mission.dm" #include "code\game\cas_manager\datums\cas_iff_group.dm" diff --git a/maps/shuttles/dropship_alamo.dmm b/maps/shuttles/dropship_alamo.dmm index 6cd6922c22b0..1e78347c1721 100644 --- a/maps/shuttles/dropship_alamo.dmm +++ b/maps/shuttles/dropship_alamo.dmm @@ -18,6 +18,14 @@ /obj/structure/shuttle/part/dropship1/transparent/nose_center, /turf/template_noop, /area/shuttle/drop1/sulaco) +"bc" = ( +/obj/effect/attach_point/electronics/dropship1{ + dir = 1; + attach_id = 5 + }, +/obj/structure/shuttle/part/dropship1/transparent/inner_left_weapons, +/turf/template_noop, +/area/shuttle/drop1/sulaco) "be" = ( /obj/structure/shuttle/part/dropship1/transparent/upper_right_wing, /turf/template_noop, @@ -73,6 +81,15 @@ icon_state = "floor8" }, /area/shuttle/drop1/sulaco) +"ed" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds1{ + dir = 1; + id = "starboard_door" + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/drop1/sulaco) "eD" = ( /obj/structure/shuttle/part/dropship1/transparent/engine_right_cap, /turf/template_noop, @@ -159,14 +176,6 @@ icon_state = "76" }, /area/shuttle/drop1/sulaco) -"os" = ( -/obj/effect/attach_point/fuel/dropship1{ - pixel_x = -32 - }, -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "33" - }, -/area/shuttle/drop1/sulaco) "oW" = ( /obj/structure/shuttle/part/dropship1/transparent/middle_left_wing, /turf/template_noop, @@ -216,19 +225,18 @@ icon_state = "23" }, /area/shuttle/drop1/sulaco) -"rS" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds1{ - id = "port_door"; - dir = 2 - }, -/turf/open/shuttle/dropship{ - icon_state = "rasputin15" - }, -/area/shuttle/drop1/sulaco) "rV" = ( /obj/structure/shuttle/part/dropship1/transparent/left_outer_bottom_wing, /turf/template_noop, /area/shuttle/drop1/sulaco) +"sm" = ( +/obj/effect/attach_point/fuel/dropship1{ + attach_id = 10 + }, +/turf/closed/shuttle/dropship1/transparent{ + icon_state = "28" + }, +/area/shuttle/drop1/sulaco) "sA" = ( /obj/structure/shuttle/part/dropship1/lower_left_wall, /turf/open/space/basic, @@ -248,12 +256,6 @@ /obj/structure/shuttle/part/dropship1/transparent/lower_right_wing, /turf/template_noop, /area/shuttle/drop1/sulaco) -"wr" = ( -/obj/effect/attach_point/crew_weapon/dropship1, -/turf/open/shuttle/dropship{ - icon_state = "rasputin15" - }, -/area/shuttle/drop1/sulaco) "ws" = ( /obj/structure/bed/chair/vehicle{ dir = 1; @@ -344,20 +346,6 @@ icon_state = "rasputin15" }, /area/shuttle/drop1/sulaco) -"Da" = ( -/obj/effect/attach_point/electronics/dropship1{ - dir = 1 - }, -/obj/structure/shuttle/part/dropship1/transparent/inner_left_weapons, -/turf/template_noop, -/area/shuttle/drop1/sulaco) -"De" = ( -/obj/effect/attach_point/electronics/dropship1{ - dir = 1 - }, -/obj/structure/shuttle/part/dropship1/transparent/inner_right_weapons, -/turf/template_noop, -/area/shuttle/drop1/sulaco) "Et" = ( /turf/closed/shuttle/dropship1{ icon_state = "72" @@ -427,6 +415,14 @@ icon_state = "62" }, /area/shuttle/drop1/sulaco) +"Kk" = ( +/obj/effect/attach_point/crew_weapon/dropship1{ + attach_id = 7 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/drop1/sulaco) "KC" = ( /obj/structure/machinery/door/airlock/hatch/cockpit, /obj/structure/blocker/forcefield/multitile_vehicles, @@ -453,6 +449,23 @@ icon_state = "64" }, /area/shuttle/drop1/sulaco) +"Nv" = ( +/obj/effect/attach_point/crew_weapon/dropship1{ + attach_id = 8 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/drop1/sulaco) +"ND" = ( +/obj/effect/attach_point/fuel/dropship1{ + pixel_x = -32; + attach_id = 11 + }, +/turf/closed/shuttle/dropship1/transparent{ + icon_state = "33" + }, +/area/shuttle/drop1/sulaco) "NQ" = ( /obj/structure/shuttle/part/dropship1/transparent/left_inner_bottom_wing, /turf/template_noop, @@ -481,15 +494,6 @@ icon_state = "rasputin5" }, /area/shuttle/drop1/sulaco) -"Pf" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds1{ - dir = 1; - id = "starboard_door" - }, -/turf/open/shuttle/dropship{ - icon_state = "rasputin15" - }, -/area/shuttle/drop1/sulaco) "Ph" = ( /turf/closed/shuttle/dropship1{ icon_state = "68" @@ -502,6 +506,14 @@ icon_state = "rasputin15" }, /area/shuttle/drop1/sulaco) +"PV" = ( +/obj/effect/attach_point/crew_weapon/dropship1{ + attach_id = 9 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/drop1/sulaco) "Qh" = ( /turf/closed/shuttle/dropship1/transparent{ icon_state = "32" @@ -575,12 +587,6 @@ /obj/structure/shuttle/part/dropship1/transparent/outer_left_weapons, /turf/template_noop, /area/shuttle/drop1/sulaco) -"Ua" = ( -/obj/effect/attach_point/fuel/dropship1, -/turf/closed/shuttle/dropship1/transparent{ - icon_state = "28" - }, -/area/shuttle/drop1/sulaco) "UG" = ( /obj/structure/prop/ice_colony/hula_girl{ pixel_x = -10; @@ -628,6 +634,23 @@ icon_state = "rasputin7" }, /area/shuttle/drop1/sulaco) +"XP" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds1{ + id = "port_door"; + dir = 2 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/drop1/sulaco) +"Ye" = ( +/obj/effect/attach_point/electronics/dropship1{ + dir = 1; + attach_id = 6 + }, +/obj/structure/shuttle/part/dropship1/transparent/inner_right_weapons, +/turf/template_noop, +/area/shuttle/drop1/sulaco) "Za" = ( /turf/closed/shuttle/dropship1{ icon_state = "77" @@ -660,7 +683,7 @@ mb mb FA Oq -Ua +sm iz EN mb @@ -677,7 +700,7 @@ Et iI JP il -rS +XP mW qn sA @@ -694,7 +717,7 @@ NQ mb mb mb -Da +bc oo TK ws @@ -773,11 +796,11 @@ BB OK OU il -wr +Kk il -wr +Nv il -wr +PV il mb mb @@ -832,7 +855,7 @@ Wg mb mb mb -De +Ye oo TK cr @@ -861,7 +884,7 @@ iv zV MP il -Pf +ed nC nE rl @@ -890,7 +913,7 @@ mb mb eD Gw -os +ND qy Jm mb diff --git a/maps/shuttles/dropship_normandy.dmm b/maps/shuttles/dropship_normandy.dmm index a2847ae62611..5a733f6a9e9b 100644 --- a/maps/shuttles/dropship_normandy.dmm +++ b/maps/shuttles/dropship_normandy.dmm @@ -36,20 +36,6 @@ /obj/structure/shuttle/part/dropship2/transparent/right_outer_bottom_wing, /turf/template_noop, /area/shuttle/drop2/sulaco) -"do" = ( -/obj/effect/attach_point/crew_weapon/dropship2, -/turf/open/shuttle/dropship{ - icon_state = "rasputin3" - }, -/area/shuttle/drop2/sulaco) -"es" = ( -/obj/effect/attach_point/fuel/dropship2{ - pixel_x = -32 - }, -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "33" - }, -/area/shuttle/drop2/sulaco) "eu" = ( /turf/closed/shuttle/dropship2{ icon_state = "75" @@ -93,6 +79,14 @@ icon_state = "54" }, /area/shuttle/drop2/sulaco) +"gH" = ( +/obj/effect/attach_point/electronics/dropship2{ + dir = 1; + attach_id = 6 + }, +/obj/structure/shuttle/part/dropship2/transparent/inner_right_weapons, +/turf/template_noop, +/area/shuttle/drop2/sulaco) "gP" = ( /obj/structure/bed/chair/dropship/pilot{ dir = 1 @@ -101,6 +95,14 @@ icon_state = "rasputin15" }, /area/shuttle/drop2/sulaco) +"hn" = ( +/obj/effect/attach_point/crew_weapon/dropship2{ + attach_id = 8 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/drop2/sulaco) "it" = ( /obj/structure/bed/chair/vehicle{ dir = 1; @@ -173,6 +175,14 @@ icon_state = "62" }, /area/shuttle/drop2/sulaco) +"mn" = ( +/obj/effect/attach_point/fuel/dropship2{ + attach_id = 10 + }, +/turf/closed/shuttle/dropship2/transparent{ + icon_state = "28" + }, +/area/shuttle/drop2/sulaco) "mz" = ( /obj/structure/machinery/camera/autoname/almayer/dropship_two{ dir = 4; @@ -190,6 +200,15 @@ icon_state = "rasputin15" }, /area/shuttle/drop2/sulaco) +"mA" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2{ + id = "port_door"; + dir = 2 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" + }, +/area/shuttle/drop2/sulaco) "nq" = ( /obj/effect/attach_point/weapon/dropship2/left_fore, /obj/structure/shuttle/part/dropship2/transparent/outer_left_weapons, @@ -253,10 +272,13 @@ icon_state = "rasputin3" }, /area/shuttle/drop2/sulaco) -"vw" = ( -/obj/effect/attach_point/fuel/dropship2, -/turf/closed/shuttle/dropship2/transparent{ - icon_state = "28" +"vh" = ( +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2{ + dir = 1; + id = "starboard_door" + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin15" }, /area/shuttle/drop2/sulaco) "wX" = ( @@ -264,13 +286,6 @@ icon_state = "83" }, /area/shuttle/drop2/sulaco) -"xd" = ( -/obj/effect/attach_point/electronics/dropship2{ - dir = 1 - }, -/obj/structure/shuttle/part/dropship2/transparent/inner_right_weapons, -/turf/template_noop, -/area/shuttle/drop2/sulaco) "xe" = ( /turf/closed/shuttle/dropship2{ icon_state = "18" @@ -310,6 +325,14 @@ icon_state = "56" }, /area/shuttle/drop2/sulaco) +"Bg" = ( +/obj/effect/attach_point/crew_weapon/dropship2{ + attach_id = 7 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/drop2/sulaco) "Bi" = ( /turf/closed/shuttle/dropship2/transparent{ icon_state = "97" @@ -349,15 +372,6 @@ /obj/structure/shuttle/part/dropship2/transparent/lower_right_wing, /turf/template_noop, /area/shuttle/drop2/sulaco) -"En" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2{ - dir = 1; - id = "starboard_door" - }, -/turf/open/shuttle/dropship{ - icon_state = "rasputin15" - }, -/area/shuttle/drop2/sulaco) "Eo" = ( /turf/closed/shuttle/dropship2{ icon_state = "47" @@ -463,6 +477,14 @@ /obj/structure/shuttle/part/dropship2/transparent/nose_top_left, /turf/template_noop, /area/shuttle/drop2/sulaco) +"MA" = ( +/obj/effect/attach_point/crew_weapon/dropship2{ + attach_id = 9 + }, +/turf/open/shuttle/dropship{ + icon_state = "rasputin3" + }, +/area/shuttle/drop2/sulaco) "ME" = ( /turf/closed/shuttle/dropship2/transparent{ icon_state = "96" @@ -494,6 +516,15 @@ /obj/structure/shuttle/part/dropship2/left_outer_wing_connector, /turf/open/space/basic, /area/shuttle/drop2/sulaco) +"Od" = ( +/obj/effect/attach_point/fuel/dropship2{ + pixel_x = -32; + attach_id = 11 + }, +/turf/closed/shuttle/dropship2/transparent{ + icon_state = "33" + }, +/area/shuttle/drop2/sulaco) "Ov" = ( /obj/structure/shuttle/part/dropship2/transparent/right_inner_bottom_wing, /turf/template_noop, @@ -582,15 +613,6 @@ /obj/structure/shuttle/part/dropship2/nose_front_left, /turf/template_noop, /area/shuttle/drop2/sulaco) -"SC" = ( -/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2{ - id = "port_door"; - dir = 2 - }, -/turf/open/shuttle/dropship{ - icon_state = "rasputin15" - }, -/area/shuttle/drop2/sulaco) "SO" = ( /turf/closed/shuttle/dropship2{ icon_state = "36" @@ -693,7 +715,7 @@ Rr Rr BG SQ -vw +mn sk Xr Rr @@ -710,7 +732,7 @@ OI GE lJ PJ -SC +mA jc pU nS @@ -806,11 +828,11 @@ Bb Iv rc vd -do +Bg vd -do +hn vd -do +MA PJ Rr Rr @@ -865,7 +887,7 @@ RJ Rr Rr Rr -xd +gH yl SY it @@ -894,7 +916,7 @@ fI fx Tp PJ -En +vh gG RG QK @@ -923,7 +945,7 @@ Rr Rr yh UP -es +Od zt Uu Rr diff --git a/nano/templates/dropship_weapons_console.tmpl b/nano/templates/dropship_weapons_console.tmpl deleted file mode 100644 index fabfdee2467b..000000000000 --- a/nano/templates/dropship_weapons_console.tmpl +++ /dev/null @@ -1,245 +0,0 @@ - -{{if data.screen_mode == 0}} -
-

Equipment installed:

-
- {{for data.equipment_data}} - {{if value.is_interactable}} -
- {{:helper.link(value.name, null, {'equip_interact' : value.eqp_tag}, null , null)}} -
- {{else}} -
- {{:value.name}} -
- {{/if}} - {{empty}} - No equipment installed. - {{/for}} -
-
- {{if data.has_firemission}} -
-

Fire Missions:

-
- {{for data.firemission_data}} -
- - {{:value.name}} - - -   - - {{if !value.can_interact}} - - *!SELECT* - - {{/if}} - {{if !value.can_edit}} - - *!EDIT* - - {{/if}} - - {{if value.can_interact}} - - {{if value.selected}} - {{:helper.link("[UNSELECT]", null, {'mission_tag' : value.mission_tag}, null , null)}} - {{else}} - {{:helper.link("[SELECT]", null, {'mission_tag' : value.mission_tag}, null , null)}} - {{/if}} - - {{/if}} - - {{if value.can_edit}} - - {{:helper.link("[EDIT]", null, {'mission_tag_edit' : value.mission_tag}, null , null)}} - - {{/if}} - - - {{:helper.link("[DELETE]", null, {'mission_tag_delete' : value.mission_tag}, null , null)}} - -
- - {{empty}} - No Fire Missions Detected - {{/for}} -
- {{:helper.link("Create New Fire Mission", null, {'create_mission' : 1}, null , null)}} -
- -
-
-
-

Fire Mission Control:

- {{if data.can_firemission}} -
- {{:helper.link("Switch to Fire Mission", null, {'switch_to_firemission' : 1}, null , null)}} -
-
- {{else}} -
- Have to be in Transit, have to select a Fire Mission and Fire Mission has to be without errors. -
- {{/if}} -
-
-

Fire Mission Simulator:

- {{if data.shuttle_state != "in_transit"}} -
- {{:helper.link("Switch To Simulation", null, {'switch_to_simulation' : 1}, null , null)}} -
-
- {{else}} -
- Have to be Stationary, have to select a Fire Mission and Fire Mission has to be without errors. -
- {{/if}} -
- {{/if}} -{{else data.screen_mode == 1}} -

Weapon Selected: {{:data.selected_eqp}}

- {{if data.selected_eqp_ammo_name}} -
- Ammo loaded: {{:data.selected_eqp_ammo_name}} -
-
- {{if data.selected_eqp_ammo_amt > data.selected_eqp_max_ammo_amt*0.5}} - Ammo count: {{:data.selected_eqp_ammo_amt}} / {{:data.selected_eqp_max_ammo_amt}} - {{else data.selected_eqp_ammo_amt > 0}} - Ammo count: {{:data.selected_eqp_ammo_amt}} / {{:data.selected_eqp_max_ammo_amt}} - {{else}} - Ammo count: {{:data.selected_eqp_ammo_amt}} / {{:data.selected_eqp_max_ammo_amt}} - {{/if}} -
- {{else}} -
- No ammo loaded -
- {{/if}} - -
- Available Targets -
- {{:helper.link('Deselect Weapon', null, {'deselect' : '1'}, null , null)}} -
-
- -
- {{for data.targets_data}} - {{:helper.link(value.target_name, null, {'open_fire' : value.target_tag}, (data.shuttle_state == "in_transit") ? null : 'disabled' , 'fixedLeftLongText')}} {{:helper.link('View', 'search', {'cas_camera' : value.target_tag}, (data.shuttle_state == "in_transit") ? null : 'disabled' , 'fixedLeft')}} - {{empty}} - No laser target detected. - {{/for}} -
- - - -{{else data.screen_mode == 2}} -

Fire Mission Editing: {{:data.editing_firemission}}

- {{if data.current_mission_error}} -
- ERROR DETECTED: {{:data.current_mission_error}} -
- {{else}} -
- No errors detected -
- {{/if}} - -
- Mission Tile Coverage: {{:data.editing_firemission_length}} -
- - - - - - - {{for data.firemission_edit_timeslices}} - - {{/for}} - - {{for data.firemission_edit_data :fm_value:fm_id}} - - - - - {{for fm_value.offsets :offset_value:offset_id}} - - {{/for}} - - {{/for}} -
NameAmmoGimbal - {{:value}} -
{{:fm_value.name}} - {{if fm_value.ammo==null}} - 0/0 - {{else}} - {{if fm_value.ammo.used > fm_value.ammo.count}} - {{:fm_value.ammo.count?fm_value.ammo.count:0}}/{{:fm_value.ammo.max?fm_value.ammo.max:0}} - {{else fm_value.ammo.used * 2 > fm_value.ammo.count}} - {{:fm_value.ammo.count?fm_value.ammo.count:0}}/{{:fm_value.ammo.max?fm_value.ammo.max:0}} - {{else}} - {{:fm_value.ammo.count?fm_value.ammo.count:0}}/{{:fm_value.ammo.max?fm_value.ammo.max:0}} - {{/if}} - {{/if}} - - {{if(fm_value.gimbal)}} - {{:fm_value.gimbal.min}} to {{:fm_value.gimbal.max}} - {{else}} - Not installed - {{/if}} - - {{:helper.link(offset_value == null ? '-' : offset_value, null, {'fm_weapon_id' : fm_id, 'fm_offset_id' : offset_id, 'fm_offset_previous': offset_value}, null , null)}} -
- -
- {{:helper.link("BACK", null, {'leave_firemission_editing' : 1}, null , null)}} -
- -{{else data.screen_mode == 3 && data.has_firemission}} -

Fire Mission Selected: {{:data.firemission_name}}

- -

- Fire Mission Status: {{:data.firemission_message}} -

- -
-

Fire Mission Options:

- - - - - - - - - - - - - -
Target:{{:data.firemission_selected_laser}}
Direction:{{:helper.link(data.firemission_direction, null, {'change_direction' : 1}, (data.shuttle_state == "in_transit" && data.firemission_step < 2) ? null : 'disabled' , null)}}
Offset:{{:helper.link(data.firemission_offset, null, {'change_offset' : 1}, (data.shuttle_state == "in_transit" && data.firemission_step < 2) ? null : 'disabled' , null)}}
-
- -
-

Fire Mission Actions:

-
- {{:helper.link('BACK', null, {'leave_firemission_execution' : '1'}, null , 'fixedLeft')}} - {{:helper.link('Activate Camera', null, {'firemission_camera' : 1}, (data.shuttle_state == "in_transit" && data.firemission_selected_laser) ? null : 'disabled' , 'fixedLeft')}} - {{:helper.link('Execute Fire Mission', null, {'execute_firemission' : 1}, (data.shuttle_state == "in_transit" && data.firemission_step == 0) ? null : 'disabled' , "linkDanger fixedLeftWide")}} -
-
-
-
Available Targets:
-
- {{for data.targets_data}} - {{:helper.link(value.target_name, null, {'select_laser_firemission' : value.target_tag}, (data.shuttle_state == "in_transit") ? null : 'disabled' , 'fixedLeftLongText')}} - {{empty}} - No CAS signal detected. - {{/for}} -
- -{{/if}} diff --git a/tgui/packages/tgui/interfaces/CasSim.js b/tgui/packages/tgui/interfaces/CasSim.js deleted file mode 100644 index 2346435e336a..000000000000 --- a/tgui/packages/tgui/interfaces/CasSim.js +++ /dev/null @@ -1,109 +0,0 @@ -import { useBackend } from '../backend'; -import { Button, Section, ProgressBar, NoticeBox, Box, Stack } from '../components'; -import { Window } from '../layouts'; - -export const CasSim = (_props, context) => { - const { act, data } = useBackend(context); - - const timeLeft = data.nextdetonationtime - data.worldtime; - const timeLeftPct = timeLeft / data.detonation_cooldown; - - const canDetonate = timeLeft < 0 && data.configuration && data.looking; - - return ( - - -
- {(!!data.configuration && ( - - Configuration : Executing {data.configuration}! - - )) || ( - - No firemission configuration loaded! - - )} - - Target dummy type : {data.dummy_mode} - - {timeLeft > 0 && ( - - - {Math.ceil(timeLeft / 10)} seconds until the console's - processors finish cooling! - - - )} -
-
- - - {(!data.looking && ( -
-
-
- ); -}; diff --git a/tgui/packages/tgui/interfaces/CasSim.tsx b/tgui/packages/tgui/interfaces/CasSim.tsx new file mode 100644 index 000000000000..b81e1baafe9c --- /dev/null +++ b/tgui/packages/tgui/interfaces/CasSim.tsx @@ -0,0 +1,106 @@ +import { useBackend } from '../backend'; +import { Box, Button, Section, ProgressBar, NoticeBox, Stack } from '../components'; + +interface CasSimData { + configuration: any; + looking: 0 | 1; + dummy_mode: string; + worldtime: number; + nextdetonationtime: number; + detonation_cooldown: number; +} + +export const CasSim = (_props, context) => { + const { act, data } = useBackend(context); + + const timeLeft = data.nextdetonationtime - data.worldtime; + const timeLeftPct = timeLeft / data.detonation_cooldown; + + const canDetonate = timeLeft < 0 && data.configuration && data.looking; + + return ( + +
+ {(!!data.configuration && ( + + Configuration : Executing {data.configuration}! + + )) || ( + No firemission configuration loaded! + )} + Target dummy type : {data.dummy_mode} + {timeLeft > 0 && ( + + + {Math.ceil(timeLeft / 10)} seconds until the console's + processors finish cooling! + + + )} +
+
+ + + {(!data.looking && ( +
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/CrtPanel.tsx b/tgui/packages/tgui/interfaces/CrtPanel.tsx new file mode 100644 index 000000000000..5745bd29c5a9 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CrtPanel.tsx @@ -0,0 +1,20 @@ +import { classes } from 'common/react'; +import { Box } from '../components'; +import { BoxProps } from '../components/Box'; +interface CrtPanelProps extends BoxProps { + color: 'green' | 'yellow' | 'blue'; +} +export const CrtPanel = (props: CrtPanelProps) => { + return ( +
+ + {props.children} + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/DropshipWeaponsConsole.tsx b/tgui/packages/tgui/interfaces/DropshipWeaponsConsole.tsx new file mode 100644 index 000000000000..629191b3ba70 --- /dev/null +++ b/tgui/packages/tgui/interfaces/DropshipWeaponsConsole.tsx @@ -0,0 +1,366 @@ +import { useBackend } from '../backend'; +import { Window } from '../layouts'; +import { Box, Divider, Flex, Stack } from '../components'; +import { CasSim } from './CasSim'; +import { MfdPanel, MfdProps } from './MfdPanels/MultifunctionDisplay'; +import { CameraMfdPanel } from './MfdPanels/CameraPanel'; +import { EquipmentMfdPanel } from './MfdPanels/EquipmentPanel'; +import { MapMfdPanel } from './MfdPanels/MapPanel'; +import { WeaponMfdPanel } from './MfdPanels/WeaponPanel'; +import { SupportMfdPanel } from './MfdPanels/SupportPanel'; +import { FiremissionMfdPanel } from './MfdPanels/FiremissionPanel'; +import { TargetAquisitionMfdPanel } from './MfdPanels/TargetAquisition'; +import { mfdState } from './MfdPanels/stateManagers'; +import { Dpad } from './common/Dpad'; + +export interface DropshipProps { + equipment_data: Array; + medevac_targets: Array; + fulton_targets: Array; + selected_eqp: number; + tactical_map_ref?: string; + camera_map_ref?: string; + camera_target_id?: string; + targets_data: Array; +} + +type MedevacTargets = { + area: string; + occupant: string; + ref: string; + triage_card?: string; + damage?: { + hp: number; + brute: number; + oxy: number; + tox: number; + fire: number; + undefib: number; + }; +}; + +type LazeTarget = { + target_name: string; + target_tag: number; +}; + +export type DropshipEquipment = { + name: string; + shorthand: string; + eqp_tag: number; + is_missile: 0 | 1; + is_weapon: 0 | 1; + is_interactable: 0 | 1; + mount_point: number; + ammo_name: string; + ammo?: number; + burst?: number; + max_ammo?: number; + firemission_delay?: number; + data?: any; +}; + +const xOffset = 40; +const yOffset = 0; +const xLookup = (index: number) => [0, 40, 80, 120][index] + xOffset; +const yLookup = (index: number) => [150, 20, 20, 150][index] + yOffset; +const OutlineColor = '#00e94e'; +const OutlineWidth = '2'; + +const DrawShipOutline = () => { + const drawLine = (pos0, pos1) => ( + + ); + return ( + <> + {drawLine(0, 1)} + {drawLine(1, 2)} + {drawLine(2, 3)} + + ); +}; + +const DrawWeapon = (props: { weapon: DropshipEquipment }, context) => { + const { data, act } = useBackend(context); + const position = props.weapon.mount_point; + const index = position - 1; + const x = xLookup(index); + const y = yLookup(index); + return ( + <> + + act('select_equipment', { 'equipment_id': props.weapon.eqp_tag }) + } + /> + + {props.weapon.shorthand} + + + ); +}; + +const WeaponStatsPanel = (props: { + slot: number; + weapon?: DropshipEquipment; +}) => { + if (props.weapon === undefined) { + return ; + } + return ( + + {props.weapon.name ?? 'Empty'} + {props.weapon.is_missile === 0 && props.weapon.ammo !== null && ( + + Ammo: {props.weapon?.ammo ?? 'Empty'} /{' '} + {props.weapon.max_ammo ?? 'Empty'} + + )} + {props.weapon?.is_missile === 1 && ( + + Loaded:
+ {props.weapon.ammo_name} +
+ )} + {props.weapon?.ammo === null && Empty} +
+ ); +}; + +const EmptyWeaponStatsPanel = (props: { slot: number }) => { + return ( + + Bay {props.slot} is empty + + ); +}; + +const DropshipWeaponsPanel = (props: { + equipment: Array; +}) => { + const weapons = props.equipment.filter((x) => x.is_weapon === 1); + const support = props.equipment.filter((x) => x.is_weapon === 0); + return ( + + + + + + x.mount_point === 2)} + /> + + + + + + x.mount_point === 1)} + /> + + + + + + + + + {weapons.map((x) => ( + + ))} + + + + + {support.map((x) => ( + {x.name} + ))} + + + + + + + + x.mount_point === 3)} + /> + + + + + + x.mount_point === 4)} + /> + + + + + + ); +}; + +const LcdPanel = (props, context) => { + const { data } = useBackend(context); + return ( + + + + ); +}; + +const FiremissionSimulationPanel = (props, context) => { + return ( + + + + ); +}; + +const FiremissionsSimMfdPanel = (props: MfdProps, context) => { + const { setPanelState } = mfdState(context, props.panelStateId); + return ( + setPanelState(''), + }, + ]}> + + + ); +}; + +const WeaponsMfdPanel = (props, context) => { + return ( + + + + ); +}; + +const BaseMfdPanel = (props: MfdProps, context) => { + const { setPanelState } = mfdState(context, props.panelStateId); + + return ( + setPanelState('equipment') }, + { + children: 'F-MISS', + onClick: () => setPanelState('firemission'), + }, + {}, + { + children: 'TARGETS', + onClick: () => setPanelState('target-aquisition'), + }, + ]} + bottomButtons={[ + {}, + { children: 'MAPS', onClick: () => setPanelState('map') }, + { children: 'CAMS', onClick: () => setPanelState('camera') }, + ]}> + +
+

U.S.C.M.

+

Dropship Weapons Control System

+

UA Northbridge

+

V 0.1

+
+
+
+ ); +}; + +const PrimaryPanel = (props: MfdProps, context) => { + const { panelState } = mfdState(context, props.panelStateId); + switch (panelState) { + case 'camera': + return ; + case 'equipment': + return ; + case 'map': + return ; + case 'weapons': + return ; + case 'firemission': + return ; + case 'firemission-sim': + return ; + case 'target-aquisition': + return ; + case 'weapon': + return ; + case 'support': + return ; + default: + return ; + } +}; + +export const DropshipWeaponsConsole = () => { + return ( + + + + + + + + + + + + + + + + Offset +
+ Calibration +
+ +
+
+ + + + +
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/CameraPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/CameraPanel.tsx new file mode 100644 index 000000000000..f3a1197e9802 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/CameraPanel.tsx @@ -0,0 +1,37 @@ +import { MfdProps, MfdPanel } from './MultifunctionDisplay'; +import { ByondUi } from '../../components'; +import { useBackend } from '../../backend'; +import { Box } from '../../components'; +import { mfdState } from './stateManagers'; +import { CameraProps } from './types'; + +export const CameraMfdPanel = (props: MfdProps, context) => { + const { act } = useBackend(context); + const { setPanelState } = mfdState(context, props.panelStateId); + return ( + act('nvg-enable') }, + { children: 'nvgoff', onClick: () => act('nvg-disable') }, + ]} + bottomButtons={[{ children: 'EXIT', onClick: () => setPanelState('') }]}> + + + ); +}; + +const CameraPanel = (_, context) => { + const { data } = useBackend(context); + return ( + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/EquipmentPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/EquipmentPanel.tsx new file mode 100644 index 000000000000..05a500563b52 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/EquipmentPanel.tsx @@ -0,0 +1,350 @@ +import { useBackend } from '../../backend'; +import { Box } from '../../components'; +import { DropshipEquipment } from '../DropshipWeaponsConsole'; +import { MfdProps, MfdPanel } from './MultifunctionDisplay'; +import { mfdState, useEquipmentState, useWeaponState } from './stateManagers'; +import { EquipmentContext } from './types'; + +const equipment_xs = [140, 160, 320, 340, 180, 300, 240, 240, 240, 140, 340]; +const equipment_ys = [120, 100, 100, 120, 100, 100, 260, 300, 340, 320, 320]; + +const DrawWeapon = (props: { x: number; y: number }, context) => { + return ( + + ); +}; + +const DrawEquipmentBox = (props: { x: number; y: number }, context) => { + return ( + + ); +}; + +const equipment_text_xs = [ + 100, 120, 360, 380, 180, 320, 250, 250, 250, 100, 400, +]; +const equipment_text_ys = [120, 60, 60, 120, 20, 20, 240, 280, 320, 320, 320]; + +const DrawWeaponText = (props: { + x: number; + y: number; + desc: string; + sub_desc?: string; +}) => { + return ( + + {props.desc.split(' ').map((x) => ( + + {x} + + ))} + + {props.sub_desc && ( + + {props.sub_desc} + + )} + + ); +}; + +const DrawWeaponEquipment = (props: DropshipEquipment) => { + return ( + <> + + + + ); +}; + +const DrawMiscEquipment = (props: DropshipEquipment, context) => { + return ( + <> + + + + ); +}; + +const DrawEquipment = (props, context) => { + const { data } = useBackend(context); + return ( + <> + {data.equipment_data.map((x) => { + if (x.is_weapon) { + return ; + } + return ; + })} + + ); +}; + +const DrawDropshipOutline = () => { + return ( + <> + {/* cockpit */} + + + {/* left body */} + + + {/* left weapon */} + + {/* left engine */} + + + {/* left tail */} + + + {/* right body */} + + {/* right weapon */} + + + {/* right engine */} + + + {/* right tail */} + + + ); +}; +const DrawAirlocks = () => { + return ( + <> + {/* cockpit door */} + + {/* left airlock */} + + {/* right airlock */} + + {/* rear ramp */} + + + ); +}; + +const EquipmentPanel = () => { + return ( + + + + + + + + + + + + + + + + + + + + + + ); +}; + +const ShipOutline = () => { + return ; +}; + +export const EquipmentMfdPanel = (props: MfdProps, context) => { + const { data } = useBackend(context); + const { setPanelState } = mfdState(context, props.panelStateId); + + const { setWeaponState } = useWeaponState(context, props.panelStateId); + + const { setEquipmentState } = useEquipmentState(context, props.panelStateId); + + const weap1 = data.equipment_data.find((x) => x.mount_point === 1); + const weap2 = data.equipment_data.find((x) => x.mount_point === 2); + const weap3 = data.equipment_data.find((x) => x.mount_point === 3); + const weap4 = data.equipment_data.find((x) => x.mount_point === 4); + const support1 = data.equipment_data.find((x) => x.mount_point === 7); + const support2 = data.equipment_data.find((x) => x.mount_point === 8); + const support3 = data.equipment_data.find((x) => x.mount_point === 9); + + const elec1 = data.equipment_data.find((x) => x.mount_point === 5); + const elec2 = data.equipment_data.find((x) => x.mount_point === 6); + + const generateWeaponButton = (equip: DropshipEquipment) => { + return { + children: equip.shorthand, + onClick: () => { + setWeaponState(equip.mount_point); + setPanelState('weapon'); + }, + }; + }; + + const generateEquipmentButton = (equip: DropshipEquipment) => { + return { + children: equip.shorthand, + onClick: () => { + setEquipmentState(equip.mount_point); + setPanelState('support'); + }, + }; + }; + + const generateButton = (equip: DropshipEquipment) => { + return equip.is_weapon + ? generateWeaponButton(equip) + : generateEquipmentButton(equip); + }; + + return ( + setPanelState('firemission'), + }, + {}, + {}, + ]} + leftButtons={[ + weap2 ? generateButton(weap2) : {}, + weap1 ? generateButton(weap1) : {}, + support1 ? generateButton(support1) : {}, + support2 ? generateButton(support2) : {}, + support3 ? generateButton(support3) : {}, + ]} + rightButtons={[ + weap3 ? generateButton(weap3) : {}, + weap4 ? generateButton(weap4) : {}, + elec1 ? generateButton(elec1) : {}, + elec2 ? generateButton(elec2) : {}, + {}, + ]} + bottomButtons={[ + { + children: 'EXIT', + onClick: () => setPanelState(''), + }, + ]}> + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/FiremissionPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/FiremissionPanel.tsx new file mode 100644 index 000000000000..fd71dab8f045 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/FiremissionPanel.tsx @@ -0,0 +1,580 @@ +import { MfdPanel, MfdProps } from './MultifunctionDisplay'; +import { Box, Button, Divider, Icon, Input, Stack } from '../../components'; +import { useBackend, useLocalState } from '../../backend'; +import { CasFiremission, FiremissionContext } from './types'; +import { range } from 'common/collections'; +import { DropshipEquipment, DropshipProps } from '../DropshipWeaponsConsole'; +import { fmEditState, fmState, fmWeaponEditState, mfdState } from './stateManagers'; + +const sortWeapons = (a: DropshipEquipment, b: DropshipEquipment) => { + return (a?.mount_point ?? 0) < (b?.mount_point ?? 0) ? -1 : 1; +}; + +const CreateFiremissionPanel = (props, context) => { + const { act } = useBackend(context); + const [fmName, setFmName] = useLocalState(context, 'fmname', ''); + return ( + + +

Create Fire Mission

+
+ + Firemission Name{' '} + setFmName(value)} + onEnter={() => { + if (fmName === '') { + return; + } + act('firemission-create', { + firemission_name: fmName, + firemission_length: 12, + }); + setFmName(''); + }} + /> + +
+ ); +}; + +const FiremissionList = (props, context) => { + const { data } = useBackend(context); + return ( + + +

Existing Fire Missions

+
+ + {data.firemission_data.map((x, i) => ( + + FM {i + 1}. {x.name} + + ))} + +
+ ); +}; + +const FiremissionMfdHomePage = (props: MfdProps, context) => { + const { setSelectedFm } = fmState(context, props.panelStateId); + const [fmName, setFmName] = useLocalState(context, 'fmname', ''); + const { data, act } = useBackend(context); + const { setPanelState } = mfdState(context, props.panelStateId); + + const firemission_mapper = (x: number) => { + const firemission = + data.firemission_data.length > x ? data.firemission_data[x] : undefined; + return { + children: firemission ? ( +
+ FM {x + 1}
{firemission?.name} +
+ ) : undefined, + onClick: () => setSelectedFm(firemission?.name), + }; + }; + + const [fmOffset, setFmOffset] = useLocalState( + context, + `${props.panelStateId}_fm_select_offset`, + 0 + ); + + const left_firemissions = range(fmOffset, fmOffset + 5).map( + firemission_mapper + ); + const right_firemissions = range(fmOffset + 5, fmOffset + 10).map( + firemission_mapper + ); + + return ( + { + act('firemission-create', { + firemission_name: fmName, + firemission_length: 12, + }); + setFmName(''); + }, + } + : {}, + { + children: , + onClick: () => { + if (fmOffset >= 1) { + setFmOffset(fmOffset - 1); + } + }, + }, + ]} + bottomButtons={[ + { + children: 'EXIT', + onClick: () => setPanelState(''), + }, + {}, + {}, + {}, + { + children: , + onClick: () => { + if (fmOffset + 8 < data.firemission_data.length) { + setFmOffset(fmOffset + 1); + } + }, + }, + ]}> + + + + + + + + + + + + + + + + + + ); +}; + +interface GimbalInfo { + min: number; + max: number; + values: string[]; +} + +const ViewFiremissionMfdPanel = ( + props: MfdProps & { firemission: CasFiremission }, + context +) => { + const { data, act } = useBackend(context); + const { setPanelState } = mfdState(context, props.panelStateId); + const { setSelectedFm } = fmState(context, props.panelStateId); + const { editFm, setEditFm } = fmEditState(context, props.panelStateId); + const { editFmWeapon, setEditFmWeapon } = fmWeaponEditState( + context, + props.panelStateId + ); + + const rightButtons = [ + editFmWeapon === undefined + ? {} + : { children: 'BACK', onClick: () => setEditFmWeapon(undefined) }, + ...data.equipment_data + .filter((x) => x.is_weapon === 1) + .sort((a, b) => (a.mount_point < b.mount_point ? -1 : 1)) + .map((x) => { + return { + children: `${x.shorthand} ${x.mount_point}`, + onClick: () => setEditFmWeapon(x.mount_point), + }; + }), + ]; + + const firemission = props.firemission; + return ( + { + act('firemission-delete', { + firemission_name: firemission.mission_tag, + }); + setSelectedFm(undefined); + }, + }, + { children: 'F-MISS', onClick: () => setSelectedFm(undefined) }, + editFm + ? { children: 'VIEW', onClick: () => setEditFm(false) } + : { children: 'EDIT', onClick: () => setEditFm(true) }, + ]} + bottomButtons={[ + { + children: 'EXIT', + onClick: () => setPanelState(''), + }, + ]} + rightButtons={editFm === true ? rightButtons : []}> + + + + + + + + +

Firemission:

+
+ +

{firemission.name}

+
+
+
+ + + +
+
+ +
+
+
+ ); +}; + +const FiremissionView = (props: MfdProps & { fm: CasFiremission }, context) => { + const { data } = useBackend(context); + + const { editFm } = fmEditState(context, props.panelStateId); + + const { editFmWeapon } = fmWeaponEditState(context, props.panelStateId); + + const weaponData = props.fm.records + .map((x) => data.equipment_data.find((y) => y.mount_point === x.weapon)) + .filter((x) => x !== undefined) + .sort(sortWeapons) as Array; + + const selectedWeapon = weaponData.find((x) => x.mount_point === editFmWeapon); + const displayDetail = editFm; + return ( + + + + Weapon + Ammunition + {!displayDetail && ( + <> + Consumption + + + )} + {displayDetail && ( + <> + Gimbals + Fire Delay + Offset + + )} + + + + + {range(1, 13).map((x) => ( + + {x} + + ))} + + + + + + + {!editFm && + weaponData.map((x) => ( + + + + ))} + {editFm && selectedWeapon === undefined && ( + Select weapon on right panel + )} + {editFm && selectedWeapon && ( + + + + )} + + ); +}; + +const gimbals: GimbalInfo[] = [ + { min: -1, max: -1, values: [] }, + { min: -6, max: 0, values: ['-6', '-5', '-4', '-3', '-2', '-1', '0', '-'] }, + { min: -6, max: 0, values: ['-6', '-5', '-4', '-3', '-2', '-1', '0', '-'] }, + { min: 0, max: 6, values: ['-', '0', '1', '2', '3', '4', '5', '6'] }, + { min: 0, max: 6, values: ['-', '0', '1', '2', '3', '4', '5', '6'] }, +]; + +const OffsetOverview = ( + props: MfdProps & { fm: CasFiremission; equipment: DropshipEquipment } +) => { + const weaponFm = props.fm.records.find( + (x) => x.weapon === props.equipment.mount_point + ); + if (weaponFm === undefined) { + return <>error; + } + const ammoConsumption = weaponFm.offsets + .map((x) => (x !== '-' ? props.equipment.burst ?? 0 : 0)) + .reduce((accumulator, currentValue) => accumulator + currentValue, 0); + return ( + <> + + {props.equipment.shorthand} {props.equipment.mount_point} + + + {props.equipment.ammo} / {props.equipment.max_ammo} + + + {ammoConsumption} + + + ); +}; + +const OffsetDetailed = ( + props: MfdProps & { + fm: CasFiremission; + equipment: DropshipEquipment; + } +) => { + const availableGimbals = gimbals[props.equipment.mount_point]; + const weaponFm = props.fm.records.find( + (x) => x.weapon === props.equipment.mount_point + ); + if (weaponFm === undefined) { + return <>error; + } + const ammoConsumption = weaponFm.offsets + .map((x) => (x === '-' ? props.equipment.burst : 0)) + .reduce( + (accumulator, currentValue) => (accumulator ?? 0) + (currentValue ?? 0), + 0 + ); + return ( + <> + + {props.equipment.shorthand} {props.equipment.mount_point} + + + {props.equipment.ammo} / {props.equipment.max_ammo} using{' '} + {ammoConsumption} per run. + + + {availableGimbals.min} to {availableGimbals.max} + + + {(props.equipment.firemission_delay ?? 0) - 1} + + + ); +}; + +const FMOffsetError = ( + props: MfdProps & { + fm: CasFiremission; + equipment: DropshipEquipment; + displayDetail?: boolean; + } +) => { + return ( + + {props.displayDetail ? ( + + ) : ( + + )} + + + + Unable to set firemission offsets. +
+ Offsets depend on ammunition. +
+ Load ammunition to adjust. +
+
+ ); +}; + +const FMOffsetStack = ( + props: MfdProps & { + fm: CasFiremission; + equipment: DropshipEquipment; + displayDetail?: boolean; + }, + context +) => { + const { fm } = props; + const { act } = useBackend(context); + const offsets = props.fm.records.find( + (x) => x.weapon === props.equipment.mount_point + )?.offsets; + + const { editFm } = fmEditState(context, props.panelStateId); + const availableGimbals = gimbals[props.equipment.mount_point]; + + const firemissionOffsets = props.equipment.firemission_delay ?? 0; + + if (firemissionOffsets === 0) { + return ; + } + + const availableMap = range(0, 13).map((_) => true); + offsets?.forEach((x, index) => { + if (x === undefined || x === '-') { + return; + } + // if offset is 0 then not allowed on strike. + if (firemissionOffsets === 0) { + range(0, availableMap.length - 1).forEach( + (value) => (availableMap[value] = false) + ); + return; + } + const indexMin = Math.max(index - firemissionOffsets + 1, 0); + const indexMax = Math.max( + Math.min(index + firemissionOffsets, availableMap.length - 1), + indexMin + ); + range(indexMin, indexMax).forEach((value) => (availableMap[value] = false)); + }); + + return ( + + {props.displayDetail ? ( + + ) : ( + + )} + + + {editFm && + availableGimbals.values.map((x) => ( + + {x === '-' ? 'UNSET' : x} + + ))} + + + + + + {editFm === false && + offsets && + offsets.map((x, i) => ( + + {x} + + ))} + + {editFm === true && + offsets && + offsets.map((x, i) => { + if (availableMap[i] === false && x === '-') { + return ( + + WEAPON BUSY + + ); + } + if (props.equipment.firemission_delay === 0) { + return ( + + + Ammo unusable for firemissions + + + ); + } + return ( + + + {availableGimbals.values.map((y) => { + const is_selected = x.toString() === y; + return ( + + + + ); + })} + + + ); + })} + + ); +}; + +export const FiremissionMfdPanel = (props: MfdProps, context) => { + const { data, act } = useBackend(context); + const { selectedFm } = fmState(context, props.panelStateId); + const firemission = data.firemission_data.find((x) => x.name === selectedFm); + if (firemission === undefined) { + return ; + } + return ( + + ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/FultonPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/FultonPanel.tsx new file mode 100644 index 000000000000..05d33e51a8d1 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/FultonPanel.tsx @@ -0,0 +1,161 @@ +import { MfdPanel, MfdProps } from './MultifunctionDisplay'; +import { Box, Stack } from '../../components'; +import { useBackend, useLocalState } from '../../backend'; +import { mfdState, useEquipmentState } from './stateManagers'; +import { range } from 'common/collections'; +import { Icon } from '../../components'; +import { FultonProps } from './types'; + +export const FultonMfdPanel = (props: MfdProps, context) => { + const { data, act } = useBackend(context); + const [fulltonOffset, setFultonOffset] = useLocalState( + context, + `${props.panelStateId}_fultonoffset`, + 0 + ); + const { setPanelState } = mfdState(context, props.panelStateId); + const { equipmentState } = useEquipmentState(context, props.panelStateId); + + const fultons = [...data.fulton_targets]; + const regex = /(\d+)/; + + const result = data.equipment_data.find( + (x) => x.mount_point === equipmentState + ); + + const fulton_mapper = (x: number) => { + const target = fultons.length > x ? fultons[x] : undefined; + return { + children: target ? (regex.exec(target) ?? [target])[0] : undefined, + onClick: () => + act('fulton-target', { + equipment_id: result?.mount_point, + ref: target, + }), + }; + }; + + const left_targets = range(fulltonOffset, fulltonOffset + 5).map( + fulton_mapper + ); + + const right_targets = range(fulltonOffset + 5, fulltonOffset + 8).map( + fulton_mapper + ); + + const all_targets = range(fulltonOffset, fulltonOffset + 8) + .map((x) => fultons[x]) + .filter((x) => x !== undefined); + + return ( + , + onClick: () => { + if (fulltonOffset >= 1) { + setFultonOffset(fulltonOffset - 1); + } + }, + }, + ...right_targets, + { + children: , + onClick: () => { + if (fulltonOffset + 8 < data.fulton_targets.length) { + setFultonOffset(fulltonOffset + 1); + } + }, + }, + ]} + bottomButtons={[ + { + children: 'EXIT', + onClick: () => setPanelState(''), + }, + ]}> + + + + + {all_targets.length > 0 && ( + + )} + {all_targets.length > 1 && ( + + )} + {all_targets.length > 2 && ( + + )} + {all_targets.length > 3 && ( + + )} + {all_targets.length > 4 && ( + + )} + + + + + +

Active Fultons

+
+ {all_targets.map((x) => ( + +

{x}

+
+ ))} +
+
+ + + {all_targets.length > 5 && ( + + )} + {all_targets.length > 6 && ( + + )} + {all_targets.length > 7 && ( + + )} + + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/MGPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/MGPanel.tsx new file mode 100644 index 000000000000..dc6df25e17c1 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/MGPanel.tsx @@ -0,0 +1,69 @@ +import { MfdPanel, MfdProps } from './MultifunctionDisplay'; +import { Box, Stack } from '../../components'; +import { DropshipEquipment } from '../DropshipWeaponsConsole'; +import { useBackend } from '../../backend'; +import { mfdState, useEquipmentState } from './stateManagers'; +import { EquipmentContext, MGSpec } from './types'; + +const MgPanel = (props: DropshipEquipment) => { + const mgData = props.data as MGSpec; + return ( + + + + + + + +

{props.name}

+
+ +

+ Health: {mgData.health} / {mgData.health_max} +

+
+ +

+ Ammo {mgData.rounds} / {mgData.max_rounds} +

+
+ +

{mgData.deployed === 1 ? 'DEPLOYED' : 'UNDEPLOYED'}

+
+
+
+ + + +
+ ); +}; + +export const MgMfdPanel = (props: MfdProps, context) => { + const { act, data } = useBackend(context); + const { setPanelState } = mfdState(context, props.panelStateId); + const { equipmentState } = useEquipmentState(context, props.panelStateId); + const mg = data.equipment_data.find((x) => x.mount_point === equipmentState); + return ( + setPanelState('equipment') }, + ]} + leftButtons={[ + { + children: 'DEPLOY', + onClick: () => + act('deploy-equipment', { equipment_id: mg?.mount_point }), + }, + ]} + bottomButtons={[ + { + children: 'EXIT', + onClick: () => setPanelState(''), + }, + ]}> + {mg && } + + ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/MapPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/MapPanel.tsx new file mode 100644 index 000000000000..83ecaac24a5c --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/MapPanel.tsx @@ -0,0 +1,37 @@ +import { useBackend } from '../../backend'; +import { Box } from '../../components'; +import { MfdPanel, MfdProps } from './MultifunctionDisplay'; +import { ByondUi } from '../../components'; +import { MapProps } from './types'; +import { mfdState } from './stateManagers'; + +export const MapMfdPanel = (props: MfdProps, context) => { + const { setPanelState } = mfdState(context, props.panelStateId); + return ( + setPanelState(''), + }, + ]}> + + + ); +}; + +const MapPanel = (_, context) => { + const { data } = useBackend(context); + return ( + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/MedevacPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/MedevacPanel.tsx new file mode 100644 index 000000000000..634b4ef2a52e --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/MedevacPanel.tsx @@ -0,0 +1,208 @@ +import { MfdProps, MfdPanel } from './MultifunctionDisplay'; +import { Box, Divider, Flex, Stack } from '../../components'; +import { useBackend, useLocalState } from '../../backend'; +import { range } from 'common/collections'; +import { Icon } from '../../components'; +import { mfdState, useEquipmentState } from './stateManagers'; +import { MedevacContext, MedevacTargets } from './types'; + +const MedevacOccupant = (props: { data: MedevacTargets }) => ( + + + + + {props.data.occupant ?? 'Empty'} + {props.data.area ?? 'Unknown'} + + + + + + HP +
+ {props.data.damage?.hp} +
+ + Brute +
+ {props.data.damage?.brute} +
+ + Fire +
+ {props.data.damage?.fire} +
+ + Tox +
+ {props.data.damage?.tox} +
+ + Oxy +
{props.data.damage?.oxy} +
+
+
+
+
+); + +export const MedevacMfdPanel = (props: MfdProps, context) => { + const [medevacOffset, setMedevacOffset] = useLocalState( + context, + `${props.panelStateId}_medevacoffset`, + 0 + ); + const { setPanelState } = mfdState(context, props.panelStateId); + const { equipmentState } = useEquipmentState(context, props.panelStateId); + + const { data, act } = useBackend(context); + + const result = data.equipment_data.find( + (x) => x.mount_point === equipmentState + ); + const medevacs = data.medevac_targets === null ? [] : data.medevac_targets; + const medevac_mapper = (x: number) => { + const target = medevacs.length > x ? medevacs[x] : undefined; + return { + children: target ? target.occupant?.split(' ')[0] ?? 'Empty' : undefined, + onClick: () => + act('medevac-target', { + equipment_id: result?.mount_point, + ref: target?.ref, + }), + }; + }; + + const left_targets = range(medevacOffset, medevacOffset + 5).map( + medevac_mapper + ); + + const right_targets = range(medevacOffset + 5, medevacOffset + 8).map( + medevac_mapper + ); + + const all_targets = range(medevacOffset, medevacOffset + 8) + .map((x) => data.medevac_targets[x]) + .filter((x) => x !== undefined); + return ( + , + onClick: () => { + if (medevacOffset >= 1) { + setMedevacOffset(medevacOffset - 1); + } + }, + }, + ...right_targets, + { + children: , + onClick: () => { + if (medevacOffset + 8 < data.medevac_targets.length) { + setMedevacOffset(medevacOffset + 1); + } + }, + }, + ]} + topButtons={[ + { + children: 'EQUIP', + onClick: () => setPanelState('equipment'), + }, + ]} + bottomButtons={[ + { + children: 'EXIT', + onClick: () => setPanelState(''), + }, + ]}> + + + + + {all_targets.length > 0 && ( + + )} + {all_targets.length > 1 && ( + + )} + {all_targets.length > 2 && ( + + )} + {all_targets.length > 3 && ( + + )} + {all_targets.length > 4 && ( + + )} + + + + + +

Medevac Requests

+
+ {all_targets.map((x) => ( + <> + + + + + + ))} +
+
+ + + {all_targets.length > 5 && ( + + )} + {all_targets.length > 6 && ( + + )} + {all_targets.length > 7 && ( + + )} + + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/MultifunctionDisplay.tsx b/tgui/packages/tgui/interfaces/MfdPanels/MultifunctionDisplay.tsx new file mode 100644 index 000000000000..9df7eaffcde4 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/MultifunctionDisplay.tsx @@ -0,0 +1,152 @@ +import { useBackend } from '../../backend'; +import { Button, Flex } from '../../components'; +import { CrtPanel } from '../CrtPanel'; +import { Table, TableCell, TableRow } from '../../components/Table'; +import { InfernoNode } from 'inferno'; +import { ButtonProps } from './types'; +import { classes } from 'common/react'; + +export interface MfdProps { + panelStateId: string; + topButtons?: Array; + leftButtons?: Array; + rightButtons?: Array; + bottomButtons?: Array; + children?: InfernoNode; +} + +export const MfdButton = (props: ButtonProps, context) => { + const { act } = useBackend(context); + return ( + + ); +}; + +export const EmptyMfdButton = () => { + return ; +}; + +export const HorizontalPanel = ( + props: { buttons: Array }, + context +) => { + return ( + + {props.buttons.map((x, i) => ( + + {x ? : } + + ))} + + ); +}; + +export const VerticalPanel = ( + props: { buttons?: Array }, + context +) => { + return ( + + {props.buttons?.map((x, i) => ( + + {x ? : } + + ))} + + ); +}; + +const HexScrew = () => { + return ( + + + + + ); +}; + +export const MfdPanel = (props: MfdProps) => { + const topProps = props.topButtons ?? []; + const botProps = props.bottomButtons ?? []; + const leftProps = props.leftButtons ?? []; + const rightProps = props.rightButtons ?? []; + + const topButtons = Array.from({ length: 5 }).map((_, i) => topProps[i] ?? {}); + const bottomButtons = Array.from({ length: 5 }).map( + (_, i) => botProps[i] ?? {} + ); + const leftButtons = Array.from({ length: 5 }).map( + (_, i) => leftProps[i] ?? {} + ); + const rightButtons = Array.from({ length: 5 }).map( + (_, i) => rightProps[i] ?? {} + ); + return ( + + + + + + + + + + + + + + + + + + + {props.children} + + + + + + + + + + + + + + + + + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/SentryPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/SentryPanel.tsx new file mode 100644 index 000000000000..d8ea220ec986 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/SentryPanel.tsx @@ -0,0 +1,89 @@ +import { MfdPanel, MfdProps } from './MultifunctionDisplay'; +import { Box, Stack } from '../../components'; +import { DropshipEquipment } from '../DropshipWeaponsConsole'; +import { useBackend } from '../../backend'; +import { mfdState, useEquipmentState } from './stateManagers'; +import { EquipmentContext, SentrySpec } from './types'; + +const SentryPanel = (props: DropshipEquipment, context) => { + const sentryData = props.data as SentrySpec; + return ( + + + + + + + +

{props.name}

+
+ +

+ Health: {sentryData.health} / {sentryData.health_max} +

+
+ +

+ Ammo {sentryData.rounds} / {sentryData.max_rounds} +

+
+ +

{sentryData.deployed === 1 ? 'DEPLOYED' : 'UNDEPLOYED'}

+
+ +

+ {sentryData.engaged === 1 + ? 'ENGAGED' + : sentryData.deployed === 1 + ? 'STANDBY' + : 'OFFLINE'} +

+
+
+
+ + + +
+ ); +}; + +export const SentryMfdPanel = (props: MfdProps, context) => { + const { act, data } = useBackend(context); + const { setPanelState } = mfdState(context, props.panelStateId); + const { equipmentState } = useEquipmentState(context, props.panelStateId); + const sentry = data.equipment_data.find( + (x) => x.mount_point === equipmentState + ); + const deployLabel = + (sentry?.data?.deployed ?? 0) === 1 ? 'RETRACT' : 'DEPLOY'; + return ( + setPanelState('equipment') }, + ]} + leftButtons={[ + { + children: deployLabel, + onClick: () => + act('deploy-equipment', { equipment_id: sentry?.mount_point }), + }, + { + children: 'CAMERA', + onClick: () => + act('set-camera-sentry', { equipment_id: sentry?.mount_point }), + }, + ]} + bottomButtons={[ + { + children: 'EXIT', + onClick: () => setPanelState(''), + }, + ]}> + + {sentry && } + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/SpotlightPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/SpotlightPanel.tsx new file mode 100644 index 000000000000..ce241420497e --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/SpotlightPanel.tsx @@ -0,0 +1,60 @@ +import { MfdPanel, MfdProps } from './MultifunctionDisplay'; +import { Box, Stack } from '../../components'; +import { useBackend } from '../../backend'; +import { mfdState, useEquipmentState } from './stateManagers'; +import { EquipmentContext, SpotlightSpec } from './types'; +import { DropshipEquipment } from '../DropshipWeaponsConsole'; + +const SpotPanel = (props: DropshipEquipment) => { + const spotData = props.data as SpotlightSpec; + return ( + + + + + + + +

{props.name}

+
+
+
+ + + +
+ ); +}; + +export const SpotlightMfdPanel = (props: MfdProps, context) => { + const { act, data } = useBackend(context); + const { setPanelState } = mfdState(context, props.panelStateId); + const { equipmentState } = useEquipmentState(context, props.panelStateId); + const spotlight = data.equipment_data.find( + (x) => x.mount_point === equipmentState + ); + return ( + setPanelState('equipment') }, + ]} + leftButtons={[ + { + children: 'DEPLOY', + onClick: () => + act('deploy-equipment', { equipment_id: spotlight?.mount_point }), + }, + ]} + bottomButtons={[ + { + children: 'EXIT', + onClick: () => setPanelState(''), + }, + ]}> + + {spotlight && } + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/SupportPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/SupportPanel.tsx new file mode 100644 index 000000000000..1eca123173b0 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/SupportPanel.tsx @@ -0,0 +1,62 @@ +import { useBackend } from '../../backend'; +import { MfdPanel, MfdProps } from './MultifunctionDisplay'; +import { MedevacMfdPanel } from './MedevacPanel'; +import { FultonMfdPanel } from './FultonPanel'; +import { Box, Stack } from '../../components'; +import { SentryMfdPanel } from './SentryPanel'; +import { MgMfdPanel } from './MGPanel'; +import { SpotlightMfdPanel } from './SpotlightPanel'; +import { EquipmentContext } from './types'; +import { mfdState, useEquipmentState } from './stateManagers'; + +export const SupportMfdPanel = (props: MfdProps, context) => { + const { equipmentState } = useEquipmentState(context, props.panelStateId); + + const { setPanelState } = mfdState(context, props.panelStateId); + + const { data } = useBackend(context); + const result = data.equipment_data.find( + (x) => x.mount_point === equipmentState + ); + if (result?.shorthand === 'Medevac') { + return ; + } + if (result?.shorthand === 'Fulton') { + return ; + } + if (result?.shorthand === 'Sentry') { + return ; + } + if (result?.shorthand === 'MG') { + return ; + } + if (result?.shorthand === 'Spotlight') { + return ; + } + return ( + setPanelState(''), + }, + ]}> + + + +

Component {result?.shorthand} not found

+
+ +

Is this authorised equipment?

+
+ +

+ Contact your local WY representative for further upgrade options +

+
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/TargetAquisition.tsx b/tgui/packages/tgui/interfaces/MfdPanels/TargetAquisition.tsx new file mode 100644 index 000000000000..49f22db18104 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/TargetAquisition.tsx @@ -0,0 +1,519 @@ +import { range } from 'common/collections'; +import { useBackend, useLocalState, useSharedState } from '../../backend'; +import { Box, Icon, Stack } from '../../components'; +import { MfdProps, MfdPanel } from './MultifunctionDisplay'; +import { mfdState, useFiremissionXOffsetValue, useFiremissionYOffsetValue, useLazeTarget } from './stateManagers'; +import { CasFiremission, EquipmentContext, FiremissionContext, TargetContext } from './types'; + +const directionLookup = new Map(); +directionLookup['SOUTH'] = 2; +directionLookup['NORTH'] = 1; +directionLookup['WEST'] = 8; +directionLookup['EAST'] = 4; + +const useStrikeMode = (context) => { + const [data, set] = useSharedState( + context, + 'strike-mode', + undefined + ); + return { + strikeMode: data, + setStrikeMode: set, + }; +}; + +const useStrikeDirection = (context) => { + const [data, set] = useSharedState( + context, + 'strike-direction', + undefined + ); + return { + strikeDirection: data, + setStrikeDirection: set, + }; +}; + +const useWeaponSelectedState = (context) => { + const [data, set] = useSharedState( + context, + 'target-weapon-select', + undefined + ); + return { + weaponSelected: data, + setWeaponSelected: set, + }; +}; + +const useTargetFiremissionSelect = (context) => { + const [data, set] = useSharedState( + context, + 'target-firemission-select', + undefined + ); + return { + firemissionSelected: data, + setFiremissionSelected: set, + }; +}; + +const useTargetOffset = (context, panelId: string) => { + const [data, set] = useLocalState(context, `${panelId}_targetOffset`, 0); + return { + targetOffset: data, + setTargetOffset: set, + }; +}; + +const useTargetSubmenu = (context, panelId: string) => { + const [data, set] = useSharedState( + context, + `${panelId}_target_left`, + undefined + ); + return { + leftButtonMode: data, + setLeftButtonMode: set, + }; +}; + +const TargetLines = (props: { panelId: string }, context) => { + const { data } = useBackend< + EquipmentContext & FiremissionContext & TargetContext + >(context); + const { targetOffset } = useTargetOffset(context, props.panelId); + return ( + <> + {data.targets_data.length > targetOffset && ( + + )} + {data.targets_data.length > targetOffset + 1 && ( + + )} + {data.targets_data.length > targetOffset + 2 && ( + + )} + + {data.targets_data.length > targetOffset + 3 && ( + + )} + {data.targets_data.length > targetOffset + 4 && ( + + )} + + ); +}; + +const leftButtonGenerator = (context, panelId: string) => { + const { data } = useBackend< + EquipmentContext & FiremissionContext & TargetContext + >(context); + const { leftButtonMode, setLeftButtonMode } = useTargetSubmenu( + context, + panelId + ); + const { strikeMode, setStrikeMode } = useStrikeMode(context); + const { setStrikeDirection } = useStrikeDirection(context); + const { firemissionSelected, setFiremissionSelected } = + useTargetFiremissionSelect(context); + const { weaponSelected, setWeaponSelected } = useWeaponSelectedState(context); + const weapons = data.equipment_data.filter((x) => x.is_weapon); + if (leftButtonMode === undefined) { + return [ + { + children: 'STRIKE', + onClick: () => setLeftButtonMode('STRIKE'), + }, + { + children: 'VECTOR', + onClick: () => setLeftButtonMode('VECTOR'), + }, + ]; + } + if (leftButtonMode === 'STRIKE') { + if (strikeMode === 'weapon' && weaponSelected === undefined) { + return weapons.map((x) => { + return { + children: x.shorthand, + onClick: () => { + setWeaponSelected(x.mount_point); + setLeftButtonMode(undefined); + }, + }; + }); + } + if (strikeMode === 'firemission' && firemissionSelected === undefined) { + return data.firemission_data.map((x) => { + return { + children: x.name, + onClick: () => { + setFiremissionSelected(x); + setLeftButtonMode(undefined); + }, + }; + }); + } + return [ + { children: 'CANCEL', onClick: () => setLeftButtonMode(undefined) }, + { + children: 'WEAPON', + onClick: () => { + setWeaponSelected(undefined); + setStrikeMode('weapon'); + }, + }, + { + children: 'F-MISS', + onClick: () => { + setFiremissionSelected(undefined); + setStrikeMode('firemission'); + }, + }, + ]; + } + if (leftButtonMode === 'VECTOR') { + return [ + { children: 'CANCEL', onClick: () => setLeftButtonMode(undefined) }, + { + children: 'SOUTH', + onClick: () => { + setStrikeDirection('SOUTH'); + setLeftButtonMode(undefined); + }, + }, + { + children: 'NORTH', + onClick: () => { + setStrikeDirection('NORTH'); + setLeftButtonMode(undefined); + }, + }, + { + children: 'EAST', + onClick: () => { + setStrikeDirection('EAST'); + setLeftButtonMode(undefined); + }, + }, + { + children: 'WEST', + onClick: () => { + setStrikeDirection('WEST'); + setLeftButtonMode(undefined); + }, + }, + ]; + } + + return []; +}; + +const lazeMapper = (context, offset) => { + const { act, data } = useBackend(context); + const { setSelectedTarget } = useLazeTarget(context); + + const { fmXOffsetValue } = useFiremissionXOffsetValue(context); + const { fmYOffsetValue } = useFiremissionYOffsetValue(context); + + const target = + data.targets_data.length > offset ? data.targets_data[offset] : undefined; + const isDebug = target?.target_name.includes('debug'); + + const buttomLabel = () => { + if (isDebug) { + return 'd-' + target?.target_name.split(' ')[3]; + } + const label = target?.target_name.split(' ')[0] ?? ''; + const squad = label[0] ?? undefined; + const number = label.split('-')[1] ?? undefined; + return squad !== undefined && number !== undefined + ? `${squad}-${number}` + : target?.target_name; + }; + + return { + children: buttomLabel(), + onClick: target + ? () => { + setSelectedTarget(target.target_tag); + act('firemission-dual-offset-camera', { + 'target_id': target.target_tag, + 'x_offset_value': fmXOffsetValue, + 'y_offset_value': fmYOffsetValue, + }); + } + : () => { + act('set-camera', { 'equipment_id': null }); + setSelectedTarget(undefined); + }, + }; +}; + +export const TargetAquisitionMfdPanel = (props: MfdProps, context) => { + const { panelStateId } = props; + + const { act, data } = useBackend< + EquipmentContext & FiremissionContext & TargetContext + >(context); + + const { setPanelState } = mfdState(context, panelStateId); + const { selectedTarget, setSelectedTarget } = useLazeTarget(context); + const { strikeMode } = useStrikeMode(context); + const { strikeDirection } = useStrikeDirection(context); + const { weaponSelected } = useWeaponSelectedState(context); + const { firemissionSelected } = useTargetFiremissionSelect(context); + const { targetOffset, setTargetOffset } = useTargetOffset( + context, + panelStateId + ); + + const { fmXOffsetValue } = useFiremissionXOffsetValue(context); + const { fmYOffsetValue } = useFiremissionYOffsetValue(context); + + const lazes = range(0, 5).map((x) => + x > data.targets_data.length ? undefined : data.targets_data[x] + ); + + const strikeConfigLabel = + strikeMode === 'weapon' + ? data.equipment_data.find((x) => x.mount_point === weaponSelected)?.name + : firemissionSelected !== undefined + ? data.firemission_data.find( + (x) => x.mission_tag === firemissionSelected.mission_tag + )?.name + : 'NONE'; + + const lazeIndex = lazes.findIndex((x) => x?.target_tag === selectedTarget); + const strikeReady = strikeMode !== undefined && lazeIndex !== -1; + + const targets = range(targetOffset, targetOffset + 5).map((x) => + lazeMapper(context, x) + ); + + const getLastName = () => { + const target = data.targets_data[data.targets_data.length - 1] ?? undefined; + const isDebug = target?.target_name.includes('debug'); + if (isDebug) { + return 'debug ' + target.target_name.split(' ')[3]; + } + const label = target?.target_name.split(' ')[0] ?? ''; + const squad = label[0] ?? undefined; + const number = label.split('-')[1] ?? undefined; + + return squad !== undefined && number !== undefined + ? `${squad}-${number}` + : target?.target_name; + }; + + if ( + selectedTarget && + data.targets_data.find((x) => `${x.target_tag}` === `${selectedTarget}`) === + undefined + ) { + setSelectedTarget(undefined); + } + + return ( + { + if (strikeMode === undefined) { + return; + } + if (strikeMode === 'firemission') { + act('firemission-execute', { + tag: firemissionSelected?.mission_tag, + direction: strikeDirection + ? directionLookup[strikeDirection] + : 1, + target_id: selectedTarget, + offset_x_value: fmXOffsetValue, + offset_y_value: fmYOffsetValue, + }); + } + if (strikeMode === 'weapon') { + act('fire-weapon', { eqp_tag: weaponSelected }); + } + }, + }, + {}, + {}, + {}, + { + children: targetOffset > 0 ? : undefined, + onClick: () => { + if (targetOffset > 0) { + setTargetOffset(targetOffset - 1); + } + }, + }, + ]} + bottomButtons={[ + { + children: 'EXIT', + onClick: () => setPanelState(''), + }, + {}, + {}, + {}, + { + children: + targetOffset < lazes.length ? ( + + ) : undefined, + onClick: () => { + if (targetOffset < lazes.length) { + setTargetOffset(targetOffset + 1); + } + }, + }, + ]} + leftButtons={leftButtonGenerator(context, panelStateId)} + rightButtons={targets}> + + + + + + + + + + + + + + + + + + + + +

Target Aquisition

+
+ +

Strike mode: {strikeMode?.toUpperCase() ?? 'NONE'}

+
+ +

Strike configuration {strikeConfigLabel}

+
+ +

+ Target selected:{' '} + {lazes.find((x) => x?.target_tag === selectedTarget) + ?.target_name ?? 'NONE'} +

+
+ +

Attack Vector {strikeDirection ?? 'NONE'}

+
+ +

+ Offset {fmXOffsetValue},{fmYOffsetValue} +

+
+ +

+ Guidance computer {strikeReady ? 'READY' : 'INCOMPLETE'} +

+
+
+
+ + + + + {data.targets_data.length === 0 && ( + + + NO TARGETS + + + )} + {data.targets_data.length > 0 && ( + + + SELECT + + + TARGETS + + + {Math.min(5, data.targets_data.length)} of{' '} + {data.targets_data.length} + + {data.targets_data.length > 0 && ( + <> + + LATEST + + + {getLastName()} + + + )} + + )} + + + + +
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/WeaponPanel.tsx b/tgui/packages/tgui/interfaces/MfdPanels/WeaponPanel.tsx new file mode 100644 index 000000000000..090001aa3ac9 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/WeaponPanel.tsx @@ -0,0 +1,179 @@ +import { range } from 'common/collections'; +import { useBackend } from '../../backend'; +import { Box, Stack } from '../../components'; +import { DropshipEquipment } from '../DropshipWeaponsConsole'; +import { MfdProps, MfdPanel } from './MultifunctionDisplay'; +import { mfdState, useWeaponState } from './stateManagers'; +import { LazeTarget } from './types'; + +const EmptyWeaponPanel = (props, context) => { + return
Nothing Listed
; +}; +interface EquipmentContext { + equipment_data: Array; + targets_data: Array; +} + +const getLazeButtonProps = (context) => { + const { act, data } = useBackend(context); + const lazes = range(0, 5).map((x) => + x > data.targets_data.length ? undefined : data.targets_data[x] + ); + const get_laze = (index: number) => { + const laze = lazes.find((_, i) => i === index); + if (laze === undefined) { + return { + children: '', + onClick: () => act('set-camera', { equipment_id: null }), + }; + } + return { + children: laze?.target_name.split(' ')[0] ?? 'NONE', + onClick: laze + ? () => act('set-camera', { 'equipment_id': laze.target_tag }) + : undefined, + }; + }; + return [get_laze(0), get_laze(1), get_laze(2), get_laze(3), get_laze(4)]; +}; + +const WeaponPanel = (props: { equipment: DropshipEquipment }, context) => { + return ( + + + + + ACTIONS + + {false && ( + + )} + {false && ( + + )} + {false && ( + + )} + + {false && ( + + )} + {false && ( + + )} + + + + + + +

{props.equipment.name}

+
+ +

{props.equipment.ammo_name}

+
+ +

+ Ammo {props.equipment.ammo} / {props.equipment.max_ammo} +

+
+
+
+
+ + + + + SELECT + + + TARGETS + + + + + + + + + + +
+ ); +}; + +export const WeaponMfdPanel = (props: MfdProps, context) => { + const { setPanelState } = mfdState(context, props.panelStateId); + const { weaponState } = useWeaponState(context, props.panelStateId); + const { data, act } = useBackend(context); + const weap = data.equipment_data.find((x) => x.mount_point === weaponState); + + return ( + act('fire-weapon', { eqp_tag: weap?.eqp_tag }), + }, + ]} + bottomButtons={[ + { + children: 'EXIT', + onClick: () => setPanelState(''), + }, + {}, + ]} + topButtons={[ + { + children: 'EQUIP', + onClick: () => setPanelState('equipment'), + }, + ]} + rightButtons={getLazeButtonProps(context)}> + + {weap ? : } + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/stateManagers.ts b/tgui/packages/tgui/interfaces/MfdPanels/stateManagers.ts new file mode 100644 index 000000000000..e639938eabf8 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/stateManagers.ts @@ -0,0 +1,109 @@ +import { useLocalState, useSharedState } from '../../backend'; + +export const useEquipmentState = (context, panelId: string) => { + const [data, set] = useSharedState( + context, + `${panelId}_equipmentstate`, + undefined + ); + return { + equipmentState: data, + setEquipmentState: set, + }; +}; + +export const fmState = (context, panelId: string) => { + const [data, set] = useLocalState( + context, + `${panelId}_selected_fm`, + undefined + ); + return { + selectedFm: data, + setSelectedFm: set, + }; +}; + +export const fmEditState = (context, panelId: string) => { + const [data, set] = useLocalState( + context, + `${panelId}_edit_fm`, + false + ); + return { + editFm: data, + setEditFm: set, + }; +}; + +export const fmWeaponEditState = (context, panelId: string) => { + const [data, set] = useLocalState( + context, + `${panelId}_edit_fm_weapon`, + undefined + ); + return { + editFmWeapon: data, + setEditFmWeapon: set, + }; +}; + +export const mfdState = (context, panelId: string) => { + const [data, set] = useSharedState( + context, + `${panelId}_panelstate`, + '' + ); + return { + panelState: data, + setPanelState: set, + }; +}; + +export const useWeaponState = (context, panelId: string) => { + const [data, set] = useSharedState( + context, + `${panelId}_weaponstate`, + undefined + ); + return { + weaponState: data, + setWeaponState: set, + }; +}; + +export const useFiremissionXOffsetValue = (context) => { + const [data, set] = useSharedState( + context, + 'firemission-x-offset-value', + 0 + ); + return { + fmXOffsetValue: data, + setFmXOffsetValue: set, + }; +}; + +export const useFiremissionYOffsetValue = (context) => { + const [data, set] = useSharedState( + context, + 'firemission-y-offset-value', + 0 + ); + return { + fmYOffsetValue: data, + setFmYOffsetValue: set, + }; +}; + +export const useLazeTarget = (context) => { + const [data, set] = useSharedState( + context, + 'laze-target', + undefined + ); + return { + selectedTarget: data, + setSelectedTarget: set, + }; +}; diff --git a/tgui/packages/tgui/interfaces/MfdPanels/types.ts b/tgui/packages/tgui/interfaces/MfdPanels/types.ts new file mode 100644 index 000000000000..78e7c3314b30 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MfdPanels/types.ts @@ -0,0 +1,112 @@ +import { InfernoNode } from 'inferno'; +import { DropshipEquipment } from '../DropshipWeaponsConsole'; + +export interface ButtonProps { + children?: InfernoNode; + onClick?: () => void; +} + +export type LazeTarget = { + target_name: string; + target_tag: number; +}; + +export type TargetContext = { + targets_data: Array; +}; + +export type FultonProps = { + fulton_targets: Array; + equipment_data: Array; +}; + +export type MedevacTargets = { + area: string; + occupant: string; + ref: string; + triage_card?: string; + damage?: { + hp: number; + brute: number; + oxy: number; + tox: number; + fire: number; + undefib: number; + }; +}; + +export type CameraProps = { + camera_map_ref?: string; +}; + +export type EquipmentContext = { + equipment_data: Array; +}; + +export type MedevacContext = { + medevac_targets: Array; + equipment_data: Array; +}; + +export type FiremissionContext = { + firemission_data: Array; +}; + +export type SentrySpec = { + rounds?: number; + max_rounds?: number; + name: string; + area: string; + active: 0 | 1; + index: number; + engaged?: number; + nickname: string; + health: number; + health_max: number; + kills: number; + iff_status: string[]; + camera_available: number; + deployed: number; +}; + +export type SpotlightSpec = { + name: string; +}; + +export type MGSpec = { + name: string; + health: number; + health_max: number; + rounds: number; + max_rounds: number; + deployed: 0 | 1; +}; + +export type CasFiremissionStage = { + weapon: number; + offsets: Array; +}; + +export type CasFiremission = { + name: string; + mission_length: number; + records: Array; + mission_tag: number; +}; + +export type MapProps = { + tactical_map_ref: string; +}; + +export const dirMap = (dir) => { + switch (dir) { + case 'NORTH': + return 1; + case 'SOUTH': + return 2; + case 'EAST': + return 4; + case 'WEST': + return 8; + } +}; diff --git a/tgui/packages/tgui/interfaces/common/Dpad.tsx b/tgui/packages/tgui/interfaces/common/Dpad.tsx new file mode 100644 index 000000000000..faa2264eb452 --- /dev/null +++ b/tgui/packages/tgui/interfaces/common/Dpad.tsx @@ -0,0 +1,113 @@ +import { useBackend } from '../../backend'; +import { Box, Button, Stack } from '../../components'; +import { useFiremissionXOffsetValue, useFiremissionYOffsetValue, useLazeTarget } from '../MfdPanels/stateManagers'; + +const SvgButton = ( + props: { transform?: string; onClick?: (e: any) => void }, + context +) => { + return ( + + + + + + + ); +}; + +export const Dpad = (props, context) => { + const { act } = useBackend(context); + const { selectedTarget } = useLazeTarget(context); + + const { fmXOffsetValue, setFmXOffsetValue } = + useFiremissionXOffsetValue(context); + const { fmYOffsetValue, setFmYOffsetValue } = + useFiremissionYOffsetValue(context); + + const min_value = -12; + const max_value = 12; + const updateOffset = (e, xValue, yValue) => { + if (xValue < min_value || yValue < min_value) { + return; + } + if (xValue > max_value || yValue > max_value) { + return; + } + setFmXOffsetValue(xValue); + setFmYOffsetValue(yValue); + act('firemission-dual-offset-camera', { + 'target_id': selectedTarget, + 'x_offset_value': xValue, + 'y_offset_value': yValue, + }); + }; + + return ( + + + + + + + + updateOffset(e, fmXOffsetValue - 1, fmYOffsetValue) + } + /> + + + + + + + + + updateOffset(e, fmXOffsetValue, fmYOffsetValue + 1) + } + /> + + + + + )) + )} + + + + +
+ {chosenTutorial !== null ? ( + + +
+ + + +
+
+ {chosenTutorial.description} + {completed_tutorials.indexOf(chosenTutorial.id) === -1 ? ( +
+ ) : ( + + Tutorial has been completed. + + )} + +
+
+
+
+ + + ); +}; From d7feab9569e83acb54a66c77b102d50de4ea5a1c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 29 Dec 2023 18:04:48 +0000 Subject: [PATCH 127/205] Automatic changelog for PR #5030 [ci skip] --- html/changelogs/AutoChangeLog-pr-5030.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5030.yml diff --git a/html/changelogs/AutoChangeLog-pr-5030.yml b/html/changelogs/AutoChangeLog-pr-5030.yml new file mode 100644 index 000000000000..0cce25ff019a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5030.yml @@ -0,0 +1,4 @@ +author: "Zonespace27" +delete-after: True +changes: + - rscadd: "Added a tutorial system for various roles (and just general information), find it in the lobby screen." \ No newline at end of file From 0ff2e6f1bb00d03b3d1f417849c3df724f7634d0 Mon Sep 17 00:00:00 2001 From: Cthulhu80 <122310258+Cthulhu80@users.noreply.github.com> Date: Fri, 29 Dec 2023 11:13:51 -0800 Subject: [PATCH 128/205] Fixes immobilized mobs being able to buckle onto chairs (#5317) # About the pull request #5277, fixes the issue outlined here, incapacitated marines should not be able to buckle themselves. # Explain why it's good for the game bug bad # Changelog :cl: fix: fixes immobilized mobs being able to buckle themselves /:cl: --- code/game/objects/objs.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index cc9f1fe53fea..7747a45ed9da 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -278,6 +278,11 @@ if (iszombie(user)) return + // mobs that become immobilized should not be able to buckle themselves. + if(M == user && HAS_TRAIT(user, TRAIT_IMMOBILIZED)) + to_chat(user, SPAN_WARNING("You are unable to do this in your current state.")) + return + if(density) density = FALSE if(!step(M, get_dir(M, src)) && loc != M.loc) From 68ccb744450d397030e494751cf258b3208309d0 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 29 Dec 2023 19:21:35 +0000 Subject: [PATCH 129/205] Automatic changelog for PR #5317 [ci skip] --- html/changelogs/AutoChangeLog-pr-5317.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5317.yml diff --git a/html/changelogs/AutoChangeLog-pr-5317.yml b/html/changelogs/AutoChangeLog-pr-5317.yml new file mode 100644 index 000000000000..b5f7cd72accb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5317.yml @@ -0,0 +1,4 @@ +author: "Cthulhu80" +delete-after: True +changes: + - bugfix: "fixes immobilized mobs being able to buckle themselves" \ No newline at end of file From adb5b8e46a8bb488be2a952db5ca1e24c15b7345 Mon Sep 17 00:00:00 2001 From: Paul Mullen <101871009+mullenpaul@users.noreply.github.com> Date: Fri, 29 Dec 2023 19:31:51 +0000 Subject: [PATCH 130/205] migrated js components to jsx (#5307) # About the pull request First round of refactors for TGUI-5 migration. Here all TGUI interfaces and components have been changed from .js to .jsx. This is to closer align us to the standards of tgstation. Within the components themselves there are no functional changes. Files of interest: - tgui/webpack.config.js - tgui/packages/tgui/routes.jsx - tgui/packages/tgui/interfaces/Filteriffic.jsx - tgui/packages/tgui/debug/KitchenSink.jsx The rest of the file changes should just be .js -> .jsx # Explain why it's good for the game Groundwork prep for TGUI 5 # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: refactor: tgui js components now jsx /:cl: --- tgui/packages/tgui/components/{Blink.js => Blink.jsx} | 0 .../tgui/components/{BlockQuote.js => BlockQuote.jsx} | 0 tgui/packages/tgui/components/{Button.js => Button.jsx} | 0 tgui/packages/tgui/components/{ByondUi.js => ByondUi.jsx} | 0 tgui/packages/tgui/components/{Chart.js => Chart.jsx} | 0 .../tgui/components/{Collapsible.js => Collapsible.jsx} | 0 tgui/packages/tgui/components/{ColorBox.js => ColorBox.jsx} | 0 tgui/packages/tgui/components/{Dimmer.js => Dimmer.jsx} | 0 tgui/packages/tgui/components/{Divider.js => Divider.jsx} | 0 .../components/{DraggableControl.js => DraggableControl.jsx} | 0 tgui/packages/tgui/components/{Dropdown.js => Dropdown.jsx} | 0 tgui/packages/tgui/components/{Grid.js => Grid.jsx} | 0 tgui/packages/tgui/components/{Icon.js => Icon.jsx} | 0 .../tgui/components/{InfinitePlane.js => InfinitePlane.jsx} | 0 tgui/packages/tgui/components/{Input.js => Input.jsx} | 0 tgui/packages/tgui/components/{Knob.js => Knob.jsx} | 0 .../components/{LabeledControls.js => LabeledControls.jsx} | 0 tgui/packages/tgui/components/{Modal.js => Modal.jsx} | 0 tgui/packages/tgui/components/{NoticeBox.js => NoticeBox.jsx} | 0 .../tgui/components/{NumberInput.js => NumberInput.jsx} | 0 .../tgui/components/{ProgressBar.js => ProgressBar.jsx} | 0 .../components/{RestrictedInput.js => RestrictedInput.jsx} | 0 .../tgui/components/{RoundGauge.js => RoundGauge.jsx} | 0 tgui/packages/tgui/components/{Slider.js => Slider.jsx} | 0 tgui/packages/tgui/components/{Table.js => Table.jsx} | 0 tgui/packages/tgui/components/{Tabs.js => Tabs.jsx} | 0 tgui/packages/tgui/components/{TextArea.js => TextArea.jsx} | 0 .../tgui/components/{TimeDisplay.js => TimeDisplay.jsx} | 0 tgui/packages/tgui/components/{index.js => index.jsx} | 0 tgui/packages/tgui/debug/{KitchenSink.js => KitchenSink.jsx} | 2 +- tgui/packages/tgui/interfaces/{AcidVest.js => AcidVest.jsx} | 0 .../tgui/interfaces/{AlmayerControl.js => AlmayerControl.jsx} | 0 .../{AltitudeControlConsole.js => AltitudeControlConsole.jsx} | 0 .../tgui/interfaces/{AntiAirConsole.js => AntiAirConsole.jsx} | 0 tgui/packages/tgui/interfaces/{Apc.js => Apc.jsx} | 0 .../tgui/interfaces/{AresInterface.js => AresInterface.jsx} | 0 .../tgui/interfaces/{Autodispenser.js => Autodispenser.jsx} | 0 tgui/packages/tgui/interfaces/{Autolathe.js => Autolathe.jsx} | 0 .../tgui/interfaces/{Binoculars.js => Binoculars.jsx} | 0 .../{BioSyntheticPrinter.js => BioSyntheticPrinter.jsx} | 0 .../tgui/interfaces/{BotanyEditor.js => BotanyEditor.jsx} | 0 .../interfaces/{BotanyExtractor.js => BotanyExtractor.jsx} | 0 tgui/packages/tgui/interfaces/{BrigCell.js => BrigCell.jsx} | 0 .../tgui/interfaces/{CameraConsole.js => CameraConsole.jsx} | 0 .../tgui/interfaces/{CanvasLayer.js => CanvasLayer.jsx} | 0 tgui/packages/tgui/interfaces/{CardMod.js => CardMod.jsx} | 0 .../tgui/interfaces/{Centrifuge.js => Centrifuge.jsx} | 0 tgui/packages/tgui/interfaces/{Changelog.js => Changelog.jsx} | 0 .../tgui/interfaces/{ChemDispenser.js => ChemDispenser.jsx} | 0 .../tgui/interfaces/{ChooseFruit.js => ChooseFruit.jsx} | 0 .../tgui/interfaces/{ChooseResin.js => ChooseResin.jsx} | 0 .../tgui/interfaces/{CommandTablet.js => CommandTablet.jsx} | 0 .../tgui/interfaces/{CrewConsole.js => CrewConsole.jsx} | 0 tgui/packages/tgui/interfaces/{Cryo.js => Cryo.jsx} | 0 tgui/packages/tgui/interfaces/{DemoSim.js => DemoSim.jsx} | 0 tgui/packages/tgui/interfaces/{Disposals.js => Disposals.jsx} | 0 tgui/packages/tgui/interfaces/{DrawnMap.js => DrawnMap.jsx} | 0 .../tgui/interfaces/{FaxMachine.js => FaxMachine.jsx} | 0 .../tgui/interfaces/{Filteriffic.js => Filteriffic.jsx} | 2 +- .../{FiltrationControl.js => FiltrationControl.jsx} | 0 .../tgui/interfaces/{HealthScan.js => HealthScan.jsx} | 0 .../tgui/interfaces/{HiveFaction.js => HiveFaction.jsx} | 0 .../tgui/interfaces/{HiveLeaders.js => HiveLeaders.jsx} | 0 .../tgui/interfaces/{HiveStatus.js => HiveStatus.jsx} | 0 tgui/packages/tgui/interfaces/{KeyBinds.js => KeyBinds.jsx} | 0 tgui/packages/tgui/interfaces/{KillPanel.js => KillPanel.jsx} | 0 .../tgui/interfaces/{LanguageMenu.js => LanguageMenu.jsx} | 0 tgui/packages/tgui/interfaces/{ListInput.js => ListInput.jsx} | 0 .../tgui/interfaces/{MedalsPanel.js => MedalsPanel.jsx} | 0 tgui/packages/tgui/interfaces/{Mortar.js => Mortar.jsx} | 0 .../tgui/interfaces/{NuclearBomb.js => NuclearBomb.jsx} | 0 .../{OrbitalCannonConsole.js => OrbitalCannonConsole.jsx} | 0 .../interfaces/{OverwatchConsole.js => OverwatchConsole.jsx} | 0 .../tgui/interfaces/{PartFabricator.js => PartFabricator.jsx} | 0 tgui/packages/tgui/interfaces/{PhoneMenu.js => PhoneMenu.jsx} | 0 .../tgui/interfaces/{PlayerPanel.js => PlayerPanel.jsx} | 0 .../tgui/interfaces/{PodLauncher.js => PodLauncher.jsx} | 0 tgui/packages/tgui/interfaces/{Proximity.js => Proximity.jsx} | 0 tgui/packages/tgui/interfaces/{Radio.js => Radio.jsx} | 0 .../{ResearchDoorDisplay.js => ResearchDoorDisplay.jsx} | 0 .../interfaces/{ResearchMemories.js => ResearchMemories.jsx} | 0 tgui/packages/tgui/interfaces/{STUI.js => STUI.jsx} | 0 .../{SelfDestructConsole.js => SelfDestructConsole.jsx} | 0 .../tgui/interfaces/{Sentencing.js => Sentencing.jsx} | 0 tgui/packages/tgui/interfaces/{Signaller.js => Signaller.jsx} | 0 .../tgui/interfaces/{SkillsMenu.js => SkillsMenu.jsx} | 0 tgui/packages/tgui/interfaces/{Sleeper.js => Sleeper.jsx} | 0 tgui/packages/tgui/interfaces/{Smes.js => Smes.jsx} | 0 tgui/packages/tgui/interfaces/{SquadMod.js => SquadMod.jsx} | 0 .../{StatbrowserOptions.js => StatbrowserOptions.jsx} | 0 .../{StationAlertConsole.js => StationAlertConsole.jsx} | 0 .../{SupplyDropConsole.js => SupplyDropConsole.jsx} | 0 .../interfaces/{TacmapAdminPanel.js => TacmapAdminPanel.jsx} | 0 tgui/packages/tgui/interfaces/{Tank.js => Tank.jsx} | 0 .../tgui/interfaces/{TechControl.js => TechControl.jsx} | 0 .../tgui/interfaces/{TechMemories.js => TechMemories.jsx} | 0 tgui/packages/tgui/interfaces/{TechNode.js => TechNode.jsx} | 0 .../{TeleporterConsole.js => TeleporterConsole.jsx} | 0 tgui/packages/tgui/interfaces/{Timer.js => Timer.jsx} | 0 .../tgui/interfaces/{VehicleStatus.js => VehicleStatus.jsx} | 0 tgui/packages/tgui/interfaces/{VoteMenu.js => VoteMenu.jsx} | 0 tgui/packages/tgui/interfaces/{VoxPanel.js => VoxPanel.jsx} | 0 .../tgui/interfaces/{WeaponStats.js => WeaponStats.jsx} | 0 tgui/packages/tgui/interfaces/{Wires.js => Wires.jsx} | 0 .../tgui/interfaces/{WorkingJoe.js => WorkingJoe.jsx} | 0 .../tgui/interfaces/common/{AccessList.js => AccessList.jsx} | 0 .../common/{BeakerContents.js => BeakerContents.jsx} | 0 .../{InterfaceLockNoticeBox.js => InterfaceLockNoticeBox.jsx} | 0 tgui/packages/tgui/layouts/{Layout.js => Layout.jsx} | 0 tgui/packages/tgui/layouts/{NtosWindow.js => NtosWindow.jsx} | 0 tgui/packages/tgui/layouts/{Pane.js => Pane.jsx} | 0 tgui/packages/tgui/layouts/{Window.js => Window.jsx} | 0 tgui/packages/tgui/{routes.js => routes.jsx} | 1 + .../tgui/stories/{Blink.stories.js => Blink.stories.jsx} | 0 .../stories/{BlockQuote.stories.js => BlockQuote.stories.jsx} | 0 .../packages/tgui/stories/{Box.stories.js => Box.stories.jsx} | 0 .../tgui/stories/{Button.stories.js => Button.stories.jsx} | 0 .../tgui/stories/{ByondUi.stories.js => ByondUi.stories.jsx} | 0 .../{Collapsible.stories.js => Collapsible.stories.jsx} | 0 .../tgui/stories/{Flex.stories.js => Flex.stories.jsx} | 0 .../tgui/stories/{Input.stories.js => Input.stories.jsx} | 0 .../{LabeledList.stories.js => LabeledList.stories.jsx} | 0 .../tgui/stories/{Popper.stories.js => Popper.stories.jsx} | 0 .../{ProgressBar.stories.js => ProgressBar.stories.jsx} | 0 .../tgui/stories/{Stack.stories.js => Stack.stories.jsx} | 0 .../tgui/stories/{Storage.stories.js => Storage.stories.jsx} | 0 .../tgui/stories/{Tabs.stories.js => Tabs.stories.jsx} | 0 .../tgui/stories/{Themes.stories.js => Themes.stories.jsx} | 0 .../tgui/stories/{Tooltip.stories.js => Tooltip.stories.jsx} | 0 tgui/packages/tgui/stories/{common.js => common.jsx} | 0 tgui/webpack.config.js | 4 ++-- 131 files changed, 5 insertions(+), 4 deletions(-) rename tgui/packages/tgui/components/{Blink.js => Blink.jsx} (100%) rename tgui/packages/tgui/components/{BlockQuote.js => BlockQuote.jsx} (100%) rename tgui/packages/tgui/components/{Button.js => Button.jsx} (100%) rename tgui/packages/tgui/components/{ByondUi.js => ByondUi.jsx} (100%) rename tgui/packages/tgui/components/{Chart.js => Chart.jsx} (100%) rename tgui/packages/tgui/components/{Collapsible.js => Collapsible.jsx} (100%) rename tgui/packages/tgui/components/{ColorBox.js => ColorBox.jsx} (100%) rename tgui/packages/tgui/components/{Dimmer.js => Dimmer.jsx} (100%) rename tgui/packages/tgui/components/{Divider.js => Divider.jsx} (100%) rename tgui/packages/tgui/components/{DraggableControl.js => DraggableControl.jsx} (100%) rename tgui/packages/tgui/components/{Dropdown.js => Dropdown.jsx} (100%) rename tgui/packages/tgui/components/{Grid.js => Grid.jsx} (100%) rename tgui/packages/tgui/components/{Icon.js => Icon.jsx} (100%) rename tgui/packages/tgui/components/{InfinitePlane.js => InfinitePlane.jsx} (100%) rename tgui/packages/tgui/components/{Input.js => Input.jsx} (100%) rename tgui/packages/tgui/components/{Knob.js => Knob.jsx} (100%) rename tgui/packages/tgui/components/{LabeledControls.js => LabeledControls.jsx} (100%) rename tgui/packages/tgui/components/{Modal.js => Modal.jsx} (100%) rename tgui/packages/tgui/components/{NoticeBox.js => NoticeBox.jsx} (100%) rename tgui/packages/tgui/components/{NumberInput.js => NumberInput.jsx} (100%) rename tgui/packages/tgui/components/{ProgressBar.js => ProgressBar.jsx} (100%) rename tgui/packages/tgui/components/{RestrictedInput.js => RestrictedInput.jsx} (100%) rename tgui/packages/tgui/components/{RoundGauge.js => RoundGauge.jsx} (100%) rename tgui/packages/tgui/components/{Slider.js => Slider.jsx} (100%) rename tgui/packages/tgui/components/{Table.js => Table.jsx} (100%) rename tgui/packages/tgui/components/{Tabs.js => Tabs.jsx} (100%) rename tgui/packages/tgui/components/{TextArea.js => TextArea.jsx} (100%) rename tgui/packages/tgui/components/{TimeDisplay.js => TimeDisplay.jsx} (100%) rename tgui/packages/tgui/components/{index.js => index.jsx} (100%) rename tgui/packages/tgui/debug/{KitchenSink.js => KitchenSink.jsx} (95%) rename tgui/packages/tgui/interfaces/{AcidVest.js => AcidVest.jsx} (100%) rename tgui/packages/tgui/interfaces/{AlmayerControl.js => AlmayerControl.jsx} (100%) rename tgui/packages/tgui/interfaces/{AltitudeControlConsole.js => AltitudeControlConsole.jsx} (100%) rename tgui/packages/tgui/interfaces/{AntiAirConsole.js => AntiAirConsole.jsx} (100%) rename tgui/packages/tgui/interfaces/{Apc.js => Apc.jsx} (100%) rename tgui/packages/tgui/interfaces/{AresInterface.js => AresInterface.jsx} (100%) rename tgui/packages/tgui/interfaces/{Autodispenser.js => Autodispenser.jsx} (100%) rename tgui/packages/tgui/interfaces/{Autolathe.js => Autolathe.jsx} (100%) rename tgui/packages/tgui/interfaces/{Binoculars.js => Binoculars.jsx} (100%) rename tgui/packages/tgui/interfaces/{BioSyntheticPrinter.js => BioSyntheticPrinter.jsx} (100%) rename tgui/packages/tgui/interfaces/{BotanyEditor.js => BotanyEditor.jsx} (100%) rename tgui/packages/tgui/interfaces/{BotanyExtractor.js => BotanyExtractor.jsx} (100%) rename tgui/packages/tgui/interfaces/{BrigCell.js => BrigCell.jsx} (100%) rename tgui/packages/tgui/interfaces/{CameraConsole.js => CameraConsole.jsx} (100%) rename tgui/packages/tgui/interfaces/{CanvasLayer.js => CanvasLayer.jsx} (100%) rename tgui/packages/tgui/interfaces/{CardMod.js => CardMod.jsx} (100%) rename tgui/packages/tgui/interfaces/{Centrifuge.js => Centrifuge.jsx} (100%) rename tgui/packages/tgui/interfaces/{Changelog.js => Changelog.jsx} (100%) rename tgui/packages/tgui/interfaces/{ChemDispenser.js => ChemDispenser.jsx} (100%) rename tgui/packages/tgui/interfaces/{ChooseFruit.js => ChooseFruit.jsx} (100%) rename tgui/packages/tgui/interfaces/{ChooseResin.js => ChooseResin.jsx} (100%) rename tgui/packages/tgui/interfaces/{CommandTablet.js => CommandTablet.jsx} (100%) rename tgui/packages/tgui/interfaces/{CrewConsole.js => CrewConsole.jsx} (100%) rename tgui/packages/tgui/interfaces/{Cryo.js => Cryo.jsx} (100%) rename tgui/packages/tgui/interfaces/{DemoSim.js => DemoSim.jsx} (100%) rename tgui/packages/tgui/interfaces/{Disposals.js => Disposals.jsx} (100%) rename tgui/packages/tgui/interfaces/{DrawnMap.js => DrawnMap.jsx} (100%) rename tgui/packages/tgui/interfaces/{FaxMachine.js => FaxMachine.jsx} (100%) rename tgui/packages/tgui/interfaces/{Filteriffic.js => Filteriffic.jsx} (99%) rename tgui/packages/tgui/interfaces/{FiltrationControl.js => FiltrationControl.jsx} (100%) rename tgui/packages/tgui/interfaces/{HealthScan.js => HealthScan.jsx} (100%) rename tgui/packages/tgui/interfaces/{HiveFaction.js => HiveFaction.jsx} (100%) rename tgui/packages/tgui/interfaces/{HiveLeaders.js => HiveLeaders.jsx} (100%) rename tgui/packages/tgui/interfaces/{HiveStatus.js => HiveStatus.jsx} (100%) rename tgui/packages/tgui/interfaces/{KeyBinds.js => KeyBinds.jsx} (100%) rename tgui/packages/tgui/interfaces/{KillPanel.js => KillPanel.jsx} (100%) rename tgui/packages/tgui/interfaces/{LanguageMenu.js => LanguageMenu.jsx} (100%) rename tgui/packages/tgui/interfaces/{ListInput.js => ListInput.jsx} (100%) rename tgui/packages/tgui/interfaces/{MedalsPanel.js => MedalsPanel.jsx} (100%) rename tgui/packages/tgui/interfaces/{Mortar.js => Mortar.jsx} (100%) rename tgui/packages/tgui/interfaces/{NuclearBomb.js => NuclearBomb.jsx} (100%) rename tgui/packages/tgui/interfaces/{OrbitalCannonConsole.js => OrbitalCannonConsole.jsx} (100%) rename tgui/packages/tgui/interfaces/{OverwatchConsole.js => OverwatchConsole.jsx} (100%) rename tgui/packages/tgui/interfaces/{PartFabricator.js => PartFabricator.jsx} (100%) rename tgui/packages/tgui/interfaces/{PhoneMenu.js => PhoneMenu.jsx} (100%) rename tgui/packages/tgui/interfaces/{PlayerPanel.js => PlayerPanel.jsx} (100%) rename tgui/packages/tgui/interfaces/{PodLauncher.js => PodLauncher.jsx} (100%) rename tgui/packages/tgui/interfaces/{Proximity.js => Proximity.jsx} (100%) rename tgui/packages/tgui/interfaces/{Radio.js => Radio.jsx} (100%) rename tgui/packages/tgui/interfaces/{ResearchDoorDisplay.js => ResearchDoorDisplay.jsx} (100%) rename tgui/packages/tgui/interfaces/{ResearchMemories.js => ResearchMemories.jsx} (100%) rename tgui/packages/tgui/interfaces/{STUI.js => STUI.jsx} (100%) rename tgui/packages/tgui/interfaces/{SelfDestructConsole.js => SelfDestructConsole.jsx} (100%) rename tgui/packages/tgui/interfaces/{Sentencing.js => Sentencing.jsx} (100%) rename tgui/packages/tgui/interfaces/{Signaller.js => Signaller.jsx} (100%) rename tgui/packages/tgui/interfaces/{SkillsMenu.js => SkillsMenu.jsx} (100%) rename tgui/packages/tgui/interfaces/{Sleeper.js => Sleeper.jsx} (100%) rename tgui/packages/tgui/interfaces/{Smes.js => Smes.jsx} (100%) rename tgui/packages/tgui/interfaces/{SquadMod.js => SquadMod.jsx} (100%) rename tgui/packages/tgui/interfaces/{StatbrowserOptions.js => StatbrowserOptions.jsx} (100%) rename tgui/packages/tgui/interfaces/{StationAlertConsole.js => StationAlertConsole.jsx} (100%) rename tgui/packages/tgui/interfaces/{SupplyDropConsole.js => SupplyDropConsole.jsx} (100%) rename tgui/packages/tgui/interfaces/{TacmapAdminPanel.js => TacmapAdminPanel.jsx} (100%) rename tgui/packages/tgui/interfaces/{Tank.js => Tank.jsx} (100%) rename tgui/packages/tgui/interfaces/{TechControl.js => TechControl.jsx} (100%) rename tgui/packages/tgui/interfaces/{TechMemories.js => TechMemories.jsx} (100%) rename tgui/packages/tgui/interfaces/{TechNode.js => TechNode.jsx} (100%) rename tgui/packages/tgui/interfaces/{TeleporterConsole.js => TeleporterConsole.jsx} (100%) rename tgui/packages/tgui/interfaces/{Timer.js => Timer.jsx} (100%) rename tgui/packages/tgui/interfaces/{VehicleStatus.js => VehicleStatus.jsx} (100%) rename tgui/packages/tgui/interfaces/{VoteMenu.js => VoteMenu.jsx} (100%) rename tgui/packages/tgui/interfaces/{VoxPanel.js => VoxPanel.jsx} (100%) rename tgui/packages/tgui/interfaces/{WeaponStats.js => WeaponStats.jsx} (100%) rename tgui/packages/tgui/interfaces/{Wires.js => Wires.jsx} (100%) rename tgui/packages/tgui/interfaces/{WorkingJoe.js => WorkingJoe.jsx} (100%) rename tgui/packages/tgui/interfaces/common/{AccessList.js => AccessList.jsx} (100%) rename tgui/packages/tgui/interfaces/common/{BeakerContents.js => BeakerContents.jsx} (100%) rename tgui/packages/tgui/interfaces/common/{InterfaceLockNoticeBox.js => InterfaceLockNoticeBox.jsx} (100%) rename tgui/packages/tgui/layouts/{Layout.js => Layout.jsx} (100%) rename tgui/packages/tgui/layouts/{NtosWindow.js => NtosWindow.jsx} (100%) rename tgui/packages/tgui/layouts/{Pane.js => Pane.jsx} (100%) rename tgui/packages/tgui/layouts/{Window.js => Window.jsx} (100%) rename tgui/packages/tgui/{routes.js => routes.jsx} (98%) rename tgui/packages/tgui/stories/{Blink.stories.js => Blink.stories.jsx} (100%) rename tgui/packages/tgui/stories/{BlockQuote.stories.js => BlockQuote.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Box.stories.js => Box.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Button.stories.js => Button.stories.jsx} (100%) rename tgui/packages/tgui/stories/{ByondUi.stories.js => ByondUi.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Collapsible.stories.js => Collapsible.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Flex.stories.js => Flex.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Input.stories.js => Input.stories.jsx} (100%) rename tgui/packages/tgui/stories/{LabeledList.stories.js => LabeledList.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Popper.stories.js => Popper.stories.jsx} (100%) rename tgui/packages/tgui/stories/{ProgressBar.stories.js => ProgressBar.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Stack.stories.js => Stack.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Storage.stories.js => Storage.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Tabs.stories.js => Tabs.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Themes.stories.js => Themes.stories.jsx} (100%) rename tgui/packages/tgui/stories/{Tooltip.stories.js => Tooltip.stories.jsx} (100%) rename tgui/packages/tgui/stories/{common.js => common.jsx} (100%) diff --git a/tgui/packages/tgui/components/Blink.js b/tgui/packages/tgui/components/Blink.jsx similarity index 100% rename from tgui/packages/tgui/components/Blink.js rename to tgui/packages/tgui/components/Blink.jsx diff --git a/tgui/packages/tgui/components/BlockQuote.js b/tgui/packages/tgui/components/BlockQuote.jsx similarity index 100% rename from tgui/packages/tgui/components/BlockQuote.js rename to tgui/packages/tgui/components/BlockQuote.jsx diff --git a/tgui/packages/tgui/components/Button.js b/tgui/packages/tgui/components/Button.jsx similarity index 100% rename from tgui/packages/tgui/components/Button.js rename to tgui/packages/tgui/components/Button.jsx diff --git a/tgui/packages/tgui/components/ByondUi.js b/tgui/packages/tgui/components/ByondUi.jsx similarity index 100% rename from tgui/packages/tgui/components/ByondUi.js rename to tgui/packages/tgui/components/ByondUi.jsx diff --git a/tgui/packages/tgui/components/Chart.js b/tgui/packages/tgui/components/Chart.jsx similarity index 100% rename from tgui/packages/tgui/components/Chart.js rename to tgui/packages/tgui/components/Chart.jsx diff --git a/tgui/packages/tgui/components/Collapsible.js b/tgui/packages/tgui/components/Collapsible.jsx similarity index 100% rename from tgui/packages/tgui/components/Collapsible.js rename to tgui/packages/tgui/components/Collapsible.jsx diff --git a/tgui/packages/tgui/components/ColorBox.js b/tgui/packages/tgui/components/ColorBox.jsx similarity index 100% rename from tgui/packages/tgui/components/ColorBox.js rename to tgui/packages/tgui/components/ColorBox.jsx diff --git a/tgui/packages/tgui/components/Dimmer.js b/tgui/packages/tgui/components/Dimmer.jsx similarity index 100% rename from tgui/packages/tgui/components/Dimmer.js rename to tgui/packages/tgui/components/Dimmer.jsx diff --git a/tgui/packages/tgui/components/Divider.js b/tgui/packages/tgui/components/Divider.jsx similarity index 100% rename from tgui/packages/tgui/components/Divider.js rename to tgui/packages/tgui/components/Divider.jsx diff --git a/tgui/packages/tgui/components/DraggableControl.js b/tgui/packages/tgui/components/DraggableControl.jsx similarity index 100% rename from tgui/packages/tgui/components/DraggableControl.js rename to tgui/packages/tgui/components/DraggableControl.jsx diff --git a/tgui/packages/tgui/components/Dropdown.js b/tgui/packages/tgui/components/Dropdown.jsx similarity index 100% rename from tgui/packages/tgui/components/Dropdown.js rename to tgui/packages/tgui/components/Dropdown.jsx diff --git a/tgui/packages/tgui/components/Grid.js b/tgui/packages/tgui/components/Grid.jsx similarity index 100% rename from tgui/packages/tgui/components/Grid.js rename to tgui/packages/tgui/components/Grid.jsx diff --git a/tgui/packages/tgui/components/Icon.js b/tgui/packages/tgui/components/Icon.jsx similarity index 100% rename from tgui/packages/tgui/components/Icon.js rename to tgui/packages/tgui/components/Icon.jsx diff --git a/tgui/packages/tgui/components/InfinitePlane.js b/tgui/packages/tgui/components/InfinitePlane.jsx similarity index 100% rename from tgui/packages/tgui/components/InfinitePlane.js rename to tgui/packages/tgui/components/InfinitePlane.jsx diff --git a/tgui/packages/tgui/components/Input.js b/tgui/packages/tgui/components/Input.jsx similarity index 100% rename from tgui/packages/tgui/components/Input.js rename to tgui/packages/tgui/components/Input.jsx diff --git a/tgui/packages/tgui/components/Knob.js b/tgui/packages/tgui/components/Knob.jsx similarity index 100% rename from tgui/packages/tgui/components/Knob.js rename to tgui/packages/tgui/components/Knob.jsx diff --git a/tgui/packages/tgui/components/LabeledControls.js b/tgui/packages/tgui/components/LabeledControls.jsx similarity index 100% rename from tgui/packages/tgui/components/LabeledControls.js rename to tgui/packages/tgui/components/LabeledControls.jsx diff --git a/tgui/packages/tgui/components/Modal.js b/tgui/packages/tgui/components/Modal.jsx similarity index 100% rename from tgui/packages/tgui/components/Modal.js rename to tgui/packages/tgui/components/Modal.jsx diff --git a/tgui/packages/tgui/components/NoticeBox.js b/tgui/packages/tgui/components/NoticeBox.jsx similarity index 100% rename from tgui/packages/tgui/components/NoticeBox.js rename to tgui/packages/tgui/components/NoticeBox.jsx diff --git a/tgui/packages/tgui/components/NumberInput.js b/tgui/packages/tgui/components/NumberInput.jsx similarity index 100% rename from tgui/packages/tgui/components/NumberInput.js rename to tgui/packages/tgui/components/NumberInput.jsx diff --git a/tgui/packages/tgui/components/ProgressBar.js b/tgui/packages/tgui/components/ProgressBar.jsx similarity index 100% rename from tgui/packages/tgui/components/ProgressBar.js rename to tgui/packages/tgui/components/ProgressBar.jsx diff --git a/tgui/packages/tgui/components/RestrictedInput.js b/tgui/packages/tgui/components/RestrictedInput.jsx similarity index 100% rename from tgui/packages/tgui/components/RestrictedInput.js rename to tgui/packages/tgui/components/RestrictedInput.jsx diff --git a/tgui/packages/tgui/components/RoundGauge.js b/tgui/packages/tgui/components/RoundGauge.jsx similarity index 100% rename from tgui/packages/tgui/components/RoundGauge.js rename to tgui/packages/tgui/components/RoundGauge.jsx diff --git a/tgui/packages/tgui/components/Slider.js b/tgui/packages/tgui/components/Slider.jsx similarity index 100% rename from tgui/packages/tgui/components/Slider.js rename to tgui/packages/tgui/components/Slider.jsx diff --git a/tgui/packages/tgui/components/Table.js b/tgui/packages/tgui/components/Table.jsx similarity index 100% rename from tgui/packages/tgui/components/Table.js rename to tgui/packages/tgui/components/Table.jsx diff --git a/tgui/packages/tgui/components/Tabs.js b/tgui/packages/tgui/components/Tabs.jsx similarity index 100% rename from tgui/packages/tgui/components/Tabs.js rename to tgui/packages/tgui/components/Tabs.jsx diff --git a/tgui/packages/tgui/components/TextArea.js b/tgui/packages/tgui/components/TextArea.jsx similarity index 100% rename from tgui/packages/tgui/components/TextArea.js rename to tgui/packages/tgui/components/TextArea.jsx diff --git a/tgui/packages/tgui/components/TimeDisplay.js b/tgui/packages/tgui/components/TimeDisplay.jsx similarity index 100% rename from tgui/packages/tgui/components/TimeDisplay.js rename to tgui/packages/tgui/components/TimeDisplay.jsx diff --git a/tgui/packages/tgui/components/index.js b/tgui/packages/tgui/components/index.jsx similarity index 100% rename from tgui/packages/tgui/components/index.js rename to tgui/packages/tgui/components/index.jsx diff --git a/tgui/packages/tgui/debug/KitchenSink.js b/tgui/packages/tgui/debug/KitchenSink.jsx similarity index 95% rename from tgui/packages/tgui/debug/KitchenSink.js rename to tgui/packages/tgui/debug/KitchenSink.jsx index 246b4f50b478..e25751722c52 100644 --- a/tgui/packages/tgui/debug/KitchenSink.js +++ b/tgui/packages/tgui/debug/KitchenSink.jsx @@ -8,7 +8,7 @@ import { useLocalState } from '../backend'; import { Flex, Section, Tabs } from '../components'; import { Pane, Window } from '../layouts'; -const r = require.context('../stories', false, /\.stories\.js$/); +const r = require.context('../stories', false, /\.stories\.jsx$/); /** * @returns {{ diff --git a/tgui/packages/tgui/interfaces/AcidVest.js b/tgui/packages/tgui/interfaces/AcidVest.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/AcidVest.js rename to tgui/packages/tgui/interfaces/AcidVest.jsx diff --git a/tgui/packages/tgui/interfaces/AlmayerControl.js b/tgui/packages/tgui/interfaces/AlmayerControl.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/AlmayerControl.js rename to tgui/packages/tgui/interfaces/AlmayerControl.jsx diff --git a/tgui/packages/tgui/interfaces/AltitudeControlConsole.js b/tgui/packages/tgui/interfaces/AltitudeControlConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/AltitudeControlConsole.js rename to tgui/packages/tgui/interfaces/AltitudeControlConsole.jsx diff --git a/tgui/packages/tgui/interfaces/AntiAirConsole.js b/tgui/packages/tgui/interfaces/AntiAirConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/AntiAirConsole.js rename to tgui/packages/tgui/interfaces/AntiAirConsole.jsx diff --git a/tgui/packages/tgui/interfaces/Apc.js b/tgui/packages/tgui/interfaces/Apc.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Apc.js rename to tgui/packages/tgui/interfaces/Apc.jsx diff --git a/tgui/packages/tgui/interfaces/AresInterface.js b/tgui/packages/tgui/interfaces/AresInterface.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/AresInterface.js rename to tgui/packages/tgui/interfaces/AresInterface.jsx diff --git a/tgui/packages/tgui/interfaces/Autodispenser.js b/tgui/packages/tgui/interfaces/Autodispenser.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Autodispenser.js rename to tgui/packages/tgui/interfaces/Autodispenser.jsx diff --git a/tgui/packages/tgui/interfaces/Autolathe.js b/tgui/packages/tgui/interfaces/Autolathe.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Autolathe.js rename to tgui/packages/tgui/interfaces/Autolathe.jsx diff --git a/tgui/packages/tgui/interfaces/Binoculars.js b/tgui/packages/tgui/interfaces/Binoculars.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Binoculars.js rename to tgui/packages/tgui/interfaces/Binoculars.jsx diff --git a/tgui/packages/tgui/interfaces/BioSyntheticPrinter.js b/tgui/packages/tgui/interfaces/BioSyntheticPrinter.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/BioSyntheticPrinter.js rename to tgui/packages/tgui/interfaces/BioSyntheticPrinter.jsx diff --git a/tgui/packages/tgui/interfaces/BotanyEditor.js b/tgui/packages/tgui/interfaces/BotanyEditor.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/BotanyEditor.js rename to tgui/packages/tgui/interfaces/BotanyEditor.jsx diff --git a/tgui/packages/tgui/interfaces/BotanyExtractor.js b/tgui/packages/tgui/interfaces/BotanyExtractor.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/BotanyExtractor.js rename to tgui/packages/tgui/interfaces/BotanyExtractor.jsx diff --git a/tgui/packages/tgui/interfaces/BrigCell.js b/tgui/packages/tgui/interfaces/BrigCell.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/BrigCell.js rename to tgui/packages/tgui/interfaces/BrigCell.jsx diff --git a/tgui/packages/tgui/interfaces/CameraConsole.js b/tgui/packages/tgui/interfaces/CameraConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/CameraConsole.js rename to tgui/packages/tgui/interfaces/CameraConsole.jsx diff --git a/tgui/packages/tgui/interfaces/CanvasLayer.js b/tgui/packages/tgui/interfaces/CanvasLayer.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/CanvasLayer.js rename to tgui/packages/tgui/interfaces/CanvasLayer.jsx diff --git a/tgui/packages/tgui/interfaces/CardMod.js b/tgui/packages/tgui/interfaces/CardMod.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/CardMod.js rename to tgui/packages/tgui/interfaces/CardMod.jsx diff --git a/tgui/packages/tgui/interfaces/Centrifuge.js b/tgui/packages/tgui/interfaces/Centrifuge.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Centrifuge.js rename to tgui/packages/tgui/interfaces/Centrifuge.jsx diff --git a/tgui/packages/tgui/interfaces/Changelog.js b/tgui/packages/tgui/interfaces/Changelog.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Changelog.js rename to tgui/packages/tgui/interfaces/Changelog.jsx diff --git a/tgui/packages/tgui/interfaces/ChemDispenser.js b/tgui/packages/tgui/interfaces/ChemDispenser.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/ChemDispenser.js rename to tgui/packages/tgui/interfaces/ChemDispenser.jsx diff --git a/tgui/packages/tgui/interfaces/ChooseFruit.js b/tgui/packages/tgui/interfaces/ChooseFruit.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/ChooseFruit.js rename to tgui/packages/tgui/interfaces/ChooseFruit.jsx diff --git a/tgui/packages/tgui/interfaces/ChooseResin.js b/tgui/packages/tgui/interfaces/ChooseResin.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/ChooseResin.js rename to tgui/packages/tgui/interfaces/ChooseResin.jsx diff --git a/tgui/packages/tgui/interfaces/CommandTablet.js b/tgui/packages/tgui/interfaces/CommandTablet.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/CommandTablet.js rename to tgui/packages/tgui/interfaces/CommandTablet.jsx diff --git a/tgui/packages/tgui/interfaces/CrewConsole.js b/tgui/packages/tgui/interfaces/CrewConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/CrewConsole.js rename to tgui/packages/tgui/interfaces/CrewConsole.jsx diff --git a/tgui/packages/tgui/interfaces/Cryo.js b/tgui/packages/tgui/interfaces/Cryo.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Cryo.js rename to tgui/packages/tgui/interfaces/Cryo.jsx diff --git a/tgui/packages/tgui/interfaces/DemoSim.js b/tgui/packages/tgui/interfaces/DemoSim.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/DemoSim.js rename to tgui/packages/tgui/interfaces/DemoSim.jsx diff --git a/tgui/packages/tgui/interfaces/Disposals.js b/tgui/packages/tgui/interfaces/Disposals.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Disposals.js rename to tgui/packages/tgui/interfaces/Disposals.jsx diff --git a/tgui/packages/tgui/interfaces/DrawnMap.js b/tgui/packages/tgui/interfaces/DrawnMap.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/DrawnMap.js rename to tgui/packages/tgui/interfaces/DrawnMap.jsx diff --git a/tgui/packages/tgui/interfaces/FaxMachine.js b/tgui/packages/tgui/interfaces/FaxMachine.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/FaxMachine.js rename to tgui/packages/tgui/interfaces/FaxMachine.jsx diff --git a/tgui/packages/tgui/interfaces/Filteriffic.js b/tgui/packages/tgui/interfaces/Filteriffic.jsx similarity index 99% rename from tgui/packages/tgui/interfaces/Filteriffic.js rename to tgui/packages/tgui/interfaces/Filteriffic.jsx index a967efafca98..8bda997dff1b 100644 --- a/tgui/packages/tgui/interfaces/Filteriffic.js +++ b/tgui/packages/tgui/interfaces/Filteriffic.jsx @@ -1,6 +1,6 @@ import { map } from 'common/collections'; import { toFixed } from 'common/math'; -import { numberOfDecimalDigits } from '../../common/math'; +import { numberOfDecimalDigits } from 'common/math'; import { useBackend, useLocalState } from '../backend'; import { Box, Button, Collapsible, ColorBox, Dropdown, Input, LabeledList, NoticeBox, NumberInput, Section } from '../components'; import { Window } from '../layouts'; diff --git a/tgui/packages/tgui/interfaces/FiltrationControl.js b/tgui/packages/tgui/interfaces/FiltrationControl.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/FiltrationControl.js rename to tgui/packages/tgui/interfaces/FiltrationControl.jsx diff --git a/tgui/packages/tgui/interfaces/HealthScan.js b/tgui/packages/tgui/interfaces/HealthScan.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/HealthScan.js rename to tgui/packages/tgui/interfaces/HealthScan.jsx diff --git a/tgui/packages/tgui/interfaces/HiveFaction.js b/tgui/packages/tgui/interfaces/HiveFaction.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/HiveFaction.js rename to tgui/packages/tgui/interfaces/HiveFaction.jsx diff --git a/tgui/packages/tgui/interfaces/HiveLeaders.js b/tgui/packages/tgui/interfaces/HiveLeaders.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/HiveLeaders.js rename to tgui/packages/tgui/interfaces/HiveLeaders.jsx diff --git a/tgui/packages/tgui/interfaces/HiveStatus.js b/tgui/packages/tgui/interfaces/HiveStatus.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/HiveStatus.js rename to tgui/packages/tgui/interfaces/HiveStatus.jsx diff --git a/tgui/packages/tgui/interfaces/KeyBinds.js b/tgui/packages/tgui/interfaces/KeyBinds.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/KeyBinds.js rename to tgui/packages/tgui/interfaces/KeyBinds.jsx diff --git a/tgui/packages/tgui/interfaces/KillPanel.js b/tgui/packages/tgui/interfaces/KillPanel.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/KillPanel.js rename to tgui/packages/tgui/interfaces/KillPanel.jsx diff --git a/tgui/packages/tgui/interfaces/LanguageMenu.js b/tgui/packages/tgui/interfaces/LanguageMenu.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/LanguageMenu.js rename to tgui/packages/tgui/interfaces/LanguageMenu.jsx diff --git a/tgui/packages/tgui/interfaces/ListInput.js b/tgui/packages/tgui/interfaces/ListInput.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/ListInput.js rename to tgui/packages/tgui/interfaces/ListInput.jsx diff --git a/tgui/packages/tgui/interfaces/MedalsPanel.js b/tgui/packages/tgui/interfaces/MedalsPanel.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/MedalsPanel.js rename to tgui/packages/tgui/interfaces/MedalsPanel.jsx diff --git a/tgui/packages/tgui/interfaces/Mortar.js b/tgui/packages/tgui/interfaces/Mortar.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Mortar.js rename to tgui/packages/tgui/interfaces/Mortar.jsx diff --git a/tgui/packages/tgui/interfaces/NuclearBomb.js b/tgui/packages/tgui/interfaces/NuclearBomb.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/NuclearBomb.js rename to tgui/packages/tgui/interfaces/NuclearBomb.jsx diff --git a/tgui/packages/tgui/interfaces/OrbitalCannonConsole.js b/tgui/packages/tgui/interfaces/OrbitalCannonConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/OrbitalCannonConsole.js rename to tgui/packages/tgui/interfaces/OrbitalCannonConsole.jsx diff --git a/tgui/packages/tgui/interfaces/OverwatchConsole.js b/tgui/packages/tgui/interfaces/OverwatchConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/OverwatchConsole.js rename to tgui/packages/tgui/interfaces/OverwatchConsole.jsx diff --git a/tgui/packages/tgui/interfaces/PartFabricator.js b/tgui/packages/tgui/interfaces/PartFabricator.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/PartFabricator.js rename to tgui/packages/tgui/interfaces/PartFabricator.jsx diff --git a/tgui/packages/tgui/interfaces/PhoneMenu.js b/tgui/packages/tgui/interfaces/PhoneMenu.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/PhoneMenu.js rename to tgui/packages/tgui/interfaces/PhoneMenu.jsx diff --git a/tgui/packages/tgui/interfaces/PlayerPanel.js b/tgui/packages/tgui/interfaces/PlayerPanel.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/PlayerPanel.js rename to tgui/packages/tgui/interfaces/PlayerPanel.jsx diff --git a/tgui/packages/tgui/interfaces/PodLauncher.js b/tgui/packages/tgui/interfaces/PodLauncher.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/PodLauncher.js rename to tgui/packages/tgui/interfaces/PodLauncher.jsx diff --git a/tgui/packages/tgui/interfaces/Proximity.js b/tgui/packages/tgui/interfaces/Proximity.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Proximity.js rename to tgui/packages/tgui/interfaces/Proximity.jsx diff --git a/tgui/packages/tgui/interfaces/Radio.js b/tgui/packages/tgui/interfaces/Radio.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Radio.js rename to tgui/packages/tgui/interfaces/Radio.jsx diff --git a/tgui/packages/tgui/interfaces/ResearchDoorDisplay.js b/tgui/packages/tgui/interfaces/ResearchDoorDisplay.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/ResearchDoorDisplay.js rename to tgui/packages/tgui/interfaces/ResearchDoorDisplay.jsx diff --git a/tgui/packages/tgui/interfaces/ResearchMemories.js b/tgui/packages/tgui/interfaces/ResearchMemories.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/ResearchMemories.js rename to tgui/packages/tgui/interfaces/ResearchMemories.jsx diff --git a/tgui/packages/tgui/interfaces/STUI.js b/tgui/packages/tgui/interfaces/STUI.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/STUI.js rename to tgui/packages/tgui/interfaces/STUI.jsx diff --git a/tgui/packages/tgui/interfaces/SelfDestructConsole.js b/tgui/packages/tgui/interfaces/SelfDestructConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/SelfDestructConsole.js rename to tgui/packages/tgui/interfaces/SelfDestructConsole.jsx diff --git a/tgui/packages/tgui/interfaces/Sentencing.js b/tgui/packages/tgui/interfaces/Sentencing.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Sentencing.js rename to tgui/packages/tgui/interfaces/Sentencing.jsx diff --git a/tgui/packages/tgui/interfaces/Signaller.js b/tgui/packages/tgui/interfaces/Signaller.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Signaller.js rename to tgui/packages/tgui/interfaces/Signaller.jsx diff --git a/tgui/packages/tgui/interfaces/SkillsMenu.js b/tgui/packages/tgui/interfaces/SkillsMenu.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/SkillsMenu.js rename to tgui/packages/tgui/interfaces/SkillsMenu.jsx diff --git a/tgui/packages/tgui/interfaces/Sleeper.js b/tgui/packages/tgui/interfaces/Sleeper.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Sleeper.js rename to tgui/packages/tgui/interfaces/Sleeper.jsx diff --git a/tgui/packages/tgui/interfaces/Smes.js b/tgui/packages/tgui/interfaces/Smes.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Smes.js rename to tgui/packages/tgui/interfaces/Smes.jsx diff --git a/tgui/packages/tgui/interfaces/SquadMod.js b/tgui/packages/tgui/interfaces/SquadMod.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/SquadMod.js rename to tgui/packages/tgui/interfaces/SquadMod.jsx diff --git a/tgui/packages/tgui/interfaces/StatbrowserOptions.js b/tgui/packages/tgui/interfaces/StatbrowserOptions.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/StatbrowserOptions.js rename to tgui/packages/tgui/interfaces/StatbrowserOptions.jsx diff --git a/tgui/packages/tgui/interfaces/StationAlertConsole.js b/tgui/packages/tgui/interfaces/StationAlertConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/StationAlertConsole.js rename to tgui/packages/tgui/interfaces/StationAlertConsole.jsx diff --git a/tgui/packages/tgui/interfaces/SupplyDropConsole.js b/tgui/packages/tgui/interfaces/SupplyDropConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/SupplyDropConsole.js rename to tgui/packages/tgui/interfaces/SupplyDropConsole.jsx diff --git a/tgui/packages/tgui/interfaces/TacmapAdminPanel.js b/tgui/packages/tgui/interfaces/TacmapAdminPanel.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/TacmapAdminPanel.js rename to tgui/packages/tgui/interfaces/TacmapAdminPanel.jsx diff --git a/tgui/packages/tgui/interfaces/Tank.js b/tgui/packages/tgui/interfaces/Tank.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Tank.js rename to tgui/packages/tgui/interfaces/Tank.jsx diff --git a/tgui/packages/tgui/interfaces/TechControl.js b/tgui/packages/tgui/interfaces/TechControl.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/TechControl.js rename to tgui/packages/tgui/interfaces/TechControl.jsx diff --git a/tgui/packages/tgui/interfaces/TechMemories.js b/tgui/packages/tgui/interfaces/TechMemories.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/TechMemories.js rename to tgui/packages/tgui/interfaces/TechMemories.jsx diff --git a/tgui/packages/tgui/interfaces/TechNode.js b/tgui/packages/tgui/interfaces/TechNode.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/TechNode.js rename to tgui/packages/tgui/interfaces/TechNode.jsx diff --git a/tgui/packages/tgui/interfaces/TeleporterConsole.js b/tgui/packages/tgui/interfaces/TeleporterConsole.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/TeleporterConsole.js rename to tgui/packages/tgui/interfaces/TeleporterConsole.jsx diff --git a/tgui/packages/tgui/interfaces/Timer.js b/tgui/packages/tgui/interfaces/Timer.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Timer.js rename to tgui/packages/tgui/interfaces/Timer.jsx diff --git a/tgui/packages/tgui/interfaces/VehicleStatus.js b/tgui/packages/tgui/interfaces/VehicleStatus.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/VehicleStatus.js rename to tgui/packages/tgui/interfaces/VehicleStatus.jsx diff --git a/tgui/packages/tgui/interfaces/VoteMenu.js b/tgui/packages/tgui/interfaces/VoteMenu.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/VoteMenu.js rename to tgui/packages/tgui/interfaces/VoteMenu.jsx diff --git a/tgui/packages/tgui/interfaces/VoxPanel.js b/tgui/packages/tgui/interfaces/VoxPanel.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/VoxPanel.js rename to tgui/packages/tgui/interfaces/VoxPanel.jsx diff --git a/tgui/packages/tgui/interfaces/WeaponStats.js b/tgui/packages/tgui/interfaces/WeaponStats.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/WeaponStats.js rename to tgui/packages/tgui/interfaces/WeaponStats.jsx diff --git a/tgui/packages/tgui/interfaces/Wires.js b/tgui/packages/tgui/interfaces/Wires.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/Wires.js rename to tgui/packages/tgui/interfaces/Wires.jsx diff --git a/tgui/packages/tgui/interfaces/WorkingJoe.js b/tgui/packages/tgui/interfaces/WorkingJoe.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/WorkingJoe.js rename to tgui/packages/tgui/interfaces/WorkingJoe.jsx diff --git a/tgui/packages/tgui/interfaces/common/AccessList.js b/tgui/packages/tgui/interfaces/common/AccessList.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/common/AccessList.js rename to tgui/packages/tgui/interfaces/common/AccessList.jsx diff --git a/tgui/packages/tgui/interfaces/common/BeakerContents.js b/tgui/packages/tgui/interfaces/common/BeakerContents.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/common/BeakerContents.js rename to tgui/packages/tgui/interfaces/common/BeakerContents.jsx diff --git a/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.js b/tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.jsx similarity index 100% rename from tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.js rename to tgui/packages/tgui/interfaces/common/InterfaceLockNoticeBox.jsx diff --git a/tgui/packages/tgui/layouts/Layout.js b/tgui/packages/tgui/layouts/Layout.jsx similarity index 100% rename from tgui/packages/tgui/layouts/Layout.js rename to tgui/packages/tgui/layouts/Layout.jsx diff --git a/tgui/packages/tgui/layouts/NtosWindow.js b/tgui/packages/tgui/layouts/NtosWindow.jsx similarity index 100% rename from tgui/packages/tgui/layouts/NtosWindow.js rename to tgui/packages/tgui/layouts/NtosWindow.jsx diff --git a/tgui/packages/tgui/layouts/Pane.js b/tgui/packages/tgui/layouts/Pane.jsx similarity index 100% rename from tgui/packages/tgui/layouts/Pane.js rename to tgui/packages/tgui/layouts/Pane.jsx diff --git a/tgui/packages/tgui/layouts/Window.js b/tgui/packages/tgui/layouts/Window.jsx similarity index 100% rename from tgui/packages/tgui/layouts/Window.js rename to tgui/packages/tgui/layouts/Window.jsx diff --git a/tgui/packages/tgui/routes.js b/tgui/packages/tgui/routes.jsx similarity index 98% rename from tgui/packages/tgui/routes.js rename to tgui/packages/tgui/routes.jsx index eb4ddff15393..0ad869fc63cb 100644 --- a/tgui/packages/tgui/routes.js +++ b/tgui/packages/tgui/routes.jsx @@ -74,6 +74,7 @@ export const getRoutedComponent = (store) => { const name = config?.interface; const interfacePathBuilders = [ (name) => `./${name}.tsx`, + (name) => `./${name}.jsx`, (name) => `./${name}.js`, (name) => `./${name}/index.tsx`, (name) => `./${name}/index.js`, diff --git a/tgui/packages/tgui/stories/Blink.stories.js b/tgui/packages/tgui/stories/Blink.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Blink.stories.js rename to tgui/packages/tgui/stories/Blink.stories.jsx diff --git a/tgui/packages/tgui/stories/BlockQuote.stories.js b/tgui/packages/tgui/stories/BlockQuote.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/BlockQuote.stories.js rename to tgui/packages/tgui/stories/BlockQuote.stories.jsx diff --git a/tgui/packages/tgui/stories/Box.stories.js b/tgui/packages/tgui/stories/Box.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Box.stories.js rename to tgui/packages/tgui/stories/Box.stories.jsx diff --git a/tgui/packages/tgui/stories/Button.stories.js b/tgui/packages/tgui/stories/Button.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Button.stories.js rename to tgui/packages/tgui/stories/Button.stories.jsx diff --git a/tgui/packages/tgui/stories/ByondUi.stories.js b/tgui/packages/tgui/stories/ByondUi.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/ByondUi.stories.js rename to tgui/packages/tgui/stories/ByondUi.stories.jsx diff --git a/tgui/packages/tgui/stories/Collapsible.stories.js b/tgui/packages/tgui/stories/Collapsible.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Collapsible.stories.js rename to tgui/packages/tgui/stories/Collapsible.stories.jsx diff --git a/tgui/packages/tgui/stories/Flex.stories.js b/tgui/packages/tgui/stories/Flex.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Flex.stories.js rename to tgui/packages/tgui/stories/Flex.stories.jsx diff --git a/tgui/packages/tgui/stories/Input.stories.js b/tgui/packages/tgui/stories/Input.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Input.stories.js rename to tgui/packages/tgui/stories/Input.stories.jsx diff --git a/tgui/packages/tgui/stories/LabeledList.stories.js b/tgui/packages/tgui/stories/LabeledList.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/LabeledList.stories.js rename to tgui/packages/tgui/stories/LabeledList.stories.jsx diff --git a/tgui/packages/tgui/stories/Popper.stories.js b/tgui/packages/tgui/stories/Popper.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Popper.stories.js rename to tgui/packages/tgui/stories/Popper.stories.jsx diff --git a/tgui/packages/tgui/stories/ProgressBar.stories.js b/tgui/packages/tgui/stories/ProgressBar.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/ProgressBar.stories.js rename to tgui/packages/tgui/stories/ProgressBar.stories.jsx diff --git a/tgui/packages/tgui/stories/Stack.stories.js b/tgui/packages/tgui/stories/Stack.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Stack.stories.js rename to tgui/packages/tgui/stories/Stack.stories.jsx diff --git a/tgui/packages/tgui/stories/Storage.stories.js b/tgui/packages/tgui/stories/Storage.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Storage.stories.js rename to tgui/packages/tgui/stories/Storage.stories.jsx diff --git a/tgui/packages/tgui/stories/Tabs.stories.js b/tgui/packages/tgui/stories/Tabs.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Tabs.stories.js rename to tgui/packages/tgui/stories/Tabs.stories.jsx diff --git a/tgui/packages/tgui/stories/Themes.stories.js b/tgui/packages/tgui/stories/Themes.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Themes.stories.js rename to tgui/packages/tgui/stories/Themes.stories.jsx diff --git a/tgui/packages/tgui/stories/Tooltip.stories.js b/tgui/packages/tgui/stories/Tooltip.stories.jsx similarity index 100% rename from tgui/packages/tgui/stories/Tooltip.stories.js rename to tgui/packages/tgui/stories/Tooltip.stories.jsx diff --git a/tgui/packages/tgui/stories/common.js b/tgui/packages/tgui/stories/common.jsx similarity index 100% rename from tgui/packages/tgui/stories/common.js rename to tgui/packages/tgui/stories/common.jsx diff --git a/tgui/webpack.config.js b/tgui/webpack.config.js index 19e2975715fa..f90b80926e44 100644 --- a/tgui/webpack.config.js +++ b/tgui/webpack.config.js @@ -55,13 +55,13 @@ module.exports = (env = {}, argv) => { chunkLoadTimeout: 15000, }, resolve: { - extensions: ['.tsx', '.ts', '.js'], + extensions: ['.jsx', '.tsx', '.ts', '.js'], alias: {}, }, module: { rules: [ { - test: /\.(js|cjs|ts|tsx)$/, + test: /\.(js|jsx|cjs|ts|tsx)$/, use: [ { loader: require.resolve('babel-loader'), From 84f65d0c592c3a88da3cdb52498bea6dc57f2079 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 29 Dec 2023 19:43:11 +0000 Subject: [PATCH 131/205] Automatic changelog for PR #5307 [ci skip] --- html/changelogs/AutoChangeLog-pr-5307.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5307.yml diff --git a/html/changelogs/AutoChangeLog-pr-5307.yml b/html/changelogs/AutoChangeLog-pr-5307.yml new file mode 100644 index 000000000000..3047d03d8e82 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5307.yml @@ -0,0 +1,4 @@ +author: "mullenpaul" +delete-after: True +changes: + - refactor: "tgui js components now jsx" \ No newline at end of file From 483f5ae363ff5bcf5f32c2b32b2dcf80c98ff899 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Fri, 29 Dec 2023 19:33:16 +0000 Subject: [PATCH 132/205] Fixes runtime in stripping (#5320) # About the pull request The dummy as an example doesn't have skills so we runtime when stripping them. ``` [2023-12-27 21:52:42.147] runtime error: Cannot execute null.get skill level(). - proc name: get strip delay (/mob/living/carbon/human/proc/get_strip_delay) - source file: code/modules/mob/living/carbon/human/inventory.dm,498 - usr: (src) - src: Jack Samerus (/mob/living/carbon/human) - src.loc: the floor (140,46,3) (/turf/open/floor/almayer) - call stack: - Jack Samerus (/mob/living/carbon/human): get strip delay(Jack Samerus (/mob/living/carbon/human), Professor DUMMY the Medical Ma... (/mob/living/carbon/human)) - Jack Samerus (/mob/living/carbon/human): stripPanelUnequip(Professor DUMMY tablet (/obj/item/device/professor_dummy_tablet), Professor DUMMY the Medical Ma... (/mob/living/carbon/human), "r_hand") - Professor DUMMY the Medical Ma... (/mob/living/carbon/human): Topic("src=\[0x3000232];item=r_hand", /list (/list)) - **** (/client): Topic("src=\[0x3000232];item=r_hand", /list (/list), Professor DUMMY the Medical Ma... (/mob/living/carbon/human)) ``` # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Runtime in inventory.dm /:cl: --- code/modules/mob/living/carbon/human/inventory.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 34b80d1ce6f9..3d372376d1e7 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -494,7 +494,8 @@ /// Multiplier for how quickly the user can strip things. var/user_speed = user.get_skill_duration_multiplier(SKILL_CQC) /// The total skill level of CQC & Police - var/target_skills = (target.skills.get_skill_level(SKILL_CQC) + target.skills.get_skill_level(SKILL_POLICE)) + var/target_skills = 0 + target_skills += (target.skills?.get_skill_level(SKILL_CQC) + target.skills?.get_skill_level(SKILL_POLICE)) /// Delay then gets + 0.5s per skill level, so long as not dead or cuffed. if(!(target.stat || target.handcuffed)) From 2e87d43ac83abece3fe6ff4098a0c8bc471296e6 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 29 Dec 2023 19:57:35 +0000 Subject: [PATCH 133/205] Automatic changelog for PR #5320 [ci skip] --- html/changelogs/AutoChangeLog-pr-5320.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5320.yml diff --git a/html/changelogs/AutoChangeLog-pr-5320.yml b/html/changelogs/AutoChangeLog-pr-5320.yml new file mode 100644 index 000000000000..32cd4fc8943d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5320.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - bugfix: "Runtime in inventory.dm" \ No newline at end of file From 5a24a69b1d6a17e63f928d51c6ce636b5c24cb12 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Fri, 29 Dec 2023 19:33:51 +0000 Subject: [PATCH 134/205] Fixes the failure message when trying to switch pyro fuels (#5321) # About the pull request Edits the pyro spec's fuel pack a bit to make it *slightly* more bug-proof, and to fix it sometimes giving weird failure messages like these: ![image](https://github.com/cmss13-devs/cmss13/assets/57483089/2fa746d0-acc6-402b-ad17-e8fff5f4e3cd) ![image](https://github.com/cmss13-devs/cmss13/assets/57483089/67cef060-55a4-4897-9e52-f6d01e43d3d1) This was caused by me in #5121, presumably because I misread how the check was handled. # Explain why it's good for the game I broked it (sorry) # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Fixed the pyro spec's fuel pack sometimes giving weird failure messages when trying to switch fuel. /:cl: --- code/game/objects/items/storage/large_holster.dm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/storage/large_holster.dm b/code/game/objects/items/storage/large_holster.dm index b02dff1bdbcc..3f653926f8b3 100644 --- a/code/game/objects/items/storage/large_holster.dm +++ b/code/game/objects/items/storage/large_holster.dm @@ -253,9 +253,12 @@ to_chat(user, SPAN_WARNING("[src] must be equipped before you can switch types.")) return - var/obj/item/weapon/gun/flamer/M240T/flamer = user.get_active_hand() - if(!istype(flamer)) - to_chat(user, SPAN_WARNING("You must be holding [flamer] to use [src].")) + if(!linked_flamer) + to_chat(user, SPAN_WARNING("An incinerator unit must be linked in order to switch fuel types.")) + return + + if(user.get_active_hand() != linked_flamer) + to_chat(user, SPAN_WARNING("You must be holding [linked_flamer] to use [src].")) return if(!active_fuel) @@ -276,8 +279,8 @@ to_chat(user, "You switch the fuel tank to [active_fuel.caliber]") playsound(src, 'sound/machines/click.ogg', 25, TRUE) - flamer.current_mag = active_fuel - flamer.update_icon() + linked_flamer.current_mag = active_fuel + linked_flamer.update_icon() return TRUE From d46e38c9318d258de40eac4b530924b9fb4a4b42 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Fri, 29 Dec 2023 20:13:00 +0000 Subject: [PATCH 135/205] Automatic changelog for PR #5321 [ci skip] --- html/changelogs/AutoChangeLog-pr-5321.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5321.yml diff --git a/html/changelogs/AutoChangeLog-pr-5321.yml b/html/changelogs/AutoChangeLog-pr-5321.yml new file mode 100644 index 000000000000..e9e39a2c8c87 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5321.yml @@ -0,0 +1,4 @@ +author: "SabreML" +delete-after: True +changes: + - bugfix: "Fixed the pyro spec's fuel pack sometimes giving weird failure messages when trying to switch fuel." \ No newline at end of file From c4a5c286727951a75e35225a84810a37b9b7cd4d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 30 Dec 2023 01:08:58 +0000 Subject: [PATCH 136/205] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5030.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5307.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5308.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5315.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5317.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5319.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5320.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5321.yml | 4 ---- html/changelogs/AutoChangeLog-pr-5323.yml | 5 ----- html/changelogs/archive/2023-12.yml | 21 +++++++++++++++++++++ 10 files changed, 21 insertions(+), 37 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5030.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5307.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5308.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5315.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5317.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5319.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5320.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5321.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5323.yml diff --git a/html/changelogs/AutoChangeLog-pr-5030.yml b/html/changelogs/AutoChangeLog-pr-5030.yml deleted file mode 100644 index 0cce25ff019a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5030.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Zonespace27" -delete-after: True -changes: - - rscadd: "Added a tutorial system for various roles (and just general information), find it in the lobby screen." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5307.yml b/html/changelogs/AutoChangeLog-pr-5307.yml deleted file mode 100644 index 3047d03d8e82..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5307.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "mullenpaul" -delete-after: True -changes: - - refactor: "tgui js components now jsx" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5308.yml b/html/changelogs/AutoChangeLog-pr-5308.yml deleted file mode 100644 index 3adc1465faaf..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5308.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "cuberound" -delete-after: True -changes: - - bugfix: "m56d can not longer shoot backwards when facing north" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5315.yml b/html/changelogs/AutoChangeLog-pr-5315.yml deleted file mode 100644 index c5dc61beb308..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5315.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - qol: "Made the designation of a tunnel display in chat when a player enters it." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5317.yml b/html/changelogs/AutoChangeLog-pr-5317.yml deleted file mode 100644 index b5f7cd72accb..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5317.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cthulhu80" -delete-after: True -changes: - - bugfix: "fixes immobilized mobs being able to buckle themselves" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5319.yml b/html/changelogs/AutoChangeLog-pr-5319.yml deleted file mode 100644 index d9582b58f9bc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5319.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - bugfix: "Fixed the CAS laser cannon only setting fire to a single tile, rather a 7x7 range." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5320.yml b/html/changelogs/AutoChangeLog-pr-5320.yml deleted file mode 100644 index 32cd4fc8943d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5320.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - bugfix: "Runtime in inventory.dm" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5321.yml b/html/changelogs/AutoChangeLog-pr-5321.yml deleted file mode 100644 index e9e39a2c8c87..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5321.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - bugfix: "Fixed the pyro spec's fuel pack sometimes giving weird failure messages when trying to switch fuel." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5323.yml b/html/changelogs/AutoChangeLog-pr-5323.yml deleted file mode 100644 index 1a521533c287..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5323.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "InsaneRed" -delete-after: True -changes: - - qol: "\"View Playtime\" is now under the \"Records\" section under OOC" - - qol: "\"Remove Your Splints\" is now under the \"IC\" section." \ No newline at end of file diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml index 73cd5f8771a1..e4245e7d5cbc 100644 --- a/html/changelogs/archive/2023-12.yml +++ b/html/changelogs/archive/2023-12.yml @@ -535,3 +535,24 @@ sleepynecrons: - imageadd: new sprites for predalien, predlarva and weeded corpse - imageadd: added predalien wound overlays +2023-12-30: + Birdtalon: + - bugfix: Runtime in inventory.dm + Cthulhu80: + - bugfix: fixes immobilized mobs being able to buckle themselves + InsaneRed: + - qol: '"View Playtime" is now under the "Records" section under OOC' + - qol: '"Remove Your Splints" is now under the "IC" section.' + SabreML: + - bugfix: Fixed the CAS laser cannon only setting fire to a single tile, rather + a 7x7 range. + - qol: Made the designation of a tunnel display in chat when a player enters it. + - bugfix: Fixed the pyro spec's fuel pack sometimes giving weird failure messages + when trying to switch fuel. + Zonespace27: + - rscadd: Added a tutorial system for various roles (and just general information), + find it in the lobby screen. + cuberound: + - bugfix: m56d can not longer shoot backwards when facing north + mullenpaul: + - refactor: tgui js components now jsx From 0533a419a3007d6dbaa55b91a14b41b3ed64fc05 Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Sat, 30 Dec 2023 03:57:02 +0000 Subject: [PATCH 137/205] Fixes the Hive Status error when the Queen dies (#5316) # About the pull request Fixes the Hive Status window showing an error message when the Queen dies. For xeno players, the interface just closes. For observing players, the interface will show 'The Hive has no Queen!' where the queen's location was previously. (The bug actually causing the error should be fixed too now) (Note: I'm not quite sure what the `tgui-panel.bundle.css` diff is from, but it kept modifying itself whenever I compiled so I figured it was something related to this.) # Explain why it's good for the game Fixes #4330 # Testing Photographs and Procedure
Screenshots & Videos **Testing queen spawn and death as the queen, as an observer, and as a xeno:** https://github.com/cmss13-devs/cmss13/assets/57483089/ba3b2960-d4ce-4be4-af6b-6daae2d10ac1
# Changelog :cl: fix: Fixed the Hive Status window showing an error message when the Queen dies. /:cl: --- .../mob/living/carbon/xenomorph/Xenomorph.dm | 6 +++--- .../living/carbon/xenomorph/hive_status.dm | 19 +++++++++---------- .../living/carbon/xenomorph/hive_status_ui.dm | 8 +++++++- tgui/packages/tgui/interfaces/HiveStatus.jsx | 14 ++++++++++---- tgui/public/tgui-panel.bundle.css | 4 ++-- 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index e924835f5882..08f884d3a69d 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -432,6 +432,9 @@ if(mob_size < MOB_SIZE_BIG) mob_flags |= SQUEEZE_UNDER_VEHICLES + GLOB.living_xeno_list += src + GLOB.xeno_mob_list += src + // More setup stuff for names, abilities etc update_icon_source() generate_name() @@ -453,9 +456,6 @@ //Begin SStracking SStracking.start_tracking("hive_[src.hivenumber]", src) - GLOB.living_xeno_list += src - GLOB.xeno_mob_list += src - //WO GAMEMODE if(SSticker?.mode?.hardcore) hardcore = 1 //Prevents healing and queen evolution diff --git a/code/modules/mob/living/carbon/xenomorph/hive_status.dm b/code/modules/mob/living/carbon/xenomorph/hive_status.dm index 83a90ded4205..3c8eb51a8155 100644 --- a/code/modules/mob/living/carbon/xenomorph/hive_status.dm +++ b/code/modules/mob/living/carbon/xenomorph/hive_status.dm @@ -422,28 +422,27 @@ // The idea is that we sort this list, and use it as a "key" for all the other information (especially the nicknumber) // in the hive status UI. That way we can minimize the amount of sorts performed by only calling this when xenos are created/disposed /datum/hive_status/proc/get_xeno_keys() - var/list/xenos[totalXenos.len] + var/list/xenos = list() - var/index = 1 - var/useless_slots = 0 for(var/mob/living/carbon/xenomorph/X in totalXenos) if(should_block_game_interaction(X)) var/area/A = get_area(X) if(!(A.flags_atom & AREA_ALLOW_XENO_JOIN)) - useless_slots++ continue - // Insert without doing list merging - xenos[index++] = list( + if(!(X in GLOB.living_xeno_list)) + continue + + // This looks weird, but in DM adding List A to List B actually adds each item in List B to List A, not List B itself. + // Having a nested list like this sort of tricks it into adding the list instead. + // In this case this results in an array of different 'xeno' dictionaries, rather than just a dictionary. + xenos += list(list( "nicknumber" = X.nicknumber, "tier" = X.tier, // This one is only important for sorting "is_leader" = (IS_XENO_LEADER(X)), "is_queen" = istype(X.caste, /datum/caste_datum/queen), "caste_type" = X.caste_type - ) - - // Clear nulls from the xenos list - xenos.len -= useless_slots + )) // Make it all nice and fancy by sorting the list before returning it var/list/sorted_keys = sort_xeno_keys(xenos) diff --git a/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm b/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm index a71ddb7de292..4e71b9a2202f 100644 --- a/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm +++ b/code/modules/mob/living/carbon/xenomorph/hive_status_ui.dm @@ -123,6 +123,10 @@ if(isobserver(user)) return UI_INTERACTIVE + // If the Queen died or is otherwise missing. + if(!assoc_hive.living_xeno_queen) + return UI_CLOSE + /datum/hive_status_ui/ui_data(mob/user) . = list() .["total_xenos"] = total_xenos @@ -131,7 +135,9 @@ .["xeno_keys"] = xeno_keys .["xeno_info"] = xeno_info .["xeno_vitals"] = xeno_vitals - .["queen_location"] = get_area_name(assoc_hive.living_xeno_queen) + .["queen_location"] = null + if(assoc_hive.living_xeno_queen) + .["queen_location"] = get_area_name(assoc_hive.living_xeno_queen) .["hive_location"] = hive_location .["burrowed_larva"] = burrowed_larva .["evilution_level"] = evilution_level diff --git a/tgui/packages/tgui/interfaces/HiveStatus.jsx b/tgui/packages/tgui/interfaces/HiveStatus.jsx index c621430a9f7c..048eb1f6df7b 100644 --- a/tgui/packages/tgui/interfaces/HiveStatus.jsx +++ b/tgui/packages/tgui/interfaces/HiveStatus.jsx @@ -117,10 +117,16 @@ const GeneralInformation = (props, context) => { return ( - -

The Queen is in:

-

{queen_location}

-
+ {queen_location === null ? ( + +

The Hive has no Queen!

+
+ ) : ( + +

The Queen is in:

+

{queen_location}

+
+ )} {!!hive_location && (

The Hive location is:

diff --git a/tgui/public/tgui-panel.bundle.css b/tgui/public/tgui-panel.bundle.css index a1e5060c698b..10fb3458b06b 100644 --- a/tgui/public/tgui-panel.bundle.css +++ b/tgui/public/tgui-panel.bundle.css @@ -1,2 +1,2 @@ -html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a !important}.color-white{color:#fff !important}.color-red{color:#df3e3e !important}.color-orange{color:#f37f33 !important}.color-yellow{color:#fbda21 !important}.color-olive{color:#cbe41c !important}.color-green{color:#25ca4c !important}.color-teal{color:#00d6cc !important}.color-blue{color:#2e93de !important}.color-dark-blue{color:#005fa7 !important}.color-violet{color:#7349cf !important}.color-purple{color:#ad45d0 !important}.color-pink{color:#e34da1 !important}.color-brown{color:#b97447 !important}.color-grey{color:#848484 !important}.color-light-grey{color:#b3b3b3 !important}.color-good{color:#68c22d !important}.color-average{color:#f29a29 !important}.color-bad{color:#df3e3e !important}.color-label{color:#8b9bb0 !important}.color-xeno{color:#664573 !important}.color-bg-black{background-color:#000 !important}.color-bg-white{background-color:#d9d9d9 !important}.color-bg-red{background-color:#bd2020 !important}.color-bg-orange{background-color:#d95e0c !important}.color-bg-yellow{background-color:#d9b804 !important}.color-bg-olive{background-color:#9aad14 !important}.color-bg-green{background-color:#1b9638 !important}.color-bg-teal{background-color:#009a93 !important}.color-bg-blue{background-color:#1c71b1 !important}.color-bg-dark-blue{background-color:#003e6e !important}.color-bg-violet{background-color:#552dab !important}.color-bg-purple{background-color:#8b2baa !important}.color-bg-pink{background-color:#cf2082 !important}.color-bg-brown{background-color:#8c5836 !important}.color-bg-grey{background-color:#646464 !important}.color-bg-light-grey{background-color:#919191 !important}.color-bg-good{background-color:#4d9121 !important}.color-bg-average{background-color:#cd7a0d !important}.color-bg-bad{background-color:#bd2020 !important}.color-bg-label{background-color:#657a94 !important}.color-bg-xeno{background-color:#462f4e !important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9) !important;background:transparent !important;outline:1px solid rgba(255,255,255,.5) !important;box-shadow:none !important;filter:none !important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8) !important}.outline-dotted{outline-style:dotted !important}.outline-dashed{outline-style:dashed !important}.outline-solid{outline-style:solid !important}.outline-double{outline-style:double !important}.outline-groove{outline-style:groove !important}.outline-ridge{outline-style:ridge !important}.outline-inset{outline-style:inset !important}.outline-outset{outline-style:outset !important}.outline-color-black{outline:.167rem solid #1a1a1a !important}.outline-color-white{outline:.167rem solid #fff !important}.outline-color-red{outline:.167rem solid #df3e3e !important}.outline-color-orange{outline:.167rem solid #f37f33 !important}.outline-color-yellow{outline:.167rem solid #fbda21 !important}.outline-color-olive{outline:.167rem solid #cbe41c !important}.outline-color-green{outline:.167rem solid #25ca4c !important}.outline-color-teal{outline:.167rem solid #00d6cc !important}.outline-color-blue{outline:.167rem solid #2e93de !important}.outline-color-dark-blue{outline:.167rem solid #005fa7 !important}.outline-color-violet{outline:.167rem solid #7349cf !important}.outline-color-purple{outline:.167rem solid #ad45d0 !important}.outline-color-pink{outline:.167rem solid #e34da1 !important}.outline-color-brown{outline:.167rem solid #b97447 !important}.outline-color-grey{outline:.167rem solid #848484 !important}.outline-color-light-grey{outline:.167rem solid #b3b3b3 !important}.outline-color-good{outline:.167rem solid #68c22d !important}.outline-color-average{outline:.167rem solid #f29a29 !important}.outline-color-bad{outline:.167rem solid #df3e3e !important}.outline-color-label{outline:.167rem solid #8b9bb0 !important}.outline-color-xeno{outline:.167rem solid #664573 !important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:bold}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003e6e;color:#fff}.Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.Button--color--dark-blue:hover,.Button--color--dark-blue:focus{background-color:#135b92;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#462f4e;color:#fff}.Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.Button--color--xeno:hover,.Button--color--xeno:focus{background-color:#64496d;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#202020;color:#fff;background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#383838;color:#fff}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.4166666667em;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;overflow-y:scroll;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color 100ms ease-out}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline{display:inline-block}.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotateZ(135deg)}.Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotateZ(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--dark-blue .Knob__ringFill{stroke:#005fa7}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.Knob--color--xeno .Knob__ringFill{stroke:#664573}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-0.25em -0.5em;margin-bottom:0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:bold;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg, transparent, transparent 0.8333333333em, rgba(0, 0, 0, 0.1) 0.8333333333em, rgba(0, 0, 0, 0.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--dark-blue{color:#fff;background-color:#02121f}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--light-grey{color:#fff;background-color:#6a6a6a}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--color--xeno{color:#fff;background-color:#19161b}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border-color:#000 !important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border-color:#d9d9d9 !important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border-color:#bd2020 !important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border-color:#d95e0c !important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border-color:#d9b804 !important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border-color:#9aad14 !important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border-color:#1b9638 !important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border-color:#009a93 !important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border-color:#1c71b1 !important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--dark-blue{border-color:#003e6e !important}.ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003e6e}.ProgressBar--color--violet{border-color:#552dab !important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border-color:#8b2baa !important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border-color:#cf2082 !important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border-color:#8c5836 !important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border-color:#646464 !important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--light-grey{border-color:#919191 !important}.ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.ProgressBar--color--good{border-color:#4d9121 !important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border-color:#cd7a0d !important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border-color:#bd2020 !important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border-color:#657a94 !important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.ProgressBar--color--xeno{border-color:#462f4e !important}.ProgressBar--color--xeno .ProgressBar__fill{background-color:#462f4e}.Section{position:relative;margin-bottom:.5em;background-color:#131313;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.Section .Section:first-child{margin-top:-0.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:bold;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:transparent}.Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--dark-blue{color:#008ffd}.Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#005fa7}.Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#005fa7}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--light-grey{color:#c6c6c6}.Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Tab--selected.Tab--color--xeno{color:#9366a3}.Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#664573}.Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#664573}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea--noborder{border:0px}.TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;bottom:1em;left:1em;right:2em}.Notification{color:#fff;background-color:crimson;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom, #202020 0%, #202020 100%)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}em{font-style:normal;font-weight:bold}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}a.visited{color:#7c00e6}a:visited{color:#7c00e6}a.popt{text-decoration:none}.popup{position:fixed;top:50%;left:50%;background:#ddd}.popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.popup .close:hover{background:#999}.popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.popup input[type=text]:hover,.popup input[type=text]:active,.popup input[type=text]:focus{border-color:green}.popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.popup input[type=submit]:hover,.popup input[type=submit]:focus,.popup input[type=submit]:active{background:#aaa;cursor:pointer}.changeFont{padding:10px}.changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.changeFont a:hover{background:#ccc}.highlightPopup{padding:10px;text-align:center}.highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.highlightPopup input.highlightColor{background-color:#ff0}.highlightPopup input.highlightTermSubmit{margin-top:5px}.contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.contextMenu a:hover{background-color:#ccc}.filterMessages{padding:5px}.filterMessages div{padding:2px 0}.icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:visited,.motd a:active,.motd a:hover{color:#a4bad6}.bold,.name,.prefix,.ooc,.looc,.adminooc,.admin,.medal,.yell{font-weight:bold}.italic,.italics{font-style:italic}.highlight{background:#ff0}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}h1.alert,h2.alert{color:#a4bad6}em{font-style:normal;font-weight:bold}.ooc{font-weight:bold}.adminobserverooc{color:#09c;font-weight:bold}.adminooc{color:#3d5bc3;font-weight:bold}.adminsay{color:#9611d4;font-weight:bold}.admin{color:#5975da;font-weight:bold}.name{font-weight:bold}.deadsay{color:#e2c1ff}.binarysay{color:#1e90ff}.binarysay a{color:lime}.binarysay a:active,.binarysay a:visited{color:#8f8}.radio{color:#1ecc43}.sciradio{color:#c68cfa}.comradio{color:#fcdf03}.secradio{color:#dd3535}.medradio{color:#57b8f0}.engradio{color:#f37746}.suppradio{color:#b88646}.servradio{color:#6ca729}.syndradio{color:#8f4a4b}.gangradio{color:#ac2ea1}.centcomradio{color:#2681a5}.aiprivradio{color:#d65d95}.redteamradio{color:#f44}.blueteamradio{color:#3434fd}.greenteamradio{color:#34fd34}.yellowteamradio{color:#fdfd34}.yell{font-weight:bold}.alert{color:#d82020}.userdanger{color:#c51e1e;font-weight:bold;font-size:185%}.bolddanger{color:#c51e1e;font-weight:bold}.danger{color:#c51e1e}.warning{color:#c51e1e;font-style:italic}.alertwarning{color:red;font-weight:bold}.boldwarning{color:#c51e1e;font-style:italic;font-weight:bold}.announce{color:#c51e1e;font-weight:bold}.boldannounce{color:#c51e1e;font-weight:bold}.bigannounce{font-weight:bold;font-size:115%}.greenannounce{color:#059223;font-weight:bold}.rose{color:#ff5050}.info{color:#9ab0ff}.notice{color:#6685f5}.staff_ic{color:#6685f5}.tinynotice{color:#6685f5;font-size:85%}.tinynoticeital{color:#6685f5;font-style:italic;font-size:85%}.smallnotice{color:#6685f5;font-size:90%}.smallnoticeital{color:#6685f5;font-style:italic;font-size:90%}.boldnotice{color:#6685f5;font-weight:bold}.hear{color:#6685f5;font-style:italic}.adminnotice{color:#6685f5}.adminhelp{color:red;font-weight:bold}.unconscious{color:#a4bad6;font-weight:bold}.suicide{color:#ff5050;font-style:italic}.green{color:#059223}.grey{color:#838383}.red{color:red}.blue{color:#215cff}.nicegreen{color:#059223}.boldnicegreen{color:#059223;font-weight:bold}.cult{color:#973e3b}.cultitalic{color:#973e3b;font-style:italic}.cultbold{color:#973e3b;font-style:italic;font-weight:bold}.cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.narsie{color:#973e3b;font-weight:bold;font-size:925%}.narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.colossus{color:#7f282a;font-size:310%}.hierophant{color:#b441ee;font-weight:bold;font-style:italic}.hierophant_warning{color:#c56bf1;font-style:italic}.purple{color:#9956d3}.holoparasite{color:#88809c}.revennotice{color:#c099e2}.revenboldnotice{color:#c099e2;font-weight:bold}.revenbignotice{color:#c099e2;font-weight:bold;font-size:185%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:bold;font-size:185%}.deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.ghostalert{color:#60f;font-style:italic;font-weight:bold}.alien{color:#855d85}.noticealien{color:#059223}.alertalien{color:#059223;font-weight:bold}.changeling{color:#059223;font-style:italic}.alertsyndie{color:red;font-size:185%;font-weight:bold}.spider{color:#80f;font-weight:bold;font-size:185%}.interface{color:#750e75}.sans{font-family:"Comic Sans MS",cursive,sans-serif}.papyrus{font-family:"Papyrus",cursive,sans-serif}.robot{font-family:"Courier New",cursive,sans-serif}.tape_recorder{color:red;font-family:"Courier New",cursive,sans-serif}.command_headset{font-weight:bold;font-size:160%}.small{font-size:60%}.big{font-size:185%}.reallybig{font-size:245%}.extremelybig{font-size:310%}.greentext{color:#059223;font-size:185%}.redtext{color:#c51e1e;font-size:185%}.clown{color:#ff70c1;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.hypnophrase{color:#202020;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#202020}25%{color:#4b02ac}50%{color:#9f41f1}75%{color:#541c9c}100%{color:#7adbf3}}.phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#f75a5a}50%{color:#d00}100%{color:#f75a5a}}.icon{height:1em;width:auto}.bigicon{font-size:2.5em}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:125%}.abductor{color:#c204c2;font-style:italic}.mind_control{color:#df3da9;font-size:100%;font-weight:bold;font-style:italic}.slime{color:#00ced1}.drone{color:#848482}.monkey{color:#975032}.swarmer{color:#2c75ff}.resonate{color:#298f85}.monkeyhive{color:#a56408}.monkeylead{color:#af6805;font-size:80%}.connectionClosed,.fatalError{background:red;color:#fff;padding:5px}.connectionClosed.restored{background:green}.internal.boldnshit{color:#3d5bc3;font-weight:bold}.text-normal{font-weight:normal;font-style:normal}.hidden{display:none;visibility:hidden}.ml-1{margin-left:1em}.ml-2{margin-left:2em}.ml-3{margin-left:3em}.xooc{color:#ac04e9;font-weight:bold;font-size:140%}.mooc{color:#090;font-weight:bold;font-size:140%}.yooc{color:#999600;font-weight:bold;font-size:140%}.headminsay{color:#653d78;font-weight:bold}.radio{color:#b4b4b4}.deptradio{color:#939}.comradio{color:#779cc2}.centradio{color:#5c5c8a}.hcradio{color:#318779}.pvstradio{color:#9b0612}.cryoradio{color:#ad6d48}.airadio{color:#f0f}.secradio{color:#a52929}.engradio{color:#a66300}.sentryradio{color:#844300}.medradio{color:#008160}.supradio{color:#ba8e41}.jtacradio{color:#ad3b98}.intelradio{color:#027d02}.wyradio{color:#fe9b24}.pmcradio{color:#4dc5ce}.vairadio{color:#e3580e}.rmcradio{color:#e3580e}.cmbradio{color:#1b748c}.clfradio{color:#8e83ca}.alpharadio{color:#db2626}.bravoradio{color:#c68610}.charlieradio{color:#a5a}.deltaradio{color:#007fcf}.echoradio{color:#3eb489}.medium{font-size:110%}.big{font-size:115%}.large{font-size:125%}.extra_large{font-size:130%}.huge{font-size:150%}.underline{text-decoration:underline}.orange{color:#eca100}.normal{font-style:normal}.attack{color:#ff3838}.moderate{color:#c00}.disarm{color:#900}.passive{color:#600}.helpful{color:#368f31}.scanner{color:#ff3838}.scannerb{color:#ff3838;font-weight:bold}.scannerburn{color:orange}.scannerburnb{color:orange;font-weight:bold}.rose{color:#ff5050}.debuginfo{color:#493d26;font-style:italic}.xenonotice{color:#51a16c}.xenoboldnotice{color:#51a16c;font-style:italic}.xenowarning{color:#51a16c;font-style:italic}.xenominorwarning{color:#51a16c;font-weight:bold;font-style:italic}.xenodanger{color:#51a16c;font-weight:bold}.avoidharm{color:#72a0e5;font-weight:bold}.highdanger{color:#ff3838;font-weight:bold;font-size:140%}.xenohighdanger{color:#51a16c;font-weight:bold;font-size:140%}.xenoannounce{color:#65c585;font-family:book-antiqua;font-weight:bold;font-size:140%}.yautjabold{color:purple;font-weight:bold}.yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.objectivebig{font-weight:bold;font-size:130%}.objectivegreen{color:lime}.objectivered{color:red}.objectivesuccess{color:lime;font-weight:bold;font-size:110%}.objectivefail{color:red;font-weight:bold;font-size:110%}.xenotalk,.xeno{color:#c048c0;font-style:italic}.xenoleader{color:#996e99;font-style:italic;font-size:125%}.xenoqueen{color:#996e99;font-style:italic;font-weight:bold;font-size:125%}.newscaster{color:maroon}.role_header{color:#e92d2d;display:block;text-align:center;font-weight:bold;font-family:trebuchet-ms;font-size:150%}.role_body{color:#3a3ae9;display:block;text-align:center;font-size:125%}.round_header{color:#e92d2d;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.round_body{color:#c5c5c5;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.announce_header{color:#cecece;font-weight:bold;font-size:150%}.announce_header_blue{color:#7575f3;font-weight:bold;font-size:150%}.announce_header_admin{color:#7575f3;font-weight:bold;font-size:150%}.announce_body{color:#e92d2d;font-weight:normal;font-size:125%}.centerbold{display:block;text-align:center;font-weight:bold}.mod{color:#917455;font-weight:bold}.modooc{color:#184880;font-weight:bold}.adminmod{color:#7c440c;font-weight:bold}.mentorsay{color:#d4af57;font-weight:bold}.mentorhelp{color:#090;font-weight:bold}.mentorbody{color:#da6200;font-weight:bold}.mentorstaff{color:#b5850d;font-weight:bold}.staffsay{color:#b5850d;font-weight:bold}.tajaran{color:#803b56}.tajaran_signlang{color:#941c1c}.skrell{color:#00ced1}.soghun{color:#228b22}.changeling{color:purple}.vox{color:#a0a}.monkey{color:#966c47}.german{color:#858f1e;font-family:"Times New Roman",Times,serif}.spanish{color:#cf982b}.japanese{color:#940927}.chinese{color:#fe1919}.zombie{color:#2dacb1;font-style:italic}.rough{font-family:trebuchet-ms,cursive,sans-serif}.commando{color:#fe9b24;font-style:bold}.say_quote{font-family:Georgia,Verdana,sans-serif}.admin .message{color:#314cad}.admin .prefix{font-weight:bolder}.pm{font-size:110%}.deadsay{color:#8b4dff}.retro_translator{font-weight:bold}.yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.tooltip{font-style:italic;border-bottom:1px dashed #fff} -.theme-light .color-black{color:#000 !important}.theme-light .color-white{color:#e6e6e6 !important}.theme-light .color-red{color:#c82121 !important}.theme-light .color-orange{color:#e6630d !important}.theme-light .color-yellow{color:#e5c304 !important}.theme-light .color-olive{color:#a3b816 !important}.theme-light .color-green{color:#1d9f3b !important}.theme-light .color-teal{color:#00a39c !important}.theme-light .color-blue{color:#1e78bb !important}.theme-light .color-dark-blue{color:#004274 !important}.theme-light .color-violet{color:#5a30b5 !important}.theme-light .color-purple{color:#932eb4 !important}.theme-light .color-pink{color:#db228a !important}.theme-light .color-brown{color:#955d39 !important}.theme-light .color-grey{color:#e6e6e6 !important}.theme-light .color-light-grey{color:#999 !important}.theme-light .color-good{color:#529923 !important}.theme-light .color-average{color:#da810e !important}.theme-light .color-bad{color:#c82121 !important}.theme-light .color-label{color:#353535 !important}.theme-light .color-xeno{color:#4a3253 !important}.theme-light .color-bg-black{background-color:#000 !important}.theme-light .color-bg-white{background-color:#bfbfbf !important}.theme-light .color-bg-red{background-color:#a61c1c !important}.theme-light .color-bg-orange{background-color:#c0530b !important}.theme-light .color-bg-yellow{background-color:#bfa303 !important}.theme-light .color-bg-olive{background-color:#889912 !important}.theme-light .color-bg-green{background-color:#188532 !important}.theme-light .color-bg-teal{background-color:#008882 !important}.theme-light .color-bg-blue{background-color:#19649c !important}.theme-light .color-bg-dark-blue{background-color:#003761 !important}.theme-light .color-bg-violet{background-color:#4b2897 !important}.theme-light .color-bg-purple{background-color:#7a2696 !important}.theme-light .color-bg-pink{background-color:#b61d73 !important}.theme-light .color-bg-brown{background-color:#7c4d2f !important}.theme-light .color-bg-grey{background-color:#bfbfbf !important}.theme-light .color-bg-light-grey{background-color:gray !important}.theme-light .color-bg-good{background-color:#44801d !important}.theme-light .color-bg-average{background-color:#b56b0b !important}.theme-light .color-bg-bad{background-color:#a61c1c !important}.theme-light .color-bg-label{background-color:#2c2c2c !important}.theme-light .color-bg-xeno{background-color:#3e2945 !important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:transparent}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-light .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-light .Tab--selected.Tab--color--dark-blue{color:#0079d7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#004274}.theme-light .Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#004274}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-light .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-light .Tab--selected.Tab--color--xeno{color:#7e558e}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#4a3253}.theme-light .Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#4a3253}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-light .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-light .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-light .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-light .Section .Section:first-child{margin-top:-0.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconPosition--right .fa,.theme-light .Button--hasContent.Button--iconPosition--right .fas,.theme-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--black:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--black:hover,.theme-light .Button--color--black:focus{background-color:#131313;color:#fff}.theme-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--white:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--white:hover,.theme-light .Button--color--white:focus{background-color:#efefef;color:#000}.theme-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--red:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--red:hover,.theme-light .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--orange:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--orange:hover,.theme-light .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--yellow:hover,.theme-light .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--olive:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--olive:hover,.theme-light .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--green:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--green:hover,.theme-light .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--teal:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--teal:hover,.theme-light .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--blue:hover,.theme-light .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-light .Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003761;color:#fff}.theme-light .Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--dark-blue:hover,.theme-light .Button--color--dark-blue:focus{background-color:#135283;color:#fff}.theme-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--violet:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--violet:hover,.theme-light .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--purple:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--purple:hover,.theme-light .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--pink:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--pink:hover,.theme-light .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--brown:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--brown:hover,.theme-light .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--grey:hover,.theme-light .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-light .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:gray;color:#fff}.theme-light .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--light-grey:hover,.theme-light .Button--color--light-grey:focus{background-color:#a6a6a6;color:#fff}.theme-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--good:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--good:hover,.theme-light .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--average:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--average:hover,.theme-light .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--bad:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--bad:hover,.theme-light .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--label:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--label:hover,.theme-light .Button--color--label:focus{background-color:#464646;color:#fff}.theme-light .Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#3e2945;color:#fff}.theme-light .Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--xeno:hover,.theme-light .Button--color--xeno:focus{background-color:#5a4363;color:#fff}.theme-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--default:hover,.theme-light .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--caution:hover,.theme-light .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--danger:hover,.theme-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--transparent:hover,.theme-light .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-light .Button--disabled{background-color:#363636 !important}.theme-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--selected:hover,.theme-light .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-light .Button--flex{display:inline-flex;flex-direction:column}.theme-light .Button--flex--fluid{width:100%}.theme-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-light .Button--verticalAlignContent--middle{justify-content:center}.theme-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-light .Button__content{display:block;align-self:stretch}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea--noborder{border:0px}.theme-light .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:transparent;line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotateZ(135deg)}.theme-light .Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotateZ(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.theme-light .Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--dark-blue .Knob__ringFill{stroke:#004274}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--light-grey .Knob__ringFill{stroke:#999}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Knob--color--xeno .Knob__ringFill{stroke:#4a3253}.theme-light .Slider{cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.theme-light .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-light .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--black{border-color:#000 !important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border-color:#a61c1c !important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border-color:#c0530b !important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border-color:#bfa303 !important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border-color:#889912 !important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border-color:#188532 !important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border-color:#008882 !important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border-color:#19649c !important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--dark-blue{border-color:#003761 !important}.theme-light .ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003761}.theme-light .ProgressBar--color--violet{border-color:#4b2897 !important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border-color:#7a2696 !important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border-color:#b61d73 !important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border-color:#7c4d2f !important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--light-grey{border-color:gray !important}.theme-light .ProgressBar--color--light-grey .ProgressBar__fill{background-color:gray}.theme-light .ProgressBar--color--good{border-color:#44801d !important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border-color:#b56b0b !important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border-color:#a61c1c !important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border-color:#2c2c2c !important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .ProgressBar--color--xeno{border-color:#3e2945 !important}.theme-light .ProgressBar--color--xeno .ProgressBar__fill{background-color:#3e2945}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom, #eeeeee 0%, #eeeeee 100%)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-light .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light html,.theme-light body{padding:0;margin:0;height:100%;color:#000}.theme-light body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-light em{font-style:normal;font-weight:bold}.theme-light img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-light img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-light a{color:blue}.theme-light a.visited{color:#f0f}.theme-light a:visited{color:#f0f}.theme-light a.popt{text-decoration:none}.theme-light .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-light .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-light .popup .close:hover{background:#999}.theme-light .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.theme-light .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-light .popup input[type=text]:hover,.theme-light .popup input[type=text]:active,.theme-light .popup input[type=text]:focus{border-color:green}.theme-light .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.theme-light .popup input[type=submit]:hover,.theme-light .popup input[type=submit]:focus,.theme-light .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-light .changeFont{padding:10px}.theme-light .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-light .changeFont a:hover{background:#ccc}.theme-light .highlightPopup{padding:10px;text-align:center}.theme-light .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-light .highlightPopup input.highlightColor{background-color:#ff0}.theme-light .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-light .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-light .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-light .contextMenu a:hover{background-color:#ccc}.theme-light .filterMessages{padding:5px}.theme-light .filterMessages div{padding:2px 0}.theme-light .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-light .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6{color:#638500;text-decoration:underline}.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:visited,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .bold,.theme-light .name,.theme-light .prefix,.theme-light .ooc,.theme-light .looc,.theme-light .adminooc,.theme-light .admin,.theme-light .medal,.theme-light .yell{font-weight:bold}.theme-light .italic,.theme-light .italics{font-style:italic}.theme-light .highlight{background:#ff0}.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:blue;font-family:Georgia,Verdana,sans-serif}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light em{font-style:normal;font-weight:bold}.theme-light .ooc{font-weight:bold}.theme-light .adminobserverooc{color:#09c;font-weight:bold}.theme-light .adminooc{color:#700038;font-weight:bold}.theme-light .adminsay{color:#ff4500;font-weight:bold}.theme-light .admin{color:#4473ff;font-weight:bold}.theme-light .name{font-weight:bold}.theme-light .deadsay{color:#5c00e6}.theme-light .binarysay{color:#20c20e;background-color:#000;display:block}.theme-light .binarysay a{color:lime}.theme-light .binarysay a:active,.theme-light .binarysay a:visited{color:#8f8}.theme-light .radio{color:green}.theme-light .sciradio{color:#939}.theme-light .comradio{color:#948f02}.theme-light .secradio{color:#a30000}.theme-light .medradio{color:#337296}.theme-light .engradio{color:#fb5613}.theme-light .sentryradio{color:#844300}.theme-light .suppradio{color:#a8732b}.theme-light .servradio{color:#6eaa2c}.theme-light .syndradio{color:#6d3f40}.theme-light .gangradio{color:#ac2ea1}.theme-light .centcomradio{color:#686868}.theme-light .aiprivradio{color:#f0f}.theme-light .redteamradio{color:red}.theme-light .blueteamradio{color:blue}.theme-light .greenteamradio{color:lime}.theme-light .yellowteamradio{color:#d1ba22}.theme-light .yell{font-weight:bold}.theme-light .alert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .userdanger{color:red;font-weight:bold;font-size:185%}.theme-light .bolddanger{color:red;font-weight:bold}.theme-light .danger{color:red}.theme-light .tinydanger{color:red;font-size:85%}.theme-light .smalldanger{color:red;font-size:90%}.theme-light .warning{color:red;font-style:italic}.theme-light .alertwarning{color:red;font-weight:bold}.theme-light .boldwarning{color:red;font-style:italic;font-weight:bold}.theme-light .announce{color:#228b22;font-weight:bold}.theme-light .boldannounce{color:red;font-weight:bold}.theme-light .bigannounce{font-weight:bold;font-size:115%}.theme-light .greenannounce{color:lime;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .info{color:#00c}.theme-light .notice{color:#009}.theme-light .staff_ic{color:#009}.theme-light .tinynotice{color:#009;font-size:85%}.theme-light .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-light .smallnotice{color:#009;font-size:90%}.theme-light .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-light .boldnotice{color:#009;font-weight:bold}.theme-light .hear{color:#009;font-style:italic}.theme-light .adminnotice{color:blue}.theme-light .adminhelp{color:red;font-weight:bold}.theme-light .unconscious{color:blue;font-weight:bold}.theme-light .suicide{color:#ff5050;font-style:italic}.theme-light .green{color:#03ff39}.theme-light .grey{color:#838383}.theme-light .red{color:red}.theme-light .blue{color:blue}.theme-light .nicegreen{color:#14a833}.theme-light .boldnicegreen{color:#14a833;font-weight:bold}.theme-light .cult{color:#973e3b}.theme-light .cultitalic{color:#973e3b;font-style:italic}.theme-light .cultbold{color:#973e3b;font-style:italic;font-weight:bold}.theme-light .cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .narsie{color:#973e3b;font-weight:bold;font-size:925%}.theme-light .narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.theme-light .colossus{color:#7f282a;font-size:310%}.theme-light .hierophant{color:#609;font-weight:bold;font-style:italic}.theme-light .hierophant_warning{color:#609;font-style:italic}.theme-light .purple{color:#5e2d79}.theme-light .holoparasite{color:#35333a}.theme-light .revennotice{color:#1d2953}.theme-light .revenboldnotice{color:#1d2953;font-weight:bold}.theme-light .revenbignotice{color:#1d2953;font-weight:bold;font-size:185%}.theme-light .revenminor{color:#823abb}.theme-light .revenwarning{color:#760fbb;font-style:italic}.theme-light .revendanger{color:#760fbb;font-weight:bold;font-size:185%}.theme-light .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-light .ghostalert{color:#5c00e6;font-style:italic;font-weight:bold}.theme-light .alien{color:#543354}.theme-light .noticealien{color:#00c000}.theme-light .alertalien{color:#00c000;font-weight:bold}.theme-light .changeling{color:purple;font-style:italic}.theme-light .alertsyndie{color:red;font-size:185%;font-weight:bold}.theme-light .spider{color:#4d004d;font-weight:bold;font-size:185%}.theme-light .interface{color:#303}.theme-light .sans{font-family:"Comic Sans MS",cursive,sans-serif}.theme-light .papyrus{font-family:"Papyrus",cursive,sans-serif}.theme-light .robot{font-family:"Courier New",cursive,sans-serif}.theme-light .tape_recorder{color:maroon;font-family:"Courier New",cursive,sans-serif}.theme-light .command_headset{font-weight:bold;font-size:160%}.theme-light .small{font-size:60%}.theme-light .big{font-size:185%}.theme-light .reallybig{font-size:245%}.theme-light .extremelybig{font-size:310%}.theme-light .greentext{color:lime;font-size:185%}.theme-light .redtext{color:red;font-size:185%}.theme-light .clown{color:#ff69bf;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.theme-light .singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.theme-light .his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.theme-light .hypnophrase{color:#0d0d0d;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#0d0d0d}25%{color:#410194}50%{color:#7f17d8}75%{color:#410194}100%{color:#3bb5d3}}.theme-light .phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#0d0d0d}50%{color:#d00}100%{color:#0d0d0d}}.theme-light .icon{height:1em;width:auto}.theme-light .bigicon{font-size:2.5em}.theme-light .memo{color:#638500;text-align:center}.theme-light .memoedit{text-align:center;font-size:125%}.theme-light .abductor{color:purple;font-style:italic}.theme-light .mind_control{color:#a00d6f;font-size:100%;font-weight:bold;font-style:italic}.theme-light .slime{color:#00ced1}.theme-light .drone{color:#848482}.theme-light .monkey{color:#975032}.theme-light .swarmer{color:#2c75ff}.theme-light .resonate{color:#298f85}.theme-light .monkeyhive{color:#774704}.theme-light .monkeylead{color:#774704;font-size:80%}.theme-light .connectionClosed,.theme-light .fatalError{background:red;color:#fff;padding:5px}.theme-light .connectionClosed.restored{background:green}.theme-light .internal.boldnshit{color:blue;font-weight:bold}.theme-light .text-normal{font-weight:normal;font-style:normal}.theme-light .hidden{display:none;visibility:hidden}.theme-light .ml-1{margin-left:1em}.theme-light .ml-2{margin-left:2em}.theme-light .ml-3{margin-left:3em}.theme-light .xooc{color:#6c0094;font-weight:bold;font-size:140%}.theme-light .mooc{color:#090;font-weight:bold;font-size:140%}.theme-light .yooc{color:#999600;font-weight:bold;font-size:140%}.theme-light .headminsay{color:#5a0a7f;font-weight:bold}.theme-light .radio{color:#4e4e4e}.theme-light .deptradio{color:#939}.theme-light .comradio{color:#004080}.theme-light .centradio{color:#5c5c8a}.theme-light .cryoradio{color:#554e3f}.theme-light .hcradio{color:#318779}.theme-light .pvstradio{color:#9b0612}.theme-light .airadio{color:#f0f}.theme-light .secradio{color:#a30000}.theme-light .engradio{color:#a66300}.theme-light .sentryradio{color:#844300}.theme-light .medradio{color:#008160}.theme-light .supradio{color:#5f4519}.theme-light .jtacradio{color:#702963}.theme-light .intelradio{color:#027d02}.theme-light .wyradio{color:#fe9b24}.theme-light .pmcradio{color:#136957}.theme-light .vairadio{color:#943d0a}.theme-light .cmbradio{color:#1b748c}.theme-light .clfradio{color:#6f679c}.theme-light .alpharadio{color:#ea0000}.theme-light .bravoradio{color:#c68610}.theme-light .charlieradio{color:#a5a}.theme-light .deltaradio{color:#007fcf}.theme-light .echoradio{color:#3a7e65}.theme-light .medium{font-size:110%}.theme-light .big{font-size:115%}.theme-light .large{font-size:125%}.theme-light .extra_large{font-size:130%}.theme-light .huge{font-size:150%}.theme-light .underline{text-decoration:underline}.theme-light .orange{color:#eca100}.theme-light .normal{font-style:normal}.theme-light .attack{color:red}.theme-light .moderate{color:#c00}.theme-light .disarm{color:#900}.theme-light .passive{color:#600}.theme-light .helpful{color:#368f31}.theme-light .scanner{color:red}.theme-light .scannerb{color:red;font-weight:bold}.theme-light .scannerburn{color:orange}.theme-light .scannerburnb{color:orange;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .debuginfo{color:#493d26;font-style:italic}.theme-light .xenonotice{color:#2a623d}.theme-light .xenoboldnotice{color:#2a623d;font-style:italic}.theme-light .xenowarning{color:#2a623d;font-style:italic}.theme-light .xenominorwarning{color:#2a623d;font-weight:bold;font-style:italic}.theme-light .xenodanger{color:#2a623d;font-weight:bold}.theme-light .avoidharm{color:#72a0e5;font-weight:bold}.theme-light .highdanger{color:red;font-weight:bold;font-size:140%}.theme-light .xenohighdanger{color:#2a623d;font-weight:bold;font-size:140%}.theme-light .xenoannounce{color:#1a472a;font-family:book-antiqua;font-weight:bold;font-size:140%}.theme-light .yautjabold{color:purple;font-weight:bold}.theme-light .yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.theme-light .objectivebig{font-weight:bold;font-size:130%}.theme-light .objectivegreen{color:lime}.theme-light .objectivered{color:red}.theme-light .objectivesuccess{color:lime;font-weight:bold;font-size:110%}.theme-light .objectivefail{color:red;font-weight:bold;font-size:110%}.theme-light .xenotalk,.theme-light .xeno{color:#900090;font-style:italic}.theme-light .xenoleader{color:#730d73;font-style:italic;font-size:125%}.theme-light .xenoqueen{color:#730d73;font-style:italic;font-weight:bold;font-size:125%}.theme-light .newscaster{color:maroon}.theme-light .role_header{color:#db0000;display:block;text-align:center;font-weight:bold;font-family:trebuchet-ms;font-size:150%}.theme-light .role_body{color:#009;display:block;text-align:center;font-size:125%}.theme-light .round_header{color:#db0000;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.theme-light .round_body{color:#001427;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.theme-light .event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.theme-light .announce_header{color:#000;font-weight:bold;font-size:150%}.theme-light .announce_header_blue{color:#009;font-weight:bold;font-size:150%}.theme-light .announce_body{color:red;font-weight:normal;font-size:125%}.theme-light .centerbold{display:block;text-align:center;font-weight:bold}.theme-light .mod{color:#735638;font-weight:bold}.theme-light .modooc{color:#184880;font-weight:bold}.theme-light .adminmod{color:#402a14;font-weight:bold}.theme-light .mentorsay{color:#b38c32;font-weight:bold}.theme-light .mentorhelp{color:#007e00;font-weight:bold}.theme-light .mentorbody{color:#da6200;font-weight:bold}.theme-light .mentorstaff{color:#876101;font-weight:bold}.theme-light .staffsay{color:#876101;font-weight:bold}.theme-light .tajaran{color:#803b56}.theme-light .tajaran_signlang{color:#941c1c}.theme-light .skrell{color:#00ced1}.theme-light .soghun{color:#228b22}.theme-light .changeling{color:purple}.theme-light .vox{color:#a0a}.theme-light .monkey{color:#966c47}.theme-light .german{color:#858f1e;font-family:"Times New Roman",Times,serif}.theme-light .spanish{color:#cf982b}.theme-light .japanese{color:#940927}.theme-light .chinese{color:#fe1919}.theme-light .zombie{color:#216163;font-style:italic}.theme-light .commando{color:#fe9b24;font-style:bold}.theme-light .rough{font-family:trebuchet-ms,cursive,sans-serif}.theme-light .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-light .admin .message{color:#314cad}.theme-light .admin .prefix{font-weight:bolder}.theme-light .pm{font-size:110%}.theme-light .retro_translator{font-weight:bold}.theme-light .yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.theme-light .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-light .examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.theme-light .tooltip{font-style:italic;border-bottom:1px dashed #000} +html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a !important}.color-white{color:#fff !important}.color-red{color:#df3e3e !important}.color-orange{color:#f37f33 !important}.color-yellow{color:#fbda21 !important}.color-olive{color:#cbe41c !important}.color-green{color:#25ca4c !important}.color-teal{color:#00d6cc !important}.color-blue{color:#2e93de !important}.color-dark-blue{color:#005fa7 !important}.color-violet{color:#7349cf !important}.color-purple{color:#ad45d0 !important}.color-pink{color:#e34da1 !important}.color-brown{color:#b97447 !important}.color-grey{color:#848484 !important}.color-light-grey{color:#b3b3b3 !important}.color-good{color:#68c22d !important}.color-average{color:#f29a29 !important}.color-bad{color:#df3e3e !important}.color-label{color:#8b9bb0 !important}.color-xeno{color:#664573 !important}.color-bg-black{background-color:#000 !important}.color-bg-white{background-color:#d9d9d9 !important}.color-bg-red{background-color:#bd2020 !important}.color-bg-orange{background-color:#d95e0c !important}.color-bg-yellow{background-color:#d9b804 !important}.color-bg-olive{background-color:#9aad14 !important}.color-bg-green{background-color:#1b9638 !important}.color-bg-teal{background-color:#009a93 !important}.color-bg-blue{background-color:#1c71b1 !important}.color-bg-dark-blue{background-color:#003e6e !important}.color-bg-violet{background-color:#552dab !important}.color-bg-purple{background-color:#8b2baa !important}.color-bg-pink{background-color:#cf2082 !important}.color-bg-brown{background-color:#8c5836 !important}.color-bg-grey{background-color:#646464 !important}.color-bg-light-grey{background-color:#919191 !important}.color-bg-good{background-color:#4d9121 !important}.color-bg-average{background-color:#cd7a0d !important}.color-bg-bad{background-color:#bd2020 !important}.color-bg-label{background-color:#657a94 !important}.color-bg-xeno{background-color:#462f4e !important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9) !important;background:transparent !important;outline:1px solid rgba(255,255,255,.5) !important;box-shadow:none !important;filter:none !important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8) !important}.outline-dotted{outline-style:dotted !important}.outline-dashed{outline-style:dashed !important}.outline-solid{outline-style:solid !important}.outline-double{outline-style:double !important}.outline-groove{outline-style:groove !important}.outline-ridge{outline-style:ridge !important}.outline-inset{outline-style:inset !important}.outline-outset{outline-style:outset !important}.outline-color-black{outline:.167rem solid #1a1a1a !important}.outline-color-white{outline:.167rem solid #fff !important}.outline-color-red{outline:.167rem solid #df3e3e !important}.outline-color-orange{outline:.167rem solid #f37f33 !important}.outline-color-yellow{outline:.167rem solid #fbda21 !important}.outline-color-olive{outline:.167rem solid #cbe41c !important}.outline-color-green{outline:.167rem solid #25ca4c !important}.outline-color-teal{outline:.167rem solid #00d6cc !important}.outline-color-blue{outline:.167rem solid #2e93de !important}.outline-color-dark-blue{outline:.167rem solid #005fa7 !important}.outline-color-violet{outline:.167rem solid #7349cf !important}.outline-color-purple{outline:.167rem solid #ad45d0 !important}.outline-color-pink{outline:.167rem solid #e34da1 !important}.outline-color-brown{outline:.167rem solid #b97447 !important}.outline-color-grey{outline:.167rem solid #848484 !important}.outline-color-light-grey{outline:.167rem solid #b3b3b3 !important}.outline-color-good{outline:.167rem solid #68c22d !important}.outline-color-average{outline:.167rem solid #f29a29 !important}.outline-color-bad{outline:.167rem solid #df3e3e !important}.outline-color-label{outline:.167rem solid #8b9bb0 !important}.outline-color-xeno{outline:.167rem solid #664573 !important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:bold}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color 100ms,background-color 100ms}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color 100ms,background-color 100ms}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color 100ms,background-color 100ms}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color 100ms,background-color 100ms}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color 100ms,background-color 100ms}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color 100ms,background-color 100ms}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color 100ms,background-color 100ms}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color 100ms,background-color 100ms}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003e6e;color:#fff}.Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.Button--color--dark-blue:hover,.Button--color--dark-blue:focus{background-color:#135b92;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color 100ms,background-color 100ms}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color 100ms,background-color 100ms}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color 100ms,background-color 100ms}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color 100ms,background-color 100ms}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color 100ms,background-color 100ms}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:#919191;color:#fff}.Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.Button--color--light-grey:hover,.Button--color--light-grey:focus{background-color:#bababa;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color 100ms,background-color 100ms}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color 100ms,background-color 100ms}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color 100ms,background-color 100ms}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color 100ms,background-color 100ms}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#462f4e;color:#fff}.Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.Button--color--xeno:hover,.Button--color--xeno:focus{background-color:#64496d;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color 100ms,background-color 100ms}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color 100ms,background-color 100ms}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color 100ms,background-color 100ms}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#202020;color:#fff;background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#383838;color:#fff}.Button--disabled{background-color:#999 !important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color 100ms,background-color 100ms}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.4166666667em;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;overflow-y:scroll;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color 100ms ease-out}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline{display:inline-block}.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.Knob:after{content:".";color:transparent;line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotateZ(135deg)}.Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotateZ(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--dark-blue .Knob__ringFill{stroke:#005fa7}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--light-grey .Knob__ringFill{stroke:#b3b3b3}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.Knob--color--xeno .Knob__ringFill{stroke:#664573}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-0.25em -0.5em;margin-bottom:0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:bold;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg, transparent, transparent 0.8333333333em, rgba(0, 0, 0, 0.1) 0.8333333333em, rgba(0, 0, 0, 0.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--dark-blue{color:#fff;background-color:#02121f}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--light-grey{color:#fff;background-color:#6a6a6a}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--color--xeno{color:#fff;background-color:#19161b}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border-color:#000 !important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border-color:#d9d9d9 !important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border-color:#bd2020 !important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border-color:#d95e0c !important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border-color:#d9b804 !important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border-color:#9aad14 !important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border-color:#1b9638 !important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border-color:#009a93 !important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border-color:#1c71b1 !important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--dark-blue{border-color:#003e6e !important}.ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003e6e}.ProgressBar--color--violet{border-color:#552dab !important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border-color:#8b2baa !important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border-color:#cf2082 !important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border-color:#8c5836 !important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border-color:#646464 !important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--light-grey{border-color:#919191 !important}.ProgressBar--color--light-grey .ProgressBar__fill{background-color:#919191}.ProgressBar--color--good{border-color:#4d9121 !important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border-color:#cd7a0d !important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border-color:#bd2020 !important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border-color:#657a94 !important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.ProgressBar--color--xeno{border-color:#462f4e !important}.ProgressBar--color--xeno .ProgressBar__fill{background-color:#462f4e}.Section{position:relative;margin-bottom:.5em;background-color:#131313;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.Section .Section:first-child{margin-top:-0.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:bold;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:transparent}.Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--dark-blue{color:#008ffd}.Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#005fa7}.Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#005fa7}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--light-grey{color:#c6c6c6}.Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#b3b3b3}.Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#b3b3b3}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Tab--selected.Tab--color--xeno{color:#9366a3}.Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#664573}.Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#664573}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:transparent}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:"Consolas",monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea--noborder{border:0px}.TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity 150ms ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -0.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;bottom:1em;left:1em;right:2em}.Notification{color:#fff;background-color:crimson;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom, #202020 0%, #202020 100%)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}em{font-style:normal;font-weight:bold}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}a.visited{color:#7c00e6}a:visited{color:#7c00e6}a.popt{text-decoration:none}.popup{position:fixed;top:50%;left:50%;background:#ddd}.popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.popup .close:hover{background:#999}.popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.popup input[type=text]:hover,.popup input[type=text]:active,.popup input[type=text]:focus{border-color:green}.popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.popup input[type=submit]:hover,.popup input[type=submit]:focus,.popup input[type=submit]:active{background:#aaa;cursor:pointer}.changeFont{padding:10px}.changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.changeFont a:hover{background:#ccc}.highlightPopup{padding:10px;text-align:center}.highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.highlightPopup input.highlightColor{background-color:#ff0}.highlightPopup input.highlightTermSubmit{margin-top:5px}.contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.contextMenu a:hover{background-color:#ccc}.filterMessages{padding:5px}.filterMessages div{padding:2px 0}.icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:visited,.motd a:active,.motd a:hover{color:#a4bad6}.bold,.name,.prefix,.ooc,.looc,.adminooc,.admin,.medal,.yell{font-weight:bold}.italic,.italics{font-style:italic}.highlight{background:#ff0}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}h1.alert,h2.alert{color:#a4bad6}em{font-style:normal;font-weight:bold}.ooc{font-weight:bold}.adminobserverooc{color:#09c;font-weight:bold}.adminooc{color:#3d5bc3;font-weight:bold}.adminsay{color:#9611d4;font-weight:bold}.admin{color:#5975da;font-weight:bold}.name{font-weight:bold}.deadsay{color:#e2c1ff}.binarysay{color:#1e90ff}.binarysay a{color:lime}.binarysay a:active,.binarysay a:visited{color:#8f8}.radio{color:#1ecc43}.sciradio{color:#c68cfa}.comradio{color:#fcdf03}.secradio{color:#dd3535}.medradio{color:#57b8f0}.engradio{color:#f37746}.suppradio{color:#b88646}.servradio{color:#6ca729}.syndradio{color:#8f4a4b}.gangradio{color:#ac2ea1}.centcomradio{color:#2681a5}.aiprivradio{color:#d65d95}.redteamradio{color:#f44}.blueteamradio{color:#3434fd}.greenteamradio{color:#34fd34}.yellowteamradio{color:#fdfd34}.yell{font-weight:bold}.alert{color:#d82020}.userdanger{color:#c51e1e;font-weight:bold;font-size:185%}.bolddanger{color:#c51e1e;font-weight:bold}.danger{color:#c51e1e}.warning{color:#c51e1e;font-style:italic}.alertwarning{color:red;font-weight:bold}.boldwarning{color:#c51e1e;font-style:italic;font-weight:bold}.announce{color:#c51e1e;font-weight:bold}.boldannounce{color:#c51e1e;font-weight:bold}.bigannounce{font-weight:bold;font-size:115%}.greenannounce{color:#059223;font-weight:bold}.rose{color:#ff5050}.info{color:#9ab0ff}.notice{color:#6685f5}.staff_ic{color:#6685f5}.tinynotice{color:#6685f5;font-size:85%}.tinynoticeital{color:#6685f5;font-style:italic;font-size:85%}.smallnotice{color:#6685f5;font-size:90%}.smallnoticeital{color:#6685f5;font-style:italic;font-size:90%}.boldnotice{color:#6685f5;font-weight:bold}.hear{color:#6685f5;font-style:italic}.adminnotice{color:#6685f5}.adminhelp{color:red;font-weight:bold}.unconscious{color:#a4bad6;font-weight:bold}.suicide{color:#ff5050;font-style:italic}.green{color:#059223}.grey{color:#838383}.red{color:red}.blue{color:#215cff}.nicegreen{color:#059223}.boldnicegreen{color:#059223;font-weight:bold}.cult{color:#973e3b}.cultitalic{color:#973e3b;font-style:italic}.cultbold{color:#973e3b;font-style:italic;font-weight:bold}.cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.narsie{color:#973e3b;font-weight:bold;font-size:925%}.narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.colossus{color:#7f282a;font-size:310%}.hierophant{color:#b441ee;font-weight:bold;font-style:italic}.hierophant_warning{color:#c56bf1;font-style:italic}.purple{color:#9956d3}.holoparasite{color:#88809c}.revennotice{color:#c099e2}.revenboldnotice{color:#c099e2;font-weight:bold}.revenbignotice{color:#c099e2;font-weight:bold;font-size:185%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:bold;font-size:185%}.deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.ghostalert{color:#60f;font-style:italic;font-weight:bold}.alien{color:#855d85}.noticealien{color:#059223}.alertalien{color:#059223;font-weight:bold}.changeling{color:#059223;font-style:italic}.alertsyndie{color:red;font-size:185%;font-weight:bold}.spider{color:#80f;font-weight:bold;font-size:185%}.interface{color:#750e75}.sans{font-family:"Comic Sans MS",cursive,sans-serif}.papyrus{font-family:"Papyrus",cursive,sans-serif}.robot{font-family:"Courier New",cursive,sans-serif}.tape_recorder{color:red;font-family:"Courier New",cursive,sans-serif}.command_headset{font-weight:bold;font-size:160%}.small{font-size:60%}.big{font-size:185%}.reallybig{font-size:245%}.extremelybig{font-size:310%}.greentext{color:#059223;font-size:185%}.redtext{color:#c51e1e;font-size:185%}.clown{color:#ff70c1;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.hypnophrase{color:#202020;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#202020}25%{color:#4b02ac}50%{color:#9f41f1}75%{color:#541c9c}100%{color:#7adbf3}}.phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#f75a5a}50%{color:#d00}100%{color:#f75a5a}}.icon{height:1em;width:auto}.bigicon{font-size:2.5em}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:125%}.abductor{color:#c204c2;font-style:italic}.mind_control{color:#df3da9;font-size:100%;font-weight:bold;font-style:italic}.slime{color:#00ced1}.drone{color:#848482}.monkey{color:#975032}.swarmer{color:#2c75ff}.resonate{color:#298f85}.monkeyhive{color:#a56408}.monkeylead{color:#af6805;font-size:80%}.connectionClosed,.fatalError{background:red;color:#fff;padding:5px}.connectionClosed.restored{background:green}.internal.boldnshit{color:#3d5bc3;font-weight:bold}.text-normal{font-weight:normal;font-style:normal}.hidden{display:none;visibility:hidden}.ml-1{margin-left:1em}.ml-2{margin-left:2em}.ml-3{margin-left:3em}.xooc{color:#ac04e9;font-weight:bold;font-size:140%}.mooc{color:#090;font-weight:bold;font-size:140%}.yooc{color:#999600;font-weight:bold;font-size:140%}.headminsay{color:#653d78;font-weight:bold}.radio{color:#b4b4b4}.deptradio{color:#939}.comradio{color:#779cc2}.centradio{color:#5c5c8a}.hcradio{color:#318779}.pvstradio{color:#9b0612}.cryoradio{color:#ad6d48}.airadio{color:#f0f}.secradio{color:#a52929}.engradio{color:#a66300}.sentryradio{color:#844300}.medradio{color:#008160}.supradio{color:#ba8e41}.jtacradio{color:#ad3b98}.intelradio{color:#027d02}.wyradio{color:#fe9b24}.pmcradio{color:#4dc5ce}.vairadio{color:#e3580e}.rmcradio{color:#e3580e}.cmbradio{color:#1b748c}.clfradio{color:#8e83ca}.alpharadio{color:#db2626}.bravoradio{color:#c68610}.charlieradio{color:#a5a}.deltaradio{color:#007fcf}.echoradio{color:#3eb489}.medium{font-size:110%}.big{font-size:115%}.large{font-size:125%}.extra_large{font-size:130%}.huge{font-size:150%}.underline{text-decoration:underline}.orange{color:#eca100}.normal{font-style:normal}.attack{color:#ff3838}.moderate{color:#c00}.disarm{color:#900}.passive{color:#600}.helpful{color:#368f31}.scanner{color:#ff3838}.scannerb{color:#ff3838;font-weight:bold}.scannerburn{color:orange}.scannerburnb{color:orange;font-weight:bold}.rose{color:#ff5050}.debuginfo{color:#493d26;font-style:italic}.xenonotice{color:#51a16c}.xenoboldnotice{color:#51a16c;font-weight:bold}.xenowarning{color:#51a16c;font-style:italic}.xenominorwarning{color:#51a16c;font-weight:bold;font-style:italic}.xenodanger{color:#51a16c;font-weight:bold}.avoidharm{color:#72a0e5;font-weight:bold}.highdanger{color:#ff3838;font-weight:bold;font-size:140%}.xenohighdanger{color:#51a16c;font-weight:bold;font-size:140%}.xenoannounce{color:#65c585;font-family:book-antiqua;font-weight:bold;font-size:140%}.yautjabold{color:purple;font-weight:bold}.yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.objectivebig{font-weight:bold;font-size:130%}.objectivegreen{color:lime}.objectivered{color:red}.objectivesuccess{color:lime;font-weight:bold;font-size:110%}.objectivefail{color:red;font-weight:bold;font-size:110%}.xenotalk,.xeno{color:#c048c0;font-style:italic}.xenoleader{color:#996e99;font-style:italic;font-size:125%}.xenoqueen{color:#996e99;font-style:italic;font-weight:bold;font-size:125%}.newscaster{color:maroon}.role_header{color:#e92d2d;display:block;text-align:center;font-weight:bold;font-family:trebuchet-ms;font-size:150%}.role_body{color:#3a3ae9;display:block;text-align:center;font-size:125%}.round_header{color:#e92d2d;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.round_body{color:#c5c5c5;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.announce_header{color:#cecece;font-weight:bold;font-size:150%}.announce_header_blue{color:#7575f3;font-weight:bold;font-size:150%}.announce_header_admin{color:#7575f3;font-weight:bold;font-size:150%}.announce_body{color:#e92d2d;font-weight:normal;font-size:125%}.centerbold{display:block;text-align:center;font-weight:bold}.mod{color:#917455;font-weight:bold}.modooc{color:#184880;font-weight:bold}.adminmod{color:#7c440c;font-weight:bold}.mentorsay{color:#d4af57;font-weight:bold}.mentorhelp{color:#090;font-weight:bold}.mentorbody{color:#da6200;font-weight:bold}.mentorstaff{color:#b5850d;font-weight:bold}.staffsay{color:#b5850d;font-weight:bold}.tajaran{color:#803b56}.tajaran_signlang{color:#941c1c}.skrell{color:#00ced1}.soghun{color:#228b22}.changeling{color:purple}.vox{color:#a0a}.monkey{color:#966c47}.german{color:#858f1e;font-family:"Times New Roman",Times,serif}.spanish{color:#cf982b}.japanese{color:#940927}.chinese{color:#fe1919}.zombie{color:#2dacb1;font-style:italic}.rough{font-family:trebuchet-ms,cursive,sans-serif}.commando{color:#fe9b24;font-style:bold}.say_quote{font-family:Georgia,Verdana,sans-serif}.admin .message{color:#314cad}.admin .prefix{font-weight:bolder}.pm{font-size:110%}.deadsay{color:#8b4dff}.retro_translator{font-weight:bold}.yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.tooltip{font-style:italic;border-bottom:1px dashed #fff} +.theme-light .color-black{color:#000 !important}.theme-light .color-white{color:#e6e6e6 !important}.theme-light .color-red{color:#c82121 !important}.theme-light .color-orange{color:#e6630d !important}.theme-light .color-yellow{color:#e5c304 !important}.theme-light .color-olive{color:#a3b816 !important}.theme-light .color-green{color:#1d9f3b !important}.theme-light .color-teal{color:#00a39c !important}.theme-light .color-blue{color:#1e78bb !important}.theme-light .color-dark-blue{color:#004274 !important}.theme-light .color-violet{color:#5a30b5 !important}.theme-light .color-purple{color:#932eb4 !important}.theme-light .color-pink{color:#db228a !important}.theme-light .color-brown{color:#955d39 !important}.theme-light .color-grey{color:#e6e6e6 !important}.theme-light .color-light-grey{color:#999 !important}.theme-light .color-good{color:#529923 !important}.theme-light .color-average{color:#da810e !important}.theme-light .color-bad{color:#c82121 !important}.theme-light .color-label{color:#353535 !important}.theme-light .color-xeno{color:#4a3253 !important}.theme-light .color-bg-black{background-color:#000 !important}.theme-light .color-bg-white{background-color:#bfbfbf !important}.theme-light .color-bg-red{background-color:#a61c1c !important}.theme-light .color-bg-orange{background-color:#c0530b !important}.theme-light .color-bg-yellow{background-color:#bfa303 !important}.theme-light .color-bg-olive{background-color:#889912 !important}.theme-light .color-bg-green{background-color:#188532 !important}.theme-light .color-bg-teal{background-color:#008882 !important}.theme-light .color-bg-blue{background-color:#19649c !important}.theme-light .color-bg-dark-blue{background-color:#003761 !important}.theme-light .color-bg-violet{background-color:#4b2897 !important}.theme-light .color-bg-purple{background-color:#7a2696 !important}.theme-light .color-bg-pink{background-color:#b61d73 !important}.theme-light .color-bg-brown{background-color:#7c4d2f !important}.theme-light .color-bg-grey{background-color:#bfbfbf !important}.theme-light .color-bg-light-grey{background-color:gray !important}.theme-light .color-bg-good{background-color:#44801d !important}.theme-light .color-bg-average{background-color:#b56b0b !important}.theme-light .color-bg-bad{background-color:#a61c1c !important}.theme-light .color-bg-label{background-color:#2c2c2c !important}.theme-light .color-bg-xeno{background-color:#3e2945 !important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:transparent}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -0.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-0.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0 .25em}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:transparent;color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075)}.theme-light .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid transparent;border-bottom:.1666666667em solid transparent;border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid transparent;border-right:.1666666667em solid transparent;border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-light .Tab--selected.Tab--color--dark-blue{color:#0079d7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--dark-blue{border-bottom-color:#004274}.theme-light .Tabs--vertical .Tab--selected.Tab--color--dark-blue{border-right-color:#004274}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--light-grey{color:#b3b3b3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--light-grey{border-bottom-color:#999}.theme-light .Tabs--vertical .Tab--selected.Tab--color--light-grey{border-right-color:#999}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-light .Tab--selected.Tab--color--xeno{color:#7e558e}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--xeno{border-bottom-color:#4a3253}.theme-light .Tabs--vertical .Tab--selected.Tab--color--xeno{border-right-color:#4a3253}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:bold;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table !important;width:100% !important;height:100% !important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row !important;height:100% !important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-light .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-light .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-light .Section .Section{background-color:transparent;margin-left:-0.5em;margin-right:-0.5em}.theme-light .Section .Section:first-child{margin-top:-0.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-0.25em;margin-right:-0.25em;min-width:1.333em;text-align:center}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconPosition--right .fa,.theme-light .Button--hasContent.Button--iconPosition--right .fas,.theme-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0px;margin-left:3px}.theme-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--black:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--black:hover,.theme-light .Button--color--black:focus{background-color:#131313;color:#fff}.theme-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--white:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--white:hover,.theme-light .Button--color--white:focus{background-color:#efefef;color:#000}.theme-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--red:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--red:hover,.theme-light .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--orange:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--orange:hover,.theme-light .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--yellow:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--yellow:hover,.theme-light .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--olive:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--olive:hover,.theme-light .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--green:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--green:hover,.theme-light .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--teal:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--teal:hover,.theme-light .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--blue:hover,.theme-light .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-light .Button--color--dark-blue{transition:color 50ms,background-color 50ms;background-color:#003761;color:#fff}.theme-light .Button--color--dark-blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--dark-blue:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--dark-blue:hover,.theme-light .Button--color--dark-blue:focus{background-color:#135283;color:#fff}.theme-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--violet:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--violet:hover,.theme-light .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--purple:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--purple:hover,.theme-light .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--pink:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--pink:hover,.theme-light .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--brown:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--brown:hover,.theme-light .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--grey:hover,.theme-light .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-light .Button--color--light-grey{transition:color 50ms,background-color 50ms;background-color:gray;color:#fff}.theme-light .Button--color--light-grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--light-grey:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--light-grey:hover,.theme-light .Button--color--light-grey:focus{background-color:#a6a6a6;color:#fff}.theme-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--good:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--good:hover,.theme-light .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--average:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--average:hover,.theme-light .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--bad:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--bad:hover,.theme-light .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--label:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--label:hover,.theme-light .Button--color--label:focus{background-color:#464646;color:#fff}.theme-light .Button--color--xeno{transition:color 50ms,background-color 50ms;background-color:#3e2945;color:#fff}.theme-light .Button--color--xeno:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--xeno:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--xeno:hover,.theme-light .Button--color--xeno:focus{background-color:#5a4363;color:#fff}.theme-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--default:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--default:hover,.theme-light .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--caution:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--caution:hover,.theme-light .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--danger:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--danger:hover,.theme-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--transparent:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--color--transparent:hover,.theme-light .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-light .Button--disabled{background-color:#363636 !important}.theme-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--selected:focus{transition:color 100ms,background-color 100ms}.theme-light .Button--selected:hover,.theme-light .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-light .Button--flex{display:inline-flex;flex-direction:column}.theme-light .Button--flex--fluid{width:100%}.theme-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-light .Button--verticalAlignContent--middle{justify-content:center}.theme-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-light .Button__content{display:block;align-self:stretch}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:transparent}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:transparent;color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:"Consolas",monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea--noborder{border:0px}.theme-light .TextArea__textarea.TextArea__textarea--scrollable{overflow:auto;overflow-x:hidden;overflow-y:scroll}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:transparent;color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .TextArea__textarea_custom{overflow:visible;white-space:pre-wrap}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto;margin-bottom:-0.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:transparent;line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0) 100%);border-radius:50%;box-shadow:0 .05em .5em 0 rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotateZ(135deg)}.theme-light .Knob__ringTrack{fill:transparent;stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotateZ(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotateZ(270deg)}.theme-light .Knob__ringFill{fill:transparent;stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--dark-blue .Knob__ringFill{stroke:#004274}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--light-grey .Knob__ringFill{stroke:#999}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Knob--color--xeno .Knob__ringFill{stroke:#4a3253}.theme-light .Slider{cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none !important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid transparent;border-right:.4166666667em solid transparent;border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translateX(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-width:.0833333333em !important;border-style:solid !important;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color 900ms ease-out}.theme-light .ProgressBar__fill{position:absolute;top:-0.5px;left:0px;bottom:-0.5px}.theme-light .ProgressBar__fill--animated{transition:background-color 900ms ease-out,width 900ms ease-out}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--black{border-color:#000 !important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border-color:#a61c1c !important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border-color:#c0530b !important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border-color:#bfa303 !important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border-color:#889912 !important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border-color:#188532 !important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border-color:#008882 !important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border-color:#19649c !important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--dark-blue{border-color:#003761 !important}.theme-light .ProgressBar--color--dark-blue .ProgressBar__fill{background-color:#003761}.theme-light .ProgressBar--color--violet{border-color:#4b2897 !important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border-color:#7a2696 !important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border-color:#b61d73 !important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border-color:#7c4d2f !important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border-color:#bfbfbf !important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--light-grey{border-color:gray !important}.theme-light .ProgressBar--color--light-grey .ProgressBar__fill{background-color:gray}.theme-light .ProgressBar--color--good{border-color:#44801d !important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border-color:#b56b0b !important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border-color:#a61c1c !important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border-color:#2c2c2c !important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .ProgressBar--color--xeno{border-color:#3e2945 !important}.theme-light .ProgressBar--color--xeno .ProgressBar__fill{background-color:#3e2945}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:crimson;border-radius:10px;transition:font-size 200ms ease-out}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-0.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:bold}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom, #eeeeee 0%, #eeeeee 100%)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color 250ms ease-out,background-color 250ms ease-out}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-light .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px !important;line-height:2.6666666667rem !important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light html,.theme-light body{padding:0;margin:0;height:100%;color:#000}.theme-light body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-light em{font-style:normal;font-weight:bold}.theme-light img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-light img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-light a{color:blue}.theme-light a.visited{color:#f0f}.theme-light a:visited{color:#f0f}.theme-light a.popt{text-decoration:none}.theme-light .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-light .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-light .popup .close:hover{background:#999}.theme-light .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:bold;border-bottom:2px solid green}.theme-light .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-light .popup input[type=text]:hover,.theme-light .popup input[type=text]:active,.theme-light .popup input[type=text]:focus{border-color:green}.theme-light .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:bold}.theme-light .popup input[type=submit]:hover,.theme-light .popup input[type=submit]:focus,.theme-light .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-light .changeFont{padding:10px}.theme-light .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-light .changeFont a:hover{background:#ccc}.theme-light .highlightPopup{padding:10px;text-align:center}.theme-light .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-light .highlightPopup input.highlightColor{background-color:#ff0}.theme-light .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-light .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-light .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-light .contextMenu a:hover{background-color:#ccc}.theme-light .filterMessages{padding:5px}.theme-light .filterMessages div{padding:2px 0}.theme-light .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-light .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6{color:#638500;text-decoration:underline}.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:visited,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .bold,.theme-light .name,.theme-light .prefix,.theme-light .ooc,.theme-light .looc,.theme-light .adminooc,.theme-light .admin,.theme-light .medal,.theme-light .yell{font-weight:bold}.theme-light .italic,.theme-light .italics{font-style:italic}.theme-light .highlight{background:#ff0}.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:blue;font-family:Georgia,Verdana,sans-serif}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light em{font-style:normal;font-weight:bold}.theme-light .ooc{font-weight:bold}.theme-light .adminobserverooc{color:#09c;font-weight:bold}.theme-light .adminooc{color:#700038;font-weight:bold}.theme-light .adminsay{color:#ff4500;font-weight:bold}.theme-light .admin{color:#4473ff;font-weight:bold}.theme-light .name{font-weight:bold}.theme-light .deadsay{color:#5c00e6}.theme-light .binarysay{color:#20c20e;background-color:#000;display:block}.theme-light .binarysay a{color:lime}.theme-light .binarysay a:active,.theme-light .binarysay a:visited{color:#8f8}.theme-light .radio{color:green}.theme-light .sciradio{color:#939}.theme-light .comradio{color:#948f02}.theme-light .secradio{color:#a30000}.theme-light .medradio{color:#337296}.theme-light .engradio{color:#fb5613}.theme-light .sentryradio{color:#844300}.theme-light .suppradio{color:#a8732b}.theme-light .servradio{color:#6eaa2c}.theme-light .syndradio{color:#6d3f40}.theme-light .gangradio{color:#ac2ea1}.theme-light .centcomradio{color:#686868}.theme-light .aiprivradio{color:#f0f}.theme-light .redteamradio{color:red}.theme-light .blueteamradio{color:blue}.theme-light .greenteamradio{color:lime}.theme-light .yellowteamradio{color:#d1ba22}.theme-light .yell{font-weight:bold}.theme-light .alert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .userdanger{color:red;font-weight:bold;font-size:185%}.theme-light .bolddanger{color:red;font-weight:bold}.theme-light .danger{color:red}.theme-light .tinydanger{color:red;font-size:85%}.theme-light .smalldanger{color:red;font-size:90%}.theme-light .warning{color:red;font-style:italic}.theme-light .alertwarning{color:red;font-weight:bold}.theme-light .boldwarning{color:red;font-style:italic;font-weight:bold}.theme-light .announce{color:#228b22;font-weight:bold}.theme-light .boldannounce{color:red;font-weight:bold}.theme-light .bigannounce{font-weight:bold;font-size:115%}.theme-light .greenannounce{color:lime;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .info{color:#00c}.theme-light .notice{color:#009}.theme-light .staff_ic{color:#009}.theme-light .tinynotice{color:#009;font-size:85%}.theme-light .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-light .smallnotice{color:#009;font-size:90%}.theme-light .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-light .boldnotice{color:#009;font-weight:bold}.theme-light .hear{color:#009;font-style:italic}.theme-light .adminnotice{color:blue}.theme-light .adminhelp{color:red;font-weight:bold}.theme-light .unconscious{color:blue;font-weight:bold}.theme-light .suicide{color:#ff5050;font-style:italic}.theme-light .green{color:#03ff39}.theme-light .grey{color:#838383}.theme-light .red{color:red}.theme-light .blue{color:blue}.theme-light .nicegreen{color:#14a833}.theme-light .boldnicegreen{color:#14a833;font-weight:bold}.theme-light .cult{color:#973e3b}.theme-light .cultitalic{color:#973e3b;font-style:italic}.theme-light .cultbold{color:#973e3b;font-style:italic;font-weight:bold}.theme-light .cultboldtalic{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .cultlarge{color:#973e3b;font-weight:bold;font-size:185%}.theme-light .narsie{color:#973e3b;font-weight:bold;font-size:925%}.theme-light .narsiesmall{color:#973e3b;font-weight:bold;font-size:370%}.theme-light .colossus{color:#7f282a;font-size:310%}.theme-light .hierophant{color:#609;font-weight:bold;font-style:italic}.theme-light .hierophant_warning{color:#609;font-style:italic}.theme-light .purple{color:#5e2d79}.theme-light .holoparasite{color:#35333a}.theme-light .revennotice{color:#1d2953}.theme-light .revenboldnotice{color:#1d2953;font-weight:bold}.theme-light .revenbignotice{color:#1d2953;font-weight:bold;font-size:185%}.theme-light .revenminor{color:#823abb}.theme-light .revenwarning{color:#760fbb;font-style:italic}.theme-light .revendanger{color:#760fbb;font-weight:bold;font-size:185%}.theme-light .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-light .ghostalert{color:#5c00e6;font-style:italic;font-weight:bold}.theme-light .alien{color:#543354}.theme-light .noticealien{color:#00c000}.theme-light .alertalien{color:#00c000;font-weight:bold}.theme-light .changeling{color:purple;font-style:italic}.theme-light .alertsyndie{color:red;font-size:185%;font-weight:bold}.theme-light .spider{color:#4d004d;font-weight:bold;font-size:185%}.theme-light .interface{color:#303}.theme-light .sans{font-family:"Comic Sans MS",cursive,sans-serif}.theme-light .papyrus{font-family:"Papyrus",cursive,sans-serif}.theme-light .robot{font-family:"Courier New",cursive,sans-serif}.theme-light .tape_recorder{color:maroon;font-family:"Courier New",cursive,sans-serif}.theme-light .command_headset{font-weight:bold;font-size:160%}.theme-light .small{font-size:60%}.theme-light .big{font-size:185%}.theme-light .reallybig{font-size:245%}.theme-light .extremelybig{font-size:310%}.theme-light .greentext{color:lime;font-size:185%}.theme-light .redtext{color:red;font-size:185%}.theme-light .clown{color:#ff69bf;font-size:160%;font-family:"Comic Sans MS",cursive,sans-serif;font-weight:bold}.theme-light .singing{font-family:"Trebuchet MS",cursive,sans-serif;font-style:italic}.theme-light .his_grace{color:#15d512;font-family:"Courier New",cursive,sans-serif;font-style:italic}.theme-light .hypnophrase{color:#0d0d0d;font-weight:bold;animation:hypnocolor 1500ms infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#0d0d0d}25%{color:#410194}50%{color:#7f17d8}75%{color:#410194}100%{color:#3bb5d3}}.theme-light .phobia{color:#d00;font-weight:bold;animation:phobia 750ms infinite}@keyframes phobia{0%{color:#0d0d0d}50%{color:#d00}100%{color:#0d0d0d}}.theme-light .icon{height:1em;width:auto}.theme-light .bigicon{font-size:2.5em}.theme-light .memo{color:#638500;text-align:center}.theme-light .memoedit{text-align:center;font-size:125%}.theme-light .abductor{color:purple;font-style:italic}.theme-light .mind_control{color:#a00d6f;font-size:100%;font-weight:bold;font-style:italic}.theme-light .slime{color:#00ced1}.theme-light .drone{color:#848482}.theme-light .monkey{color:#975032}.theme-light .swarmer{color:#2c75ff}.theme-light .resonate{color:#298f85}.theme-light .monkeyhive{color:#774704}.theme-light .monkeylead{color:#774704;font-size:80%}.theme-light .connectionClosed,.theme-light .fatalError{background:red;color:#fff;padding:5px}.theme-light .connectionClosed.restored{background:green}.theme-light .internal.boldnshit{color:blue;font-weight:bold}.theme-light .text-normal{font-weight:normal;font-style:normal}.theme-light .hidden{display:none;visibility:hidden}.theme-light .ml-1{margin-left:1em}.theme-light .ml-2{margin-left:2em}.theme-light .ml-3{margin-left:3em}.theme-light .xooc{color:#6c0094;font-weight:bold;font-size:140%}.theme-light .mooc{color:#090;font-weight:bold;font-size:140%}.theme-light .yooc{color:#999600;font-weight:bold;font-size:140%}.theme-light .headminsay{color:#5a0a7f;font-weight:bold}.theme-light .radio{color:#4e4e4e}.theme-light .deptradio{color:#939}.theme-light .comradio{color:#004080}.theme-light .centradio{color:#5c5c8a}.theme-light .cryoradio{color:#554e3f}.theme-light .hcradio{color:#318779}.theme-light .pvstradio{color:#9b0612}.theme-light .airadio{color:#f0f}.theme-light .secradio{color:#a30000}.theme-light .engradio{color:#a66300}.theme-light .sentryradio{color:#844300}.theme-light .medradio{color:#008160}.theme-light .supradio{color:#5f4519}.theme-light .jtacradio{color:#702963}.theme-light .intelradio{color:#027d02}.theme-light .wyradio{color:#fe9b24}.theme-light .pmcradio{color:#136957}.theme-light .vairadio{color:#943d0a}.theme-light .cmbradio{color:#1b748c}.theme-light .clfradio{color:#6f679c}.theme-light .alpharadio{color:#ea0000}.theme-light .bravoradio{color:#c68610}.theme-light .charlieradio{color:#a5a}.theme-light .deltaradio{color:#007fcf}.theme-light .echoradio{color:#3a7e65}.theme-light .medium{font-size:110%}.theme-light .big{font-size:115%}.theme-light .large{font-size:125%}.theme-light .extra_large{font-size:130%}.theme-light .huge{font-size:150%}.theme-light .underline{text-decoration:underline}.theme-light .orange{color:#eca100}.theme-light .normal{font-style:normal}.theme-light .attack{color:red}.theme-light .moderate{color:#c00}.theme-light .disarm{color:#900}.theme-light .passive{color:#600}.theme-light .helpful{color:#368f31}.theme-light .scanner{color:red}.theme-light .scannerb{color:red;font-weight:bold}.theme-light .scannerburn{color:orange}.theme-light .scannerburnb{color:orange;font-weight:bold}.theme-light .rose{color:#ff5050}.theme-light .debuginfo{color:#493d26;font-style:italic}.theme-light .xenonotice{color:#2a623d}.theme-light .xenoboldnotice{color:#2a623d;font-weight:bold}.theme-light .xenowarning{color:#2a623d;font-style:italic}.theme-light .xenominorwarning{color:#2a623d;font-weight:bold;font-style:italic}.theme-light .xenodanger{color:#2a623d;font-weight:bold}.theme-light .avoidharm{color:#72a0e5;font-weight:bold}.theme-light .highdanger{color:red;font-weight:bold;font-size:140%}.theme-light .xenohighdanger{color:#2a623d;font-weight:bold;font-size:140%}.theme-light .xenoannounce{color:#1a472a;font-family:book-antiqua;font-weight:bold;font-size:140%}.theme-light .yautjabold{color:purple;font-weight:bold}.theme-light .yautjaboldbig{color:purple;font-weight:bold;font-size:120%}.theme-light .objectivebig{font-weight:bold;font-size:130%}.theme-light .objectivegreen{color:lime}.theme-light .objectivered{color:red}.theme-light .objectivesuccess{color:lime;font-weight:bold;font-size:110%}.theme-light .objectivefail{color:red;font-weight:bold;font-size:110%}.theme-light .xenotalk,.theme-light .xeno{color:#900090;font-style:italic}.theme-light .xenoleader{color:#730d73;font-style:italic;font-size:125%}.theme-light .xenoqueen{color:#730d73;font-style:italic;font-weight:bold;font-size:125%}.theme-light .newscaster{color:maroon}.theme-light .role_header{color:#db0000;display:block;text-align:center;font-weight:bold;font-family:trebuchet-ms;font-size:150%}.theme-light .role_body{color:#009;display:block;text-align:center;font-size:125%}.theme-light .round_header{color:#db0000;display:block;text-align:center;font-family:courier;font-weight:bold;font-size:180%}.theme-light .round_body{color:#001427;display:block;text-align:center;font-family:trebuchet-ms;font-weight:bold;font-size:125%}.theme-light .event_announcement{color:#600d48;font-family:arial-narrow;font-weight:bold;font-size:125%}.theme-light .announce_header{color:#000;font-weight:bold;font-size:150%}.theme-light .announce_header_blue{color:#009;font-weight:bold;font-size:150%}.theme-light .announce_body{color:red;font-weight:normal;font-size:125%}.theme-light .centerbold{display:block;text-align:center;font-weight:bold}.theme-light .mod{color:#735638;font-weight:bold}.theme-light .modooc{color:#184880;font-weight:bold}.theme-light .adminmod{color:#402a14;font-weight:bold}.theme-light .mentorsay{color:#b38c32;font-weight:bold}.theme-light .mentorhelp{color:#007e00;font-weight:bold}.theme-light .mentorbody{color:#da6200;font-weight:bold}.theme-light .mentorstaff{color:#876101;font-weight:bold}.theme-light .staffsay{color:#876101;font-weight:bold}.theme-light .tajaran{color:#803b56}.theme-light .tajaran_signlang{color:#941c1c}.theme-light .skrell{color:#00ced1}.theme-light .soghun{color:#228b22}.theme-light .changeling{color:purple}.theme-light .vox{color:#a0a}.theme-light .monkey{color:#966c47}.theme-light .german{color:#858f1e;font-family:"Times New Roman",Times,serif}.theme-light .spanish{color:#cf982b}.theme-light .japanese{color:#940927}.theme-light .chinese{color:#fe1919}.theme-light .zombie{color:#216163;font-style:italic}.theme-light .commando{color:#fe9b24;font-style:bold}.theme-light .rough{font-family:trebuchet-ms,cursive,sans-serif}.theme-light .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-light .admin .message{color:#314cad}.theme-light .admin .prefix{font-weight:bolder}.theme-light .pm{font-size:110%}.theme-light .retro_translator{font-weight:bold}.theme-light .yautja_translator{color:#a00;font-weight:bold;animation:glitch .5s infinite}@keyframes glitch{25%{color:#a00;transform:translate(-2px, -1px)}50%{color:#be0000;transform:translate(1px, -2px)}75%{color:#8d0000;transform:translate(-1px, 2px)}100%{color:#830000;transform:translate(1px, 1px)}}.theme-light .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-light .examine_block .icon{width:1.5em;height:1.5em;margin:0;padding:0}.theme-light .tooltip{font-style:italic;border-bottom:1px dashed #000} From 8432fc6d43ee3ba07428d08243105bf63541ab5d Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 04:05:04 +0000 Subject: [PATCH 138/205] Automatic changelog for PR #5316 [ci skip] --- html/changelogs/AutoChangeLog-pr-5316.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5316.yml diff --git a/html/changelogs/AutoChangeLog-pr-5316.yml b/html/changelogs/AutoChangeLog-pr-5316.yml new file mode 100644 index 000000000000..50b3a094ab2d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5316.yml @@ -0,0 +1,4 @@ +author: "SabreML" +delete-after: True +changes: + - bugfix: "Fixed the Hive Status window showing an error message when the Queen dies." \ No newline at end of file From 4ee4a86cca381a1d06d726b8d1ccb2af35f89448 Mon Sep 17 00:00:00 2001 From: cuberound <122645057+cuberound@users.noreply.github.com> Date: Sat, 30 Dec 2023 07:14:54 +0100 Subject: [PATCH 139/205] gives trucker construction skills (#5231) # About the pull request Gives trucker engineering construction skills # Explain why it's good for the game It is strange to have engineering survivor who can not build cades and walls and it sucks when you have 3 truckers but none able to build openable cades. Giving more skills to survivors should make playing survivor more fun. Trucker still has other diferent skill and gets diferent loudout from engineer # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: balance: gives trucker engineer level construction skill /:cl: --- code/datums/skills/civilian.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/skills/civilian.dm b/code/datums/skills/civilian.dm index 53b7cb8c2194..9dc4afd78826 100644 --- a/code/datums/skills/civilian.dm +++ b/code/datums/skills/civilian.dm @@ -160,6 +160,7 @@ CIVILIAN name = "Survivor Trucker" additional_skills = list( SKILL_ENGINEER = SKILL_ENGINEER_ENGI, + SKILL_CONSTRUCTION = SKILL_CONSTRUCTION_ENGI, SKILL_VEHICLE = SKILL_VEHICLE_CREWMAN, ) From 4f797b05653cc3f90de6ee785e6f2584732f4ee9 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 06:23:14 +0000 Subject: [PATCH 140/205] Automatic changelog for PR #5231 [ci skip] --- html/changelogs/AutoChangeLog-pr-5231.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5231.yml diff --git a/html/changelogs/AutoChangeLog-pr-5231.yml b/html/changelogs/AutoChangeLog-pr-5231.yml new file mode 100644 index 000000000000..63ee5031277c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5231.yml @@ -0,0 +1,4 @@ +author: "cuberound" +delete-after: True +changes: + - balance: "gives trucker engineer level construction skill" \ No newline at end of file From 0f886022c37879ec867cf4bcf0f305bb8569f2db Mon Sep 17 00:00:00 2001 From: blackdragonTOW <31581761+blackdragonTOW@users.noreply.github.com> Date: Fri, 29 Dec 2023 22:15:44 -0800 Subject: [PATCH 141/205] CL Headsets can utilize two more keys. (#5234) # About the pull request CLs have access to more keys now for CL purposes. This bump should allow them to utilize the new keys without feeling awkwardly limited by the key count. # Explain why it's good for the game You use utility by having limited key access, this should allow people who use keys more frequently to take part in broader information spaces. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: add: Max CL Headset radio keys from 3 to 5. (+2 increase) /:cl: --- code/game/objects/items/devices/radio/headset.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 7ec941f1192b..e5c717e699f0 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -520,6 +520,7 @@ name = "corporate liaison radio headset" desc = "Used by the CL to convince people to sign NDAs. Channels are as follows: :v - marine command, :a - alpha squad, :b - bravo squad, :c - charlie squad, :d - delta squad, :n - engineering, :m - medbay, :u - requisitions, :j - JTAC, :t - intel, :y for WY." icon_state = "wy_headset" + maximum_keys = 5 initial_keys = list(/obj/item/device/encryptionkey/mcom/cl) /obj/item/device/radio/headset/almayer/reporter From b45c7d8685ccb5e326c0936078e50492e34b1fa5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 06:37:11 +0000 Subject: [PATCH 142/205] Automatic changelog for PR #5234 [ci skip] --- html/changelogs/AutoChangeLog-pr-5234.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5234.yml diff --git a/html/changelogs/AutoChangeLog-pr-5234.yml b/html/changelogs/AutoChangeLog-pr-5234.yml new file mode 100644 index 000000000000..270ff64cc103 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5234.yml @@ -0,0 +1,4 @@ +author: "blackdragonTOW" +delete-after: True +changes: + - rscadd: "Max CL Headset radio keys from 3 to 5. (+2 increase)" \ No newline at end of file From ec9be92834268fbce257f40c4fd1b1133e93c42d Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Sat, 30 Dec 2023 06:24:56 +0000 Subject: [PATCH 143/205] Refactors some other xeno throws to throw_carbon() (#5237) # About the pull request Reduce boilerplate # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: code: Refactors some code to new throw_carbon proc /:cl: --- .../xenomorph/abilities/defender/defender_powers.dm | 10 +--------- .../xenomorph/abilities/ravager/ravager_powers.dm | 10 +--------- .../xenomorph/abilities/warrior/warrior_powers.dm | 11 +---------- 3 files changed, 3 insertions(+), 28 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm index 0cb803e67b96..ef084c9b5b59 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/defender/defender_powers.dm @@ -85,20 +85,12 @@ var/facing = get_dir(fendy, carbone) var/headbutt_distance = 1 + (fendy.crest_defense * 2) + (fendy.fortify * 2) - var/turf/thrown_turf = get_turf(fendy) - var/turf/temp = get_turf(fendy) - - for(var/x in 0 to headbutt_distance) - temp = get_step(thrown_turf, facing) - if(!temp) - break - thrown_turf = temp // Hmm today I will kill a marine while looking away from them fendy.face_atom(carbone) fendy.animation_attack_on(carbone) fendy.flick_attack_overlay(carbone, "punch") - carbone.throw_atom(thrown_turf, headbutt_distance, SPEED_SLOW, src) + fendy.throw_carbon(carbone, facing, headbutt_distance, SPEED_SLOW, shake_camera = FALSE, immobilize = FALSE) playsound(carbone,'sound/weapons/alien_claw_block.ogg', 50, 1) apply_cooldown() return ..() diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm index c70c3cae6cd3..5f8853a066a7 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ravager/ravager_powers.dm @@ -132,16 +132,8 @@ human.attack_alien(xeno, rand(xeno.melee_damage_lower, xeno.melee_damage_upper)) var/facing = get_dir(xeno, human) - var/turf/turf = xeno.loc - var/turf/temp = xeno.loc - - for(var/step in 0 to behavior.fling_distance-1) - temp = get_step(turf, facing) - if (!temp) - break - turf = temp - human.throw_atom(turf, behavior.fling_distance, SPEED_VERY_FAST, xeno, TRUE) + xeno.throw_carbon(human, facing, behavior.fling_distance, SPEED_VERY_FAST, shake_camera = FALSE, immobilize = TRUE) /datum/action/xeno_action/activable/scissor_cut/use_ability(atom/target_atom) var/mob/living/carbon/xenomorph/ravager_user = owner diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm index be550e50f0e2..bbb4a584e2a5 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/warrior/warrior_powers.dm @@ -86,23 +86,14 @@ if(carbon.slowed < slowdown) carbon.apply_effect(slowdown, SLOW) carbon.last_damage_data = create_cause_data(initial(xeno.caste_type), xeno) - shake_camera(carbon, 2, 1) var/facing = get_dir(xeno, carbon) - var/turf/throw_turf = xeno.loc - var/turf/temp = xeno.loc - - for (var/step in 0 to fling_distance-1) - temp = get_step(throw_turf, facing) - if (!temp) - break - throw_turf = temp // Hmm today I will kill a marine while looking away from them xeno.face_atom(carbon) xeno.animation_attack_on(carbon) xeno.flick_attack_overlay(carbon, "disarm") - carbon.throw_atom(throw_turf, fling_distance, SPEED_VERY_FAST, xeno, TRUE) + xeno.throw_carbon(carbon, facing, fling_distance, SPEED_VERY_FAST, shake_camera = TRUE, immobilize = TRUE) apply_cooldown() return ..() From 28c942315eb710bd381757752c3af6c592da1196 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 06:50:34 +0000 Subject: [PATCH 144/205] Automatic changelog for PR #5237 [ci skip] --- html/changelogs/AutoChangeLog-pr-5237.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5237.yml diff --git a/html/changelogs/AutoChangeLog-pr-5237.yml b/html/changelogs/AutoChangeLog-pr-5237.yml new file mode 100644 index 000000000000..2e75583fc134 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5237.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - code_imp: "Refactors some code to new throw_carbon proc" \ No newline at end of file From b9b88fd2ccf3a2ebb50c5dc6adf3117827193e2b Mon Sep 17 00:00:00 2001 From: BeagleGaming1 <56142455+BeagleGaming1@users.noreply.github.com> Date: Sat, 30 Dec 2023 03:22:30 -0500 Subject: [PATCH 145/205] Adds a verb to hide action buttons (#5304) # About the pull request Adds a verb on /client to show/hide action buttons Makes it a new variable, as var/hidden also prevents the action from being used ![image](https://github.com/cmss13-devs/cmss13/assets/56142455/1d78441c-5085-4165-a2b7-f7c3e9f7e2c3) # Changelog :cl: qol: Adds the ability to hide your action buttons /:cl: --- code/datums/action.dm | 8 ++++---- code/modules/client/client_procs.dm | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/code/datums/action.dm b/code/datums/action.dm index 0510a43415a7..3a597ad262b1 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,9 +11,9 @@ var/cost = 0 // By default an action has no cost -> will be utilized by skill actions/xeno actions var/action_flags = 0 // Check out __game.dm for flags /// Whether the action is hidden from its owner - /// Useful for when you want to preserve action state while preventing - /// a mob from using said action - var/hidden = FALSE + var/hidden = FALSE //Preserve action state while preventing mob from using action + ///Hide the action from the owner without preventing them from using it (incase of keybind listen_signal) + var/player_hidden = FALSE var/unique = TRUE /// A signal on the mob that will cause the action to activate var/listen_signal @@ -227,7 +227,7 @@ var/atom/movable/screen/action_button/B = A.button if(reload_screen) client.add_to_screen(B) - if(A.hidden) + if(A.hidden || A.player_hidden) B.screen_loc = null continue button_number++ diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 6d5efba2645f..a085cb7634d6 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -848,3 +848,32 @@ GLOBAL_LIST_INIT(whitelisted_client_procs, list( total_t3_playtime += get_job_playtime(src, caste_name) return total_t3_playtime + +/client/verb/action_hide_menu() + set name = "Show/Hide Actions" + set category = "IC" + + var/mob/user = usr + + var/list/actions_list = list() + for(var/datum/action/action as anything in user.actions) + var/action_name = action.name + if(action.player_hidden) + action_name += " (Hidden)" + actions_list[action_name] += action + + if(!LAZYLEN(actions_list)) + to_chat(user, SPAN_WARNING("You have no actions available.")) + return + + var/selected_action_name = tgui_input_list(user, "Show or hide selected action", "Show/Hide Actions", actions_list, 30 SECONDS) + if(!selected_action_name) + to_chat(user, SPAN_WARNING("You did not select an action.")) + return + + var/datum/action/selected_action = actions_list[selected_action_name] + selected_action.player_hidden = !selected_action.player_hidden + user.update_action_buttons() + + if(!selected_action.player_hidden && selected_action.hidden) //Inform the player that even if they are unhiding it, itll still not be visible + to_chat(user, SPAN_NOTICE("[selected_action] is forcefully hidden, bypassing player unhiding.")) From 891b1b46d41665f74bed40891fbd37c9684e6455 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 08:30:37 +0000 Subject: [PATCH 146/205] Automatic changelog for PR #5304 [ci skip] --- html/changelogs/AutoChangeLog-pr-5304.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5304.yml diff --git a/html/changelogs/AutoChangeLog-pr-5304.yml b/html/changelogs/AutoChangeLog-pr-5304.yml new file mode 100644 index 000000000000..eeada8e1ae61 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5304.yml @@ -0,0 +1,4 @@ +author: "BeagleGaming1" +delete-after: True +changes: + - qol: "Adds the ability to hide your action buttons" \ No newline at end of file From 4affa1dd228c2f67640b0eea3e778b185ec0a33e Mon Sep 17 00:00:00 2001 From: Paul Mullen <101871009+mullenpaul@users.noreply.github.com> Date: Sat, 30 Dec 2023 08:56:22 +0000 Subject: [PATCH 147/205] sentry laptop now uses camera manager (#5309) # About the pull request The sentry laptop had a bunch of custom code for handling gunsight cameras. This PR refactors it to exclusively use the camera_manager component. # Explain why it's good for the game Reduction of duplicated code. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: refactor: sentry laptop now uses camera manager component /:cl: --- code/modules/defenses/sentry_computer.dm | 119 ++++------------------- 1 file changed, 21 insertions(+), 98 deletions(-) diff --git a/code/modules/defenses/sentry_computer.dm b/code/modules/defenses/sentry_computer.dm index e2cbd5d5858e..6107bc3d7ee8 100644 --- a/code/modules/defenses/sentry_computer.dm +++ b/code/modules/defenses/sentry_computer.dm @@ -48,41 +48,18 @@ // Stuff needed to render the map /// asset name for the game map - var/map_name - - /// camera screen which renders the world - var/atom/movable/screen/map_view/cam_screen - - /// camera screen which shows a blank error - var/atom/movable/screen/background/cam_background - - var/list/cam_plane_masters + var/camera_map_name /obj/item/device/sentry_computer/Initialize(mapload) . = ..() if(cell_type) cell = new cell_type() cell.charge = cell.maxcharge - // set up cameras - map_name = "sentry_computer_[REF(src)]_map" - cam_screen = new - cam_screen.name = "screen" - cam_screen.assigned_map = map_name - cam_screen.del_on_map_removal = FALSE - cam_screen.screen_loc = "[map_name]:1,1" - cam_background = new - cam_background.assigned_map = map_name - cam_background.del_on_map_removal = FALSE - - cam_plane_masters = list() - for(var/plane in subtypesof(/atom/movable/screen/plane_master) - /atom/movable/screen/plane_master/blackness) - var/atom/movable/screen/plane_master/instance = new plane() - instance.assigned_map = map_name - instance.del_on_map_removal = FALSE - if(instance.blend_mode_override) - instance.blend_mode = instance.blend_mode_override - instance.screen_loc = "[map_name]:CENTER" - cam_plane_masters += instance + + RegisterSignal(src, COMSIG_CAMERA_MAPNAME_ASSIGNED, PROC_REF(camera_mapname_update)) + + AddComponent(/datum/component/camera_manager) + SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR) faction_group = FACTION_LIST_MARINE transceiver.forceMove(src) @@ -94,9 +71,8 @@ /obj/item/device/sentry_computer/Destroy() . = ..() + UnregisterSignal(src, COMSIG_CAMERA_MAPNAME_ASSIGNED) QDEL_NULL(cell) - QDEL_NULL(cam_background) - QDEL_NULL(cam_screen) QDEL_NULL(transceiver) QDEL_NULL(voice) last_camera_turf = null @@ -104,6 +80,9 @@ registered_tools = null paired_sentry = null +/obj/item/device/sentry_computer/proc/camera_mapname_update(source, value) + camera_map_name = value + /obj/item/device/sentry_computer/Move(NewLoc, direct) ..() if(table_setup || open || on) @@ -321,7 +300,7 @@ if(current == target) current = null - update_active_camera() + SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR) /obj/item/device/sentry_computer/ui_status(mob/user, datum/ui_state/state) . = ..() @@ -332,15 +311,13 @@ /obj/item/device/sentry_computer/ui_close(mob/user) - - // Unregister map objects - user.client.clear_map(map_name) + SEND_SIGNAL(src, COMSIG_CAMERA_UNREGISTER_UI, user) /obj/item/device/sentry_computer/ui_static_data(mob/user) . = list() .["sentry_static"] = list() - .["mapRef"] = map_name + .["mapRef"] = camera_map_name var/index = 1 for(var/sentry in paired_sentry) var/list/sentry_holder = list() @@ -396,13 +373,8 @@ /obj/item/device/sentry_computer/tgui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) - update_active_camera() if (!ui) - // Register map objects - user.client.register_map_obj(cam_background) - user.client.register_map_obj(cam_screen) - for(var/plane in cam_plane_masters) - user.client.register_map_obj(plane) + SEND_SIGNAL(src, COMSIG_CAMERA_REGISTER_UI, user) ui = new(user, src, "SentryGunUI", name) ui.open() @@ -426,7 +398,12 @@ if("set-camera") current = sentry playsound(src, get_sfx("terminal_button"), 25, FALSE) - update_active_camera() + var/obj/structure/machinery/defenses/sentry/defense = sentry + if (defense.has_camera) + defense.set_range() + var/datum/shape/rectangle/current_bb = defense.range_bounds + SEND_SIGNAL(src, COMSIG_CAMERA_SET_AREA, current_bb.center_x, current_bb.center_y, defense.loc.z, current_bb.width, current_bb.height) + return TRUE if("ping") playsound(sentry, 'sound/machines/twobeep.ogg', 50, 1) @@ -439,62 +416,8 @@ if("clear-camera") current = null playsound(src, get_sfx("terminal_button"), 25, FALSE) - update_active_camera() + SEND_SIGNAL(src, COMSIG_CAMERA_CLEAR) return TRUE if("ui-interact") playsound(src, get_sfx("terminal_button"), 25, FALSE) return FALSE - -/** - * Set the displayed camera to the static not-connected. - */ -/obj/item/device/sentry_computer/proc/show_camera_static() - cam_screen.vis_contents.Cut() - last_camera_turf = null - cam_background.icon_state = "scanline2" - cam_background.fill_rect(1, 1, 15, 15) - -/** - * Update camera settings and redraw camera on the current variable. - */ -/obj/item/device/sentry_computer/proc/update_active_camera() - // Show static if can't use the camera - if(isnull(current) || !current.has_camera || current.placed != 1) - show_camera_static() - return - - // Is this camera located in or attached to a living thing, Vehicle or helmet? If so, assume the camera's loc is the living (or non) thing. - var/cam_location = current - if(isliving(current.loc) || isVehicle(current.loc)) - cam_location = current.loc - else if(istype(current.loc, /obj/item/clothing/head/helmet/marine)) - var/obj/item/clothing/head/helmet/marine/helmet = current.loc - cam_location = helmet.loc - // If we're not forcing an update for some reason and the cameras are in the same location, - // we don't need to update anything. - // Most security cameras will end here as they're not moving. - if(last_camera_turf == get_turf(cam_location)) - return - - // Cameras that get here are moving, and are likely attached to some moving atom such as cyborgs. - last_camera_turf = get_turf(cam_location) - current.set_range() - var/datum/shape/rectangle/current_bb = current.range_bounds - var/x_size = current_bb.width - var/y_size = current_bb.height - var/target = locate(current_bb.center_x, current_bb.center_y, current.loc.z) - var/list/guncamera_zone = range("[x_size]x[y_size]", target) - - var/list/visible_turfs = list() - - for(var/turf/visible_turf in guncamera_zone) - visible_turfs += visible_turf - - var/list/bbox = get_bbox_of_atoms(visible_turfs) - var/size_x = bbox[3] - bbox[1] + 1 - var/size_y = bbox[4] - bbox[2] + 1 - cam_screen.icon = null - cam_screen.icon_state = "clear" - cam_screen.vis_contents = visible_turfs - cam_background.icon_state = "clear" - cam_background.fill_rect(1, 1, size_x, size_y) From b1f422b3b1f41cd29893fe9788f53d6ba830b23b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 09:04:35 +0000 Subject: [PATCH 148/205] Automatic changelog for PR #5309 [ci skip] --- html/changelogs/AutoChangeLog-pr-5309.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5309.yml diff --git a/html/changelogs/AutoChangeLog-pr-5309.yml b/html/changelogs/AutoChangeLog-pr-5309.yml new file mode 100644 index 000000000000..cf471ddf7e95 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5309.yml @@ -0,0 +1,4 @@ +author: "mullenpaul" +delete-after: True +changes: + - refactor: "sentry laptop now uses camera manager component" \ No newline at end of file From 71d1f9368f0aca4d856940662c8c17eb662c30ab Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Sat, 30 Dec 2023 09:41:27 +0000 Subject: [PATCH 149/205] Fixes a couple of runtimes with xenos dying (#5322) # About the pull request Trying to call `post_attack()` on something which has already been qdeleted within gib() ``` [2023-12-27 22:10:14.636] runtime error: Cannot read null.comp_lookup - proc name: UnregisterSignal (/datum/proc/UnregisterSignal) - source file: code/datums/components/_component.dm,219 - usr: null - src: Hide (/datum/action/xeno_action/onclick/xenohide) - call stack: - Hide (/datum/action/xeno_action/onclick/xenohide): UnregisterSignal(null, "mob_statchange") - Hide (/datum/action/xeno_action/onclick/xenohide): post attack() - Hide (/datum/action/xeno_action/onclick/xenohide): unhide on stat(Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger), 2, 0) - CallAsync(Hide (/datum/action/xeno_action/onclick/xenohide), "unhide_on_stat", /list (/list)) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): SendSignal("mob_statchange", /list (/list)) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): set stat(2) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): set stat(2) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): set stat(2) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): death(/datum/cause_data (/datum/cause_data), 1, "lets out a waning guttural scr...") - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): death(/datum/cause_data (/datum/cause_data), 1) - ... - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): updatehealth() - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): apply damage(36, "brute", "r_foot", null, 0, 0, 0) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): bullet act(the rifle bullet (/obj/projectile)) - the rifle bullet (/obj/projectile): handle mob(Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger)) - the rifle bullet (/obj/projectile): scan a turf(the catwalk (20,151,2) (/turf/open/floor/plating/plating_catwalk/shiva), 8) - the rifle bullet (/obj/projectile): process(1.19104) - Projectiles (/datum/controller/subsystem/projectiles): handle projectile flight(the rifle bullet (/obj/projectile), 5) - Projectiles (/datum/controller/subsystem/projectiles): ignite(0) - Master (/datum/controller/master): Loop(2) - Master (/datum/controller/master): StartProcessing(0) - [2023-12-27 22:10:14.636] runtime error: Cannot read null.layer - proc name: post attack (/datum/action/xeno_action/onclick/xenohide/proc/post_attack) - source file: code/modules/mob/living/carbon/xenomorph/abilities/general_abilities.dm,398 - usr: null - src: Hide (/datum/action/xeno_action/onclick/xenohide) - call stack: - Hide (/datum/action/xeno_action/onclick/xenohide): post attack() - Hide (/datum/action/xeno_action/onclick/xenohide): unhide on stat(Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger), 2, 0) - CallAsync(Hide (/datum/action/xeno_action/onclick/xenohide), "unhide_on_stat", /list (/list)) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): SendSignal("mob_statchange", /list (/list)) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): set stat(2) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): set stat(2) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): set stat(2) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): death(/datum/cause_data (/datum/cause_data), 1, "lets out a waning guttural scr...") - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): death(/datum/cause_data (/datum/cause_data), 1) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): gib(/datum/cause_data (/datum/cause_data)) - ... - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): apply damage(36, "brute", "r_foot", null, 0, 0, 0) - Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger): bullet act(the rifle bullet (/obj/projectile)) - the rifle bullet (/obj/projectile): handle mob(Veteran Facehugger (896) (/mob/living/carbon/xenomorph/facehugger)) - the rifle bullet (/obj/projectile): scan a turf(the catwalk (20,151,2) (/turf/open/floor/plating/plating_catwalk/shiva), 8) - the rifle bullet (/obj/projectile): fly() - Projectiles (/datum/controller/subsystem/projectiles): process wrapper(the rifle bullet (/obj/projectile), 5) - Projectiles (/datum/controller/subsystem/projectiles): fire(0) - Master (/datum/controller/master): RunQueue() - Master (/datum/controller/master): StartProcessing(0) - ``` # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Fixes runtime calling post_attack() on a mob which has already been qdeleted via gibbing. /:cl: --- .../mob/living/carbon/xenomorph/abilities/general_powers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm index 63c8ed6da21b..63cc4cb93431 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/general_powers.dm @@ -512,7 +512,7 @@ /datum/action/xeno_action/onclick/xenohide/proc/unhide_on_stat(mob/living/carbon/xenomorph/source, new_stat, old_stat) SIGNAL_HANDLER - if(new_stat >= UNCONSCIOUS && old_stat <= UNCONSCIOUS) + if(!QDELETED(source) && (new_stat >= UNCONSCIOUS && old_stat <= UNCONSCIOUS)) post_attack() /datum/action/xeno_action/onclick/place_trap/use_ability(atom/A) From 8d965a58c339def30be2823bf0f40254dab72261 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 09:51:24 +0000 Subject: [PATCH 150/205] Automatic changelog for PR #5322 [ci skip] --- html/changelogs/AutoChangeLog-pr-5322.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5322.yml diff --git a/html/changelogs/AutoChangeLog-pr-5322.yml b/html/changelogs/AutoChangeLog-pr-5322.yml new file mode 100644 index 000000000000..fdff7e6c3e9a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5322.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - bugfix: "Fixes runtime calling post_attack() on a mob which has already been qdeleted via gibbing." \ No newline at end of file From 2e8e334b214a0a454a1e2791789ebfd5554e6bdc Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Sat, 30 Dec 2023 09:44:02 +0000 Subject: [PATCH 151/205] Fixes runtime on death by decapitation (#5328) # About the pull request Fixes two runtimes caused by passing an invalid argument type to `death()` it should be `/datum/cause_data` and we passed a `/mob`. Player decapitated themselves by shooting themselves in the head. The extra typechecks are there because I don't want to assume that `cause` is always going to be a `mob`. If it's not a `mob` or `cause_data` already then we create a cause data with mob = null so at least we're passing it correctly to `death()` ``` [2023-12-28 17:54:11.462] runtime error: death called with string cause (Unknown (as Sherri Baker)) instead of datum - proc name: stack trace (/proc/stack_trace) - source file: code/__HELPERS/unsorted.dm,1888 - usr: Unknown (as Sherri Baker) (/mob/living/carbon/human) - src: null - usr.loc: the floor (288,32,4) (/turf/open/floor/almayer) - call stack: - stack trace("death called with string cause...") - Unknown (as Sherri Baker) (/mob/living/carbon/human): death(Unknown (as Sherri Baker) (/mob/living/carbon/human), 0, "seizes up and falls limp, thei...") - Unknown (as Sherri Baker) (/mob/living/carbon/human): death(Unknown (as Sherri Baker) (/mob/living/carbon/human), null) - the head (/obj/limb/head): droplimb(0, 0, Unknown (as Sherri Baker) (/mob/living/carbon/human), null) - the head (/obj/limb/head): limb delimb(Unknown (as Sherri Baker) (/mob/living/carbon/human)) - the head (/obj/limb/head): take damage(44, 0, 0, 0, null, /list (/list), 0, Unknown (as Sherri Baker) (/mob/living/carbon/human), -1, 0, 0) - the head (/obj/limb/head): take damage(44, 0, 0, 0, null, /list (/list), 0, Unknown (as Sherri Baker) (/mob/living/carbon/human), -1, -1) - Unknown (as Sherri Baker) (/mob/living/carbon/human): apply damage(44, "brute", "head", 0, 0, null, 0, 0, Unknown (as Sherri Baker) (/mob/living/carbon/human), 0) - Unknown (as Sherri Baker) (/mob/living/carbon/human): bullet act(the rifle bullet (/obj/projectile)) - the M41A pulse rifle MK2 (Wiel... (/obj/item/weapon/gun/rifle/m41a): attack(Unknown (as Sherri Baker) (/mob/living/carbon/human), Unknown (as Sherri Baker) (/mob/living/carbon/human), null) - Unknown (as Sherri Baker) (/mob/living/carbon/human): attackby(the M41A pulse rifle MK2 (Wiel... (/obj/item/weapon/gun/rifle/m41a), Unknown (as Sherri Baker) (/mob/living/carbon/human), /list (/list)) - Unknown (as Sherri Baker) (/mob/living/carbon/human): attackby(the M41A pulse rifle MK2 (Wiel... (/obj/item/weapon/gun/rifle/m41a), Unknown (as Sherri Baker) (/mob/living/carbon/human), /list (/list)) - Unknown (as Sherri Baker) (/mob/living/carbon/human): click adjacent(Unknown (as Sherri Baker) (/mob/living/carbon/human), the M41A pulse rifle MK2 (Wiel... (/obj/item/weapon/gun/rifle/m41a), /list (/list)) - Unknown (as Sherri Baker) (/mob/living/carbon/human): do click(Unknown (as Sherri Baker) (/mob/living/carbon/human), the floor (288,32,4) (/turf/open/floor/almayer), "icon-x=17;icon-y=19;left=1;but...") - **** (/client): Click(Unknown (as Sherri Baker) (/mob/living/carbon/human), the floor (288,32,4) (/turf/open/floor/almayer), "mapwindow.map", "icon-x=17;icon-y=19;left=1;but...") - [2023-12-28 17:54:11.465] runtime error: undefined variable /mob/living/carbon/human/var/cause_name - proc name: death (/mob/living/carbon/human/death) - source file: code/modules/mob/living/carbon/human/death.dm,117 - usr: (src) - src: Unknown (as Sherri Baker) (/mob/living/carbon/human) - src.loc: the floor (288,32,4) (/turf/open/floor/almayer) - call stack: - Unknown (as Sherri Baker) (/mob/living/carbon/human): death(Unknown (as Sherri Baker) (/mob/living/carbon/human), null) - the head (/obj/limb/head): droplimb(0, 0, Unknown (as Sherri Baker) (/mob/living/carbon/human), null) - the head (/obj/limb/head): limb delimb(Unknown (as Sherri Baker) (/mob/living/carbon/human)) - the head (/obj/limb/head): take damage(44, 0, 0, 0, null, /list (/list), 0, Unknown (as Sherri Baker) (/mob/living/carbon/human), -1, 0, 0) - the head (/obj/limb/head): take damage(44, 0, 0, 0, null, /list (/list), 0, Unknown (as Sherri Baker) (/mob/living/carbon/human), -1, -1) - Unknown (as Sherri Baker) (/mob/living/carbon/human): apply damage(44, "brute", "head", 0, 0, null, 0, 0, Unknown (as Sherri Baker) (/mob/living/carbon/human), 0) - Unknown (as Sherri Baker) (/mob/living/carbon/human): bullet act(the rifle bullet (/obj/projectile)) - the M41A pulse rifle MK2 (/obj/item/weapon/gun/rifle/m41a): attack(Unknown (as Sherri Baker) (/mob/living/carbon/human), Unknown (as Sherri Baker) (/mob/living/carbon/human), null) - Unknown (as Sherri Baker) (/mob/living/carbon/human): attackby(the M41A pulse rifle MK2 (/obj/item/weapon/gun/rifle/m41a), Unknown (as Sherri Baker) (/mob/living/carbon/human), /list (/list)) - Unknown (as Sherri Baker) (/mob/living/carbon/human): attackby(the M41A pulse rifle MK2 (/obj/item/weapon/gun/rifle/m41a), Unknown (as Sherri Baker) (/mob/living/carbon/human), /list (/list)) - Unknown (as Sherri Baker) (/mob/living/carbon/human): click adjacent(Unknown (as Sherri Baker) (/mob/living/carbon/human), the M41A pulse rifle MK2 (/obj/item/weapon/gun/rifle/m41a), /list (/list)) - Unknown (as Sherri Baker) (/mob/living/carbon/human): do click(Unknown (as Sherri Baker) (/mob/living/carbon/human), the floor (288,32,4) (/turf/open/floor/almayer), "icon-x=17;icon-y=19;left=1;but...") - **** (/client): Click(Unknown (as Sherri Baker) (/mob/living/carbon/human), the floor (288,32,4) (/turf/open/floor/almayer), "mapwindow.map", "icon-x=17;icon-y=19;left=1;but...") - ``` # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Fixes a runtime on decapping one's self. /:cl: --- code/modules/organs/limbs.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/organs/limbs.dm b/code/modules/organs/limbs.dm index 718aba208f5a..949104c5d673 100644 --- a/code/modules/organs/limbs.dm +++ b/code/modules/organs/limbs.dm @@ -955,7 +955,13 @@ This function completely restores a damaged organ to perfect condition. // OK so maybe your limb just flew off, but if it was attached to a pair of cuffs then hooray! Freedom! release_restraints() - if(vital) owner.death(cause) + if(vital) + var/mob/caused_mob + if(istype(cause, /mob)) + caused_mob = cause + if(!istype(cause, /datum/cause_data)) + cause = create_cause_data("lost vital limb", caused_mob) + owner.death(cause) /* HELPERS From 5cc1b72507fec1dd3c095212fbd7d7de0a6a31db Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 10:04:27 +0000 Subject: [PATCH 152/205] Automatic changelog for PR #5328 [ci skip] --- html/changelogs/AutoChangeLog-pr-5328.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5328.yml diff --git a/html/changelogs/AutoChangeLog-pr-5328.yml b/html/changelogs/AutoChangeLog-pr-5328.yml new file mode 100644 index 000000000000..cfd4dba8f96d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5328.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - bugfix: "Fixes a runtime on decapping one's self." \ No newline at end of file From 0c7443c355c0ecb92f03b1543edb5455a5076d20 Mon Sep 17 00:00:00 2001 From: Julian56 <117036822+Huffie56@users.noreply.github.com> Date: Sat, 30 Dec 2023 11:31:50 +0100 Subject: [PATCH 153/205] Modify organization for vendors of the Rifleman and the Team Leader role. (#5187) # About the pull request added binocular to rifleman because he access to the higher tier of it already. added the advance tier to team leader because their is no reason for rifleman to have it and not their leader. added the section because it's a section other job have to store engi item(SL and comtech) # Explain why it's good for the game better logic on what items are available for marines for binoculars change. the new section is on other job so it will probably make it better to orient ourself in vendors. the two new item because i think they aren't OP and are under-used items that some marine might take if they can buy them. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: qol: creating a new section called engineering supplies for the rifleman and the team leader. balance: added standard binocular to the rifleman vendor at a cost of 5. balance: added Range Finder and Laser Designator binoculars to Team leader at a cost of 10 and 20. balance: added ES-11 Mobile Fuel Canister and ME3 hand welder to Team leader and rifleman for 5 each. /:cl: --------- Co-authored-by: Julien --- .../vending/vendor_types/squad_prep/squad_rifleman.dm | 9 +++++++-- .../vending/vendor_types/squad_prep/squad_tl.dm | 10 ++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm index 3a15229182b4..15661cc4b661 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_rifleman.dm @@ -45,6 +45,12 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("Heat Absorbent Coif", 0, /obj/item/clothing/mask/rebreather/scarf, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), list("Rebreather", 0, /obj/item/clothing/mask/rebreather, MARINE_CAN_BUY_MASK, VENDOR_ITEM_REGULAR), + list("ENGINEERING SUPPLIES", 0, null, null, null), + list("E-Tool", 5, /obj/item/tool/shovel/etool/folded, null, VENDOR_ITEM_REGULAR), + list("Sandbags", 20, /obj/item/stack/sandbags_empty/half, null, VENDOR_ITEM_REGULAR), + list("ES-11 Mobile Fuel Canister", 5, /obj/item/tool/weldpack/minitank, null, VENDOR_ITEM_REGULAR), + list("ME3 Hand Welder", 5, /obj/item/tool/weldingtool/simple, null, VENDOR_ITEM_REGULAR), + list("RESTRICTED FIREARMS", 0, null, null, null), list("VP78 Pistol", 15, /obj/item/storage/box/guncase/vp78, null, VENDOR_ITEM_REGULAR), list("SU-6 Smart Pistol", 15, /obj/item/storage/box/guncase/smartpistol, null, VENDOR_ITEM_REGULAR), @@ -88,8 +94,6 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("Large General Pouch", 15, /obj/item/storage/pouch/general/large, null, VENDOR_ITEM_REGULAR), list("UTILITIES", 0, null, null, null), - list("E-Tool", 5, /obj/item/tool/shovel/etool/folded, null, VENDOR_ITEM_REGULAR), - list("Sandbags", 20, /obj/item/stack/sandbags_empty/half, null, VENDOR_ITEM_REGULAR), list("Roller Bed", 5, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("Fulton Device Stack", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR), @@ -98,6 +102,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_marine, list( list("Whistle", 5, /obj/item/device/whistle, null, VENDOR_ITEM_REGULAR), list("BINOCULARS", 0, null, null, null), + list("Binoculars", 5, /obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), list("Range Finder", 10, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), list("Laser Designator", 15, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_REGULAR), diff --git a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm index 7ddcf14eccde..d9ba7ee97c26 100644 --- a/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm +++ b/code/game/machinery/vending/vendor_types/squad_prep/squad_tl.dm @@ -42,10 +42,14 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( list("Insulated Gloves", 3, /obj/item/clothing/gloves/yellow, null, VENDOR_ITEM_REGULAR), list("Night Vision Optic", 30, /obj/item/device/helmet_visor/night_vision, null, VENDOR_ITEM_RECOMMENDED), - list("UTILITIES", 0, null, null, null), - list("Motion Detector", 15, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), + list("ENGINEERING SUPPLIES", 0, null, null, null), list("Plastic Explosive", 10, /obj/item/explosive/plastic, null, VENDOR_ITEM_REGULAR), list("Breaching Charge", 10, /obj/item/explosive/plastic/breaching_charge, null, VENDOR_ITEM_REGULAR), + list("ES-11 Mobile Fuel Canister", 5, /obj/item/tool/weldpack/minitank, null, VENDOR_ITEM_REGULAR), + list("ME3 Hand Welder", 5, /obj/item/tool/weldingtool/simple, null, VENDOR_ITEM_REGULAR), + + list("UTILITIES", 0, null, null, null), + list("Motion Detector", 15, /obj/item/device/motiondetector, null, VENDOR_ITEM_RECOMMENDED), list("Roller Bed", 5, /obj/item/roller, null, VENDOR_ITEM_REGULAR), list("Fulton Device Stack", 5, /obj/item/stack/fulton, null, VENDOR_ITEM_REGULAR), list("Fire Extinguisher (Portable)", 5, /obj/item/tool/extinguisher/mini, null, VENDOR_ITEM_REGULAR), @@ -53,6 +57,8 @@ GLOBAL_LIST_INIT(cm_vending_gear_tl, list( list("BINOCULARS", 0, null, null, null), list("Binoculars", 5, /obj/item/device/binoculars, null, VENDOR_ITEM_REGULAR), + list("Range Finder", 10, /obj/item/device/binoculars/range, null, VENDOR_ITEM_REGULAR), + list("Laser Designator", 15, /obj/item/device/binoculars/range/designator, null, VENDOR_ITEM_REGULAR), list("HELMET OPTICS", 0, null, null, null), list("Medical Helmet Optic", 15, /obj/item/device/helmet_visor/medical, null, VENDOR_ITEM_REGULAR), From 87179fdb934c2590969797425f05ac2b01a32bac Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 10:39:47 +0000 Subject: [PATCH 154/205] Automatic changelog for PR #5187 [ci skip] --- html/changelogs/AutoChangeLog-pr-5187.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5187.yml diff --git a/html/changelogs/AutoChangeLog-pr-5187.yml b/html/changelogs/AutoChangeLog-pr-5187.yml new file mode 100644 index 000000000000..0e4a496510dc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5187.yml @@ -0,0 +1,7 @@ +author: "Huffie56" +delete-after: True +changes: + - qol: "creating a new section called engineering supplies for the rifleman and the team leader." + - balance: "added standard binocular to the rifleman vendor at a cost of 5." + - balance: "added Range Finder and Laser Designator binoculars to Team leader at a cost of 10 and 20." + - balance: "added ES-11 Mobile Fuel Canister and ME3 hand welder to Team leader and rifleman for 5 each." \ No newline at end of file From 2764eaa8df2da0ee7aef0c43e118790e479aaa42 Mon Sep 17 00:00:00 2001 From: Birdtalon Date: Sat, 30 Dec 2023 13:06:17 +0000 Subject: [PATCH 155/205] Fixes milk runtime in on_mob_life() (and maybe other reagents) (#5327) # About the pull request Seen this runtime a couple of times now with milk specifically. But this situation I believe could also occur in other `reagent/on_mob_life()` `holder` being null can occur if we qdel the reagent during `remove_reagent()` and we then try to call procs on the now null holder further down the thread of `on_mob_life()`. We now check again if `!holder` after calling `remove_reagent()` at `/datum/reagent` level which will cause us to return early in `on_mob_life()` which should call parent when implemented and not operate on a null `holder` ``` [2023-12-28 17:57:27.386] runtime error: Cannot execute null.remove reagent(). - proc name: on mob life (/datum/reagent/drink/milk/on_mob_life) - source file: code/modules/reagents/chemistry_reagents/drink.dm,168 - usr: null - src: Milk (/datum/reagent/drink/milk) - call stack: - Milk (/datum/reagent/drink/milk): on mob life(Gilles Liebreich (/mob/living/carbon/human), 0, 2) - /datum/reagents (/datum/reagents): metabolize(Gilles Liebreich (/mob/living/carbon/human), 0, 2) - Gilles Liebreich (/mob/living/carbon/human): handle chemicals in body(2) - Gilles Liebreich (/mob/living/carbon/human): Life(2) - Human Life (/datum/controller/subsystem/human): fire(0) - Human Life (/datum/controller/subsystem/human): ignite(0) - Master (/datum/controller/master): RunQueue() - Master (/datum/controller/master): Loop(2) - Master (/datum/controller/master): StartProcessing(0) - ``` # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: fix: Runtime with milk and possibly other reagent's on_mob_life() /:cl: --- code/modules/reagents/Chemistry-Reagents.dm | 3 +++ code/modules/reagents/chemistry_reagents/drink.dm | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 6d36765146ed..4e3f3a91449d 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -152,6 +152,9 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) handle_processing(M, mods, delta_time) holder.remove_reagent(id, custom_metabolism * delta_time) + if(!holder) + return FALSE + return TRUE //Pre-processing diff --git a/code/modules/reagents/chemistry_reagents/drink.dm b/code/modules/reagents/chemistry_reagents/drink.dm index 9739687dec20..3a49429d664e 100644 --- a/code/modules/reagents/chemistry_reagents/drink.dm +++ b/code/modules/reagents/chemistry_reagents/drink.dm @@ -163,8 +163,10 @@ /datum/reagent/drink/milk/on_mob_life(mob/living/M) . = ..() - if(!.) return - if(M.getBruteLoss() && prob(20)) M.heal_limb_damage(1,0) + if(!.) + return + if(M.getBruteLoss() && prob(20)) + M.heal_limb_damage(1,0) holder.remove_reagent("capsaicin", 10*REAGENTS_METABOLISM) holder.remove_reagent("hotsauce", 10*REAGENTS_METABOLISM) From 291fcd95a423bf58980bde41ccc3767d13582644 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 13:14:10 +0000 Subject: [PATCH 156/205] Automatic changelog for PR #5327 [ci skip] --- html/changelogs/AutoChangeLog-pr-5327.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5327.yml diff --git a/html/changelogs/AutoChangeLog-pr-5327.yml b/html/changelogs/AutoChangeLog-pr-5327.yml new file mode 100644 index 000000000000..5184b272d156 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5327.yml @@ -0,0 +1,4 @@ +author: "Birdtalon" +delete-after: True +changes: + - bugfix: "Runtime with milk and possibly other reagent's on_mob_life()" \ No newline at end of file From b9db0b88f44336d67dd8667871386323f0757a3d Mon Sep 17 00:00:00 2001 From: Cthulhu80 <122310258+Cthulhu80@users.noreply.github.com> Date: Sat, 30 Dec 2023 07:15:45 -0800 Subject: [PATCH 157/205] Fixes movement delay stacking when crossing weeds. (#5332) # About the pull request Fixes #2227 . Shadow nerfing warrior and praetorian with this one boys. # Explain why it's good for the game bug bad, and fuck oppressor. # Changelog :cl: fix: Fixes movement delay stacking on weeds /:cl: --- code/modules/cm_aliens/XenoStructures.dm | 5 ++--- code/modules/cm_aliens/weeds.dm | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/code/modules/cm_aliens/XenoStructures.dm b/code/modules/cm_aliens/XenoStructures.dm index e78756f1eda6..7e4f7996d3f8 100644 --- a/code/modules/cm_aliens/XenoStructures.dm +++ b/code/modules/cm_aliens/XenoStructures.dm @@ -160,13 +160,12 @@ /obj/effect/alien/resin/sticky/Crossed(atom/movable/AM) . = ..() var/mob/living/carbon/human/H = AM - // Wait doesn't this stack slows if you get dragged over it? What's going on here? if(istype(H) && !H.ally_of_hivenumber(hivenumber)) - H.next_move_slowdown = H.next_move_slowdown + slow_amt + H.next_move_slowdown = max(H.next_move_slowdown, slow_amt) return . var/mob/living/carbon/xenomorph/X = AM if(istype(X) && !X.ally_of_hivenumber(hivenumber)) - X.next_move_slowdown = X.next_move_slowdown + slow_amt + X.next_move_slowdown = max(X.next_move_slowdown, slow_amt) return . /obj/effect/alien/resin/sticky/proc/forsaken_handling() diff --git a/code/modules/cm_aliens/weeds.dm b/code/modules/cm_aliens/weeds.dm index 4be1ce63ac25..45c78b979105 100644 --- a/code/modules/cm_aliens/weeds.dm +++ b/code/modules/cm_aliens/weeds.dm @@ -186,7 +186,7 @@ SEND_SIGNAL(crossing_mob, COMSIG_MOB_WEED_SLOWDOWN, slowdata, src) var/final_slowdown = slowdata["movement_slowdown"] - crossing_mob.next_move_slowdown += POSITIVE(final_slowdown) + crossing_mob.next_move_slowdown = max(crossing_mob.next_move_slowdown, POSITIVE(final_slowdown)) // Uh oh, we might be dying! // I know this is bad proc naming but it was too good to pass on and it's only used in this file anyways From 312ec96fdb934125f56802a0cd098f710d962967 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 15:28:38 +0000 Subject: [PATCH 158/205] Automatic changelog for PR #5332 [ci skip] --- html/changelogs/AutoChangeLog-pr-5332.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5332.yml diff --git a/html/changelogs/AutoChangeLog-pr-5332.yml b/html/changelogs/AutoChangeLog-pr-5332.yml new file mode 100644 index 000000000000..108f2cb25ab8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5332.yml @@ -0,0 +1,4 @@ +author: "Cthulhu80" +delete-after: True +changes: + - bugfix: "Fixes movement delay stacking on weeds" \ No newline at end of file From 5517c1ed523549b0c4893109c7cb2cee4d84506f Mon Sep 17 00:00:00 2001 From: HaultyAnonie <131271192+HaultyAnonie@users.noreply.github.com> Date: Sat, 30 Dec 2023 15:15:48 +0000 Subject: [PATCH 159/205] Fixes a grammar mistake seen in the requisitions vendor. (#5333) # About the pull request Fixes a grammar mistake left behind. # Explain why it's good for the game Proper English is good and encouraged. # Testing Photographs and Procedure No screenshots or videos. # Changelog :cl: AnonHault spellcheck: fixed a typo /:cl: --- code/game/machinery/vending/vendor_types/requisitions.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/vending/vendor_types/requisitions.dm b/code/game/machinery/vending/vendor_types/requisitions.dm index 1ea56c9fc0f5..24f58c8f6ae3 100644 --- a/code/game/machinery/vending/vendor_types/requisitions.dm +++ b/code/game/machinery/vending/vendor_types/requisitions.dm @@ -50,7 +50,7 @@ list("M40 HPDP White Phosphorus Smoke Grenade", round(scale * 4), /obj/item/explosive/grenade/phosphorus, VENDOR_ITEM_REGULAR), list("M40 HSDP Smoke Grenade", round(scale * 5), /obj/item/explosive/grenade/smokebomb, VENDOR_ITEM_REGULAR), list("M74 AGM-Frag Airburst Grenade", round(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst, VENDOR_ITEM_REGULAR), - list("M74 AGM-Icendiary Airburst Grenade", round(scale * 4), /obj/item/explosive/grenade/incendiary/airburst, VENDOR_ITEM_REGULAR), + list("M74 AGM-Incendiary Airburst Grenade", round(scale * 4), /obj/item/explosive/grenade/incendiary/airburst, VENDOR_ITEM_REGULAR), list("M74 AGM-Smoke Airburst Grenade", round(scale * 4), /obj/item/explosive/grenade/smokebomb/airburst, VENDOR_ITEM_REGULAR), list("M74 AGM-Star Shell", round(scale * 2), /obj/item/explosive/grenade/high_explosive/airburst/starshell, VENDOR_ITEM_REGULAR), list("M74 AGM-Hornet Shell", round(scale * 4), /obj/item/explosive/grenade/high_explosive/airburst/hornet_shell, VENDOR_ITEM_REGULAR), From 4383f1b517b3f7339dd0bea4f6225d68afdd64b1 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 15:43:54 +0000 Subject: [PATCH 160/205] Automatic changelog for PR #5333 [ci skip] --- html/changelogs/AutoChangeLog-pr-5333.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5333.yml diff --git a/html/changelogs/AutoChangeLog-pr-5333.yml b/html/changelogs/AutoChangeLog-pr-5333.yml new file mode 100644 index 000000000000..67fea80ab849 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5333.yml @@ -0,0 +1,4 @@ +author: "AnonHault" +delete-after: True +changes: + - spellcheck: "fixed a typo" \ No newline at end of file From 81f565418773be417b164e3835610855d09afbe6 Mon Sep 17 00:00:00 2001 From: Cthulhu80 <122310258+Cthulhu80@users.noreply.github.com> Date: Sat, 30 Dec 2023 07:15:52 -0800 Subject: [PATCH 161/205] Fixes evac pods launching with more than three occupants (#5335) # About the pull request Fixes #3650 , Evac pods can no longer launch if the occupant number is greater than three. # Explain why it's good for the game bug bad # Changelog :cl: fix: Fixes evac pods launching with more than the occupant limit /:cl: --- code/modules/shuttle/shuttles/crashable/escape_shuttle.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm b/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm index 1f0a8fd502cf..c2c6b818b37b 100644 --- a/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm +++ b/code/modules/shuttle/shuttles/crashable/escape_shuttle.dm @@ -73,6 +73,8 @@ for(var/mob/living/occupant in interior_area) occupant_count++ for(var/obj/structure/machinery/cryopod/evacuation/cryotube in interior_area) + if(cryotube.occupant) + occupant_count++ cryos += list(cryotube) if (occupant_count > max_capacity) playsound(src,'sound/effects/escape_pod_warmup.ogg', 50, 1) From 785ab31d0ec80091100e736f6496ef75f719e296 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 15:59:10 +0000 Subject: [PATCH 162/205] Automatic changelog for PR #5335 [ci skip] --- html/changelogs/AutoChangeLog-pr-5335.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5335.yml diff --git a/html/changelogs/AutoChangeLog-pr-5335.yml b/html/changelogs/AutoChangeLog-pr-5335.yml new file mode 100644 index 000000000000..dcc844cb6b29 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5335.yml @@ -0,0 +1,4 @@ +author: "Cthulhu80" +delete-after: True +changes: + - bugfix: "Fixes evac pods launching with more than the occupant limit" \ No newline at end of file From dc43dbec1eeb40abf5c69c05d996dfc754ea0d5a Mon Sep 17 00:00:00 2001 From: SabreML <57483089+SabreML@users.noreply.github.com> Date: Sat, 30 Dec 2023 15:29:17 +0000 Subject: [PATCH 163/205] Adds a 'Time Since Death' counter to the status tab (#5314) # About the pull request Adds a 'Time Since Death' counter to the status tab, which shows in minutes and seconds how long it's been since the player died. (The counter isn't shown to players who joined as observers, just ghosts.) (also for the record I asked and this is fine in regards to the freeze: https://discord.com/channels/150315577943130112/745447048261795890/1189329387397578912) # Explain why it's good for the game Primarily, it would be very useful for tracking how long until it's possible to spawn as a lesser drone/facehugger without having to keep clicking the buttons to see the failure message. # Testing Photographs and Procedure
Screenshots & Videos **Normal:** ![after normal](https://github.com/cmss13-devs/cmss13/assets/57483089/99b10552-a0a1-4288-a106-802cc52cd9e6)
**With larva queue:** ![after with queue](https://github.com/cmss13-devs/cmss13/assets/57483089/a862c4f7-615f-4979-8d50-16c2551eb31d)
**With hijack:** ![after with hijack](https://github.com/cmss13-devs/cmss13/assets/57483089/e7992cac-13a4-4202-a4ba-203653b0e468)
**With both:** ![after](https://github.com/cmss13-devs/cmss13/assets/57483089/6cca3520-673d-4e7c-a718-edbc3ee02f9d)
# Changelog :cl: qol: Added a 'Time Since Death' counter to the status tab for ghosts. /:cl: --- code/modules/mob/dead/observer/observer.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 83bc0c3750f7..529d13636b2d 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1232,6 +1232,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(client.prefs?.be_special & BE_ALIEN_AFTER_DEATH) if(larva_queue_cached_message) . += larva_queue_cached_message + . += "" + + if(timeofdeath) + . += "Time Since Death: [duration2text_sec(world.time - timeofdeath)]" /proc/message_ghosts(message) From 61a891a8448e4a70d5ef883ea72015d70973084b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 16:12:13 +0000 Subject: [PATCH 164/205] Automatic changelog for PR #5314 [ci skip] --- html/changelogs/AutoChangeLog-pr-5314.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5314.yml diff --git a/html/changelogs/AutoChangeLog-pr-5314.yml b/html/changelogs/AutoChangeLog-pr-5314.yml new file mode 100644 index 000000000000..617641b9ef23 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5314.yml @@ -0,0 +1,4 @@ +author: "SabreML" +delete-after: True +changes: + - qol: "Added a 'Time Since Death' counter to the status tab for ghosts." \ No newline at end of file From 42d355f156f3f4874be32f0abefb8c9d90e7ca35 Mon Sep 17 00:00:00 2001 From: InsaneRed <47158596+InsaneRed@users.noreply.github.com> Date: Sun, 31 Dec 2023 00:08:40 +0300 Subject: [PATCH 165/205] "Fixes" predator stun durations (#5302) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # About the pull request (this is up for debate from the council / pred players) After fira fixed the code it actually works which has resulted in predators gettiing up from stuns way faster then ""intended"" im using intended because it was balanced around a system which didnt work, and now that it works they get up "faster" # Explain why it's good for the game predators are already busted to fight against as a xenomorph and their only counter (stuns) not working properly is not fun to play against # Testing Photographs and Procedure
https://github.com/cmss13-devs/cmss13/assets/47158596/0226dd1e-0a7b-4cf6-8f9b-f873f28616d6 https://github.com/cmss13-devs/cmss13/assets/47158596/bc16e62f-924e-40a6-a969-a83840867db7 https://github.com/cmss13-devs/cmss13/assets/47158596/3af3f5e1-faea-4ae8-bc34-e162cb2238b5 ^^^^ NEW ↓ ↓ ↓ OLD https://github.com/cmss13-devs/cmss13/assets/47158596/6755d095-81fd-40f9-89c2-89532cb1a50e https://github.com/cmss13-devs/cmss13/assets/47158596/66327438-4e2c-45fa-bc2b-bafe041e2607 https://github.com/cmss13-devs/cmss13/assets/47158596/3b9fad3b-559a-4a74-9968-0f818a27ac04
# Changelog :cl: balance: Properly tweaks predator stun resist back to what it should have been. /:cl: --------- Co-authored-by: InsaneRed --- .../mob/living/carbon/human/species/yautja/_species.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species/yautja/_species.dm b/code/modules/mob/living/carbon/human/species/yautja/_species.dm index f8937279d8b9..a69d94afaca7 100644 --- a/code/modules/mob/living/carbon/human/species/yautja/_species.dm +++ b/code/modules/mob/living/carbon/human/species/yautja/_species.dm @@ -53,8 +53,8 @@ /mob/living/carbon/human/proc/mark_panel, ) - knock_down_reduction = 4 - stun_reduction = 4 + knock_down_reduction = 1.5 + stun_reduction = 1.5 weed_slowdown_mult = 0 // no slowdown! icobase = 'icons/mob/humans/species/r_predator.dmi' From 7838ceaa8086c17d3b56a2f41ffe2d5f7543f464 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 30 Dec 2023 21:16:44 +0000 Subject: [PATCH 166/205] Automatic changelog for PR #5302 [ci skip] --- html/changelogs/AutoChangeLog-pr-5302.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5302.yml diff --git a/html/changelogs/AutoChangeLog-pr-5302.yml b/html/changelogs/AutoChangeLog-pr-5302.yml new file mode 100644 index 000000000000..c423a926897d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5302.yml @@ -0,0 +1,4 @@ +author: "InsaneRed" +delete-after: True +changes: + - balance: "Properly tweaks predator stun resist back to what it should have been." \ No newline at end of file From 24f3ba1fee8574795c5f5ef6a99ff7caef337e33 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 31 Dec 2023 01:15:33 +0000 Subject: [PATCH 167/205] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-5187.yml | 7 ----- html/changelogs/AutoChangeLog-pr-5231.yml | 4 --- html/changelogs/AutoChangeLog-pr-5234.yml | 4 --- html/changelogs/AutoChangeLog-pr-5237.yml | 4 --- html/changelogs/AutoChangeLog-pr-5302.yml | 4 --- html/changelogs/AutoChangeLog-pr-5304.yml | 4 --- html/changelogs/AutoChangeLog-pr-5309.yml | 4 --- html/changelogs/AutoChangeLog-pr-5314.yml | 4 --- html/changelogs/AutoChangeLog-pr-5316.yml | 4 --- html/changelogs/AutoChangeLog-pr-5322.yml | 4 --- html/changelogs/AutoChangeLog-pr-5327.yml | 4 --- html/changelogs/AutoChangeLog-pr-5328.yml | 4 --- html/changelogs/AutoChangeLog-pr-5332.yml | 4 --- html/changelogs/AutoChangeLog-pr-5333.yml | 4 --- html/changelogs/AutoChangeLog-pr-5335.yml | 4 --- html/changelogs/archive/2023-12.yml | 33 +++++++++++++++++++++++ 16 files changed, 33 insertions(+), 63 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-5187.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5231.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5234.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5237.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5302.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5304.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5309.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5314.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5316.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5322.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5327.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5328.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5332.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5333.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-5335.yml diff --git a/html/changelogs/AutoChangeLog-pr-5187.yml b/html/changelogs/AutoChangeLog-pr-5187.yml deleted file mode 100644 index 0e4a496510dc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5187.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Huffie56" -delete-after: True -changes: - - qol: "creating a new section called engineering supplies for the rifleman and the team leader." - - balance: "added standard binocular to the rifleman vendor at a cost of 5." - - balance: "added Range Finder and Laser Designator binoculars to Team leader at a cost of 10 and 20." - - balance: "added ES-11 Mobile Fuel Canister and ME3 hand welder to Team leader and rifleman for 5 each." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5231.yml b/html/changelogs/AutoChangeLog-pr-5231.yml deleted file mode 100644 index 63ee5031277c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5231.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "cuberound" -delete-after: True -changes: - - balance: "gives trucker engineer level construction skill" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5234.yml b/html/changelogs/AutoChangeLog-pr-5234.yml deleted file mode 100644 index 270ff64cc103..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5234.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "blackdragonTOW" -delete-after: True -changes: - - rscadd: "Max CL Headset radio keys from 3 to 5. (+2 increase)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5237.yml b/html/changelogs/AutoChangeLog-pr-5237.yml deleted file mode 100644 index 2e75583fc134..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5237.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - code_imp: "Refactors some code to new throw_carbon proc" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5302.yml b/html/changelogs/AutoChangeLog-pr-5302.yml deleted file mode 100644 index c423a926897d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5302.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "InsaneRed" -delete-after: True -changes: - - balance: "Properly tweaks predator stun resist back to what it should have been." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5304.yml b/html/changelogs/AutoChangeLog-pr-5304.yml deleted file mode 100644 index eeada8e1ae61..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5304.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "BeagleGaming1" -delete-after: True -changes: - - qol: "Adds the ability to hide your action buttons" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5309.yml b/html/changelogs/AutoChangeLog-pr-5309.yml deleted file mode 100644 index cf471ddf7e95..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5309.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "mullenpaul" -delete-after: True -changes: - - refactor: "sentry laptop now uses camera manager component" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5314.yml b/html/changelogs/AutoChangeLog-pr-5314.yml deleted file mode 100644 index 617641b9ef23..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5314.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - qol: "Added a 'Time Since Death' counter to the status tab for ghosts." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5316.yml b/html/changelogs/AutoChangeLog-pr-5316.yml deleted file mode 100644 index 50b3a094ab2d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5316.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SabreML" -delete-after: True -changes: - - bugfix: "Fixed the Hive Status window showing an error message when the Queen dies." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5322.yml b/html/changelogs/AutoChangeLog-pr-5322.yml deleted file mode 100644 index fdff7e6c3e9a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5322.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - bugfix: "Fixes runtime calling post_attack() on a mob which has already been qdeleted via gibbing." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5327.yml b/html/changelogs/AutoChangeLog-pr-5327.yml deleted file mode 100644 index 5184b272d156..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5327.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - bugfix: "Runtime with milk and possibly other reagent's on_mob_life()" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5328.yml b/html/changelogs/AutoChangeLog-pr-5328.yml deleted file mode 100644 index cfd4dba8f96d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5328.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Birdtalon" -delete-after: True -changes: - - bugfix: "Fixes a runtime on decapping one's self." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5332.yml b/html/changelogs/AutoChangeLog-pr-5332.yml deleted file mode 100644 index 108f2cb25ab8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5332.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cthulhu80" -delete-after: True -changes: - - bugfix: "Fixes movement delay stacking on weeds" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5333.yml b/html/changelogs/AutoChangeLog-pr-5333.yml deleted file mode 100644 index 67fea80ab849..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5333.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AnonHault" -delete-after: True -changes: - - spellcheck: "fixed a typo" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-5335.yml b/html/changelogs/AutoChangeLog-pr-5335.yml deleted file mode 100644 index dcc844cb6b29..000000000000 --- a/html/changelogs/AutoChangeLog-pr-5335.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Cthulhu80" -delete-after: True -changes: - - bugfix: "Fixes evac pods launching with more than the occupant limit" \ No newline at end of file diff --git a/html/changelogs/archive/2023-12.yml b/html/changelogs/archive/2023-12.yml index e4245e7d5cbc..6f487820ae46 100644 --- a/html/changelogs/archive/2023-12.yml +++ b/html/changelogs/archive/2023-12.yml @@ -556,3 +556,36 @@ - bugfix: m56d can not longer shoot backwards when facing north mullenpaul: - refactor: tgui js components now jsx +2023-12-31: + AnonHault: + - spellcheck: fixed a typo + BeagleGaming1: + - qol: Adds the ability to hide your action buttons + Birdtalon: + - bugfix: Fixes a runtime on decapping one's self. + - bugfix: Runtime with milk and possibly other reagent's on_mob_life() + - bugfix: Fixes runtime calling post_attack() on a mob which has already been qdeleted + via gibbing. + - code_imp: Refactors some code to new throw_carbon proc + Cthulhu80: + - bugfix: Fixes movement delay stacking on weeds + - bugfix: Fixes evac pods launching with more than the occupant limit + Huffie56: + - qol: creating a new section called engineering supplies for the rifleman and the + team leader. + - balance: added standard binocular to the rifleman vendor at a cost of 5. + - balance: added Range Finder and Laser Designator binoculars to Team leader at + a cost of 10 and 20. + - balance: added ES-11 Mobile Fuel Canister and ME3 hand welder to Team leader and + rifleman for 5 each. + InsaneRed: + - balance: Properly tweaks predator stun resist back to what it should have been. + SabreML: + - bugfix: Fixed the Hive Status window showing an error message when the Queen dies. + - qol: Added a 'Time Since Death' counter to the status tab for ghosts. + blackdragonTOW: + - rscadd: Max CL Headset radio keys from 3 to 5. (+2 increase) + cuberound: + - balance: gives trucker engineer level construction skill + mullenpaul: + - refactor: sentry laptop now uses camera manager component From 1f63e72b1ccb54ba87ed4a19448c94bef9cb0d0c Mon Sep 17 00:00:00 2001 From: fira Date: Sun, 31 Dec 2023 02:18:03 +0100 Subject: [PATCH 168/205] Fixes Nuke failing to detonate (#5338) # About the pull request Under very specific circumstances (seen 2x or more on live), the nuke broken logic of checking eligbile mobs for explosion will cause it to crash completely and fail to detonate. The problem is primarily the `loc` check at top, which is not a sufficient safeguard. Also moves the explosion delay so that people die when the nuke explode and not before... # Testing Photographs and Procedure Spawn in nuke and testers, safety off, proccall explode # Changelog :cl: fix: Fixed Nuke failing to detonate under specific circumstances. It may involve a little rodent. fix: Nuke explosion will now kill mobs on its actual explosion rather than at the start of the cinematic sequence. /:cl: --- code/game/machinery/nuclearbomb.dm | 52 +++++++++++++----------------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/code/game/machinery/nuclearbomb.dm b/code/game/machinery/nuclearbomb.dm index cfb0d1abb94f..aac4f82ccff1 100644 --- a/code/game/machinery/nuclearbomb.dm +++ b/code/game/machinery/nuclearbomb.dm @@ -396,45 +396,39 @@ GLOBAL_VAR_INIT(bomb_set, FALSE) playsound(src, 'sound/machines/Alarm.ogg', 75, 0, 30) world << pick('sound/theme/nuclear_detonation1.ogg','sound/theme/nuclear_detonation2.ogg') - var/list/alive_mobs = list() //Everyone who will be destroyed on the zlevel(s). - var/list/dead_mobs = list() //Everyone who only needs to see the cinematic. for(var/mob/current_mob as anything in GLOB.mob_list) - if(!current_mob?.loc) - continue - if(current_mob.stat == DEAD) - dead_mobs |= current_mob - continue var/turf/current_turf = get_turf(current_mob) - if(z == current_turf.z) - alive_mobs |= current_mob + if(current_turf?.z == z && current_mob.stat != DEAD) shake_camera(current_mob, 110, 4) + sleep(10 SECONDS) + + var/list/mob/alive_mobs = list() //Everyone who will be destroyed on the zlevel(s). + var/list/mob/dead_mobs = list() //Everyone that needs embryos cleared + for(var/mob/current_mob as anything in GLOB.mob_list) + var/turf/current_turf = get_turf(current_mob) + if(current_turf?.z == z) + if(current_mob.stat == DEAD) + dead_mobs |= current_mob + continue + alive_mobs |= current_mob + for(var/mob/current_mob in alive_mobs) - if(current_mob && current_mob.loc) - var/turf/current_mob_turf = get_turf(current_mob) - if(z == current_mob_turf.z) - if(istype(current_mob.loc, /obj/structure/closet/secure_closet/freezer/fridge)) - continue - current_mob.death(create_cause_data("nuclear explosion")) - - for(var/mob/current_mob in (alive_mobs + dead_mobs)) - if(current_mob && current_mob.loc) - var/turf/current_mob_turf = get_turf(current_mob) - if(z == current_mob_turf.z) - if(istype(current_mob.loc, /obj/structure/closet/secure_closet/freezer/fridge)) - continue - for(var/obj/item/alien_embryo/embryo in current_mob) - qdel(embryo) - - sleep(100) + if(istype(current_mob.loc, /obj/structure/closet/secure_closet/freezer/fridge)) + continue + current_mob.death(create_cause_data("nuclear explosion")) + + for(var/mob/living/current_mob in (alive_mobs + dead_mobs)) + if(istype(current_mob.loc, /obj/structure/closet/secure_closet/freezer/fridge)) + continue + for(var/obj/item/alien_embryo/embryo in current_mob) + qdel(embryo) + cell_explosion(loc, 500, 150, EXPLOSION_FALLOFF_SHAPE_LINEAR, null, create_cause_data(initial(name))) qdel(src) return TRUE /obj/structure/machinery/nuclearbomb/Destroy() - if(timing != -1) - message_admins("\The [src] has been unexpectedly deleted at ([x],[y],[x]). [ADMIN_JMP(src)]") - log_game("\The [src] has been unexpectedly deleted at ([x],[y],[x]).") GLOB.bomb_set = FALSE SSminimaps.remove_marker(src) return ..() From 22b345eae2b3a355f3483e86218dea6cc14cc819 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 31 Dec 2023 01:26:00 +0000 Subject: [PATCH 169/205] Automatic changelog for PR #5338 [ci skip] --- html/changelogs/AutoChangeLog-pr-5338.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5338.yml diff --git a/html/changelogs/AutoChangeLog-pr-5338.yml b/html/changelogs/AutoChangeLog-pr-5338.yml new file mode 100644 index 000000000000..e87c3ad81c78 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5338.yml @@ -0,0 +1,5 @@ +author: "fira" +delete-after: True +changes: + - bugfix: "Fixed Nuke failing to detonate under specific circumstances. It may involve a little rodent." + - bugfix: "Nuke explosion will now kill mobs on its actual explosion rather than at the start of the cinematic sequence." \ No newline at end of file From 7dd1f070a1b6d28b64719d7f54b66361908b6d93 Mon Sep 17 00:00:00 2001 From: Cthulhu80 <122310258+Cthulhu80@users.noreply.github.com> Date: Sat, 30 Dec 2023 18:15:15 -0800 Subject: [PATCH 170/205] Fixes vulture sniper rifle applying permanent nvg (#5341) # About the pull request Fixes #5300 , scoping on vulture sniper rifle no longer applies a permanent lighting buff. # Explain why it's good for the game bug bad # Changelog :cl: fix: Fixes permanent lighting buff after using the vulture sniper rifle. /:cl: --- code/modules/projectiles/gun_attachables.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm index e0dda3203d96..0f3fde8f3c9b 100644 --- a/code/modules/projectiles/gun_attachables.dm +++ b/code/modules/projectiles/gun_attachables.dm @@ -1586,7 +1586,7 @@ Defined in conflicts.dm of the #defines folder. scoper.clear_fullscreen("vulture") scoper.client.remove_from_screen(scope_element) scoper.see_in_dark -= darkness_view - scoper.lighting_alpha = 127 + scoper.lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE scoper.sync_lighting_plane_alpha() QDEL_NULL(scope_element) recalculate_scope_pos() From 6e0235ba81cd115949651a4531a02d4943adf793 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 31 Dec 2023 02:23:29 +0000 Subject: [PATCH 171/205] Automatic changelog for PR #5341 [ci skip] --- html/changelogs/AutoChangeLog-pr-5341.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5341.yml diff --git a/html/changelogs/AutoChangeLog-pr-5341.yml b/html/changelogs/AutoChangeLog-pr-5341.yml new file mode 100644 index 000000000000..fdbd4ed00896 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5341.yml @@ -0,0 +1,4 @@ +author: "Cthulhu80" +delete-after: True +changes: + - bugfix: "Fixes permanent lighting buff after using the vulture sniper rifle." \ No newline at end of file From 192e412889eb526f1191f5df0a4ec7f570d968b5 Mon Sep 17 00:00:00 2001 From: private-tristan <54422837+private-tristan@users.noreply.github.com> Date: Sat, 30 Dec 2023 21:15:28 -0500 Subject: [PATCH 172/205] Eggs are now properly converted to forsaken on evac (#5340) # About the pull request half of #4376 eggs now become forsaken on hijack, like everything else. tested and it works. # Explain why it's good for the game bugs should be fixed # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: Private Tristan fix: Eggs are properly converted to Forsaken hive on evac /:cl: --- code/modules/cm_aliens/structures/egg.dm | 11 +++++++++++ .../xenomorph/abilities/ability_helper_procs.dm | 1 - code/modules/mob/living/carbon/xenomorph/egg_item.dm | 11 +++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/code/modules/cm_aliens/structures/egg.dm b/code/modules/cm_aliens/structures/egg.dm index 5b0654d05b55..889359bb7eef 100644 --- a/code/modules/cm_aliens/structures/egg.dm +++ b/code/modules/cm_aliens/structures/egg.dm @@ -23,10 +23,21 @@ if (hive) hivenumber = hive + if(hivenumber == XENO_HIVE_NORMAL) + RegisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING, PROC_REF(forsaken_handling)) + set_hive_data(src, hivenumber) update_icon() addtimer(CALLBACK(src, PROC_REF(Grow)), rand(EGG_MIN_GROWTH_TIME, EGG_MAX_GROWTH_TIME)) +/obj/effect/alien/egg/proc/forsaken_handling() + SIGNAL_HANDLER + if(is_ground_level(z)) + hivenumber = XENO_HIVE_FORSAKEN + set_hive_data(src, XENO_HIVE_FORSAKEN) + + UnregisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING) + /obj/effect/alien/egg/Destroy() . = ..() for(var/obj/effect/egg_trigger/trigger as anything in egg_triggers) diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm index 7f3d886deb3a..68312b77936d 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/ability_helper_procs.dm @@ -31,7 +31,6 @@ if(isobj(O)) I = O - wait_time = I.get_applying_acid_time() if(wait_time == -1) to_chat(src, SPAN_WARNING("We cannot dissolve \the [I].")) diff --git a/code/modules/mob/living/carbon/xenomorph/egg_item.dm b/code/modules/mob/living/carbon/xenomorph/egg_item.dm index e4cc7bd39fe0..6f00ae1798e9 100644 --- a/code/modules/mob/living/carbon/xenomorph/egg_item.dm +++ b/code/modules/mob/living/carbon/xenomorph/egg_item.dm @@ -25,6 +25,17 @@ set_hive_data(src, hivenumber) . = ..() + if(hivenumber == XENO_HIVE_NORMAL) + RegisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING, PROC_REF(forsaken_handling)) + +/obj/item/xeno_egg/proc/forsaken_handling() + SIGNAL_HANDLER + if(is_ground_level(z)) + hivenumber = XENO_HIVE_FORSAKEN + set_hive_data(src, XENO_HIVE_FORSAKEN) + + UnregisterSignal(SSdcs, COMSIG_GLOB_GROUNDSIDE_FORSAKEN_HANDLING) + /obj/item/xeno_egg/get_examine_text(mob/user) . = ..() if(isxeno(user)) From e6593fc412ba9f059ca42771933792dd9da64343 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 31 Dec 2023 02:38:05 +0000 Subject: [PATCH 173/205] Automatic changelog for PR #5340 [ci skip] --- html/changelogs/AutoChangeLog-pr-5340.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5340.yml diff --git a/html/changelogs/AutoChangeLog-pr-5340.yml b/html/changelogs/AutoChangeLog-pr-5340.yml new file mode 100644 index 000000000000..49bd725b0596 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5340.yml @@ -0,0 +1,4 @@ +author: "Private Tristan" +delete-after: True +changes: + - bugfix: "Eggs are properly converted to Forsaken hive on evac" \ No newline at end of file From 158f87fc3992bdf57ec49edad01dc4eb60e34f8f Mon Sep 17 00:00:00 2001 From: Cthulhu80 <122310258+Cthulhu80@users.noreply.github.com> Date: Sat, 30 Dec 2023 22:01:13 -0800 Subject: [PATCH 174/205] Fixes photos only being viewable from adjacent tiles as an observer (#5343) # About the pull request Fixes #3855 , observer mobs can now view photos from any distance. # Explain why it's good for the game bug bad # Changelog :cl: fix: Fixes photos not being viewable from any distance as an observer /:cl: --- code/modules/paperwork/paper.dm | 2 +- code/modules/paperwork/photography.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index b572b5d9e87b..7a0fe71b4fc6 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -75,7 +75,7 @@ /obj/item/paper/get_examine_text(mob/user) . = ..() - if(in_range(user, src) || istype(user, /mob/dead/observer)) + if(in_range(user, src) || isobserver(user)) if(!(istype(user, /mob/dead/observer) || istype(user, /mob/living/carbon/human) || isRemoteControlling(user))) // Show scrambled paper if they aren't a ghost, human, or silicone. if(photo_list) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index cebb4ad613b0..40d88f684791 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -46,7 +46,7 @@ ..() /obj/item/photo/get_examine_text(mob/user) - if(in_range(user, src)) + if(in_range(user, src) || isobserver(user)) show(user) return list(desc) else From f3113a03bd9d7dd89d6f8f7d2318dd3eab6e308e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 31 Dec 2023 06:10:04 +0000 Subject: [PATCH 175/205] Automatic changelog for PR #5343 [ci skip] --- html/changelogs/AutoChangeLog-pr-5343.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5343.yml diff --git a/html/changelogs/AutoChangeLog-pr-5343.yml b/html/changelogs/AutoChangeLog-pr-5343.yml new file mode 100644 index 000000000000..31eedc2e1940 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5343.yml @@ -0,0 +1,4 @@ +author: "Cthulhu80" +delete-after: True +changes: + - bugfix: "Fixes photos not being viewable from any distance as an observer" \ No newline at end of file From 672be37da571684e65dbd9439f1595bf1ccc2ac2 Mon Sep 17 00:00:00 2001 From: Cthulhu80 <122310258+Cthulhu80@users.noreply.github.com> Date: Sat, 30 Dec 2023 22:01:20 -0800 Subject: [PATCH 176/205] Fixes mobs in crit being able to understand other languages (#5342) # About the pull request Fixes #3778 , mobs should no longer be able to comprehend other languages while in crit. # Explain why it's good for the game bug bad # Changelog :cl: fix: Fixes mobs being able to understand other languages while in crit. /:cl: --- code/modules/mob/hear_say.dm | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index c66d096c6c68..dd71180e2dfe 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -202,18 +202,21 @@ /mob/living/hear_say(message, verb, datum/language/language, alt_name, italics, mob/speaker, sound/speech_sound, sound_vol) if(client && mind && stat == UNCONSCIOUS) - hear_sleep(src, message, src == speaker, Adjacent(speaker)) + hear_sleep(speaker, message, src == speaker, Adjacent(speaker), language) return return ..() /mob/living/hear_radio(message, verb, datum/language/language, part_a, part_b, mob/speaker, hard_to_hear, vname, command, no_paygrade) if(client && mind && stat == UNCONSCIOUS) - hear_sleep(src, message, FALSE, FALSE) + hear_sleep(speaker, message, FALSE, FALSE, language) return return ..() -/mob/living/proc/hear_sleep(mob/speaker = null, message, hearing_self = FALSE, proximity_flag = FALSE) +/mob/living/proc/hear_sleep(mob/speaker = null, message, hearing_self = FALSE, proximity_flag = FALSE, datum/language/language = null) var/heard = "" + var/clear_char_probability = 90 + if(!say_understands(speaker, language)) + clear_char_probability = 25 if(sdisabilities & DISABILITY_DEAF || ear_deaf) if(speaker == src) @@ -226,7 +229,7 @@ heard = SPAN_LOCALSAY("You mutter something about... [stars(message, clear_char_probability = 99)]") else if(!sleeping && proximity_flag) - heard = SPAN_LOCALSAY("You hear someone near you say something... [stars(message, clear_char_probability = 90)]") + heard = SPAN_LOCALSAY("You hear someone near you say something... [stars(message, clear_char_probability)]") else if(prob(15)) From 9d9139aa75fba645236913eeec48f086081d4447 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 31 Dec 2023 06:23:41 +0000 Subject: [PATCH 177/205] Automatic changelog for PR #5342 [ci skip] --- html/changelogs/AutoChangeLog-pr-5342.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5342.yml diff --git a/html/changelogs/AutoChangeLog-pr-5342.yml b/html/changelogs/AutoChangeLog-pr-5342.yml new file mode 100644 index 000000000000..f70005834713 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5342.yml @@ -0,0 +1,4 @@ +author: "Cthulhu80" +delete-after: True +changes: + - bugfix: "Fixes mobs being able to understand other languages while in crit." \ No newline at end of file From 988a56a1c9220f4d85e5ba638b44ba2522cc7540 Mon Sep 17 00:00:00 2001 From: InsaneRed <47158596+InsaneRed@users.noreply.github.com> Date: Sun, 31 Dec 2023 11:59:26 +0300 Subject: [PATCH 178/205] Changes hit alerts from you to WE (#5295) # About the pull request This makes you are hit by x to We for the xeno side i dont know if this is a good way to do this, however. # Explain why it's good for the game Consistency is good, also more hiveminded alerts # Testing Photographs and Procedure text based # Changelog :cl: spellcheck: Changed hit alerts to We instead of You on the xeno side. /:cl: --------- Co-authored-by: InsaneRed --- .../mob/living/carbon/human/powers/human_powers.dm | 14 +++++++------- .../mob/living/carbon/xenomorph/damage_procs.dm | 2 +- code/modules/projectiles/guns/flamer/flamer.dm | 4 ++-- code/modules/projectiles/projectile.dm | 3 ++- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/living/carbon/human/powers/human_powers.dm b/code/modules/mob/living/carbon/human/powers/human_powers.dm index be7848b2a936..36eb927eb7fb 100644 --- a/code/modules/mob/living/carbon/human/powers/human_powers.dm +++ b/code/modules/mob/living/carbon/human/powers/human_powers.dm @@ -202,7 +202,7 @@ if(new_resting == resting) return if(!COOLDOWN_FINISHED(src, rest_cooldown)) - to_chat(src, SPAN_WARNING("You can't 'rest' that fast. Take a breather!")) + to_chat(src, SPAN_WARNING("[isxeno(src) ? "We" : "You"] can't 'rest' that fast. Take a breather!")) return COOLDOWN_START(src, rest_cooldown, 1 SECONDS) @@ -211,24 +211,24 @@ if(new_resting) if(body_position == LYING_DOWN) if(!silent) - to_chat(src, SPAN_NOTICE("You will now try to stay lying down on the floor.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] will now try to stay lying down on the floor.")) else if(HAS_TRAIT(src, TRAIT_FORCED_STANDING) || (buckled && buckled.buckle_lying != NO_BUCKLE_LYING)) if(!silent) - to_chat(src, SPAN_NOTICE("You will now lay down as soon as you are able to.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] will now lay down as soon as [isxeno(src) ? "we" : "you"] are able to.")) else if(!silent) - to_chat(src, SPAN_NOTICE("You lay down.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] lay down.")) set_lying_down() else if(body_position == STANDING_UP) if(!silent) - to_chat(src, SPAN_NOTICE("You will now try to remain standing up.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] will now try to remain standing up.")) else if(HAS_TRAIT(src, TRAIT_FLOORED) || (buckled && buckled.buckle_lying != NO_BUCKLE_LYING)) if(!silent) - to_chat(src, SPAN_NOTICE("You will now stand up as soon as you are able to.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] will now stand up as soon as [isxeno(src) ? "we" : "you"] are able to.")) else if(!silent) - to_chat(src, SPAN_NOTICE("You stand up.")) + to_chat(src, SPAN_NOTICE("[isxeno(src) ? "We" : "You"] stand up.")) get_up(instant) // SEND_SIGNAL(src, COMSIG_LIVING_RESTING, new_resting, silent, instant) diff --git a/code/modules/mob/living/carbon/xenomorph/damage_procs.dm b/code/modules/mob/living/carbon/xenomorph/damage_procs.dm index e372b03e68d9..624c9df25f3e 100644 --- a/code/modules/mob/living/carbon/xenomorph/damage_procs.dm +++ b/code/modules/mob/living/carbon/xenomorph/damage_procs.dm @@ -313,4 +313,4 @@ fire.set_on_fire(src) //Deals an extra proc of fire when you're crossing it. 30 damage per tile crossed, plus 15 per Process(). next_move_slowdown = next_move_slowdown + (SLOWDOWN_AMT_GREENFIRE * resist_modifier) if(resist_modifier > 0) - to_chat(src, SPAN_DANGER("You feel pieces of your exoskeleton fusing with the viscous fluid below and tearing off as you struggle to move through the flames!")) + to_chat(src, SPAN_DANGER("We feel pieces of our exoskeleton fusing with the viscous fluid below and tearing off as we struggle to move through the flames!")) diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index 18fb0bf44cd8..282edcab9fd6 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -621,7 +621,7 @@ burn_damage = 0 if(!burn_damage) - to_chat(M, SPAN_DANGER("You step over the flames.")) + to_chat(M, SPAN_DANGER("[isxeno(M) ? "We" : "You"] step over the flames.")) return M.last_damage_data = weapon_cause_data @@ -632,7 +632,7 @@ if(FIRE_VARIANT_TYPE_B) if(isxeno(M)) var/mob/living/carbon/xenomorph/X = M - X.armor_deflection?(variant_burn_msg=" You feel the flames weakening your exoskeleton!"):(variant_burn_msg=" You feel the flaming chemicals eating into your body!") + X.armor_deflection?(variant_burn_msg=" We feel the flames weakening our exoskeleton!"):(variant_burn_msg=" You feel the flaming chemicals eating into your body!") to_chat(M, SPAN_DANGER("You are burned![variant_burn_msg?"[variant_burn_msg]":""]")) M.updatehealth() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 38ee9c55b2a8..ee9caa61d7a7 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -1227,9 +1227,10 @@ return if(COOLDOWN_FINISHED(src, shot_cooldown)) visible_message(SPAN_DANGER("[src] is hit by the [P.name] in the [parse_zone(P.def_zone)]!"), \ - SPAN_HIGHDANGER("You are hit by the [P.name] in the [parse_zone(P.def_zone)]!"), null, 4, CHAT_TYPE_TAKING_HIT) + SPAN_HIGHDANGER("[isxeno(src) ? "We" : "You"] are hit by the [P.name] in the [parse_zone(P.def_zone)]!"), null, 4, CHAT_TYPE_TAKING_HIT) COOLDOWN_START(src, shot_cooldown, 1 SECONDS) + last_damage_data = P.weapon_cause_data if(P.firer && ismob(P.firer)) var/mob/firingMob = P.firer From 798ed883fc2d22054f7c89a81d72021185cd2a8c Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sun, 31 Dec 2023 09:07:26 +0000 Subject: [PATCH 179/205] Automatic changelog for PR #5295 [ci skip] --- html/changelogs/AutoChangeLog-pr-5295.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-5295.yml diff --git a/html/changelogs/AutoChangeLog-pr-5295.yml b/html/changelogs/AutoChangeLog-pr-5295.yml new file mode 100644 index 000000000000..c8d0b6b0a189 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-5295.yml @@ -0,0 +1,4 @@ +author: "InsaneRed" +delete-after: True +changes: + - spellcheck: "Changed hit alerts to We instead of You on the xeno side." \ No newline at end of file From 4d7f5489c5b9a5919d724f66fc43ffc3e0b3335a Mon Sep 17 00:00:00 2001 From: Cthulhu80 <122310258+Cthulhu80@users.noreply.github.com> Date: Sun, 31 Dec 2023 03:59:06 -0800 Subject: [PATCH 180/205] Fixes users getting locked in simulation view / simulation refactor (#5318) # About the pull request Initially I thought I introduced this bug, but it looks like it's existed for a few years. Fixes #4927. Also did some minor refactoring for the simulator. # Explain why it's good for the game bug bad # Changelog :cl: fix: fixes users getting stuck inside of the simulator /:cl: --- code/game/machinery/computer/demo_sim.dm | 4 +--- .../machinery/computer/dropship_weapons.dm | 4 +--- code/game/sim_manager/datums/simulator.dm | 22 ++++++++++++------- tgui/packages/tgui/interfaces/CasSim.tsx | 19 ++++++++++++---- tgui/packages/tgui/interfaces/DemoSim.jsx | 19 ++++++++++++---- 5 files changed, 46 insertions(+), 22 deletions(-) diff --git a/code/game/machinery/computer/demo_sim.dm b/code/game/machinery/computer/demo_sim.dm index 15261cfc8f4b..f633e8f351d4 100644 --- a/code/game/machinery/computer/demo_sim.dm +++ b/code/game/machinery/computer/demo_sim.dm @@ -55,7 +55,6 @@ var/list/data = list() data["configuration"] = configuration - data["looking"] = simulation.looking_at_simulation data["dummy_mode"] = simulation.dummy_mode data["worldtime"] = world.time @@ -104,8 +103,7 @@ /obj/structure/machinery/computer/demo_sim/ui_close(mob/user) . = ..() - if(simulation.looking_at_simulation) - simulation.stop_watching(user) + simulation.stop_watching(user) // DEMOLITIONS TGUI SHIT END \\ diff --git a/code/game/machinery/computer/dropship_weapons.dm b/code/game/machinery/computer/dropship_weapons.dm index 2f9047abc63c..db376c40029c 100644 --- a/code/game/machinery/computer/dropship_weapons.dm +++ b/code/game/machinery/computer/dropship_weapons.dm @@ -152,8 +152,7 @@ /obj/structure/machinery/computer/dropship_weapons/ui_close(mob/user) . = ..() SEND_SIGNAL(src, COMSIG_CAMERA_UNREGISTER_UI, user) - if(simulation.looking_at_simulation) - simulation.stop_watching(user) + simulation.stop_watching(user) /obj/structure/machinery/computer/dropship_weapons/ui_status(mob/user, datum/ui_state/state) . = ..() @@ -239,7 +238,6 @@ .["firemission_selected_laser"] = firemission_envelope.recorded_loc ? firemission_envelope.recorded_loc.get_name() : "NOT SELECTED" .["configuration"] = configuration - .["looking"] = simulation.looking_at_simulation .["dummy_mode"] = simulation.dummy_mode .["worldtime"] = world.time .["nextdetonationtime"] = simulation.detonation_cooldown diff --git a/code/game/sim_manager/datums/simulator.dm b/code/game/sim_manager/datums/simulator.dm index bf99c65ee66f..1f1aedad8153 100644 --- a/code/game/sim_manager/datums/simulator.dm +++ b/code/game/sim_manager/datums/simulator.dm @@ -1,18 +1,21 @@ +#define GRID_CLEARING_SIZE 16 + /datum/simulator // Necessary to prevent multiple users from simulating at the same time. var/static/detonation_cooldown = 0 + var/static/detonation_cooldown_time = 2 MINUTES var/static/sim_reboot_state = TRUE - var/looking_at_simulation = FALSE - var/detonation_cooldown_time = 2 MINUTES var/dummy_mode = CLF_MODE var/obj/structure/machinery/camera/simulation/sim_camera - var/grid_clearing_size = 16 // garbage collection, var/static/list/delete_targets = list() + // list of users currently inside the simulator + var/static/list/users_in_sim = list() + /* unarmoured humans are unnencessary clutter as they tend to explode easily and litter the sim room with body parts, best left out. @@ -29,7 +32,7 @@ /datum/simulator/proc/start_watching(mob/living/user) - if(looking_at_simulation) + if(user in users_in_sim) to_chat(user, SPAN_WARNING("You are already looking at the simulation.")) return if(!sim_camera) @@ -41,13 +44,15 @@ to_chat(user, SPAN_WARNING("You're too busy looking at something else.")) return user.reset_view(sim_camera) - looking_at_simulation = TRUE + users_in_sim += user /datum/simulator/proc/stop_watching(mob/living/user) + if(!(user in users_in_sim)) + return user.unset_interaction() user.reset_view(null) user.cameraFollow = null - looking_at_simulation = FALSE + users_in_sim -= user /datum/simulator/proc/sim_turf_garbage_collection() @@ -67,8 +72,8 @@ y:2 | x: 1 2 3 4 ... 16 y:1 | x: 1 2 3 4 ... 16 */ - for (var/y_pos in 1 to grid_clearing_size)// outer y - for (var/x_pos in 1 to grid_clearing_size) // inner x + for (var/y_pos in 1 to GRID_CLEARING_SIZE)// outer y + for (var/x_pos in 1 to GRID_CLEARING_SIZE) // inner x var/turf/current_grid = locate(sim_grid_start_pos.x + x_pos,sim_grid_start_pos.y + y_pos,sim_grid_start_pos.z) current_grid.empty(/turf/open/floor/engine) @@ -101,3 +106,4 @@ addtimer(CALLBACK(src, PROC_REF(sim_turf_garbage_collection)), 30 SECONDS, TIMER_STOPPABLE) +#undef GRID_CLEARING_SIZE diff --git a/tgui/packages/tgui/interfaces/CasSim.tsx b/tgui/packages/tgui/interfaces/CasSim.tsx index b81e1baafe9c..ba5990bd81ce 100644 --- a/tgui/packages/tgui/interfaces/CasSim.tsx +++ b/tgui/packages/tgui/interfaces/CasSim.tsx @@ -1,4 +1,4 @@ -import { useBackend } from '../backend'; +import { useBackend, useLocalState } from '../backend'; import { Box, Button, Section, ProgressBar, NoticeBox, Stack } from '../components'; interface CasSimData { @@ -12,6 +12,11 @@ interface CasSimData { export const CasSim = (_props, context) => { const { act, data } = useBackend(context); + const [simulationView, setSimulationView] = useLocalState( + context, + 'simulation_view', + false + ); const timeLeft = data.nextdetonationtime - data.worldtime; const timeLeftPct = timeLeft / data.detonation_cooldown; @@ -48,13 +53,16 @@ export const CasSim = (_props, context) => {
- {(!data.looking && ( + {(!simulationView && (