//This is a holder for things like the Skipjack and Nuke shuttle.
/datum/shuttle/multi_shuttle
flags = SHUTTLE_FLAGS_NONE
var/cloaked = FALSE
var/can_cloak = FALSE
var/at_origin = 1
var/returned_home = 0
// var/move_time = 240
var/move_time = 60
var/cooldown = 20
var/last_move = 0 //the time at which we last moved
var/announcer
var/arrival_message
var/departure_message
var/area/interim
var/area/last_departed
var/start_location
var/last_location
var/list/destinations
var/list/destination_dock_controller_tags = list() //optional, in case the shuttle has multiple docking ports like the ERT shuttle (even though that isn't a multi_shuttle)
var/list/destination_dock_controllers = list()
var/list/destination_dock_targets = list()
var/area/origin
var/return_warning = 0
var/legit = 0 //VOREStation Add - Whether or not a shuttle is a legit NT shuttle.
category = /datum/shuttle/multi_shuttle
/datum/shuttle/multi_shuttle/New()
origin = locate(origin)
interim = locate(interim)
for(var/destination in destinations)
destinations[destination] = locate(destinations[destination])
..()
/datum/shuttle/multi_shuttle/init_docking_controllers()
..()
for(var/destination in destinations)
var/controller_tag = destination_dock_controller_tags[destination]
if(!controller_tag)
destination_dock_controllers[destination] = docking_controller
else
var/datum/computer/file/embedded_program/docking/C = locate(controller_tag)
if(!istype(C))
warning("warning: shuttle with docking tag [controller_tag] could not find it's controller!")
else
destination_dock_controllers[destination] = C
//might as well set this up here.
if(origin) last_departed = origin
last_location = start_location
//VOREStation Add - Set up origin dock controller
if(!(start_location in destination_dock_controller_tags))
destination_dock_controllers[start_location] = docking_controller
//VOREStation Add End
/datum/shuttle/multi_shuttle/current_dock_target()
return destination_dock_targets[last_location]
/datum/shuttle/multi_shuttle/move(var/area/origin, var/area/destination)
..()
last_move = world.time
if (destination == src.origin)
returned_home = 1
docking_controller = destination_dock_controllers[last_location]
/datum/shuttle/multi_shuttle/proc/announce_departure()
if(cloaked || isnull(departure_message))
return
command_announcement.Announce(departure_message,(announcer ? announcer : "[using_map.boss_name]"))
/datum/shuttle/multi_shuttle/proc/announce_arrival()
if(cloaked || isnull(arrival_message))
return
command_announcement.Announce(arrival_message,(announcer ? announcer : "[using_map.boss_name]"))
/obj/machinery/computer/shuttle_control/multi
icon_keyboard = "syndie_key"
icon_screen = "syndishuttle"
/obj/machinery/computer/shuttle_control/multi/attack_hand(user as mob)
if(..(user))
return
src.add_fingerprint(user)
var/datum/shuttle/multi_shuttle/MS = shuttle_controller.shuttles[shuttle_tag]
if(!istype(MS)) return
var/dat
dat = "
[shuttle_tag] Ship Control
"
if(MS.moving_status != SHUTTLE_IDLE)
dat += "Location: Moving
"
else
var/area/areacheck = get_area(src)
dat += "Location: [areacheck.name]
"
if((MS.last_move + MS.cooldown*10) > world.time)
dat += "Engines charging.
"
else
dat += "Engines ready.
"
//dat += "
[MS.legit ? "Inhibit ATC":"Toggle cloak"]
" //VOREStation Edit - Adds legit shuttles. //SYNC Edit: Below deals with cloak.
if(MS.can_cloak)
dat += "
Toggle cloaking field
"
dat += "Move ship
"
dat += "Return to base"
//Docking
dat += "
"
if(MS.skip_docking_checks())
dat += "Docking Status: Not in use."
else
var/override_en = MS.docking_controller.override_enabled
var/docking_status = MS.docking_controller.get_docking_status()
dat += "Docking Status: "
switch(docking_status)
if("undocked")
dat += "Undocked"
if("docking")
dat += "Docking"
if("undocking")
dat += "Undocking"
if("docked")
dat += "Docked"
if(override_en) dat += " (Override Enabled)"
dat += ". \[Refresh\]
"
switch(docking_status)
if("undocked")
dat += "Dock"
if("docked")
dat += "Undock"
dat += ""
user << browse("[dat]", "window=[shuttle_tag]shuttlecontrol;size=300x600")
//check if we're undocked, give option to force launch
/obj/machinery/computer/shuttle_control/proc/check_docking(datum/shuttle/multi_shuttle/MS)
if(MS.skip_docking_checks() || MS.docking_controller.can_launch())
return 1
var/choice = alert("The shuttle is currently docked! Please undock before continuing.","Error","Cancel","Force Launch")
if(choice == "Cancel")
return 0
choice = alert("Forcing a shuttle launch while docked may result in severe injury, death and/or damage to property. Are you sure you wish to continue?", "Force Launch", "Force Launch", "Cancel")
if(choice == "Cancel")
return 0
return 1
/obj/machinery/computer/shuttle_control/multi/Topic(href, href_list)
if(..())
return 1
usr.set_machine(src)
src.add_fingerprint(usr)
var/datum/shuttle/multi_shuttle/MS = shuttle_controller.shuttles[shuttle_tag]
if(!istype(MS)) return
//to_world("multi_shuttle: last_departed=[MS.last_departed], origin=[MS.origin], interim=[MS.interim], travel_time=[MS.move_time]")
if(href_list["refresh"])
updateUsrDialog()
return
if (MS.moving_status != SHUTTLE_IDLE)
to_chat(usr, "[shuttle_tag] vessel is moving.")
return
if(href_list["dock_command"])
MS.dock()
return
if(href_list["undock_command"])
MS.undock()
return
if(href_list["start"])
if(MS.at_origin)
to_chat(usr, "You are already at the home base.")
return
if((MS.last_move + MS.cooldown*10) > world.time)
to_chat(usr, "The ship's drive is inoperable while the engines are charging.")
return
if(!check_docking(MS))
updateUsrDialog()
return
if(!MS.return_warning && !MS.legit) //VOREStation Add - Criminals only!
to_chat(usr, "Returning to your home base will end your mission. If you are sure, press the button again.")
//TODO: Actually end the mission.
MS.return_warning = 1
return
//VOREStation Add - Only long-jump if that's a thing you do
if(MS.interim)
MS.long_jump(MS.last_departed, MS.origin, MS.interim, MS.move_time)
else
MS.short_jump(MS.last_departed, MS.origin)
//VOREStation Add End
// No point giving a warning if it does literally nothing.
// if(!MS.return_warning)
// to_chat(usr, "Returning to your home base will end your mission. If you are sure, press the button again.")
// //TODO: Actually end the mission.
// MS.return_warning = 1
// return
//MS.long_jump(MS.last_departed, MS.origin, MS.interim, MS.move_time) //VOREStation Edit
MS.last_departed = MS.origin
MS.last_location = MS.start_location
MS.at_origin = 1
if(href_list["toggle_cloak"])
if(!MS.can_cloak)
return
MS.cloaked = !MS.cloaked
to_chat(usr, " Ship [MS.legit ? "ATC inhibitor":"stealth"] systems have been [(MS.cloaked ? "activated. The station will not" : "deactivated. The station will")] be [MS.legit ? "notified":"warned"] of our arrival.") //VOREStation Edit - Adds legit shuttles.
//to_chat(usr, "Ship stealth systems have been [(MS.cloaked ? "activated. The station will not" : "deactivated. The station will")] be warned of our arrival.") //VOREStation Edit.
if(href_list["move_multi"])
if((MS.last_move + MS.cooldown*10) > world.time)
to_chat(usr, "The ship's drive is inoperable while the engines are charging.")
return
if(!check_docking(MS))
updateUsrDialog()
return
var/choice = input("Select a destination.") as null|anything in MS.destinations
if(!choice) return
to_chat(usr, "[shuttle_tag] main computer received message.")
if(MS.at_origin)
MS.announce_arrival()
MS.last_departed = MS.origin
MS.at_origin = 0
//VOREStation Add - Only long-jump if that's a thing you do
if(MS.interim)
MS.long_jump(MS.last_departed, MS.destinations[choice], MS.interim, MS.move_time)
else
MS.short_jump(MS.last_departed, MS.destinations[choice])
//VOREStation Add End
MS.last_departed = MS.destinations[choice]
MS.last_location = choice
return
else if(choice == MS.origin)
MS.announce_departure()
//VOREStation Add - Only long-jump if that's a thing you do
if(MS.interim)
MS.long_jump(MS.last_departed, MS.destinations[choice], MS.interim, MS.move_time)
else
MS.short_jump(MS.last_departed, MS.destinations[choice])
return
//VOREStation Add End
//VOREStation Add - Only long-jump if that's a thing you do
if(MS.interim)
MS.long_jump(MS.last_departed, MS.destinations[choice], MS.interim, MS.move_time)
else
MS.short_jump(MS.last_departed, MS.destinations[choice])
//VOREStation Add End
//MS.short_jump(MS.last_departed, MS.destinations[choice]) //VOREStation Removal
MS.last_departed = MS.destinations[choice]
MS.last_location = choice
updateUsrDialog()