Skip to content

Commit

Permalink
Pried dropship's hatches cannot be locked again (#5808)
Browse files Browse the repository at this point in the history
# About the pull request
<!-- Remove this text and explain what the purpose of your PR is.

Mention if you have tested your changes. If you changed a map, make sure
you used the mapmerge tool.
If this is an Issue Correction, you can type "Fixes Issue #169420" to
link the PR to the corresponding Issue number #169420.

Remember: something that is self-evident to you might not be to others.
Explain your rationale fully, even if you feel it goes without saying.
-->
#5015 this PR allowed a lot
better control of the doors for POs, but as it turned out Queen cannot
disable door control from the outside anymore. So it led to dropships to
be basically unenterable if PO controls the cockpit. Now pried open
hatch cannot be remotely locked anymore. Engineer can fix the door by
multitooling.

# Explain why it's good for the game
Xenos can assault dropships again.

# Testing Photographs and Procedure

<details>
<summary>Screenshots & Videos</summary>


![2024-02-25_21-02-58](https://github.com/cmss13-devs/cmss13/assets/115417687/5f38c206-e26c-43fe-b247-cb2dd407797a)

</details>


# Changelog
:cl: ihatethisengine
balance: Pried open dropship hatches cannot be remotely locked anymore
/:cl:

---------

Co-authored-by: Drathek <[email protected]>
  • Loading branch information
ihatethisengine and Drulikar authored Feb 27, 2024
1 parent d819ed4 commit 5f5f15f
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 17 deletions.
5 changes: 5 additions & 0 deletions code/__DEFINES/dropships.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,8 @@
#define DROPSHIP_MIN_AUTO_DELAY 10 SECONDS
#define DROPSHIP_AUTO_RETRY_COOLDOWN 20 SECONDS
#define DROPSHIP_MEDEVAC_COOLDOWN 20 SECONDS

//Hatches states
#define SHUTTLE_DOOR_BROKEN -1
#define SHUTTLE_DOOR_UNLOCKED 0
#define SHUTTLE_DOOR_LOCKED 1
48 changes: 48 additions & 0 deletions code/game/machinery/doors/multi_tile.dm
Original file line number Diff line number Diff line change
Expand Up @@ -241,10 +241,43 @@
no_panel = 1
not_weldable = 1
var/queen_pryable = TRUE
var/obj/docking_port/mobile/marine_dropship/linked_dropship


/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ex_act(severity)
return

/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/attackby(obj/item/item, mob/user)
if(HAS_TRAIT(item, TRAIT_TOOL_MULTITOOL))
var/direction
switch(id)
if("starboard_door")
direction = "starboard"
if("port_door")
direction = "port"
if("aft_door")
direction = "aft"
if(!linked_dropship || !linked_dropship.door_control.door_controllers[direction])
return ..()
var/datum/door_controller/single/control = linked_dropship.door_control.door_controllers[direction]
if (control.status != SHUTTLE_DOOR_BROKEN)
return ..()
if(!skillcheck(user, SKILL_ENGINEER, SKILL_ENGINEER_ENGI))
to_chat(user, SPAN_WARNING("You don't seem to understand how to restore a remote connection to [src]."))
return
if(user.action_busy)
return

to_chat(user, SPAN_WARNING("You begin to restore the remote connection to [src]."))
if(!do_after(user, 5 SECONDS, INTERRUPT_ALL, BUSY_ICON_BUILD))
to_chat(user, SPAN_WARNING("You fail to restore a remote connection to [src]."))
return
unlock(TRUE)
close(FALSE)
control.status = SHUTTLE_DOOR_UNLOCKED
to_chat(user, SPAN_WARNING("You successfully restored the remote connection to [src]."))
return
..()

/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/unlock()
if(is_reserved_level(z))
Expand All @@ -261,11 +294,26 @@
if(!locked)
return ..()

if(xeno.action_busy)
return

to_chat(xeno, SPAN_NOTICE("You try and force the doors open"))
if(do_after(xeno, 3 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE))
unlock(TRUE)
open(1)
lock(TRUE)
var/direction
switch(id)
if("starboard_door")
direction = "starboard"
if("port_door")
direction = "port"
if("aft_door")
direction = "aft"
if(linked_dropship && linked_dropship.door_control.door_controllers[direction])
var/datum/door_controller/single/control = linked_dropship.door_control.door_controllers[direction]
control.status = SHUTTLE_DOOR_BROKEN


/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds1
name = "\improper Alamo cargo door"
Expand Down
2 changes: 1 addition & 1 deletion code/modules/shuttle/computers/escape_pod_computer.dm
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
.["docking_status"] = STATE_LAUNCHED
var/obj/structure/machinery/door/door = shuttle.door_handler.doors[1]
.["door_state"] = door.density
.["door_lock"] = shuttle.door_handler.is_locked
.["door_lock"] = shuttle.door_handler.status == SHUTTLE_DOOR_LOCKED
.["can_delay"] = TRUE//launch_status[2]
.["launch_without_evac"] = launch_without_evac

Expand Down
28 changes: 17 additions & 11 deletions code/modules/shuttle/helpers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
if(!door_controllers[direction])
var/datum/door_controller/single/new_controller = new()
new_controller.label = label
new_controller.is_locked = FALSE
new_controller.status = SHUTTLE_DOOR_UNLOCKED
door_controllers[direction] = new_controller

var/datum/door_controller/single/controller = door_controllers[direction]
Expand All @@ -29,12 +29,12 @@
if(direction == "all")
for(var/i in door_controllers)
var/datum/door_controller/single/control = door_controllers[i]
if(!control.is_locked)
if(control.status != SHUTTLE_DOOR_LOCKED)
return FALSE
return TRUE
if(door_controllers[direction])
var/datum/door_controller/single/single_controller = door_controllers[direction]
return single_controller.is_locked
return single_controller.status == SHUTTLE_DOOR_LOCKED
else
WARNING("Direction [direction] does not exist.")
return FALSE
Expand All @@ -60,9 +60,9 @@

for(var/direction in door_controllers)
var/datum/door_controller/single/controller = door_controllers[direction]
var/list/door_data = list("id" = direction, "value" = controller.is_locked)
var/list/door_data = list("id" = direction, "value" = controller.status)
. += list(door_data)
if(!controller.is_locked)
if(controller.status == SHUTTLE_DOOR_UNLOCKED)
all_locked = FALSE

var/list/door_data = list("id" = "all", "value" = all_locked)
Expand All @@ -74,7 +74,7 @@
/datum/door_controller/single
var/label = "dropship"
var/list/doors = list()
var/is_locked = FALSE
var/status = SHUTTLE_DOOR_UNLOCKED

/datum/door_controller/single/Destroy(force, ...)
. = ..()
Expand All @@ -93,23 +93,29 @@
if("close")
INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/structure/machinery/door/airlock, close))
if("force-lock")
if (status == SHUTTLE_DOOR_BROKEN)
continue
INVOKE_ASYNC(src, PROC_REF(lockdown_door), door)
is_locked = TRUE
status = SHUTTLE_DOOR_LOCKED
if("lock")
INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/structure/machinery/door/airlock, lock))
is_locked = TRUE
if (status != SHUTTLE_DOOR_BROKEN)
status = SHUTTLE_DOOR_LOCKED
if("unlock")
INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/structure/machinery/door/airlock, unlock))
is_locked = FALSE
if (status != SHUTTLE_DOOR_BROKEN)
status = SHUTTLE_DOOR_UNLOCKED
if("force-lock-launch")
if(asynchronous)
INVOKE_ASYNC(src, PROC_REF(lockdown_door_launch), door)
else
lockdown_door_launch(door)
is_locked = TRUE
if (status != SHUTTLE_DOOR_BROKEN)
status = SHUTTLE_DOOR_LOCKED
if("force-unlock")
INVOKE_ASYNC(src, PROC_REF(force_lock_open_door), door)
is_locked = FALSE
if (status != SHUTTLE_DOOR_BROKEN)
status = SHUTTLE_DOOR_UNLOCKED
else
CRASH("Unknown door command [action]")

