From 9383e8f7cf2beac6ad5fd65df084c094344bf2af Mon Sep 17 00:00:00 2001 From: fira Date: Fri, 22 Dec 2023 22:07:20 +0100 Subject: [PATCH 01/37] 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 02/37] 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 03/37] 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 04/37] 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 05/37] 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 06/37] 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 07/37] 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 08/37] 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 09/37] 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 10/37] 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 zcmeFZbyQVP+b}%m&?z7-ap+dM<4_WU(ka~~2uKPX8Ubk#0TECdq&o#AL>dG{N)b>} zK#@G(Mt}GH-Osb$wccl~_x}c@nQLm#6?0v4&EDK`aL@&C@K11h)6{pFv=nwG zfHA;)+&!(Gye^ zL_m<_5@_WN0j)i)?%B#XdAYl>Loge6HxDasCu>)`zXe`@N}y6v=qCvEFW}}OEPx5s zRP~h+_yyfHd^GL6t<>(>yUPSJ+gf>BF-rzATX}dG{2h#0l376DI{$TkW?p6+M*%3S ztE~AaEeNF@+}#~q?Vzlkt&_K&zlR+JyG&j}{5;$}{|)<-fuQc5P7Y4@tXwTFYkB{d z2JT)^V_!RKsFsJPyX^xTZz%8MWb?rLFVM%y*3Mnc76OV|8_7HCS@CIm8QZEW-7|I% z@KV-kw(8b~2*; zf5Ig-+^qcmfcP)*>uqP@t)NfE@N%{al_46vk zG6DxWjurz$OH{}MV=hx)DpbY-Vp^coPDe3q;1C4!LI~SZ0DuWlT)0`D%L?B+ju>dx zNVRFX`!7?GkNDGQB4yG)nrt$qep2`@v(A7^WQ+wdAwc3XMUd;LGDZF?;wsFvj^!%K zw0_4`Oy~7ppdS%VEV=PARZ9Vn>!p@Dcj?PC9d*7BCSE%oI1668^1l%gBnnU`|BC+1 z0|7k?1hoAFyzKdJe}AWi04N9%KrNYksD^HMoNo9B-6$!WHW}NvAm5~ph^~-~zMk^5 zp1z^JnVGNKw2#|#hTDw6pM-&%aiiP(f4%-p9RUM*ED|X!Tq(?4DPP1>Fe9QW;K240 zC3&2&U&IquRTJ2pQtbUR93EwrJk8oD&Bgyy1;C&xmtom2cHJ+*!9V3soK@_URrEi- zkd6b~014r;|32N{OU08F=MRPl07O%y4r{+BuZov&zn8R%w^F~i#$cM>V8dO4e-Qy9 zI~0&td6jjg`%|SyuZoOL3J+h^)E3s9{2yGphal%dY(r_&u8jeEmus<_L01!d)pIpooMQt6!RGj09 z&t38|C6@agXWe_jA>PZVqIX1cv$~f=kx-z1LY-G++Q8;``{jdrF@LB@?i zOGp24%{=%|$$`X%St8+!>VK7-gwNs$ENUsN#wqN7B&YOg?zhr{|0X$kjoEzOk20JdWtFuQxW0R}+4{e|{w+C>z(AL>4y*Eik(_P;Iz>o$YI!ve{?1Wm99kW` zm8t%d0049+5#G97N?5gZ_@;G4rgixA^?Q$13&{nZ~f|o=jh`+Rc@7r z4=LJTS>Mvp#^!|?co9(u$Ed|IS>rRY3uF*W7UfLQ>T=O|>3O*_>BXoKNfzmFVe{ca ze2WY6X#jCQjCBakdJ6-h<7H5r1j7el=-_V-ASZ;o_l1!M(*NZDk8Z4*7{a5M*FU{L z1KlBqLD%1W_r7%ZRhjOq%Kt}${L`53zl{aW2pVYg>OW&aGlB;CzckkWjpzOU`}qGf z1|YVB5ko&pg?uI+I7%D_qFLor5Ncz>C|lz(VMkhxs|aICVWKST$-nCT5*x^Us6d#g z05?haN*1B$IA1#+vb|21M! z0H9zv00pkTL;m}j3XCWL5Kpl&hU^RR6gwC|*%=o=+CHQ35%d4LoBuiVzYPdOaRLwx z4d_8P1W&LrMyBu*SQ>+23`bfdIqb4B{PO9p3A0h+a0=V90TL{*tVKRFA*{VBo>Ayj zFp$i9Yf>rM&M9mCDZB9Sfd*;8x_=Sg=m9iur`UorIHX=6v}0YOUDQ#XmsrbjKph}h zLHCMy##jG>4gUhitg?6ad4~>^w8=Gf_4U)gIA*LrD&Wj2Dl6lL1{(dNqV)C69JBrb zw_cYX{in7WRqncf0cUJcY1u0RZE|JE@PQWa87!z%2vqjH6?qARKxR}if4h9O3IC^3 zx*5u;tgH;uH*h_u!ps9Zn!L*ane!* zAVcT2`nOC7#!+bd9)hLnNM0I0YFvfhP!-6wR@k8PhU|}LUc?G8fc%T?Sl8S9WO{$l zO#!->FUgh55nJS>mQv)OyZ)%C%sJ)dA4qB0zwvol@CQ$xX8&N5ZK%NU61`;vmqw+Y z{!HYhfm>F#+0%H5)|m%Z^AHjtEOkRDgHSkdslIs$0J!4;0C%<3gNW3Enr=wZ!7ue? zga9rVWOEH5UXm!Naz!TnSN4aY^dJC5~KTe z1W`Fl4*6p&O4?d7fQtiBR6a&vgB7ypB1vq<)Km)_sCgo&!?o1aD;qMU*Xbg3Oq}`p zRwdREFQ-i61=wexnG|MN$JI1bDsXc(e6X$JpW_NU;|K6T=QP>>p4|I1F3VR|Lq=Hc0(}$5=EL$ zXP!_dxXS@bQmJ6Z{CiN25aK*yk+ z(7I?Fv^iQ8y4#_B(1y@m463Dtz5(4?06y_$5Y0I2{B=b~o~y~>_tlIu>3&~D`JpBU zW5G;pV_QS3lQ-~?16*l5Ng&HJQuk;FdS?o{mHt~kK)dmT9B zodzBT`ND}47)3I`dVwxZyp14&{E(I9_gDXCbE)rFvyYyk=4)ttmqDN6ko$!}ws+-u zL+DcpQTOZmd%8#Kqxm(sc$xfgIY7?l)?9uEcS7~MMOyv$dl}J4{@-pH_i@6Wl`nhMl~qgV`^y?S+7GgWJn;#cRC z8fq_9Ac~neesi$1xUE`zyxA7K?$IWP4y_6aPB|EQ{m|fx0NPIOS{P}5Yf6AG))Y;L zF;^4KZr1%>KM%>ZPF-IaX5kiE!r65ivF#(B^U01LH$gJdT7PuajT=u7J#G)5-VT0M zlf30yJ{QdQLO*0i%m~miXAk)tH)#nAKECiisy3(l-dj`D#~xYJFm&&}DPH63*1ha2 zuX1khKhuE8)VT!P2cge%k8*2e0^dZ@TzvalB@X+jV&~kZTID6cW93_WKUBZ+W!10+ zUkMd+aIEVmNEE>GLwrsWz zTJBSq-TN7m2l)=U=H}b2r@xlJr)9~nYP{YDfe!3?6hS-lxxPExBU>^#JGQ8uj|Xb4 zBgZFU5xQFu7~+1U9cTP^4n8di9ayl3>_0e)?liPm5_`%YXkT{(G^QV({^C107-W3k z*oD23Wy5~5-@E$0`~4!i17^8P)D65hjZa{i9er%Kr@0R5ven$$c~{BAn?oC}$*Gb8 ztKASaBb_dHch-Rv*w(z|`FYj;xNQ1C!&EW1*EjB^ptEp{a4b=>JQ5f_=xlBnJRf{p zay+a^6})*{2HnS}5|7qAp*7f}asK_}=JfXvT(Eo#pk7lB72S1Bs3&4YL6{^t$3(7< z%#gym4-Zx1T4rpCqu+(RF11*CwHVFai$EdBx)w*DS2Yf|nVnN}}xrb*>zUwj~`=_ zTqKXHG}?ljXH`M*%Z{dI6+c+Yx-4i0Q!vSvGJoVo3w}9lGW8Pq9r&~<+Fbi_ey=}f z-Z4xzlgQ(MSgGAaz(erJZ*{-^;*}63?mX97OJB1qSJ7g}ViHR)Fv=Gcr5aF*)?m2NSe36(KFJxr-R#hSRS9K(c%CS(&Q{)0<# zSXk$shvQptJSu4k$!Naks)Xc*&^|~S3&3mPF?Yf-_s3)-)2q5DHaOqX)8zf$Gvcsd zd_`zOj*6tsP_LRuf9{g6)N{7@x#s69&vA;zF>{HZN-LyQTAHy>viO>V-&vEiSq%9< z<>V_R)cW-MYyTG8(0T~%uChKq?}!Lb@kqZZ|L|sk@f*G0%DPt;8@HOvLos1#B&;`j z?_Ep816V(_EM4%dJ_|==B(p-=D&eF3%;S8=cmyGNb&sR1*Nr&s410!>c*}GIL|$lVCSp1w~?h;n`QlRV$#k` zeqF9iK`&NK;t{STAAd(8E{1iD@)n<*Y_J)^|M71u%(q|4bj~1u zzU>u&%0m6F&(=nbWQi%Vr43amhqY`97@2br!Xnf?8=_{kCfCwrE2D! zv#qJdYbZ-8Z5=}nmEo#7iCiCRDd(2C!2ZDS=y^!G{e)tfz8S)i9~s2F5YX^msp@R~ zi}Fe`&(ZA2q@H=#aq8|oAV6k(<2q2Bg=55&bx=oHUBmFZU{UM@KnvPPANvLO-sFAL zbDKb$LPKEs`sI-l#8bn$qrPdm>{V5Pxel494{=OWy5hf*Y;~>P;35}2k?5YhR}g2) z6T@9vS{Cg_WV;mN<+SIgG$fN0S_0?i|MI($Y2Y)%_3^kX-TrQ=a|vcv8mu%zzue>4 z2v0jzQ|<+ciDE}!Ud#@Yq{_}5>Y-xptR%*2*iDp^C@;AP8xY?=XE{44S=P%C?WQ3} z@Bc(iY?w@5HK>pI){b0n__PEpAET`{glHT3XdPlZ#JRCD!%{MAm=4{YYP&*kUNN zu17g@bZ$}67JbaIvl&LWs%_u*?ipm^CB-s}+R$>r4G7Eefg@Ffyf8nkKz*PU#mJB( z97JL{g-3|M5q}ODPbi;^-`w2god@erSP$u9%WzMYRkRykn%?X|sNqsxbH%X4+M{tS z?zWu!IETH0DEjRV%1XA~i6R;xWHbYXXH3@4|ah=gESAE?A}g+3+3SuHs?d6>3jbD#{fBK9a_$tIbQ^=!CR zt+_`92IoIE;W}T7$>@R3tDYI9=;v-PSPNq$G3^GeraC;#?4h=j=rP!?aT7Q}=rFO= z-S9uFcq&?IX&ZcGb4n&nnr_TBY&>{zRC)U4eAA}Ur`fB)-4sdp{0P=a-so zliv!LF_F!vh@ve>?+QBHue~0WIaVoXem?asC~W`Tnh0ij3b6_2b;8vnAB5ce2ZExj zAJ5u<)XG2CCy3p|cDTViTKeFE3Mq~v%o9W%?dViI)=sYJe+eUnrDS0765RLA$i}Gj zeVUQcHjfQZ6P+UKU*pGBw||vP*OeXHpHc{hQgAZLA__pvYdKr!v=Rv{NrERi2KJx7 z6@R8SjBeGDq`!6*lX3vF32tQ@3d79~3C3e(Sh+EjkN&t65}*9;Eh73klQVHvRatme zL0gi4SKa^(%YqUC>c`Q7`?iJjvd{H{HCS--FppQ45Bti&5>;{YXO6m!VUHK|mS$(_ zTOP#59eyBA1W!=8sPc2_THa_UlXR^;isdZ z51>+h$crsjKi@z4V^&7J8GR($SztD4Tw4-G`y?i2M-1DT=H@FM#^k2Dx>R$YrhaJy z-NnYBnho)h;vh#pe+}AR zx}iDp7QBG=|0+3{+yI$OXJC)zOO}#-P)c z&!hT8A@ss(6;mJSzfZMt_58G|tSsETY+rrHO_R0U2+khM6!l&}8#~HBQ^pon`;cak zv6Bn{CCo`JZSA=*bK2)SSvwzwT9+PPV|_qxr4mC33|Psa4QS@tQ#yj47(Ax zeV?XJ_wI_}8^)35&rez~qrLYr{Z#fHB0>~oCex)dqnQa~vj~wSTBKik-`jg% z-1!7(8h$+&-0v>Um%L_cqd@3qDInKwY@n<>EOhY>5=&@9;dmH94t`88Zi-I~v-G0W z!LiTbFmX>eEEb!o77Sn)r0h_37$8Zi4MXYhdPow5qStLq57A_(yd^SGRRpQwRbGH# zTx2PWV$T1(wg?A%7ad`=WuQ9*Yt0{WBNRD3?A8Mp8x7qX*dBL!RN~!V2NkGy#k{M= zQW48rVtLrNM|mP$wuSKtnF8BQ7g}{mywiGJi}Tqs?n~I*j`g9QgBSe(?24GAUO2S0 z-}=Vez^?5!I~O0U*lzVjVp!j-x4r-PM0A^8YRP=O2xqj0!X;L1r?A8Ax@P%7T+nmh z4yjh%5!z9FZ$6;KRAl!~@H-|+upXg^xX?8@W`}PQ%xJb?r~Et&9kxM&HALgh#agwd z3Gboyj;Fh0NkAlZXa+e}&?@z`mFL;fgLTi^>m23{sJmWurNj$7>8$1%KOWiA0%s00 zjh~j>oieubM?<`j66(|Y9AqY?#r00K6A ze05^Zrhd3JzHUsj`&APg+b*Vj_=wBd_4P1;+RWN!h=@4 zy~|uKxMDeV$~m6Ba?=;#MXBm>pFyaW%6jSM_11l4+3VnJg5bWrxUVY`f=(}?<(5RB zzC~f>aGg9o_#|SgN4A&UG-`Wc+&|s4s@TP~a?se@TK-gY(A4SXe_zUr>5sBN@E66kjKxzw{S_0S}A2#5+ zV(K?L7Sc-Fn`oWqmAsybDdUXv8`E&)0FN2G6V;Stp-r- zO>v;RG0g97#ucEC1>!>{0)>QO1HZl*=rM^SVz7y^I=R-q?Ocno=y4A|-(=DA*Ane# zH4nm|irzPcZ}rIa#}hs(B#H?dD)k)CbCIJexhYJh3NiLrIS1cHjvo7GtWp)O_S>Qc zZxAeX&kVMOXKkisDV(2;NYmUD{Ep1_uV*>56XYc>1@m=&4x!As+wcV>BH@*l% zXo@-xthJO?fpa?R?fXa1mbSMFoDg=mi@mo!#Vc`*`xN?;F!Nvcp_0EJh%kr@Hh(=F zHF{c9QX$sr5Y;T1HU$baVr*f|%y4IWTdDaB1T=9=p_981OJOl*4L|-sP4m=nik$qa zp7PXX84sZr$;a27de=j2m<#e^)LRU8Ve~<%fQ6j-i&5)qdy#ST!I)>$?^VbE3Pn`V z?LeBhmtJC>$1S=|w9|3FO9_vgv%CKktD21Yi+4sAUXc@nJ>Ibx(d793g9 zy^R@lrsCU`vG0_)4u4CtYiNymD`YTa)5d+H%A}M3WB8)6&gk6H1Hw+}%1&v8x2*}` zX+->>qUjFyji01w$*J1(UzI_6V{yUhdQ#$3$hqGO&t{dds{zdDrk~wgM2VzKNoQy0 zNYJwx12fCz2y!!_!-J!P6TdcuiCwIEZ_N0y0zUE$#{8QEC07Vd@~ko1(7_jIjM3eu zc&ngPWBt)76Q5laAHwbnWN2732pYxF+kxSx!KfJ`m_X+}vA(r~rD6~A*JN)DXcj;V?1`7K;ZV#+d!49zF{;04umYB>IS<3u5Tx1Ac|!*}}8>UJ~0#QY#eZ-B0NR6vqgBY1A$= z%JcXlyZ|E4v9Uf@^Qj21EMUitipgV9*;P=ab7hLBc$C$Q7sH2847FGQ8k4YKytQu| z^s}-&NKCU5hk?$C)S+rNc1FZ*r6s91(^hsa?@!B|dewMoiA{Bv>Z_#3d}&h1OA+#; znf7k950jr$jfw9(k9=wJr2mm!X39q_kDB*_?32_ZrVW7)Lf)D~8{k^i`ZVKhs`+cD zUUiFx{hgMFIk7a@r5ih~3(7j5%vMIf9`4Q6cKj^KoUAAcwqSK0{<*ndD^Z#>@;U%= z3@4D37s_{g2l@FOS;(?o$$-N_Ew%>TEoIta_C~wlgVAj)D@WEGTt^nb;~!RLeT%Q( z+C(zy#UCw3?v3$w_5^0#9%gypHSaE(dwDct{U}qnRW^C-VfR=@UNBNGxpyeF>T%or zm+e4#eVCrS9TCY3qmEKrKYFXv0`7jR&vn?;EG)MeBd2k}Jvx9iV*mZ2l+Z!#KI~WD zo0Xh#oS-nOxZ z&h2nk@+4C2!X5b_MX)zH7?q!(`hqCE>@Y50=dF&|1Uru6;=RZBd4)BlsBgA=Q@;}D z0bolkX(P>%h05`UG#87e?Rl!i&war$MJ*BS;sCZ#t5=lWTD|qNom|SNf-@6suOg*= zr}^8dUV42C*!lWXdK5?J1q|rf>7mMEPTI43L(aY}N{@PvvU8z=H&3SYeIHg>*n~5~%TJByU$)e!Q*B zdH@GTv4~Mn-~n;oz%T0|4CGWZPeGM=c^Pe3!9Ep0TF3#Ca2R#i)d-k4W!W7e49g%d zk}!drhdfuo@%QJ8T~8jm=qo}#4o1|5m??}Ts1o2$QBW%@n!<8%8D5?~cyJp}R&jT4 z>RF~{%~uD!s$aVNNm`>Ur+4}uYdXT7^t*))+K+7Pv~Bd?{>>L(irw1^$y8(Ep|$-d znzpRWtPN2P4PyX)O>ViXK{l=G-5%#Oc0xsSL;`ZIEmuw3{)KK}hAJsTfb(vrv@=4+^I zRNd$jPsn-Twlhkf_{7!cHgS%4#aFp=|2d1|C-;q2h7r7wf!)}Ob@R;_-HWC+_Ap0D zT5ZJ!7#M4uvA&W>XrR2i>3+lwN0k8Jf3{EX^!(?E)u*m8(AV?fiZ#4|I|j~Or9`1j zNEliKRz>)eG(|z#l_~O7Rf`MDcQO<^i|9T**f`EWl)4HtAH4cLF1$;~YZfy}VF{#k z-z7sB<5Q%6fz}e>M*;7JBjBG-PjcZWl+-=DeS)ZWE9?CzXjck?aT!3{weGh1CHTo! zdt-=S3N=GmIl;1=J|fSicF9JXzh3LMGD6Y*gbY}gmnDBTtM^Y_yIq3+P#E(3jeY1~ zf5DaMqcYXjug1RV*W+U21q1dWZAKf76xtDecn?T@&z@|&7%H7Fs=X1u!ED&(kigF9 zP^Yj-m-nq@2{#2B>=NA%u5_?C{rFn4b6UE$@?<9Qih1rj@7E^_FFMw{e2>OwRtgc$eY8k{okC#yi#jqg0Te zb+WhM0*u5{K{av`O*RBEb<&MmUBuR2{1(&Z5 z%x)5}$H2heLeHJuki|mHo`AcyX3uR~it&&1{D@E&YfaEvgN&`pmu7TrY#n81P-j=_ z%P7>!fHj9u^8(~aJvIvC(rXWv`$9F60b=hYy(FfjlwgJf1mhVTdUpL9`EC+18(B4R zno867=A`AzMnjdPMS-m9Z%iFd4H@)$f=At>EdPZXD-xHl)EiEPZ2quC6j7{WfjXGHN3o& zQ?~kD6;NSensot_{3;4u~e)Fj9_%K*;^?G_xK^~8*elhsngPe-n?9Y>|>XSq@m z4l=PO4ZqKhlI~0%5I%#no8R?`fZqwdmt2TBDCP0NRf80D3h#art>Wn;lwcR2&L`^p zg_7F1&j1TkTYuGMTnSRB4G$KSzvHVx4ydvX9xTjsoHAz5;}Z{-Cn1#D9eSZh&Ux@| zoRwD)MYZ%xX?CoNFmUmBw@C1=ZD8XXr$7hIUBr}N3J!Wzfhy<6ZPjih(7o6UKx$}V zEuZcmF+U9HU4*uITUZ-$OBn0Sle0oY%;Ff7VyNIpU04ZNZN7sr-DstotTa_w6gYF? zfG2z0MzT%rXsy@40uu$Iei+?v-^D(^mUT)w^gAT)n&>{m0 zhroz>-_(P)BW=uXlzzf39cJH&LMXL- zaAX7siz1zr1&JAJfVtmuCibCS#66?b!D&E>o`Y`QGkvjc3 zUW?9Rp3on*zV&ohc7_~M3y-1$S`ogBTreax%I-Dp&9W6k>ME+E#^`OjZQUcWOrbf4 zBP|E?qRSz@lEJr#_jgg~yRGja6As$!dr<9&!;o;ic{{qsc}8U$8`DtMSyxKMcuCn% zih(6Xfb@661trX=$4HV}*t{%EbQom;$L3mC03k`ov;tpDDE!^txh`|>uuv?lqTa^d z2qG>4r6X=W~K*l_l9|w z@nxE}_*d8*i|-4JK9w2_`1Z<5EV|IV?EBE*`pP1Q3jp@TK%IDNR%qt^&+@pcL}C4- zs$&NOft*mTC6c38a_z0_?zZta z&bK?!m+rO0$3~d7@~p1UDx39t93ZWqG*~L8>0*;f&!6&E-r?pQ@;%3b@Ab*zhg&9v zuO*7a*f?U|%KX?xWET2qQ9dc;<&Ym_pL2CxoF~o}No`eCyQi)x;#eWm()gx)(B__~ z9)+20@ajMu-?MUkVxbwacq|b`I5k;;-5|$Ec&FR#gdHAx>Ic90Pjwu;wo>1BgjD*_ zKis(ufRN@?DVgsbxvle-T)L9p9d3Qdi3gId8O*-5OoX(zUlUGDyTBX4VdK{s#EqXS z--Khbs>PBdsxad#C_vil{Bn^gVE5cjeH_;2`puL~6|RN~I&DZM1jzT-8D2o|eJlmP zE@(5|BygXW$+Q=ShlT=;Q};fa1NcBU{T#N+H-Jo2=z5q3KcNyJ(q$us4!r5R>nH|f z)UI@$>vIQb6aOC1wy7i7@ZH-x?Q$I0Z;CFIk12jMNzB3uYnhQ=??jdnyzF}kFT_4> zh8BEhS@RDMH>VRFeWW)dO?H3T_xCuy`j*Y|=Dqc7W1zGbW!!tRr?Ikel~*1y1d*DD z1_!)sR!yCopqI}WB)*0RK4reEf(`%7v`#obfxA{Ag;v`wx@NgJqgdLHC6EQv)2N zzRG$c*C}-1d>P~#&*p{>^N5{_+@EyxVOJ}VN-Bj>LqZM2aqYYd&T|YY5tAdCdIv1`QnXRLQegwmCsGp*`jZ8BegT&;_mU?74N_8B>0Bv<;iHK%dLowVPI^c5m?;n5&m~&TTH2Nv&Pyoer%a!%Yb?IrQ8?FK-^JTfC%Xj>L-SMZ^9SkK<)_-D2R #1VwdxmtvU^yF3(rG<#V7Pi`kzn}Z{4jPt>9nyVmjj>DSR#WNJHX2 zXpPH#4MoKV6uu|KwSa?oI)`679rCP4K^n_97#S0(B+a15Eo)aPR-f$6-Gk19?#Odr zy~Hx=JkfU=WSW=d&)g6>( z>j}XO4OT$joSw13X6nHPpYMLHoSR90M)#Ui*s}MA_~4VPa9~K#?FJB=ZCn0e8Nm)Q zTxZciI=tkpE#{#XhI!@!82OCNDvQ-c)R_MJh}`+0B$h+#Y=yLurYuIzi)rOb zl{Ez{6>05=PJ)-P$S;HwlwL1LsQPVSKG1^Q5)0o^YmDgilNu2^K|3C&J-q76z>pml zQ&1jfc=JTuST@&3!gs;guj}|**(AT<2T$nhNYt6v$6=WIm(62;&>gUC-doQY_EPBU zQ=1W!K%q4unreG2Uyiu>>j4(#pJoGy_td|*Ufi$OZizEb)4~H$&4{K$j)Uob6?bv- zZJ`D-)di|;AD>^9x-(U$#vFA_!H3Xk!p2K^!KKN2>K4Zx5}(-sVHvzNfI+VRL+FuP zuiaBTg7VV?Xf^fVy?-l`e#lJ%k((mzJD}89~kK2!tW?+QovvbO(!gQ zW!$^k5nwiyZs{7Xt1@AL0b~x7q+ium@DBa;f_lsmpTW7?n(| z*JCzBZmewGr)o0mwYv>wsvFE#@ET&t6hsCr04SkNT?-=Ds8_YwSBTPITV}hOdGjU4 z@5fXP07w(@1)9F#h+rUULoe7OQGS)JGeM+5*6AIU_qaa42k|2r)uDp(6@toinX<)ntV6At zIhiBb{h{)Op_x=(|Ko3cI!=(w=#!=^<~U1d(CJ3E zQ_NlB6A|fqN$yJ-z%;7?7P)iJe+?hxdA+y}R6|_JIdQ8@`>By+fEg3)iP6Z$&|_2i zB6iO%u~YI&^#YD z+eYYl_gj@dtJjKEOzo8(hql+h`}cy{k54Ly8}Ko_-zG(8u{>LSx!B22HQ~lwCo~wf>G$2Oj)86| z@rpZf$phhnRJJ%wRN)p(8KXR-hyPY1ktqDeIYoBDx9sN^+wL>{ap+%(Dvx$&A>JHo zB`4|4aC+ zMvu4^a<+l`4k786=fMQli;BePvjzk{=niEYJGs&tX!cEQxzxd1V5s&AD3OY%!4~(P z;v|g6M3S#0bR(?39d93Hv%)}U^g@zR1@b6*dbe0|=0SP@ZaXmxB~{YtXMCw? z42wQ0x0B>o;gvVwK#w9?=9C_P1Ev;;^XOqmge3#C$3ztAjK;Ckl~0#xWAiENdGq`B z-TMw%DG1i!8zJb2RW5aJ`rH>6RK9%G3H1J0^5RPUyMn@1!Z2~&pYIein{V%yJiM*Z?K=F}Z+)2C7eV^|I%L*x~ z+%smSdk8ZooK7>~r?C;CtRH8A7`%k4aM}o&77?5{Pl4w zJ%v<+AQ@V(PQ22a{eF%n?ye~aB|dO4>f+_yk7obyNzuk=_?xnpW~KkVfM=#=QFPXZ z<5p9IKs8LS-ODJwux;~2QPzcIWqv_0ev$u(rl;`p&4Y9KS2kK?YP`aHWwsQ8TZ&4m z=5T&!r!z=tA9z+~+*xDBMr79yw>B|)H@3KVFmuHD#yJv6<(#Zf_z91$+y+8tl5gp= z#!uH!ZU9EgN;j(-TZs(B1LLXLMULhMfeRAJvoyGsc|846WQ&ocKKU@z?i)i4qasPS zh$~15Vw?zTV;5=VJKm2;RjnL>c?mscIac*~!I5cs5%+WQd(rv5SckzIXR>A53nYmg z9D=bJr0_Qy4%kzfTdsQ2SA@e9DG=96>3aL05lMT+LEoOZCWJFC{c;ZRFlzNv)BVmg zNAFoZ@vb;XZFTH-4s|-0=5WTWOPBUdshaknx|ACq)t-Xb&?C7e&FEr!M#)nxk~Lh! z*$}tXBH|g|=TY}C^Bxfn7|LWhz5S;mhJpSP&yU;02A=sXOLR6J?k>xRpP$RNpe1U# zV5ml0;|R=w2nz99$bZWVDpoRPrX}6SLLYyv{^5I|AqW7p69Ja3V#7g4&vP9j-rF#QmC(^0!VjbZC8Vcu0~d>qkr_A!H(C9tNDe=1dsDco)a zzGgBCm@!J0!7|GQkE$W2BRg|AD_MZ%%=NuTw2$q=2EAObzZWR=DehNQw$~fpr(NX+U`jO0>tz_e$!&|Q z-H9K4mc|cWnP#&&=8AH&P1Jm+c8QN;8vQg=$;W_M%Y7H?cGdght(2?w=!>xc0`AIE z#jLUiykt#lJMCwN-GsRd#^^g9=uX3tf=?SisTZ3t1uq7}9!OAeM8<2scZ{bd!v^G6 z;hcFv-(zfTC@6%WH!=isWG}=+8Ri8!$iGXv%j&@%t0AO;)EfpZ?9&`%Ag;C-t4O9Q+5)oaLy7 z8-0UzpuHV^IP}5$Ls*Nsc`atdTWJ-pcVBNk|E3-&F>FGSCUL@^JfPtUPGszpaTVxj zc|JQ5Vgbu*&|8ZG);EkyKF%6t6;MZAZg|o<(G^5l0TItczuMb6ki%aX$-klQ!nW6- zK+Gk6P}M=ti{6w+V4Sc=m&1^uHa25ROP|=T1#K@L3tjrZdnhd3`*~dZ9RMn%G!pB( zDic{_ye}!pB=A5H$tyvgki6>f!WxlKCnXRZL(lvn_`GE!NOVep&KalqE&X1LQ4ejU z9ziW8op>B2wao+tJB58Qo8B$qq}Te83u)3xppMxj(KyE4E4vM;G-+X*hs(UHdm!~BbpgD&Gup$0qcitFU}nZ5 z9Vf%!>~`(fpU;u&Uf=Job|hHQb1_jA^4PnGi}p%TZunvIM%LO;_aF#aGHTpdaR41L z?~vfib$e9=0K{|)uAo{`xCa|`@FXNCX5*$8Zy(dQ?q{k~`B+5`?x-&4-8`ZPV!qB( zg8H9-4*mGOJh!IOizmclUuQJ2_56JPhq6qW|K>YWsk@BdSQdm{`lx9|sN*Hd} zn)U2Xqh{j$uq<13o^1qI=~|GF+3)SNh> zUyDtq9l!*6Ull5C`ZE@sdg>$Z$2*d|!_2q7*>lD@06^@{+%+R;=6fCN(kL2#72G^P zo@AHqbR(aX_7yx($njn<JB=jL-QszfCpK7kY14_QsZ-#2<_b{vQ>FW=>th+}9;1BMB-z1R~_hg-WS?m=^Bjt#Dvad7&>`9UIN_IpKT#brqwPMn*h* z|F6iN$ya#h2c1N>zYt`s&GV;6W*hB$*flW51&dj zk`FNo7bKak1gUu>=m{zQBt&71DMw&Yc_BH%Ke-yijzWIF>8FHn)hRYSf8c-I81%zM z>DIXTlfcQ>9uhY$9_$G`^>QY5#B+RBj@3t(-W2iPeuyXbdkOgpixJWaoZ8y%j(7&zcb;e9j@0 zCnTKfFLBmN)<(lO1vv&Kc!RAgFHYFX_wvKm*rTnp)Wy#_7v!&jn0SDsme0J3bR-;0 zn#Ca5BB`)2FnEDaQg`0?Ysvd6HZWSOP}MT9yxe?*T%a-P5lKKl*0mQ~oDc&t0bvm^ z<7^uvJdgJDo64{!>)1rEV_my>%Xy6(4UDa-@$FYAfLorX(Z|n0kQ)TGEpxiNBq#_5 zMh>Y$RYuO@d9F6=>C&-2ZD@L;0WyecnVI50P;|0Z-Xq^zfQWM8`?74vDD+NO`pciw zjM?FfOpkJg`03+D_0n|ZR2F6gVz-Tp*y$NoMhM;z%U?kM_Tv1UET+O(sJyVSaKQ#o zSA&18Bc1D78y}8KhD+_o`PrHY8e>5dy-#x$CKxkC>_+SOpR{gu${pcMeqa?*YH&G` z-XSnxcIoJhU(%X$=jgzG_0sXi%-TG3)(-_oKo@}v;&a+w^%PB}!%(LU zCm1(qD?MZ_FGNJm-4%b63Xy=l* zdktk3fUxKg#RB9Yv>43`fIgE1&g!=Px7wWg8R2>KE+e!G<~mF@EBTRz7_+CZ>cngb zVrQMT%`A`IvbeW_!OJ0I8DGHYTBBMJ=fU%M&o9&xvNpv!4XId!WexN_Q#Dy1Pg(aE z6_Cr-`RP@CP}jz36H}nLk<9)=zqzNImQXggz{LOD$x$sL4(^%dR~!9fW?}er2AR9_ zy>ned{MNL8s)Pm{`kdzf3GM$q1W?0%+T-P-ry()j*$bbPpCuD4v%! zT0wir`sHF({Mxu!7y-xvuLwq4d@i8}ZD`Ymk02`Y6#xLal;G@uzElVE2fM&#dG&aJ zg{Q~1s%m!Q0A?|Bs383Y0A81z#TYA>ba|y-lQXNv#w9x*qh{haed#<=UhV&8FBH`x zA)uYi!C|Z7>?l;C2p$gr0002OGDnT3VMves;YRSM&6(;}8?P&GX#`Fevd7h#{#W@W9*eb?QItjl$Jz3zQ>S9|E( z4JDUw5bu+=jJz96E7lxv5SKLVrISM%vH;HS-&9%#WD;mcAPZpx08r4^Z*w*Pu+Qi09+W8)3;hF$nk*u}IvX1>|E9rJm zevYn={-+05k)P>wPV|03^FBkb%iK}bTF+A^_N-g6Bn2c|c$zdp15{kX`=(t^sb&&jjTE?{~91@wAZ z33-3McCpX2!n_249|sVSWq4(nSAb^)P)`_H003aUEOx~nyZIC_s{jB1plG0|00000 z9+v#~C~vv|4iJ|7_b6|=01kiz2H6b5@D~6800000000000I&d1o%9qM005`}w%Hs# u!Wskr{fFV>1cm|tAa!Z#9|v&1|H?TV0000E4h{|u4h{|u4h{|u4h{|-^A1S> 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 11/37] 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 12/37] 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 13/37] 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 14/37] 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 15/37] 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 16/37] 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 17/37] 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 18/37] 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 19/37] 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 20/37] 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 21/37] 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 22/37] 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 23/37] 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 24/37] 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 25/37] 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 26/37] 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) + } + /> + + +