diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 5fb5f0c8bd..5b792451bc 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -13,6 +13,17 @@ var/global/datum/shuttle_controller/shuttle_controller shuttle.process() +//This is called by gameticker after all the machines and radio frequencies have been properly initialized +/datum/shuttle_controller/proc/setup_shuttle_docks() + for(var/shuttle_tag in shuttles) + var/datum/shuttle/shuttle = shuttles[shuttle_tag] + shuttle.init_docking_controllers() + shuttle.dock() //makes all shuttles docked to something at round start go into the docked state + + for(var/obj/machinery/embedded_controller/C in machines) + if(istype(C.program, /datum/computer/file/embedded_program/docking)) + C.program.tag = null //clear the tags, 'cause we don't need 'em anymore + /datum/shuttle_controller/New() shuttles = list() process_shuttles = list() @@ -235,72 +246,3 @@ var/global/datum/shuttle_controller/shuttle_controller MS.warmup_time = 0 shuttles["Mercenary"] = MS - -//This is called by gameticker after all the machines and radio frequencies have been properly initialized -/datum/shuttle_controller/proc/setup_shuttle_docks() - var/datum/shuttle/shuttle - var/datum/shuttle/ferry/multidock/multidock - var/list/dock_controller_map = list() //so we only have to iterate once through each list - - //multidock shuttles - var/list/dock_controller_map_station = list() - var/list/dock_controller_map_offsite = list() - - for (var/shuttle_tag in shuttles) - shuttle = shuttles[shuttle_tag] - if (shuttle.docking_controller_tag) - dock_controller_map[shuttle.docking_controller_tag] = shuttle - if (istype(shuttle, /datum/shuttle/ferry/multidock)) - multidock = shuttle - dock_controller_map_station[multidock.docking_controller_tag_station] = multidock - dock_controller_map_offsite[multidock.docking_controller_tag_offsite] = multidock - - //escape pod arming controllers - var/datum/shuttle/ferry/escape_pod/pod - var/list/pod_controller_map = list() - for (var/datum/shuttle/ferry/escape_pod/P in emergency_shuttle.escape_pods) - if (P.dock_target_station) - pod_controller_map[P.dock_target_station] = P - - //search for the controllers, if we have one. - if (dock_controller_map.len) - for (var/obj/machinery/embedded_controller/radio/C in machines) //only radio controllers are supported at the moment - if (istype(C.program, /datum/computer/file/embedded_program/docking)) - if (C.id_tag in dock_controller_map) - shuttle = dock_controller_map[C.id_tag] - shuttle.docking_controller = C.program - dock_controller_map -= C.id_tag - - //escape pods - if(istype(C, /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod) && istype(shuttle, /datum/shuttle/ferry/escape_pod)) - var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/EPC = C - EPC.pod = shuttle - - if (C.id_tag in dock_controller_map_station) - multidock = dock_controller_map_station[C.id_tag] - if (istype(multidock)) - multidock.docking_controller_station = C.program - dock_controller_map_station -= C.id_tag - if (C.id_tag in dock_controller_map_offsite) - multidock = dock_controller_map_offsite[C.id_tag] - if (istype(multidock)) - multidock.docking_controller_offsite = C.program - dock_controller_map_offsite -= C.id_tag - - //escape pods - if (C.id_tag in pod_controller_map) - pod = pod_controller_map[C.id_tag] - if (istype(C.program, /datum/computer/file/embedded_program/docking/simple/escape_pod/)) - pod.arming_controller = C.program - - //sanity check - if (dock_controller_map.len || dock_controller_map_station.len || dock_controller_map_offsite.len) - var/dat = "" - for (var/dock_tag in dock_controller_map + dock_controller_map_station + dock_controller_map_offsite) - dat += "\"[dock_tag]\", " - world << "\red \b warning: shuttles with docking tags [dat] could not find their controllers!" - - //makes all shuttles docked to something at round start go into the docked state - for (var/shuttle_tag in shuttles) - shuttle = shuttles[shuttle_tag] - shuttle.dock() diff --git a/code/game/machinery/embedded_controller/docking_program.dm b/code/game/machinery/embedded_controller/docking_program.dm index 032676f037..987634d02a 100644 --- a/code/game/machinery/embedded_controller/docking_program.dm +++ b/code/game/machinery/embedded_controller/docking_program.dm @@ -71,6 +71,15 @@ var/override_enabled = 0 //when enabled, do not open/close doors or cycle airlocks and wait for the player to do it manually var/received_confirm = 0 //for undocking, whether the server has recieved a confirmation from the client +/datum/computer/file/embedded_program/docking/New() + ..() + var/datum/existing = locate(id_tag) //in case a datum already exists with our tag + if(existing) + existing.tag = null //take it from them + + tag = id_tag //Greatly simplifies shuttle initialization + + /datum/computer/file/embedded_program/docking/receive_signal(datum/signal/signal, receive_method, receive_param) var/receive_tag = signal.data["tag"] //for docking signals, this is the sender id var/command = signal.data["command"] diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index 289cf4d7b0..7c0ca83b80 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -1,6 +1,19 @@ /datum/shuttle/ferry/escape_pod var/datum/computer/file/embedded_program/docking/simple/escape_pod/arming_controller +/datum/shuttle/ferry/escape_pod/init_docking_controllers() + ..() + arming_controller = locate(dock_target_station) + if(!istype(arming_controller)) + world << "warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!" + + if(docking_controller) + var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/controller_master = docking_controller.master + if(!istype(controller_master)) + world << "warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!" + else + controller_master.pod = src + /datum/shuttle/ferry/escape_pod/can_launch() if(arming_controller && !arming_controller.armed) //must be armed return 0 diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index c0e8d31546..40661ee2ff 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -12,6 +12,12 @@ var/arrive_time = 0 //the time at which the shuttle arrives when long jumping +/datum/shuttle/proc/init_docking_controllers() + if(docking_controller_tag) + docking_controller = locate(docking_controller_tag) + if(!istype(docking_controller)) + world << "warning: shuttle with docking tag [docking_controller_tag] could not find it's controller!" + /datum/shuttle/proc/short_jump(var/area/origin,var/area/destination) if(moving_status != SHUTTLE_IDLE) return diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm index 8e3fd5fb0b..078d1e9a5a 100644 --- a/code/modules/shuttles/shuttle_specops.dm +++ b/code/modules/shuttles/shuttle_specops.dm @@ -14,6 +14,16 @@ var/datum/computer/file/embedded_program/docking/docking_controller_station var/datum/computer/file/embedded_program/docking/docking_controller_offsite +/datum/shuttle/ferry/multidock/init_docking_controllers() + if(docking_controller_tag_station) + docking_controller_station = locate(docking_controller_tag_station) + if(!istype(docking_controller_station)) + world << "warning: shuttle with docking tag [docking_controller_station] could not find it's controller!" + if(docking_controller_tag_offsite) + docking_controller_offsite = locate(docking_controller_tag_offsite) + if(!istype(docking_controller_offsite)) + world << "warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!" + /datum/shuttle/ferry/multidock/move(var/area/origin,var/area/destination) ..(origin, destination) if (!location)