Expand Down
3 changes: 3 additions & 0 deletions code/modules/shuttle/shuttles/dropship.dm
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@
door_control.add_door(air, "port")
if("aft_door")
door_control.add_door(air, "aft")
var/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/hatch = air
if(istype(hatch))
hatch.linked_dropship = src

RegisterSignal(src, COMSIG_DROPSHIP_ADD_EQUIPMENT, PROC_REF(add_equipment))
RegisterSignal(src, COMSIG_DROPSHIP_REMOVE_EQUIPMENT, PROC_REF(remove_equipment))
Expand Down
21 changes: 16 additions & 5 deletions tgui/packages/tgui/interfaces/DropshipFlightControl.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,17 @@ import { Window } from '../layouts';
import { Box, Button, Flex, Icon, ProgressBar, Section, Stack } from '../components';
import { LaunchButton, CancelLaunchButton, DisabledScreen, InFlightCountdown, LaunchCountdown, NavigationProps, ShuttleRecharge, DockingPort } from './NavigationShuttle';

const DoorStatusEnum = {
SHUTTLE_DOOR_BROKEN: -1,
SHUTTLE_DOOR_UNLOCKED: 0,
SHUTTLE_DOOR_LOCKED: 1,
} as const;

type DoorStatusEnums = typeof DoorStatusEnum[keyof typeof DoorStatusEnum];

interface DoorStatus {
id: string;
value: 0 | 1;
value: DoorStatusEnums;
}

interface AutomatedControl {
Expand Down Expand Up @@ -40,7 +48,7 @@ const DropshipDoorControl = () => {
.filter((x) => x.id === 'all')
.map((x) => (
<>
{x.value === 0 && (
{x.value === DoorStatusEnum.SHUTTLE_DOOR_UNLOCKED && (
<Button
disabled={disable_door_controls}
onClick={() =>
Expand All @@ -54,7 +62,7 @@ const DropshipDoorControl = () => {
</Button>
)}

{x.value === 1 && (
{x.value === DoorStatusEnum.SHUTTLE_DOOR_LOCKED && (
<Button
disabled={disable_door_controls}
onClick={() =>
Expand All @@ -77,7 +85,10 @@ const DropshipDoorControl = () => {
return (
<Stack.Item key={x.id}>
<>
{x.value === 0 && (
{x.value === DoorStatusEnum.SHUTTLE_DOOR_BROKEN && (
<Button icon="ban">No response</Button>
)}
{x.value === DoorStatusEnum.SHUTTLE_DOOR_UNLOCKED && (
<Button
onClick={() =>
act('door-control', {
Expand All @@ -89,7 +100,7 @@ const DropshipDoorControl = () => {
Lock {name}
</Button>
)}
{x.value === 1 && (
{x.value === DoorStatusEnum.SHUTTLE_DOOR_LOCKED && (
<Button
disabled={disable_door_controls}
onClick={() =>
Expand Down

0 comments on commit 5f5f15f

Please sign in to comment.