diff --git a/baystation12.dme b/baystation12.dme
index 0abf32bf787..43733732a07 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1293,6 +1293,7 @@
#include "code\modules\shuttles\shuttle.dm"
#include "code\modules\shuttles\shuttle_console.dm"
#include "code\modules\shuttles\shuttle_specops.dm"
+#include "code\modules\shuttles\shuttle_supply.dm"
#include "code\modules\shuttles\shuttles_multi.dm"
#include "code\modules\supermatter\supermatter.dm"
#include "code\modules\surgery\appendix.dm"
diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm
index 3faa6e4c809..491a1b2c43a 100644
--- a/code/controllers/verbs.dm
+++ b/code/controllers/verbs.dm
@@ -1,7 +1,7 @@
//TODO: rewrite and standardise all controller datums to the datum/controller type
//TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done
-/client/proc/restart_controller(controller in list("Master","Failsafe","Lighting","Supply Shuttle"))
+/client/proc/restart_controller(controller in list("Master","Failsafe","Lighting","Supply"))
set category = "Debug"
set name = "Restart Controller"
set desc = "Restart one of the various periodic loop controllers for the game (be careful!)"
@@ -21,14 +21,14 @@
new /datum/controller/lighting()
lighting_controller.process()
feedback_add_details("admin_verb","RLighting")
- if("Supply Shuttle")
- supply_shuttle.process()
+ if("Supply")
+ supply_controller.process()
feedback_add_details("admin_verb","RSupply")
message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.")
return
-/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply Shuttle","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller"))
+/client/proc/debug_controller(controller in list("Master","Failsafe","Ticker","Lighting","Air","Jobs","Sun","Radio","Supply","Emergency Shuttle","Configuration","pAI", "Cameras", "Transfer Controller"))
set category = "Debug"
set name = "Debug Controller"
set desc = "Debug the various periodic loop controllers for the game (be careful!)"
@@ -59,8 +59,8 @@
if("Radio")
debug_variables(radio_controller)
feedback_add_details("admin_verb","DRadio")
- if("Supply Shuttle")
- debug_variables(supply_shuttle)
+ if("Supply")
+ debug_variables(supply_controller)
feedback_add_details("admin_verb","DSupply")
if("Emergency Shuttle")
debug_variables(emergency_shuttle)
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index 0ae6a7b28b2..18f6d114106 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -129,7 +129,7 @@ var/global/datum/controller/gameticker/ticker
//here to initialize the random events nicely at round start
setup_economy()
-
+
setup_shuttle_docks()
spawn(0)//Forking here so we dont have to wait for this to finish
@@ -154,7 +154,7 @@ var/global/datum/controller/gameticker/ticker
if(admins_number == 0)
send2adminirc("Round has started with no admins online.")
- supply_shuttle.process() //Start the supply shuttle regenerating points -- TLE
+ supply_controller.process() //Start the supply shuttle regenerating points -- TLE
master_controller.process() //Start master_controller.process()
lighting_controller.process() //Start processing DynamicAreaLighting updates
@@ -320,7 +320,7 @@ var/global/datum/controller/gameticker/ticker
else
game_finished = (mode.check_finished() || (emergency_shuttle.location == 2 && emergency_shuttle.alert == 1))
mode_finished = game_finished
-
+
if(!mode.explosion_in_progress && game_finished && (mode_finished || post_game))
current_state = GAME_STATE_FINISHED
@@ -351,17 +351,17 @@ var/global/datum/controller/gameticker/ticker
world << "\blue An admin has delayed the round end"
else
world << "\blue An admin has delayed the round end"
-
+
else if (mode_finished)
post_game = 1
-
+
mode.cleanup()
-
+
//call a transfer shuttle vote
spawn(50)
world << "\red The round has ended!"
vote.autotransfer()
-
+
return 1
proc/getfactionbyname(var/name)
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index c62f1a236aa..404c2d54ca4 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -110,13 +110,22 @@
update_display(line1, line2)
if(4) // supply shuttle timer
var/line1 = "SUPPLY"
- var/line2
- if(supply_shuttle.moving)
+ var/line2 = ""
+
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ if (!shuttle)
+ line2 = "Error"
+ else if(shuttle.has_eta())
line2 = get_supply_shuttle_timer()
if(lentext(line2) > CHARS_PER_LINE)
line2 = "Error"
+ else if (shuttle.moving_status == SHUTTLE_WARMUP)
+ if (shuttle.at_station())
+ line2 = "Launch"
+ else
+ line2 = "ETA"
else
- if(supply_shuttle.at_station)
+ if(shuttle.at_station())
line2 = "Docked"
else
line1 = ""
@@ -162,8 +171,12 @@
return ""
proc/get_supply_shuttle_timer()
- if(supply_shuttle.moving)
- var/timeleft = round((supply_shuttle.eta_timeofday - world.timeofday) / 10,1)
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ if (!shuttle)
+ return "Error"
+
+ if(shuttle.has_eta())
+ var/timeleft = round((shuttle.arrive_time - world.time) / 10,1)
if(timeleft < 0)
return "Late"
return "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]"
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 499bbef25f6..0f041ef5c9f 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -411,12 +411,14 @@
if(mode==47)
var/supplyData[0]
- supplyData["shuttle_moving"] = supply_shuttle.moving
- supplyData["shuttle_eta"] = supply_shuttle.eta
- supplyData["shuttle_loc"] = supply_shuttle.at_station ? "Station" : "Dock"
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ if (shuttle)
+ supplyData["shuttle_moving"] = shuttle.has_eta()
+ supplyData["shuttle_eta"] = shuttle.eta_minutes()
+ supplyData["shuttle_loc"] = shuttle.at_station() ? "Station" : "Dock"
var/supplyOrderCount = 0
var/supplyOrderData[0]
- for(var/S in supply_shuttle.shoppinglist)
+ for(var/S in supply_controller.shoppinglist)
var/datum/supply_order/SO = S
supplyOrderData[++supplyOrderData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "ApprovedBy" = SO.orderedby, "Comment" = html_encode(SO.comment))
@@ -428,7 +430,7 @@
var/requestCount = 0
var/requestData[0]
- for(var/S in supply_shuttle.requestlist)
+ for(var/S in supply_controller.requestlist)
var/datum/supply_order/SO = S
requestCount++
requestData[++requestData.len] = list("Number" = SO.ordernum, "Name" = html_encode(SO.object.name), "OrderedBy" = SO.orderedby, "Comment" = html_encode(SO.comment))
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index 63f69b5becf..aa4ecd007d5 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -4,7 +4,7 @@
#define SUPPLY_STATION_AREATYPE "/area/supply/station" //Type of the supply shuttle area for station
#define SUPPLY_DOCK_AREATYPE "/area/supply/dock" //Type of the supply shuttle area for dock
-var/datum/controller/supply_shuttle/supply_shuttle = new()
+var/datum/controller/supply/supply_controller = new()
var/list/mechtoys = list(
/obj/item/toy/prize/ripley,
@@ -125,7 +125,7 @@ var/list/mechtoys = list(
var/orderedby = null
var/comment = null
-/datum/controller/supply_shuttle
+/datum/controller/supply
var/processing = 1
var/processing_interval = 300
var/iteration = 0
@@ -142,15 +142,23 @@ var/list/mechtoys = list(
var/list/requestlist = list()
var/list/supply_packs = list()
//shuttle movement
- var/at_station = 0
var/movetime = 1200
- var/moving = 0
- var/eta_timeofday
- var/eta
+ var/shuttle_tag = "Supply"
New()
ordernum = rand(1,9000)
+ proc/get_shuttle()
+ if (!shuttles || !(shuttle_tag in shuttles))
+ return null
+
+ var/datum/shuttle/ferry/supply/shuttle = shuttles[shuttle_tag]
+
+ if (!istype(shuttle))
+ return null
+
+ return shuttle
+
//Supply shuttle ticker - handles supply point regenertion and shuttle travelling between centcomm and the station
proc/process()
for(var/typepath in (typesof(/datum/supply_packs) - /datum/supply_packs))
@@ -164,30 +172,17 @@ var/list/mechtoys = list(
iteration++
points += points_per_process
- if(moving == 1)
- var/ticksleft = (eta_timeofday - world.timeofday)
- if(ticksleft > 0)
- eta = round(ticksleft/600,1)
- else
- eta = 0
- var/datum/shuttle/S = shuttles["Supply"]
- if (istype(S)) S.move()
- moving = 0
- at_station = !at_station
-
sleep(processing_interval)
-
- //Check whether the shuttle is allowed to move
- proc/can_move()
- if(moving) return 0
-
- var/area/shuttle = locate(/area/supply/station)
- if(!shuttle) return 0
-
- if(forbidden_atoms_check(shuttle))
- return 0
-
- return 1
+
+ spawn(0)
+ set background = 1
+ while(1)
+ if(processing)
+ var/datum/shuttle/ferry/supply/shuttle = get_shuttle()
+ if (shuttle && shuttle.in_use)
+ shuttle.process_shuttle()
+
+ sleep(10)
//To stop things being sent to centcomm which should not be sent to centcomm. Recursively checks for these types.
proc/forbidden_atoms_check(atom/A)
@@ -207,11 +202,10 @@ var/list/mechtoys = list(
//Sellin
proc/sell()
- var/shuttle_at
- if(at_station) shuttle_at = SUPPLY_STATION_AREATYPE
- else shuttle_at = SUPPLY_DOCK_AREATYPE
+ var/datum/shuttle/ferry/supply/shuttle_datum = get_shuttle()
+ if (!shuttle_datum) return
- var/area/shuttle = locate(shuttle_at)
+ var/area/shuttle = shuttle_datum.get_location_area()
if(!shuttle) return
var/phoron_count = 0
@@ -259,11 +253,10 @@ var/list/mechtoys = list(
proc/buy()
if(!shoppinglist.len) return
- var/shuttle_at
- if(at_station) shuttle_at = SUPPLY_STATION_AREATYPE
- else shuttle_at = SUPPLY_DOCK_AREATYPE
+ var/datum/shuttle/ferry/supply/shuttle_datum = get_shuttle()
+ if (!shuttle_datum) return
- var/area/shuttle = locate(shuttle_at)
+ var/area/shuttle = shuttle_datum.get_location_area()
if(!shuttle) return
var/list/clear_turfs = list()
@@ -290,7 +283,7 @@ var/list/mechtoys = list(
slip.info = "
[command_name()] Shipping Manifest
"
slip.info +="Order #[SO.ordernum]
"
slip.info +="Destination: [station_name]
"
- slip.info +="[supply_shuttle.shoppinglist.len] PACKAGES IN THIS SHIPMENT
"
+ slip.info +="[shoppinglist.len] PACKAGES IN THIS SHIPMENT
"
slip.info +="CONTENTS:
"
//spawn the stuff, finish generating the manifest while you're at it
@@ -319,7 +312,7 @@ var/list/mechtoys = list(
slip.info += "CHECK CONTENTS AND STAMP BELOW THE LINE TO CONFIRM RECEIPT OF GOODS
"
if (SP.contraband) slip.loc = null //we are out of blanks for Form #44-D Ordering Illicit Drugs.
- supply_shuttle.shoppinglist.Cut()
+ shoppinglist.Cut()
return
/obj/item/weapon/paper/manifest
@@ -346,9 +339,11 @@ var/list/mechtoys = list(
if(temp)
dat = temp
else
- dat += {"
Supply shuttle
- Location: [supply_shuttle.moving ? "Moving to station ([supply_shuttle.eta] Mins.)":supply_shuttle.at_station ? "Station":"Dock"]
-
Supply points: [supply_shuttle.points]
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ if (shuttle)
+ dat += {"
Supply shuttle
+ Location: [shuttle.has_eta() ? "Moving to station ([shuttle.eta_minutes()] Mins.)":shuttle.at_station() ? "Docked":"Away"]
+
Supply points: [supply_controller.points]
\nRequest items
View approved orders
View requests
@@ -370,18 +365,18 @@ var/list/mechtoys = list(
//all_supply_groups
//Request what?
last_viewed_group = "categories"
- temp = "Supply points: [supply_shuttle.points]
"
+ temp = "Supply points: [supply_controller.points]
"
temp += "Main Menu
"
temp += "Select a category
"
for(var/supply_group_name in all_supply_groups )
temp += "[supply_group_name]
"
else
last_viewed_group = href_list["order"]
- temp = "Supply points: [supply_shuttle.points]
"
+ temp = "Supply points: [supply_controller.points]
"
temp += "Back to all categories
"
temp += "Request from: [last_viewed_group]
"
- for(var/supply_name in supply_shuttle.supply_packs )
- var/datum/supply_packs/N = supply_shuttle.supply_packs[supply_name]
+ for(var/supply_name in supply_controller.supply_packs )
+ var/datum/supply_packs/N = supply_controller.supply_packs[supply_name]
if(N.hidden || N.contraband || N.group != last_viewed_group) continue //Have to send the type instead of a reference to
temp += "[supply_name] Cost: [N.cost]
" //the obj because it would get caught by the garbage
@@ -392,7 +387,7 @@ var/list/mechtoys = list(
return
//Find the correct supply_pack datum
- var/datum/supply_packs/P = supply_shuttle.supply_packs[href_list["doorder"]]
+ var/datum/supply_packs/P = supply_controller.supply_packs[href_list["doorder"]]
if(!istype(P)) return
var/timeout = world.time + 600
@@ -409,11 +404,11 @@ var/list/mechtoys = list(
else if(issilicon(usr))
idname = usr.real_name
- supply_shuttle.ordernum++
+ supply_controller.ordernum++
var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(loc)
reqform.name = "Requisition Form - [P.name]"
reqform.info += "[station_name] Supply Requisition Form
"
- reqform.info += "INDEX: #[supply_shuttle.ordernum]
"
+ reqform.info += "INDEX: #[supply_controller.ordernum]
"
reqform.info += "REQUESTED BY: [idname]
"
reqform.info += "RANK: [idrank]
"
reqform.info += "REASON: [reason]
"
@@ -429,24 +424,24 @@ var/list/mechtoys = list(
//make our supply_order datum
var/datum/supply_order/O = new /datum/supply_order()
- O.ordernum = supply_shuttle.ordernum
+ O.ordernum = supply_controller.ordernum
O.object = P
O.orderedby = idname
- supply_shuttle.requestlist += O
+ supply_controller.requestlist += O
temp = "Thanks for your request. The cargo team will process it as soon as possible.
"
temp += "
Back Main Menu"
else if (href_list["vieworders"])
temp = "Current approved orders:
"
- for(var/S in supply_shuttle.shoppinglist)
+ for(var/S in supply_controller.shoppinglist)
var/datum/supply_order/SO = S
temp += "[SO.object.name] approved by [SO.orderedby] [SO.comment ? "([SO.comment])":""]
"
temp += "
OK"
else if (href_list["viewrequests"])
temp = "Current requests:
"
- for(var/S in supply_shuttle.requestlist)
+ for(var/S in supply_controller.requestlist)
var/datum/supply_order/SO = S
temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby]
"
temp += "
OK"
@@ -471,14 +466,47 @@ var/list/mechtoys = list(
if (temp)
dat = temp
else
- dat += {"
Supply shuttle
- \nLocation: [supply_shuttle.moving ? "Moving to station ([supply_shuttle.eta] Mins.)":supply_shuttle.at_station ? "Station":"Away"]
-
\nSupply points: [supply_shuttle.points]
\n
- [supply_shuttle.moving ? "\n*Must be away to order items*
\n
":supply_shuttle.at_station ? "\n*Must be away to order items*
\n
":"\nOrder items
\n
"]
- [supply_shuttle.moving ? "\n*Shuttle already called*
\n
":supply_shuttle.at_station ? "\nSend away
\n
":"\nSend to station
\n
"]
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ if (shuttle)
+ dat += "
Supply shuttle
"
+ dat += "\nLocation: "
+ if (shuttle.has_eta())
+ dat += "In transit ([shuttle.eta_minutes()] Mins.)
"
+ else
+ if (shuttle.at_station())
+ if (shuttle.docking_controller)
+ switch(shuttle.docking_controller.get_docking_status())
+ if ("docked") dat += "Docked at station
"
+ if ("undocked") dat += "Undocked from station
"
+ if ("docking") dat += "Docking with station [shuttle.can_force()? "OVERRIDE" : ""]
"
+ if ("undocking") dat += "Undocking from station [shuttle.can_force()? "OVERRIDE" : ""]
"
+ else
+ dat += "Station
"
+
+ if (shuttle.can_launch())
+ dat += "Send away"
+ else if (shuttle.can_cancel())
+ dat += "Cancel launch"
+ else
+ dat += "*Shuttle is busy*"
+ dat += "
\n
"
+ else
+ dat += "Away
"
+ if (shuttle.can_launch())
+ dat += "Request supply shuttle"
+ else if (shuttle.can_cancel())
+ dat += "Cancel request"
+ else
+ dat += "*Shuttle is busy*"
+ dat += "
\n
"
+
+
+ dat += {"
\nSupply points: [supply_controller.points]
\n
+ \nOrder items
\n
\nView requests
\n
\nView orders
\n
\nClose"}
+
user << browse(dat, "window=computer;size=575x450")
onclose(user, "computer")
@@ -494,8 +522,12 @@ var/list/mechtoys = list(
return
/obj/machinery/computer/supplycomp/Topic(href, href_list)
- if(!supply_shuttle)
- world.log << "## ERROR: Eek. The supply_shuttle controller datum is missing somehow."
+ if(!supply_controller)
+ world.log << "## ERROR: Eek. The supply_controller controller datum is missing somehow."
+ return
+ var/datum/shuttle/ferry/supply/shuttle = supply_controller.get_shuttle()
+ if (!shuttle)
+ world.log << "## ERROR: Eek. The supply/shuttle datum is missing somehow."
return
if(..())
return
@@ -505,51 +537,48 @@ var/list/mechtoys = list(
//Calling the shuttle
if(href_list["send"])
- if(!supply_shuttle.can_move())
- temp = "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.
OK"
-
- else if(supply_shuttle.at_station)
- supply_shuttle.moving = -1
- supply_shuttle.sell()
- supply_shuttle.moving = 0
- supply_shuttle.at_station = !supply_shuttle.at_station
-
- var/datum/shuttle/S = shuttles["Supply"]
- if (istype(S)) S.move()
-
- temp = "The supply shuttle has departed.
OK"
+ if(shuttle.at_station())
+ if (shuttle.forbidden_atoms_check())
+ temp = "For safety reasons the automated supply shuttle cannot transport live organisms, classified nuclear weaponry or homing beacons.
OK"
+ else
+ shuttle.launch(src)
+ temp = "Initiating launch sequence.
OK"
else
- supply_shuttle.moving = 1
- supply_shuttle.buy()
- supply_shuttle.eta_timeofday = (world.timeofday + supply_shuttle.movetime) % 864000
- temp = "The supply shuttle has been called and will arrive in [round(supply_shuttle.movetime/600,1)] minutes.
OK"
+ shuttle.launch(src)
+ temp = "The supply shuttle has been called and will arrive in approximately [round(supply_controller.movetime/600,1)] minutes.
OK"
post_signal("supply")
+
+ if (href_list["force_send"])
+ shuttle.force_launch(src)
+ if (href_list["cancel_send"])
+ shuttle.cancel_launch(src)
+
else if (href_list["order"])
- if(supply_shuttle.moving) return
+ //if(!shuttle.idle()) return //this shouldn't be necessary it seems
if(href_list["order"] == "categories")
//all_supply_groups
//Request what?
last_viewed_group = "categories"
- temp = "Supply points: [supply_shuttle.points]
"
+ temp = "Supply points: [supply_controller.points]
"
temp += "Main Menu
"
temp += "Select a category
"
for(var/supply_group_name in all_supply_groups )
temp += "[supply_group_name]
"
else
last_viewed_group = href_list["order"]
- temp = "Supply points: [supply_shuttle.points]
"
+ temp = "Supply points: [supply_controller.points]
"
temp += "Back to all categories
"
temp += "Request from: [last_viewed_group]
"
- for(var/supply_name in supply_shuttle.supply_packs )
- var/datum/supply_packs/N = supply_shuttle.supply_packs[supply_name]
+ for(var/supply_name in supply_controller.supply_packs )
+ var/datum/supply_packs/N = supply_controller.supply_packs[supply_name]
if((N.hidden && !hacked) || (N.contraband && !can_order_contraband) || N.group != last_viewed_group) continue //Have to send the type instead of a reference to
temp += "[supply_name] Cost: [N.cost]
" //the obj because it would get caught by the garbage
- /*temp = "Supply points: [supply_shuttle.points]
Request what?
"
+ /*temp = "Supply points: [supply_controller.points]
Request what?
"
- for(var/supply_name in supply_shuttle.supply_packs )
- var/datum/supply_packs/N = supply_shuttle.supply_packs[supply_name]
+ for(var/supply_name in supply_controller.supply_packs )
+ var/datum/supply_packs/N = supply_controller.supply_packs[supply_name]
if(N.hidden && !hacked) continue
if(N.contraband && !can_order_contraband) continue
temp += "[supply_name] Cost: [N.cost]
" //the obj because it would get caught by the garbage
@@ -562,7 +591,7 @@ var/list/mechtoys = list(
return
//Find the correct supply_pack datum
- var/datum/supply_packs/P = supply_shuttle.supply_packs[href_list["doorder"]]
+ var/datum/supply_packs/P = supply_controller.supply_packs[href_list["doorder"]]
if(!istype(P)) return
var/timeout = world.time + 600
@@ -579,11 +608,11 @@ var/list/mechtoys = list(
else if(issilicon(usr))
idname = usr.real_name
- supply_shuttle.ordernum++
+ supply_controller.ordernum++
var/obj/item/weapon/paper/reqform = new /obj/item/weapon/paper(loc)
reqform.name = "Requisition Form - [P.name]"
reqform.info += "[station_name] Supply Requisition Form
"
- reqform.info += "INDEX: #[supply_shuttle.ordernum]
"
+ reqform.info += "INDEX: #[supply_controller.ordernum]
"
reqform.info += "REQUESTED BY: [idname]
"
reqform.info += "RANK: [idrank]
"
reqform.info += "REASON: [reason]
"
@@ -599,10 +628,10 @@ var/list/mechtoys = list(
//make our supply_order datum
var/datum/supply_order/O = new /datum/supply_order()
- O.ordernum = supply_shuttle.ordernum
+ O.ordernum = supply_controller.ordernum
O.object = P
O.orderedby = idname
- supply_shuttle.requestlist += O
+ supply_controller.requestlist += O
temp = "Order request placed.
"
temp += "
Back | Main Menu | Authorize Order"
@@ -613,15 +642,15 @@ var/list/mechtoys = list(
var/datum/supply_order/O
var/datum/supply_packs/P
temp = "Invalid Request"
- for(var/i=1, i<=supply_shuttle.requestlist.len, i++)
- var/datum/supply_order/SO = supply_shuttle.requestlist[i]
+ for(var/i=1, i<=supply_controller.requestlist.len, i++)
+ var/datum/supply_order/SO = supply_controller.requestlist[i]
if(SO.ordernum == ordernum)
O = SO
P = O.object
- if(supply_shuttle.points >= P.cost)
- supply_shuttle.requestlist.Cut(i,i+1)
- supply_shuttle.points -= P.cost
- supply_shuttle.shoppinglist += O
+ if(supply_controller.points >= P.cost)
+ supply_controller.requestlist.Cut(i,i+1)
+ supply_controller.points -= P.cost
+ supply_controller.shoppinglist += O
temp = "Thanks for your order.
"
temp += "
Back Main Menu"
else
@@ -631,7 +660,7 @@ var/list/mechtoys = list(
else if (href_list["vieworders"])
temp = "Current approved orders:
"
- for(var/S in supply_shuttle.shoppinglist)
+ for(var/S in supply_controller.shoppinglist)
var/datum/supply_order/SO = S
temp += "#[SO.ordernum] - [SO.object.name] approved by [SO.orderedby][SO.comment ? " ([SO.comment])":""]
"// (Cancel)
"
temp += "
OK"
@@ -649,9 +678,9 @@ var/list/mechtoys = list(
*/
else if (href_list["viewrequests"])
temp = "Current requests:
"
- for(var/S in supply_shuttle.requestlist)
+ for(var/S in supply_controller.requestlist)
var/datum/supply_order/SO = S
- temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby] [supply_shuttle.moving ? "":supply_shuttle.at_station ? "":"Approve Remove"]
"
+ temp += "#[SO.ordernum] - [SO.object.name] requested by [SO.orderedby] Approve Remove
"
temp += "
Clear list"
temp += "
OK"
@@ -659,16 +688,16 @@ var/list/mechtoys = list(
else if (href_list["rreq"])
var/ordernum = text2num(href_list["rreq"])
temp = "Invalid Request.
"
- for(var/i=1, i<=supply_shuttle.requestlist.len, i++)
- var/datum/supply_order/SO = supply_shuttle.requestlist[i]
+ for(var/i=1, i<=supply_controller.requestlist.len, i++)
+ var/datum/supply_order/SO = supply_controller.requestlist[i]
if(SO.ordernum == ordernum)
- supply_shuttle.requestlist.Cut(i,i+1)
+ supply_controller.requestlist.Cut(i,i+1)
temp = "Request removed.
"
break
temp += "
Back Main Menu"
else if (href_list["clearreq"])
- supply_shuttle.requestlist.Cut()
+ supply_controller.requestlist.Cut()
temp = "List cleared.
"
temp += "
OK"
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 52f37b9dd2c..314e6dbccfd 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -6,6 +6,7 @@
icon_state = "conveyor0"
name = "conveyor belt"
desc = "A conveyor belt."
+ layer = 2 // so they appear under stuff
anchored = 1
var/operating = 0 // 1 if running forward, -1 if backwards, 0 if off
var/operable = 1 // true if can operate (no broken segments in this belt run)
diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm
index a1bb570884d..471c4a77d39 100644
--- a/code/modules/shuttles/shuttle.dm
+++ b/code/modules/shuttles/shuttle.dm
@@ -1,9 +1,7 @@
//These lists are populated in /datum/shuttle_controller/New()
//Shuttle controller is instantiated in master_controller.dm.
-#define SHUTTLE_IDLE 0
-#define SHUTTLE_WARMUP 1
-#define SHUTTLE_INTRANSIT 2
+//shuttle moving state defines are in setup.dm
var/global/list/shuttles
@@ -128,10 +126,13 @@ var/global/list/shuttles
var/datum/shuttle/ferry/shuttle
//Supply and escape shuttles.
- shuttle = new()
+ shuttle = new/datum/shuttle/ferry/supply()
shuttle.location = 1
+ shuttle.warmup_time = 10
shuttle.area_offsite = locate(/area/supply/dock)
shuttle.area_station = locate(/area/supply/station)
+ shuttle.docking_controller_tag = "supply_shuttle"
+ shuttle.dock_target_station = "cargo_bay"
shuttles["Supply"] = shuttle
// Admin shuttles.
diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm
index 4391982c085..13f8884be3b 100644
--- a/code/modules/shuttles/shuttle_console.dm
+++ b/code/modules/shuttles/shuttle_console.dm
@@ -22,9 +22,9 @@
return
if(!destination)
- destination = (location == 1 ? area_station : area_offsite)
+ destination = get_location_area(!location)
if(!origin)
- origin = (location == 1 ? area_offsite : area_station)
+ origin = get_location_area(location)
..(origin, destination)
@@ -33,23 +33,31 @@
return
if(!destination)
- destination = (location == 1 ? area_station : area_offsite)
+ destination = get_location_area(!location)
if(!departing)
- departing = (location == 1 ? area_offsite : area_station)
+ departing = get_location_area(location)
..(departing, destination, interim, travel_time)
/datum/shuttle/ferry/move(var/area/origin,var/area/destination)
if(!destination)
- destination = (location == 1 ? area_station : area_offsite)
+ destination = get_location_area(!location)
if(!origin)
- origin = (location == 1 ? area_offsite : area_station)
-
+ origin = get_location_area(location)
+
if (docking_controller && !docking_controller.undocked())
docking_controller.force_undock()
..(origin, destination)
location = !location
+/datum/shuttle/ferry/proc/get_location_area(location_id = null)
+ if (isnull(location_id))
+ location_id = location
+
+ if (!location_id)
+ return area_station
+ return area_offsite
+
/datum/shuttle/ferry/proc/process_shuttle()
switch(process_state)
if (WAIT_LAUNCH)
diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm
new file mode 100644
index 00000000000..f75193ea032
--- /dev/null
+++ b/code/modules/shuttles/shuttle_supply.dm
@@ -0,0 +1,82 @@
+
+
+
+
+
+/datum/shuttle/ferry/supply
+ var/away_location = 1 //the location to hide at while pretending to be in-transit
+ var/arrive_time = 0
+ var/late_chance = 80
+ var/max_late_time = 300
+
+/datum/shuttle/ferry/supply/short_jump(var/area/origin,var/area/destination)
+ if(moving_status != SHUTTLE_IDLE)
+ return
+
+ if(isnull(location))
+ return
+
+ if(!destination)
+ destination = get_location_area(!location)
+ if(!origin)
+ origin = get_location_area(location)
+
+ if (!at_station()) //at centcom
+ supply_controller.buy()
+
+ //it would be cool to play a sound here
+ moving_status = SHUTTLE_WARMUP
+ spawn(warmup_time*10)
+ if (moving_status == SHUTTLE_IDLE)
+ return //someone cancelled the launch
+
+ if (at_station() && forbidden_atoms_check())
+ //cancel the launch because of forbidden atoms. announce over supply channel?
+ return
+
+ //We pretend it's a long_jump by making the shuttle stay at centcom for the "in-transit" period.
+ var/area/away_area = get_location_area(away_location)
+ if (origin == away_area)
+ moving_status = SHUTTLE_INTRANSIT //pretend
+ else
+ move(origin, away_area)
+
+ //wait ETA here.
+ arrive_time = world.time + supply_controller.movetime
+ while (world.time <= arrive_time)
+ sleep(5)
+
+ if (destination != away_area)
+ move(away_area, destination)
+
+ //late
+ if (prob(late_chance))
+ sleep(rand(0,max_late_time))
+
+ moving_status = SHUTTLE_IDLE
+
+ if (!at_station()) //at centcom
+ supply_controller.sell()
+
+// returns 1 if the supply shuttle should be prevented from moving because it contains forbidden atoms
+/datum/shuttle/ferry/supply/proc/forbidden_atoms_check()
+ if (!at_station())
+ return 0 //if badmins want to send mobs or a nuke on the supply shuttle from centcom we don't care
+
+ return supply_controller.forbidden_atoms_check(get_location_area())
+
+/datum/shuttle/ferry/supply/proc/at_station()
+ return (!location)
+
+//returns 1 if the shuttle is moving and we can show valid ETAs
+/datum/shuttle/ferry/supply/proc/has_eta()
+ return (moving_status == SHUTTLE_INTRANSIT)
+
+//returns 1 if the shuttle is idle and we can still mess with the cargo shopping list
+/datum/shuttle/ferry/supply/proc/idle()
+ return (moving_status == SHUTTLE_IDLE)
+
+//returns the ETA in minutes
+/datum/shuttle/ferry/supply/proc/eta_minutes()
+ var/ticksleft = arrive_time - world.time
+ return round(ticksleft/600,1)
\ No newline at end of file
diff --git a/code/setup.dm b/code/setup.dm
index 9099a2f8f6d..3c190f1e2ad 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -761,3 +761,8 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse
#define COLOR_YELLOW "#FFFF00"
#define COLOR_ORANGE "#FF9900"
#define COLOR_WHITE "#FFFFFF"
+
+//Shuttle moving status
+#define SHUTTLE_IDLE 0
+#define SHUTTLE_WARMUP 1
+#define SHUTTLE_INTRANSIT 2
\ No newline at end of file
diff --git a/maps/tgstation2.dmm b/maps/tgstation2.dmm
index 46078a2fe90..ff96df168ad 100644
--- a/maps/tgstation2.dmm
+++ b/maps/tgstation2.dmm
@@ -687,7 +687,7 @@
"ank" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/solar/auxstarboard)
"anl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/solar/auxport)
"anm" = (/turf/simulated/wall,/area)
-"ann" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1; name = "External Construction Airlock"; req_access_txt = "32"},/obj/item/tape/engineering,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"ann" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1; name = "External Construction Airlock"; req_access_txt = "32"},/obj/item/tape/engineering{icon_state = "engineering_door"; layer = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"ano" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/security/prison)
"anp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_Toxins = 1},/turf/simulated/floor{icon_state = "dark"},/area/security/tactical)
"anq" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/security/brig)
@@ -832,7 +832,7 @@
"apZ" = (/obj/structure/table,/obj/item/weapon/folder/red,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "redfull"; dir = 9},/area/security/main)
"aqa" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "security_outer"; locked = 1; name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
"aqb" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "security_airlock"; name = "exterior access button"; pixel_x = -20; pixel_y = -20; req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/fsmaint)
-"aqc" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1; name = "External Construction Airlock"; req_access_txt = "32"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/tape/engineering,/turf/simulated/floor/plating,/area/maintenance/fpmaint)
+"aqc" = (/obj/machinery/door/airlock/external{icon_state = "door_locked"; locked = 1; name = "External Construction Airlock"; req_access_txt = "32"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/tape/engineering{icon_state = "engineering_door"; layer = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint)
"aqd" = (/obj/structure/sign/vacuum,/turf/simulated/wall,/area/maintenance/fpmaint)
"aqe" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor,/area/hallway/primary/fore)
"aqf" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/turf/simulated/floor,/area/hallway/primary/fore)
@@ -3683,7 +3683,7 @@
"bsQ" = (/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/space,/area/shuttle/research/station)
"bsR" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/shuttle/engine/heater{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/shuttle/research/station)
"bsS" = (/obj/machinery/light/small{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
-"bsT" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor2"; name = "Supply Dock Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/quartermaster/storage)
+"bsT" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bsU" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bsV" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
"bsW" = (/turf/simulated/floor{dir = 4; icon_state = "loadingarea"},/area/quartermaster/storage)
@@ -3760,7 +3760,7 @@
"bup" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"buq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
"bur" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/medical/research{name = "Research Division"})
-"bus" = (/obj/machinery/door/airlock/external{name = "Supply Dock Airlock"; req_access_txt = "31"},/turf/simulated/floor/plating,/area/quartermaster/storage)
+"bus" = (/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"but" = (/turf/simulated/floor/plating,/area/quartermaster/storage)
"buu" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/quartermaster/storage)
"buv" = (/turf/simulated/floor{icon_state = "delivery"},/area/quartermaster/storage)
@@ -3848,7 +3848,7 @@
"bvZ" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/research/station)
"bwa" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bwb" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/quartermaster/storage)
-"bwc" = (/obj/machinery/camera{c_tag = "Cargo Recieving Dock"; dir = 4},/obj/machinery/door_control{id = "QMLoaddoor"; layer = 4; name = "Loading Doors"; pixel_x = -24; pixel_y = -8},/obj/machinery/door_control{dir = 2; id = "QMLoaddoor2"; layer = 4; name = "Loading Doors"; pixel_x = -24; pixel_y = 8},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
+"bwc" = (/obj/machinery/camera{c_tag = "Cargo Recieving Dock"; dir = 4},/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "cargo_bay"; name = "cargo bay hatch controller"; pixel_x = -30; pixel_y = 0; req_access_txt = "0"; req_one_access_txt = "13;31"; tag_door = "cargo_bay_door"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
"bwd" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #2"},/obj/machinery/bot/mulebot{home_destination = "QM #2"; suffix = "#2"},/turf/simulated/floor{icon_state = "bot"},/area/quartermaster/storage)
"bwe" = (/obj/structure/table,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/weapon/folder/yellow,/obj/item/device/eftpos{eftpos_name = "Cargo Bay EFTPOS scanner"},/turf/simulated/floor,/area/quartermaster/office)
"bwf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/quartermaster/office)
@@ -4004,7 +4004,7 @@
"byZ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor,/area/hallway/primary/central)
"bza" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/medical/research{name = "Research Division"})
"bzb" = (/obj/structure/closet/crate,/obj/item/device/multitool,/obj/item/device/multitool,/obj/item/device/assembly/prox_sensor,/obj/item/device/flashlight,/obj/machinery/atmospherics/pipe/simple/hidden/supply{color = "#4444FF"; dir = 4},/obj/item/weapon/storage/backpack,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"bzc" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor"; name = "Supply Dock Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/quartermaster/storage)
+"bzc" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/firedoor/border_only{dir = 2},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access_txt = "13"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bzd" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor/plating,/area/quartermaster/storage)
"bze" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/status_display{density = 0; pixel_y = -30; supply_display = 1},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
"bzf" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/light,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/quartermaster/storage)
@@ -7154,20 +7154,20 @@
"cHD" = (/obj/structure/kitchenspike,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living)
"cHE" = (/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living)
"cHF" = (/obj/machinery/gibber,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living)
-"cHG" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor2"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/shuttle/plating,/area/supply/dock)
+"cHG" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/plating,/area/supply/dock)
"cHH" = (/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom)
"cHI" = (/obj/item/weapon/reagent_containers/food/condiment/saltshaker{pixel_x = -6},/obj/structure/table,/turf/unsimulated/floor{icon_state = "redyellowfull"},/area/centcom/living)
"cHJ" = (/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living)
"cHK" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living)
"cHL" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -5},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living)
-"cHM" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor,/area/supply/dock)
+"cHM" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/floor,/area/supply/dock)
"cHN" = (/obj/machinery/optable,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom)
"cHO" = (/obj/structure/table/reinforced,/obj/machinery/librarycomp,/turf/simulated/floor{dir = 1; icon_state = "chapel"},/area/shuttle/administration/centcom)
"cHP" = (/obj/structure/bookcase,/turf/simulated/floor{dir = 4; icon_state = "chapel"},/area/shuttle/administration/centcom)
"cHQ" = (/obj/structure/table,/obj/item/weapon/reagent_containers/food/drinks/shaker,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living)
"cHR" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living)
"cHS" = (/obj/machinery/door/airlock/centcom{name = "Living Quarters"; opacity = 1; req_access_txt = "105"},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/living)
-"cHT" = (/obj/machinery/door_control{dir = 2; id = "QMLoaddoor2"; name = "Loading Doors"; pixel_x = 24; pixel_y = 8},/obj/machinery/door_control{id = "QMLoaddoor"; name = "Loading Doors"; pixel_x = 24; pixel_y = -8},/turf/simulated/shuttle/floor,/area/supply/dock)
+"cHT" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "supply_shuttle"; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; req_one_access_txt = "13;31"; tag_door = "supply_shuttle_hatch"},/turf/simulated/shuttle/floor,/area/supply/dock)
"cHU" = (/obj/machinery/door/window/northright{icon_state = "right"; dir = 2},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom)
"cHV" = (/obj/structure/table,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom)
"cHW" = (/obj/structure/table{icon_state = "tabledir"; dir = 9},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/administration/centcom)
@@ -7187,7 +7187,7 @@
"cIk" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living)
"cIl" = (/obj/machinery/computer/card/centcom,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/centcom/living)
"cIm" = (/obj/structure/table,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 3},/obj/item/weapon/kitchen/rollingpin,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/living)
-"cIn" = (/obj/machinery/door/poddoor{density = 1; icon_state = "pdoor1"; id = "QMLoaddoor"; name = "Supply Shuttle Loading Door"; opacity = 1},/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/shuttle/plating,/area/supply/dock)
+"cIn" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "supply_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access_txt = "13"},/turf/simulated/shuttle/plating,/area/supply/dock)
"cIo" = (/obj/machinery/vending/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom)
"cIp" = (/obj/machinery/chem_master,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom)
"cIq" = (/obj/machinery/chem_dispenser,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/administration/centcom)