From 2a371a967dac12be533b20e3d3fb94424660358a Mon Sep 17 00:00:00 2001 From: private-tristan <54422837+private-tristan@users.noreply.github.com> Date: Fri, 29 Mar 2024 12:43:15 -0400 Subject: [PATCH] Ports a few Dropship PRs (#154) Haven't heard of any issue about this. Should be good for the game as a general improvement. --- code/__DEFINES/dropships.dm | 5 ++ code/game/machinery/door_control.dm | 2 +- code/game/machinery/doors/airlock_control.dm | 12 +-- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/multi_tile.dm | 78 ++++++++++++++++-- .../shuttle/computers/escape_pod_computer.dm | 2 +- code/modules/shuttle/helpers.dm | 28 ++++--- code/modules/shuttle/shuttles/dropship.dm | 3 + .../obj/structures/doors/dropship1_side2.dmi | Bin 0 -> 2553 bytes .../obj/structures/doors/dropship2_side2.dmi | Bin 0 -> 2116 bytes .../LV522_Chances_Claim.dmm | 44 ++++++++-- maps/shuttles/dropship_alamo.dmm | 31 +++---- maps/shuttles/dropship_cyclone.dmm | 30 +++---- maps/shuttles/dropship_midway.dmm | 34 ++++---- maps/shuttles/dropship_normandy.dmm | 31 +++---- .../tgui/interfaces/DropshipFlightControl.tsx | 12 ++- 16 files changed, 218 insertions(+), 96 deletions(-) create mode 100644 icons/obj/structures/doors/dropship1_side2.dmi create mode 100644 icons/obj/structures/doors/dropship2_side2.dmi diff --git a/code/__DEFINES/dropships.dm b/code/__DEFINES/dropships.dm index f7df570a28..d53e7c68d8 100644 --- a/code/__DEFINES/dropships.dm +++ b/code/__DEFINES/dropships.dm @@ -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 diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 8b73588f1d..5d6c66309d 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -64,7 +64,7 @@ if(is_mainship_level(z)) // on the almayer return - shuttle.control_doors("lock", "all", force=FALSE) + shuttle.control_doors("force-lock", "all", force=FALSE) /obj/structure/machinery/door_control/proc/handle_door() for(var/obj/structure/machinery/door/airlock/D in range(range)) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 57e27cc60d..b20a052d26 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -123,15 +123,15 @@ radio_connection.post_signal(src, signal, range = AIRLOCK_CONTROL_RANGE, filter = RADIO_AIRLOCK) -/obj/structure/machinery/door/airlock/open(surpress_send) +/obj/structure/machinery/door/airlock/open(forced) . = ..() - if(!surpress_send) send_status() + if(!forced) + send_status() - -/obj/structure/machinery/door/airlock/close(surpress_send) +/obj/structure/machinery/door/airlock/close(forced) . = ..() - if(!surpress_send) send_status() - + if(!forced) + send_status() /obj/structure/machinery/door/airlock/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 99353a6688..2e79604e87 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -214,7 +214,7 @@ flick("door_deny", src) return -/obj/structure/machinery/door/proc/open(forced=0) +/obj/structure/machinery/door/proc/open(forced) if(!density) return TRUE if(operating || !loc) diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index cddcfae08c..c60c08dc03 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -241,10 +241,42 @@ 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)) @@ -258,13 +290,32 @@ if(!queen_pryable) return ..() - if(!locked) - return ..() - - to_chat(xeno, SPAN_NOTICE("You try and force the doors open")) + if(xeno.action_busy) + return + + var/direction + switch(id) + if("starboard_door") + direction = "starboard" + if("port_door") + direction = "port" + if("aft_door") + direction = "aft" + var/datum/door_controller/single/control + if(linked_dropship && linked_dropship.door_control.door_controllers[direction]) + control = linked_dropship.door_control.door_controllers[direction] + + if(control && control.status == SHUTTLE_DOOR_BROKEN) + to_chat(xeno, SPAN_NOTICE("The door is already disabled.")) + return + + to_chat(xeno, SPAN_WARNING("You try and force the doors open!")) if(do_after(xeno, 3 SECONDS, INTERRUPT_ALL, BUSY_ICON_HOSTILE)) + if(control) + control.status = SHUTTLE_DOOR_BROKEN unlock(TRUE) open(1) + open(TRUE) lock(TRUE) /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/ds1 @@ -275,6 +326,23 @@ name = "\improper Normandy cargo door" icon = 'icons/obj/structures/doors/dropship2_cargo.dmi' +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside + width = 2 + +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds1 + name = "\improper Alamo crew hatch" + icon = 'icons/obj/structures/doors/dropship1_side2.dmi' + +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds1/midway + name = "\improper Midway crew hatch" + +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2 + name = "\improper Normandy crew hatch" + icon = 'icons/obj/structures/doors/dropship2_side2.dmi' + +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/dropshipside/ds2/cyclone + name = "\improper Cyclone crew hatch" + /obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/upp name = "\improper Akademia Nauk cargo door" icon = 'icons/obj/structures/doors/dropshipupp_cargo.dmi' @@ -329,7 +397,7 @@ continue INVOKE_ASYNC(atom_movable, TYPE_PROC_REF(/atom/movable, throw_atom), projected, 1, SPEED_FAST, null, FALSE) -/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override) +/obj/structure/machinery/door/airlock/multi_tile/almayer/dropshiprear/lifeboat/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock) . = ..() if(istype(port, /obj/docking_port/mobile/crashable/lifeboat)) var/obj/docking_port/mobile/crashable/lifeboat/lifeboat = port diff --git a/code/modules/shuttle/computers/escape_pod_computer.dm b/code/modules/shuttle/computers/escape_pod_computer.dm index ec523747e1..ef2bfad381 100644 --- a/code/modules/shuttle/computers/escape_pod_computer.dm +++ b/code/modules/shuttle/computers/escape_pod_computer.dm @@ -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 diff --git a/code/modules/shuttle/helpers.dm b/code/modules/shuttle/helpers.dm index 6ab5d88da1..cb4082c761 100644 --- a/code/modules/shuttle/helpers.dm +++ b/code/modules/shuttle/helpers.dm @@ -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] @@ -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 @@ -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) @@ -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, ...) . = ..() @@ -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]") diff --git a/code/modules/shuttle/shuttles/dropship.dm b/code/modules/shuttle/shuttles/dropship.dm index 40b50d257f..bd9beefb61 100644 --- a/code/modules/shuttle/shuttles/dropship.dm +++ b/code/modules/shuttle/shuttles/dropship.dm @@ -42,6 +42,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 /obj/docking_port/mobile/marine_dropship/Destroy(force) . = ..() diff --git a/icons/obj/structures/doors/dropship1_side2.dmi b/icons/obj/structures/doors/dropship1_side2.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f2d96e59af5a864e0995e706672a99a6a23c12c8 GIT binary patch literal 2553 zcmX|C3p~^78=swAP6)Y-bCC3DE@4KPB$u|3O+-26dYn**xy>zOE+eKmeRjoeY%b_J>gx`@8Fp>DU^rsTn$sIb>kNP* zvTwB`jL#dtH$I!JYAoL{cc=G`n}(~-Q7fwUDRV6r(fElr+)T08 z6zN*(lUq`BwT}`;NQlT!T*;>5!aF7I4rNcww+AMw+j9|x8cF#a zh`*@26$D%P1E^UoM5VrIe>Mmt(dvM-af>Zmzb75WK*%EfEv^S?y|!x<3fsI@Uq#D5 zs0|8241P$UsX2#96d$>Cx}ks3FtoKaoXlk7O37h|rf$vLo)T^e<^{V+9HA;~CVNJVo(K+WNKCgh8N;1c@-WI>v*($K!45tocVro^xOtTD` zHgkc#a0AngZoD{2G}P<@F4{TRXfYN?cnNjQZW}}uvo+eppMA4Dbjv*&+a=8ca`+JH zu_YwWWR_j-Pz#}3=1(0mEnUYw-Bz_q#C2F-*svx^Fn-PqpHiJUFq25;v({ytD)eP# z3Wy(LY1k{OH(`zA=PK^iXEH=_rMW-x)Czoj+xE_M)pkWxsT4hu_8BbRo>~Ak)-q5; z@YNOqc9sQyaTNtz<7-pQBy)~|@JlK)v8xC7Y8ZbToE9Dzv05@c8&oUvL|hjm zePdB^H^qy!M%73#(A-6))<@t76l$dycnPm{G5Zl_bXWelI`4%%4`xsOxG*`{EcWOald3_Y1^eu1`Aqx=B?$X}uj47;>aHBureJQwDjq{&bk3(iKWZ1{bD3;(O*qL>4p0REMKdJa? zyHC~^^TLX}hA67>YC`R$p<2?+UEs6vF2>b3KKfhKoA<6(h02;tQ6*sl2(kV)ISbI= zVDvoZl{Ip1ODS4|5LuE<@wLO{Hy3%>hZ#Bc)_{2esi^$vD^t~GDrPH~K1_Umc)mbo zS&Z=VUk`NOU5pr@=5LQL{7j78_8OhoA9&OKjGyc;*_4bMxGB`a`_jkcj2rR!(M6sP z9Fb5FIRxK9Kj_;+$QH(s@_iYScU!#?g7|uIavC${g*-(b_=Bh0NGY?~3=bTUjED+t z;YP?M$!l~w=u4k{{f3fqOh3yl(b?g1i}$@!z4VpQ^p*QX&^3Sfqq;lJHb4z9dK(l_|Ut7Z?0#`dOAqNmARV4v0E>qs8)Z-BY?~H~R*{UaS|qIO(y;fi0p}`+n#`W3mGA7%}Nw}bx_!jwRAgC75 zr9gO(+a)P55kL>r{deo^bBeN3dB(5NHOflDOn|*TsC>MQ( zE&(u|pV~{A5HDAnUiz-Z@AikP4vklnvwB)^J;5IQPn;1$_w=*WbnENiE^;QLy@fN< zBw5B>SR=2000)}g_4BmM>JK#%M2N8iixb)?T^e>F`B!5IbwO;^hx5QK;G;0GD6v;GvER;YBA)Q)_Pb>$ z!`k<{-1ah*oJ^b6{4|1T_4eg@jPLnb+9qR`>P^YCNQ+`_O|>`65ZrfsLJVv-fQm)q zL^5(sikP4V_ixqI^|_jGp1Ik$nFMa zQF=E9N~N(ehRjB+OsElC(i4Wo=7-D3Z-U8f@4l21GXSRxnnDBO@@Q~OpC#JUnnj1s z=Zs6LPF?vVxmK>rJC&8;tvtl+@@BDWq?zk-h)!B}(tY-q=U)XfJ_k=9@&Az5veyv~ LC?{ltt#8Ud*$U?g literal 0 HcmV?d00001 diff --git a/icons/obj/structures/doors/dropship2_side2.dmi b/icons/obj/structures/doors/dropship2_side2.dmi new file mode 100644 index 0000000000000000000000000000000000000000..bff39827c359805e98ff1c9101fe22f05a0e63e8 GIT binary patch literal 2116 zcmV-K2)p-*P)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfIFQGZU`jlEji!AX6zNKffqGIVZn3HARVwGbOXA7^Ibp zGp#5wHxzPaZl*;4LuUK$r6BQ zX5$?pGj5Y50MS(OL0N)$Lg*MQV^ri5`-E7+hfU4QKLkZn#omNb(UkFFwFL2mnq&#M zmLQ%`lUf2M%w`F;mVmQ_x|V=Nr>-SD3DdR2UyIeVZTw=f`ud#}>sK6C>*f0Ui#xnt zu9r7vEMIX<)9Ll;c3FIVdOb~MtX^?UDAZX3CQN4uP&Ac@ya}VCsYC=5rk@Zfnkok2 z{)AZE-u?gO_KvrIfw4Q`o42dQi|rG8wpwhm02aFwW<__qK07(ve$>g?$>tltVt2ys z-;j5;#m{u%re^1cbhW622|KUJ$`}@@x`2m8>b;0$t37#^fC;OY`LIa6TTSemknUc( zx2n|5KzPyGq#;dwLx*LF-5np+-z9EXlO-6!2W1JimLR?%d{d@HE#bNCrLQG0k&aPI z0AqfPS^^=gUU9&C&FU40CQC4)JE)dWX9>8LP-h8bYW6nD(MG$`tcvNqR9~OePYk`D zgu4?~k4g0U{KNrNPqT~Cj#GVIUOF!-(V4TV*1TO(ZC1@Y0`9FVo3Oa`gc?4o&X2r4 zwsu~WZ_0EREo-887cFa|cNcBzt=sORWli+nqOJCt z)%F8Zl&uXOy+u1yOYDoV_sJLBLNj-Vr3lfuqiCDkz|FD z9^vQ>cQqdq)v4Rj@qd>1v?2WCmn<FOOGfV8(5@RFY z)Etg*))Ji&k8oy*&WJ~NuvNT?(N^&$s% zAFh#--OJ91M>u5nGF+C(TB0N3P0b}?`NkyQs;|d$Xpctd_z0`VBzhe_#L7+tv>)03R4wU89`01F1^8_Z zYQ!T9|8l4p!yRQmKEjzLJP0Fi%~7N5a9gpOZ`CliVm04@go_Th6|4DH+e%if<{LCi zWG#_|9}v!3A_*6SGfO1lg79eXDzGrzy9z9n{#+|o^EG!uN81?vkE zl5jydWR?iE%n#Q{$?jzmE(nM0UWUsOSxa<8ys0@H;gGdNDA9!@oLS|js(Fh%%_fq}Dj^9!~8lmI!!1FIlz@~Qgm;K>dqV*e2V8Xp$mhhx^7u*wiZpJ*} z7Vj?D5i(z&0q=yCF|7f#&A^)Iy+u2*CVFqtvgNJ2X!V4>SMA=Sr3rhBmL}{i+6II< zP}G?|xK)Xn(poG@sjZ!KDzFlnN1En0gF zldIU)qQwcf@U#;eunChU`qrYg$8hUqJSke7u=B~6s!?JR7N2~f>rKVfAsf0|;}F?-Ct9VN$g2gy|PG`Gb5>Qz9XT`Zb*} z*u86a!to}KaD=_rUmhQxnVz!m?ToJ<7(0000 { disabled={disable_door_controls} onClick={() => act('door-control', { - interaction: 'lock', + interaction: 'force-lock', location: 'all', }) } @@ -81,7 +89,7 @@ const DropshipDoorControl = (_, context) => {