Web Shuttle Update

Adds autopilot functionality for shuttle one and shuttle two. It can be enabled and disabled by the flight computer.
Autopilot is active by default on both shuttles. The shuttle waits for two minutes when it reaches the outpost or station, except for the first flight, where it waits for about ten minutes, which should be plenty of time for people to get on and for the pilot to turn it off if one exists.
Adds renaming feature to all shuttles.
Ports /tg/'s 'shuttle warning' effect, which adds a bunch of blue circles where a ship is about to land, which should prevent surprise shuttle crushes if paying attention.
Flight times for all routes are cut in half to act as the bonus for flying manually. Automatic flight takes twice as long, and so it will take the current amount of time.
Makes Ninja shuttle faster because Nippen steal.
Does some cleanup with temporary effects.
This commit is contained in:
Neerti
2018-01-14 14:03:58 -05:00
parent cd298b1575
commit d0d6689263
20 changed files with 478 additions and 113 deletions

View File

@@ -8,8 +8,12 @@ var/global/datum/shuttle_controller/shuttle_controller
/datum/shuttle_controller/proc/process() /datum/shuttle_controller/proc/process()
//process ferry shuttles //process ferry shuttles
for (var/datum/shuttle/ferry/shuttle in process_shuttles) for (var/datum/shuttle/shuttle in process_shuttles)
if (shuttle.process_state || shuttle.always_process) if(istype(shuttle, /datum/shuttle/ferry))
var/datum/shuttle/ferry/F = shuttle
if(F.process_state || F.always_process)
F.process()
else
shuttle.process() shuttle.process()

View File

@@ -25,5 +25,6 @@
/obj/effect/temporary_effect/darkness /obj/effect/temporary_effect/darkness
name = "darkness" name = "darkness"
time_to_die = 2 MINUTES time_to_die = 2 MINUTES
new_light_range = 6 invisibility = 101
new_light_power = -20 light_range = 6
light_power = -20

View File

@@ -26,13 +26,11 @@
/obj/effect/temporary_effect/destablize /obj/effect/temporary_effect/destablize
name = "destablizing disturbance" name = "destablizing disturbance"
desc = "This can't be good..." desc = "This can't be good..."
icon = 'icons/effects/effects.dmi'
icon_state = "blueshatter" icon_state = "blueshatter"
time_to_die = null time_to_die = null
invisibility = 0 light_range = 6
new_light_range = 6 light_power = 20
new_light_power = 20 light_color = "#C26DDE"
new_light_color = "#C26DDE"
var/pulses_remaining = 40 // Lasts 20 seconds. var/pulses_remaining = 40 // Lasts 20 seconds.
var/instability_power = 5 var/instability_power = 5
var/instability_range = 6 var/instability_range = 6

View File

@@ -22,13 +22,11 @@
/obj/effect/temporary_effect/fire_blast /obj/effect/temporary_effect/fire_blast
name = "fire blast" name = "fire blast"
desc = "Run!" desc = "Run!"
icon = 'icons/effects/effects.dmi'
icon_state = "at_shield1" icon_state = "at_shield1"
time_to_die = 2.5 SECONDS // After which we go boom. time_to_die = 2.5 SECONDS // After which we go boom.
invisibility = 0 light_range = 4
new_light_range = 4 light_power = 5
new_light_power = 5 light_color = "#FF6A00"
new_light_color = "#FF6A00"
/obj/effect/temporary_effect/fire_blast/Destroy() /obj/effect/temporary_effect/fire_blast/Destroy()
explosion(get_turf(src), -1, 1, 2, 5, adminlog = 1) explosion(get_turf(src), -1, 1, 2, 5, adminlog = 1)

View File

@@ -28,13 +28,11 @@
/obj/effect/temporary_effect/pulsar /obj/effect/temporary_effect/pulsar
name = "pulsar" name = "pulsar"
desc = "Not a real pulsar, but still emits loads of EMP." desc = "Not a real pulsar, but still emits loads of EMP."
icon = 'icons/effects/effects.dmi'
icon_state = "shield2" icon_state = "shield2"
time_to_die = null time_to_die = null
invisibility = 0 light_range = 4
new_light_range = 4 light_power = 5
new_light_power = 5 light_color = "#2ECCFA"
new_light_color = "#2ECCFA"
var/pulses_remaining = 3 var/pulses_remaining = 3
/obj/effect/temporary_effect/pulsar/New() /obj/effect/temporary_effect/pulsar/New()

View File

@@ -6,22 +6,6 @@
aspect = null aspect = null
var/obj/effect/spawner_type = null var/obj/effect/spawner_type = null
/obj/effect/temporary_effect
name = "self deleting effect"
desc = "How are you examining what which cannot be seen?"
invisibility = 101
var/time_to_die = 10 SECONDS // Afer which, it will delete itself.
var/new_light_range = 6
var/new_light_power = 6
var/new_light_color = "#FFFFFF"
/obj/effect/temporary_effect/New()
..()
set_light(new_light_range, new_light_power, l_color = new_light_color)
if(time_to_die)
spawn(time_to_die)
qdel(src)
/obj/item/weapon/spell/spawner/on_ranged_cast(atom/hit_atom, mob/user) /obj/item/weapon/spell/spawner/on_ranged_cast(atom/hit_atom, mob/user)
var/turf/T = get_turf(hit_atom) var/turf/T = get_turf(hit_atom)
if(T) if(T)

View File

@@ -7,6 +7,19 @@
density = 1 density = 1
anchored = 0 anchored = 0
/obj/effect/temporary_effect
name = "self deleting effect"
desc = "How are you examining what which cannot be seen?"
icon = 'icons/effects/effects.dmi'
invisibility = 0
var/time_to_die = 10 SECONDS // Afer which, it will delete itself.
/obj/effect/temporary_effect/New()
..()
if(time_to_die)
spawn(time_to_die)
qdel(src)
// Shown really briefly when attacking with axes. // Shown really briefly when attacking with axes.
/obj/effect/temporary_effect/cleave_attack /obj/effect/temporary_effect/cleave_attack
name = "cleaving attack" name = "cleaving attack"
@@ -16,12 +29,19 @@
layer = 6 layer = 6
time_to_die = 6 time_to_die = 6
alpha = 140 alpha = 140
invisibility = 0
mouse_opacity = 0 mouse_opacity = 0
new_light_range = 0
new_light_power = 0
pixel_x = -32 pixel_x = -32
pixel_y = -32 pixel_y = -32
/obj/effect/temporary_effect/cleave_attack/initialize() // Makes the slash fade smoothly. When completely transparent it should qdel itself. /obj/effect/temporary_effect/cleave_attack/initialize() // Makes the slash fade smoothly. When completely transparent it should qdel itself.
animate(src, alpha = 0, time = time_to_die - 1) animate(src, alpha = 0, time = time_to_die - 1)
/obj/effect/temporary_effect/shuttle_landing
name = "shuttle landing"
desc = "You better move if you don't want to go splat!"
icon_state = "shuttle_warning_still"
time_to_die = 4.9 SECONDS
/obj/effect/temporary_effect/shuttle_landing/initialize()
flick("shuttle_warning", src) // flick() forces the animation to always begin at the start.
..()

View File

@@ -281,15 +281,11 @@ var/list/blobs = list()
/obj/effect/temporary_effect/blob_attack /obj/effect/temporary_effect/blob_attack
name = "blob" name = "blob"
desc = "The blob lashing out at something." desc = "The blob lashing out at something."
icon = 'icons/effects/effects.dmi'
icon_state = "blob_attack" icon_state = "blob_attack"
layer = 5.2 layer = 5.2
time_to_die = 6 time_to_die = 6
alpha = 140 alpha = 140
invisibility = 0
mouse_opacity = 0 mouse_opacity = 0
new_light_range = 0
new_light_power = 0
/obj/structure/grille/blob_act() /obj/structure/grille/blob_act()
qdel(src) qdel(src)

View File

@@ -37,12 +37,20 @@
supply_controller.shuttle = null supply_controller.shuttle = null
. = ..() . = ..()
/datum/shuttle/proc/process()
return
/datum/shuttle/proc/init_docking_controllers() /datum/shuttle/proc/init_docking_controllers()
if(docking_controller_tag) if(docking_controller_tag)
docking_controller = locate(docking_controller_tag) docking_controller = locate(docking_controller_tag)
if(!istype(docking_controller)) if(!istype(docking_controller))
world << "<span class='danger'>warning: shuttle with docking tag [docking_controller_tag] could not find it's controller!</span>" world << "<span class='danger'>warning: shuttle with docking tag [docking_controller_tag] could not find it's controller!</span>"
// This creates a graphical warning to where the shuttle is about to land, in approximately five seconds.
/datum/shuttle/proc/create_warning_effect(area/landing_area)
for(var/turf/T in landing_area)
new /obj/effect/temporary_effect/shuttle_landing(T) // It'll delete itself when needed.
// Return false to abort a jump, before the 'warmup' phase. // Return false to abort a jump, before the 'warmup' phase.
/datum/shuttle/proc/pre_warmup_checks() /datum/shuttle/proc/pre_warmup_checks()
return TRUE return TRUE
@@ -70,6 +78,7 @@
spawn(warmup_time*10) spawn(warmup_time*10)
make_sounds(origin, HYPERSPACE_WARMUP) make_sounds(origin, HYPERSPACE_WARMUP)
create_warning_effect(destination)
sleep(5 SECONDS) // so the sound finishes. sleep(5 SECONDS) // so the sound finishes.
if(!post_warmup_checks()) if(!post_warmup_checks())
@@ -102,6 +111,7 @@
spawn(warmup_time*10) spawn(warmup_time*10)
make_sounds(departing, HYPERSPACE_WARMUP) make_sounds(departing, HYPERSPACE_WARMUP)
create_warning_effect(interim) // Really doubt someone is gonna get crushed in the interim area but for completeness's sake we'll make the warning.
sleep(5 SECONDS) // so the sound finishes. sleep(5 SECONDS) // so the sound finishes.
if(!post_warmup_checks()) if(!post_warmup_checks())
@@ -122,11 +132,16 @@
move(departing, interim, direction) move(departing, interim, direction)
var/last_progress_sound = 0 var/last_progress_sound = 0
var/made_warning = FALSE
while (world.time < arrive_time) while (world.time < arrive_time)
// Make the shuttle make sounds every four seconds, since the sound file is five seconds. // Make the shuttle make sounds every four seconds, since the sound file is five seconds.
if(last_progress_sound + 4 SECONDS < world.time) if(last_progress_sound + 4 SECONDS < world.time)
make_sounds(interim, HYPERSPACE_PROGRESS) make_sounds(interim, HYPERSPACE_PROGRESS)
last_progress_sound = world.time last_progress_sound = world.time
if(arrive_time - world.time <= 5 SECONDS && !made_warning)
made_warning = TRUE
create_warning_effect(destination)
sleep(5) sleep(5)
move(interim, destination, direction) move(interim, destination, direction)

View File

@@ -57,9 +57,9 @@
..() // Do everything else ..() // Do everything else
/datum/shuttle/ferry/arrivals/proc/message_passengers(area/A, var/message) /datum/shuttle/proc/message_passengers(area/A, var/message)
for(var/mob/M in A) for(var/mob/M in A)
to_chat(M, message) M.show_message(message, 2)
/* /*
/datum/shuttle/ferry/arrivals/current_dock_target() /datum/shuttle/ferry/arrivals/current_dock_target()

View File

@@ -76,7 +76,7 @@
Please ensure that long_jump() and short_jump() are only called from here. This applies to subtypes as well. Please ensure that long_jump() and short_jump() are only called from here. This applies to subtypes as well.
Doing so will ensure that multiple jumps cannot be initiated in parallel. Doing so will ensure that multiple jumps cannot be initiated in parallel.
*/ */
/datum/shuttle/ferry/proc/process() /datum/shuttle/ferry/process()
switch(process_state) switch(process_state)
if (WAIT_LAUNCH) if (WAIT_LAUNCH)
if (skip_docking_checks() || docking_controller.can_launch()) if (skip_docking_checks() || docking_controller.can_launch())

View File

@@ -1,20 +1,32 @@
//This shuttle traverses a "web" of route_datums to have a wider range of places to go and make flying feel like movement is actually occuring. //This shuttle traverses a "web" of route_datums to have a wider range of places to go and make flying feel like movement is actually occuring.
/datum/shuttle/web_shuttle /datum/shuttle/web_shuttle
flags = SHUTTLE_FLAGS_NONE flags = SHUTTLE_FLAGS_NONE
var/visible_name = null // The pretty name shown to people in announcements, since the regular name var is used internally for other things.
var/cloaked = FALSE var/cloaked = FALSE
var/can_cloak = FALSE var/can_cloak = FALSE
var/cooldown = 5 SECONDS var/cooldown = 0
var/last_move = 0 //the time at which we last moved var/last_move = 0 //the time at which we last moved
var/area/current_area = null var/area/current_area = null
var/datum/shuttle_web_master/web_master = null var/datum/shuttle_web_master/web_master = null
var/web_master_type = null var/web_master_type = null
var/flight_time_modifier = 1.0 var/flight_time_modifier = 1.0
var/autopilot = FALSE
var/can_autopilot = FALSE
var/autopilot_delay = 60 // How many ticks to not do anything when not following an autopath. Should equal two minutes.
var/autopilot_first_delay = null // If your want your shuttle to stay for a different amount of time for the first time, set this.
var/can_rename = TRUE // Lets the pilot rename the shuttle. Only available once.
category = /datum/shuttle/web_shuttle category = /datum/shuttle/web_shuttle
/datum/shuttle/web_shuttle/New() /datum/shuttle/web_shuttle/New()
current_area = locate(current_area) current_area = locate(current_area)
web_master = new web_master_type(src) web_master = new web_master_type(src)
build_destinations() build_destinations()
if(autopilot)
flags |= SHUTTLE_FLAGS_PROCESS
if(autopilot_first_delay)
autopilot_delay = autopilot_first_delay
if(!visible_name)
visible_name = name
..() ..()
/datum/shuttle/web_shuttle/Destroy() /datum/shuttle/web_shuttle/Destroy()
@@ -39,6 +51,78 @@
/datum/shuttle/web_shuttle/proc/build_destinations() /datum/shuttle/web_shuttle/proc/build_destinations()
return return
/datum/shuttle/web_shuttle/process()
if(moving_status == SHUTTLE_IDLE)
if(web_master.autopath) // We're currently flying a path.
autopilot_say("Continuing route.")
web_master.process_autopath()
else // Otherwise we are about to start one or just finished one.
if(autopilot_delay > 0) // Wait for awhile so people can get on and off.
if(docking_controller && !skip_docking_checks()) // Dock to the destination if possible.
var/docking_status = docking_controller.get_docking_status()
if(docking_status == "undocked")
dock()
autopilot_say("Docking.")
return
else if(docking_status == "docking")
return // Give it a few more ticks to finish docking.
if(autopilot_delay % 10 == 0) // Every ten ticks.
var/seconds_left = autopilot_delay * 2
if(seconds_left >= 60) // A minute
var/minutes_left = Floor(seconds_left / 60)
seconds_left = seconds_left % 60
autopilot_say("Departing in [minutes_left] minute\s[seconds_left ? ", [seconds_left] seconds":""].")
else
autopilot_say("Departing in [seconds_left] seconds.")
autopilot_delay--
else // Time to go.
if(docking_controller && !skip_docking_checks()) // Undock if possible.
var/docking_status = docking_controller.get_docking_status()
if(docking_status == "docked")
undock()
autopilot_say("Undocking.")
return
else if(docking_status == "undocking")
return // Give it a few more ticks to finish undocking.
autopilot_delay = initial(autopilot_delay)
autopilot_say("Taking off.")
web_master.process_autopath()
/datum/shuttle/web_shuttle/proc/adjust_autopilot(on)
if(on)
if(autopilot)
return
autopilot = TRUE
autopilot_delay = initial(autopilot_delay)
shuttle_controller.process_shuttles += src
else
if(!autopilot)
return
autopilot = FALSE
shuttle_controller.process_shuttles -= src
/datum/shuttle/web_shuttle/proc/autopilot_say(message) // Makes the autopilot 'talk' to the passengers.
var/padded_message = "<span class='game say'><span class='name'>shuttle autopilot</span> states, \"[message]\"</span>"
message_passengers(current_area, padded_message)
/datum/shuttle/web_shuttle/proc/rename_shuttle(mob/user)
if(!can_rename)
to_chat(user, "<span class='warning'>You can't rename this vessel.</span>")
return
var/new_name = input(user, "Please enter a new name for this vessel. Note that you can only set its name once, so choose wisely.", "Rename Shuttle", visible_name) as null|text
var/sanitized_name = sanitizeName(new_name, MAX_NAME_LEN, TRUE)
if(sanitized_name)
can_rename = FALSE
to_chat(user, "<span class='notice'>You've renamed the vessel to '[sanitized_name]'.</span>")
message_admins("[key_name_admin(user)] renamed shuttle '[visible_name]' to '[sanitized_name]'.")
visible_name = sanitized_name
else
to_chat(user, "<span class='warning'>The name you supplied was invalid. Try another name.</span>")
/obj/machinery/computer/shuttle_control/web /obj/machinery/computer/shuttle_control/web
name = "flight computer" name = "flight computer"
icon_state = "flightcomp_center" icon_state = "flightcomp_center"
@@ -174,13 +258,16 @@
"travel_progress" = between(0, percent_finished, 100), "travel_progress" = between(0, percent_finished, 100),
"time_left" = round( (total_time - elapsed_time) / 10), "time_left" = round( (total_time - elapsed_time) / 10),
"can_cloak" = shuttle.can_cloak ? 1 : 0, "can_cloak" = shuttle.can_cloak ? 1 : 0,
"cloaked" = shuttle.cloaked ? 1 : 0 "cloaked" = shuttle.cloaked ? 1 : 0,
"can_autopilot" = shuttle.can_autopilot ? 1 : 0,
"autopilot" = shuttle.autopilot ? 1 : 0,
"can_rename" = shuttle.can_rename ? 1 : 0
) )
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if(!ui) if(!ui)
ui = new(user, src, ui_key, "flight.tmpl", "[shuttle_tag] Flight Computer", 470, 500) ui = new(user, src, ui_key, "flight.tmpl", "[shuttle.visible_name] Flight Computer", 470, 500)
ui.set_initial_data(data) ui.set_initial_data(data)
ui.open() ui.open()
ui.set_auto_update(1) ui.set_auto_update(1)
@@ -202,13 +289,22 @@
ui_interact(usr) ui_interact(usr)
if (WS.moving_status != SHUTTLE_IDLE) if (WS.moving_status != SHUTTLE_IDLE)
usr << "<font color='blue'>[shuttle_tag] vessel is busy moving.</font>" usr << "<font color='blue'>[WS.visible_name] is busy moving.</font>"
return return
if(href_list["rename_command"])
WS.rename_shuttle(usr)
if(href_list["dock_command"]) if(href_list["dock_command"])
if(WS.autopilot)
to_chat(usr, "<span class='warning'>The autopilot must be disabled before you can control the vessel manually.</span>")
return
WS.dock() WS.dock()
if(href_list["undock_command"]) if(href_list["undock_command"])
if(WS.autopilot)
to_chat(usr, "<span class='warning'>The autopilot must be disabled before you can control the vessel manually.</span>")
return
WS.undock() WS.undock()
if(href_list["cloak_command"]) if(href_list["cloak_command"])
@@ -223,7 +319,17 @@
WS.cloaked = FALSE WS.cloaked = FALSE
to_chat(usr, "<span class='danger'>Ship stealth systems have been deactivated. The station will be warned of our arrival.</span>") to_chat(usr, "<span class='danger'>Ship stealth systems have been deactivated. The station will be warned of our arrival.</span>")
if(href_list["autopilot_on_command"])
WS.adjust_autopilot(TRUE)
if(href_list["autopilot_off_command"])
WS.adjust_autopilot(FALSE)
if(href_list["traverse"]) if(href_list["traverse"])
if(WS.autopilot)
to_chat(usr, "<span class='warning'>The autopilot must be disabled before you can control the vessel manually.</span>")
return
if((WS.last_move + WS.cooldown) > world.time) if((WS.last_move + WS.cooldown) > world.time)
usr << "<font color='red'>The ship's drive is inoperable while the engines are charging.</font>" usr << "<font color='red'>The ship's drive is inoperable while the engines are charging.</font>"
return return
@@ -245,7 +351,8 @@
return return
WS.web_master.future_destination = target_destination WS.web_master.future_destination = target_destination
to_chat(usr, "<span class='notice'>[shuttle_tag] flight computer received command.</span>") to_chat(usr, "<span class='notice'>[WS.visible_name] flight computer received command.</span>")
WS.web_master.reset_autopath() // Deviating from the path will almost certainly confuse the autopilot, so lets just reset its memory.
var/travel_time = new_route.travel_time * WS.flight_time_modifier var/travel_time = new_route.travel_time * WS.flight_time_modifier

View File

@@ -1,4 +1,8 @@
// This file actually has three seperate datums. // This file actually has four seperate datums.
/**********
* Routes *
**********/
// This is the first datum, and it connects shuttle_destinations together. // This is the first datum, and it connects shuttle_destinations together.
/datum/shuttle_route /datum/shuttle_route
@@ -39,6 +43,10 @@
return target.name return target.name
/****************
* Destinations *
****************/
// This is the second datum, and contains information on all the potential destinations for a specific shuttle. // This is the second datum, and contains information on all the potential destinations for a specific shuttle.
/datum/shuttle_destination /datum/shuttle_destination
var/name = "a place" // Name of the destination, used for the flight computer. var/name = "a place" // Name of the destination, used for the flight computer.
@@ -50,8 +58,8 @@
var/dock_target = null // The tag_id that the shuttle will use to try to dock to the destination, if able. var/dock_target = null // The tag_id that the shuttle will use to try to dock to the destination, if able.
var/announcer = null // The name of the 'announcer' that will say the arrival/departure messages. Defaults to the map's boss name if blank. var/announcer = null // The name of the 'announcer' that will say the arrival/departure messages. Defaults to the map's boss name if blank.
var/arrival_message = null // Message said if the ship enters this destination. Not announced if the ship is cloaked. // var/arrival_message = null // Message said if the ship enters this destination. Not announced if the ship is cloaked.
var/departure_message = null // Message said if the ship exits this destination. Not announced if the ship is cloaked. // var/departure_message = null // Message said if the ship exits this destination. Not announced if the ship is cloaked.
// When this destination is instantiated, it will go and instantiate other destinations in this assoc list and build routes between them. // When this destination is instantiated, it will go and instantiate other destinations in this assoc list and build routes between them.
// The list format is '/datum/shuttle_destination/subtype = 1 MINUTES' // The list format is '/datum/shuttle_destination/subtype = 1 MINUTES'
@@ -101,18 +109,23 @@
/datum/shuttle_destination/proc/exit(var/datum/shuttle_destination/new_destination) /datum/shuttle_destination/proc/exit(var/datum/shuttle_destination/new_destination)
announce_departure() announce_departure()
/datum/shuttle_destination/proc/get_departure_message()
return null
/datum/shuttle_destination/proc/announce_departure() /datum/shuttle_destination/proc/announce_departure()
if(isnull(departure_message) || master.my_shuttle.cloaked) if(isnull(get_departure_message()) || master.my_shuttle.cloaked)
return return
command_announcement.Announce(departure_message,(announcer ? announcer : "[using_map.boss_name]")) command_announcement.Announce(get_departure_message(),(announcer ? announcer : "[using_map.boss_name]"))
/datum/shuttle_destination/proc/get_arrival_message()
return null
/datum/shuttle_destination/proc/announce_arrival() /datum/shuttle_destination/proc/announce_arrival()
if(isnull(arrival_message) || master.my_shuttle.cloaked) if(isnull(get_arrival_message()) || master.my_shuttle.cloaked)
return return
command_announcement.Announce(arrival_message,(announcer ? announcer : "[using_map.boss_name]")) command_announcement.Announce(get_arrival_message(),(announcer ? announcer : "[using_map.boss_name]"))
/datum/shuttle_destination/proc/link_destinations(var/datum/shuttle_destination/other_place, var/area/interim_area, var/travel_time = 0) /datum/shuttle_destination/proc/link_destinations(var/datum/shuttle_destination/other_place, var/area/interim_area, var/travel_time = 0)
// First, check to make sure this doesn't cause a duplicate route. // First, check to make sure this doesn't cause a duplicate route.
@@ -131,6 +144,17 @@
/datum/shuttle_destination/proc/flight_failure() /datum/shuttle_destination/proc/flight_failure()
return return
// Returns a /datum/shuttle_route connecting this destination to origin, if one exists.
/datum/shuttle_destination/proc/get_route_to(origin_type)
for(var/datum/shuttle_route/R in routes)
if(R.start.type == origin_type || R.end.type == origin_type)
return R
return null
/***************
* Web Masters *
***************/
// This is the third and final datum, which coordinates with the shuttle datum to tell it where it is, where it can go, and how long it will take. // This is the third and final datum, which coordinates with the shuttle datum to tell it where it is, where it can go, and how long it will take.
// It is also responsible for instancing all the destinations it has control over, and linking them together. // It is also responsible for instancing all the destinations it has control over, and linking them together.
/datum/shuttle_web_master /datum/shuttle_web_master
@@ -141,12 +165,17 @@
var/list/destinations = list() // List of currently instanced destinations. var/list/destinations = list() // List of currently instanced destinations.
var/destination_class = null // Type to use in typesof(), to build destinations. var/destination_class = null // Type to use in typesof(), to build destinations.
var/datum/shuttle_autopath/autopath = null // Datum used to direct an autopilot.
var/list/autopaths = list() // Potential autopaths the autopilot can use. The autopath's start var must equal current_destination to be viable.
var/autopath_class = null // Similar to destination_class, used for typesof().
/datum/shuttle_web_master/New(var/new_shuttle, var/new_destination_class = null) /datum/shuttle_web_master/New(var/new_shuttle, var/new_destination_class = null)
my_shuttle = new_shuttle my_shuttle = new_shuttle
if(new_destination_class) if(new_destination_class)
destination_class = new_destination_class destination_class = new_destination_class
build_destinations() build_destinations()
current_destination = get_destination_by_type(starting_destination) current_destination = get_destination_by_type(starting_destination)
build_autopaths()
/datum/shuttle_web_master/Destroy() /datum/shuttle_web_master/Destroy()
my_shuttle = null my_shuttle = null
@@ -189,4 +218,84 @@
return current_destination return current_destination
/datum/shuttle_web_master/proc/get_destination_by_type(var/type_to_get) /datum/shuttle_web_master/proc/get_destination_by_type(var/type_to_get)
return locate(type_to_get) in destinations return locate(type_to_get) in destinations
// Autopilot stuff.
/datum/shuttle_web_master/proc/build_autopaths()
init_subtypes(autopath_class, autopaths)
for(var/datum/shuttle_autopath/P in autopaths)
P.master = src
/datum/shuttle_web_master/proc/choose_path()
if(!autopaths.len)
return
for(var/datum/shuttle_autopath/path in autopaths)
if(path.start == current_destination.type)
autopath = path
break
/datum/shuttle_web_master/proc/path_finished(datum/shuttle_autopath/path)
autopath = null
/datum/shuttle_web_master/proc/walk_path(target_type)
var/datum/shuttle_route/R = current_destination.get_route_to(target_type)
if(!R)
return FALSE
future_destination = R.get_other_side(current_destination)
var/travel_time = R.travel_time * my_shuttle.flight_time_modifier * 2 // Autopilot is less efficent than having someone flying manually.
if(R.interim && R.travel_time > 0)
my_shuttle.long_jump(my_shuttle.current_area, future_destination.my_area, R.interim, travel_time / 10)
else
my_shuttle.short_jump(my_shuttle.current_area, future_destination.my_area)
return TRUE // Note this will return before the shuttle actually arrives.
/datum/shuttle_web_master/proc/process_autopath()
if(!autopath) // If we don't have a path, get one.
if(!autopaths.len)
return
choose_path()
if(!autopath) // Still nothing, oh well.
return
var/datum/shuttle_destination/target = autopath.get_next_node()
if(walk_path(target))
autopath.walk_path()
// Call this to reset everything related to autopiloting.
/datum/shuttle_web_master/proc/reset_autopath()
autopath = null
my_shuttle.autopilot = FALSE
/*************
* Autopaths *
*************/
// Fourth datum, this one essentially acts as directions for an autopilot to go to the correct places.
/datum/shuttle_autopath
var/datum/shuttle_web_master/master = null
var/datum/shuttle_destination/start = null
var/list/path_nodes = list()
var/index = 1
/datum/shuttle_autopath/Destroy()
master = null
return ..()
/datum/shuttle_autopath/proc/reset_path()
index = 1
/datum/shuttle_autopath/proc/get_next_node()
return path_nodes[index]
/datum/shuttle_autopath/proc/walk_path()
index++
if(index > path_nodes.len)
finish_path()
/datum/shuttle_autopath/proc/finish_path()
reset_path()
master.path_finished(src)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 KiB

After

Width:  |  Height:  |  Size: 387 KiB

View File

@@ -10,11 +10,36 @@
current_area = /area/shuttle/shuttle1/start current_area = /area/shuttle/shuttle1/start
docking_controller_tag = "shuttle1_shuttle" docking_controller_tag = "shuttle1_shuttle"
web_master_type = /datum/shuttle_web_master/shuttle1 web_master_type = /datum/shuttle_web_master/shuttle1
autopilot = TRUE
can_autopilot = TRUE
autopilot_delay = 60
autopilot_first_delay = 300 // Ten minutes at roundstart. Two minutes otherwise.
/datum/shuttle_web_master/shuttle1 /datum/shuttle_web_master/shuttle1
destination_class = /datum/shuttle_destination/shuttle1 destination_class = /datum/shuttle_destination/shuttle1
autopath_class = /datum/shuttle_autopath/shuttle1
starting_destination = /datum/shuttle_destination/shuttle1/root starting_destination = /datum/shuttle_destination/shuttle1/root
/datum/shuttle_autopath/shuttle1/to_outpost
start = /datum/shuttle_destination/shuttle1/root
path_nodes = list(
/datum/shuttle_destination/shuttle1/outside_SC,
/datum/shuttle_destination/shuttle1/sif_orbit,
/datum/shuttle_destination/shuttle1/sky,
/datum/shuttle_destination/shuttle1/main_base
)
/datum/shuttle_autopath/shuttle1/to_home
start = /datum/shuttle_destination/shuttle1/main_base
path_nodes = list(
/datum/shuttle_destination/shuttle1/sky,
/datum/shuttle_destination/shuttle1/sif_orbit,
/datum/shuttle_destination/shuttle1/outside_SC,
/datum/shuttle_destination/shuttle1/root
)
//Shuttle 2 //Shuttle 2
/obj/machinery/computer/shuttle_control/web/shuttle2 /obj/machinery/computer/shuttle_control/web/shuttle2
@@ -27,11 +52,38 @@
current_area = /area/shuttle/shuttle2/start current_area = /area/shuttle/shuttle2/start
docking_controller_tag = "shuttle2_shuttle" docking_controller_tag = "shuttle2_shuttle"
web_master_type = /datum/shuttle_web_master/shuttle2 web_master_type = /datum/shuttle_web_master/shuttle2
autopilot = TRUE
can_autopilot = TRUE
autopilot_delay = 60
autopilot_first_delay = 380 // Twelve and a half minutes at roundstart. Two minutes otherwise. This should leave when the first shuttle arrives at the outpost.
/datum/shuttle_web_master/shuttle2 /datum/shuttle_web_master/shuttle2
destination_class = /datum/shuttle_destination/shuttle2 destination_class = /datum/shuttle_destination/shuttle2
autopath_class = /datum/shuttle_autopath/shuttle2
starting_destination = /datum/shuttle_destination/shuttle2/root starting_destination = /datum/shuttle_destination/shuttle2/root
/datum/shuttle_autopath/shuttle2/to_outpost
start = /datum/shuttle_destination/shuttle2/root
path_nodes = list(
/datum/shuttle_destination/shuttle2/outside_SC,
/datum/shuttle_destination/shuttle2/sif_orbit,
/datum/shuttle_destination/shuttle2/sky,
/datum/shuttle_destination/shuttle2/main_base
)
/datum/shuttle_autopath/shuttle2/to_home
start = /datum/shuttle_destination/shuttle2/main_base
path_nodes = list(
/datum/shuttle_destination/shuttle2/sky,
/datum/shuttle_destination/shuttle2/sif_orbit,
/datum/shuttle_destination/shuttle2/outside_SC,
/datum/shuttle_destination/shuttle2/root
)
/datum/shuttle_destination/shuttle1/root /datum/shuttle_destination/shuttle1/root
name = "Southern Cross Hangar One" name = "Southern Cross Hangar One"
my_area = /area/shuttle/shuttle1/start my_area = /area/shuttle/shuttle1/start
@@ -39,13 +91,17 @@
dock_target = "hangar_1" dock_target = "hangar_1"
announcer = "Southern Cross Docking Computer" announcer = "Southern Cross Docking Computer"
arrival_message = "Attention, shuttle one has arrived to Hangar One."
departure_message = "Attention, shuttle one has departed Hangar One."
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/shuttle1/outside_SC = 0, /datum/shuttle_destination/shuttle1/outside_SC = 0,
) )
/datum/shuttle_destination/shuttle1/root/get_arrival_message()
return "Attention, [master.my_shuttle.visible_name] has arrived to Hangar One."
/datum/shuttle_destination/shuttle1/root/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed Hangar One."
/datum/shuttle_destination/shuttle2/root /datum/shuttle_destination/shuttle2/root
name = "Southern Cross Hangar Two" name = "Southern Cross Hangar Two"
my_area = /area/shuttle/shuttle2/start my_area = /area/shuttle/shuttle2/start
@@ -53,13 +109,17 @@
dock_target = "hangar_2" dock_target = "hangar_2"
announcer = "Southern Cross Docking Computer" announcer = "Southern Cross Docking Computer"
arrival_message = "Attention, shuttle two has arrived to Hangar Two."
departure_message = "Attention, shuttle two has departed Hangar Two."
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/shuttle2/outside_SC = 0, /datum/shuttle_destination/shuttle2/outside_SC = 0,
) )
/datum/shuttle_destination/shuttle2/root/get_arrival_message()
return "Attention, [master.my_shuttle.visible_name] has arrived to Hangar Two."
/datum/shuttle_destination/shuttle2/root/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed Hangar Two."
/datum/shuttle_destination/shuttle1/outside_SC /datum/shuttle_destination/shuttle1/outside_SC
name = "Outside of NLS Southern Cross" name = "Outside of NLS Southern Cross"
@@ -67,7 +127,7 @@
preferred_interim_area = /area/shuttle/shuttle1/transit preferred_interim_area = /area/shuttle/shuttle1/transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/shuttle1/sif_orbit = 1 MINUTE, /datum/shuttle_destination/shuttle1/sif_orbit = 30 SECONDS,
/datum/shuttle_destination/shuttle1/docked_SC = 0 /datum/shuttle_destination/shuttle1/docked_SC = 0
) )
@@ -77,7 +137,7 @@
preferred_interim_area = /area/shuttle/shuttle2/transit preferred_interim_area = /area/shuttle/shuttle2/transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/shuttle2/sif_orbit = 1 MINUTE, /datum/shuttle_destination/shuttle2/sif_orbit = 30 SECONDS,
/datum/shuttle_destination/shuttle2/docked_SC = 0 /datum/shuttle_destination/shuttle2/docked_SC = 0
) )
@@ -89,8 +149,13 @@
dock_target = "shuttle1_dock_airlocksc" dock_target = "shuttle1_dock_airlocksc"
announcer = "Southern Cross Docking Computer" announcer = "Southern Cross Docking Computer"
arrival_message = "Attention, shuttle one has arrived to the Arrivals Dock."
departure_message = "Attention, shuttle one has departed the Arrivals Dock." /datum/shuttle_destination/shuttle1/docked_SC/get_arrival_message()
return "Attention, [master.my_shuttle.visible_name] has arrived to the Arrivals Dock."
/datum/shuttle_destination/shuttle1/docked_SC/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed the Arrivals Dock."
/datum/shuttle_destination/shuttle2/docked_SC /datum/shuttle_destination/shuttle2/docked_SC
name = "Southern Cross Docking Port" name = "Southern Cross Docking Port"
@@ -99,8 +164,12 @@
dock_target = "shuttle2_dock_airlocksc" dock_target = "shuttle2_dock_airlocksc"
announcer = "Southern Cross Docking Computer" announcer = "Southern Cross Docking Computer"
arrival_message = "Attention, shuttle two has arrived to the Arrivals Dock."
departure_message = "Attention, shuttle two has departed the Arrivals Dock." /datum/shuttle_destination/shuttle2/docked_SC/get_arrival_message()
return "Attention, [master.my_shuttle.visible_name] has arrived to the Arrivals Dock."
/datum/shuttle_destination/shuttle2/docked_SC/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed the Arrivals Dock."
/datum/shuttle_destination/shuttle1/sif_orbit /datum/shuttle_destination/shuttle1/sif_orbit
@@ -109,7 +178,7 @@
preferred_interim_area = /area/shuttle/shuttle1/transit preferred_interim_area = /area/shuttle/shuttle1/transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/shuttle1/sky = 1 MINUTE /datum/shuttle_destination/shuttle1/sky = 30 SECONDS
) )
/datum/shuttle_destination/shuttle2/sif_orbit /datum/shuttle_destination/shuttle2/sif_orbit
@@ -118,7 +187,7 @@
preferred_interim_area = /area/shuttle/shuttle2/transit preferred_interim_area = /area/shuttle/shuttle2/transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/shuttle2/sky = 1 MINUTE /datum/shuttle_destination/shuttle2/sky = 30 SECONDS
) )
@@ -128,8 +197,8 @@
preferred_interim_area = /area/shuttle/shuttle1/sky_transit preferred_interim_area = /area/shuttle/shuttle1/sky_transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/shuttle1/main_base = 30 SECONDS, /datum/shuttle_destination/shuttle1/main_base = 15 SECONDS,
/datum/shuttle_destination/shuttle1/mining_base = 30 SECONDS /datum/shuttle_destination/shuttle1/mining_base = 15 SECONDS
) )
/datum/shuttle_destination/shuttle2/sky /datum/shuttle_destination/shuttle2/sky
@@ -138,8 +207,8 @@
preferred_interim_area = /area/shuttle/shuttle2/sky_transit preferred_interim_area = /area/shuttle/shuttle2/sky_transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/shuttle2/main_base = 30 SECONDS, /datum/shuttle_destination/shuttle2/main_base = 15 SECONDS,
/datum/shuttle_destination/shuttle2/mining_base = 30 SECONDS /datum/shuttle_destination/shuttle2/mining_base = 15 SECONDS
) )
@@ -150,8 +219,12 @@
dock_target = "surface_dock_1" dock_target = "surface_dock_1"
announcer = "Outpost Automated ATC" announcer = "Outpost Automated ATC"
arrival_message = "Attention, shuttle one has arrived to the Main Outpost."
departure_message = "Attention, shuttle one has departed the Main Outpost." /datum/shuttle_destination/shuttle1/main_base/get_arrival_message()
return "Attention, [master.my_shuttle.visible_name] has arrived to the Main Outpost."
/datum/shuttle_destination/shuttle1/main_base/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed the Main Outpost."
/datum/shuttle_destination/shuttle2/main_base /datum/shuttle_destination/shuttle2/main_base
name = "Main Outpost" name = "Main Outpost"
@@ -160,8 +233,12 @@
dock_target = "surface_dock_2" dock_target = "surface_dock_2"
announcer = "Outpost Automated ATC" announcer = "Outpost Automated ATC"
arrival_message = "Attention, shuttle two has arrived to the Main Outpost."
departure_message = "Attention, shuttle two has departed the Main Outpost." /datum/shuttle_destination/shuttle2/main_base/get_arrival_message()
return "Attention, [master.my_shuttle.visible_name] has arrived to the Main Outpost."
/datum/shuttle_destination/shuttle2/main_base/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed the Main Outpost."
/datum/shuttle_destination/shuttle1/mining_base /datum/shuttle_destination/shuttle1/mining_base
@@ -171,8 +248,11 @@
dock_target = "mining_dock_1" dock_target = "mining_dock_1"
announcer = "Outpost Automated ATC" announcer = "Outpost Automated ATC"
arrival_message = "Attention, shuttle one has arrived to the Mining Outpost." /datum/shuttle_destination/shuttle1/mining_base/get_arrival_message()
departure_message = "Attention, shuttle one has departed the Mining Outpost." return "Attention, [master.my_shuttle.visible_name] has arrived to the Mining Outpost."
/datum/shuttle_destination/shuttle1/mining_base/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed the Mining Outpost."
/datum/shuttle_destination/shuttle2/mining_base /datum/shuttle_destination/shuttle2/mining_base
name = "Mining Outpost" name = "Mining Outpost"
@@ -181,5 +261,9 @@
dock_target = "mining_dock_2" dock_target = "mining_dock_2"
announcer = "Outpost Automated ATC" announcer = "Outpost Automated ATC"
arrival_message = "Attention, shuttle two has arrived to the Mining Outpost."
departure_message = "Attention, shuttle two has departed the Mining Outpost." /datum/shuttle_destination/shuttle2/mining_base/get_arrival_message()
return "Attention, [master.my_shuttle.visible_name] has arrived to the Mining Outpost."
/datum/shuttle_destination/shuttle2/mining_base/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed the Mining Outpost."

View File

@@ -50,7 +50,7 @@
dock_target = "response_base" dock_target = "response_base"
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/ert/orbit = 2 MINUTES, /datum/shuttle_destination/ert/orbit = 1 MINUTE,
) )
/datum/shuttle_destination/ert/orbit /datum/shuttle_destination/ert/orbit
@@ -59,10 +59,10 @@
preferred_interim_area = /area/shuttle/response_ship/transit preferred_interim_area = /area/shuttle/response_ship/transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/ert/outside_SC_1d = 1 MINUTE, /datum/shuttle_destination/ert/outside_SC_1d = 30 SECONDS,
/datum/shuttle_destination/ert/outside_SC_2d = 1 MINUTE, /datum/shuttle_destination/ert/outside_SC_2d = 30 SECONDS,
/datum/shuttle_destination/ert/outside_SC_3d = 1 MINUTE, /datum/shuttle_destination/ert/outside_SC_3d = 30 SECONDS,
/datum/shuttle_destination/ert/sky = 1 MINUTE /datum/shuttle_destination/ert/sky = 30 SECONDS
) )
/datum/shuttle_destination/ert/outside_SC_1d /datum/shuttle_destination/ert/outside_SC_1d
@@ -106,8 +106,12 @@
dock_target = "response_shuttle_dock_airlock" dock_target = "response_shuttle_dock_airlock"
announcer = "Southern Cross Docking Computer" announcer = "Southern Cross Docking Computer"
arrival_message = "Attention, the Emergency Response Team's shuttle has arrived to the Arrivals Dock."
departure_message = "Attention, the Emergency Response Team's shuttle has departed the Arrivals Dock." /datum/shuttle_destination/ert/docked_SC/get_arrival_message()
return "Attention, the Emergency Response Team's shuttle has arrived to the Arrivals Dock."
/datum/shuttle_destination/ert/docked_SC/get_departure_message()
return "Attention, the Emergency Response Team's shuttle has departed the Arrivals Dock."
/datum/shuttle_destination/ert/sky /datum/shuttle_destination/ert/sky
name = "Skies of Sif" name = "Skies of Sif"
@@ -115,7 +119,7 @@
preferred_interim_area = /area/shuttle/response_ship/sky_transit preferred_interim_area = /area/shuttle/response_ship/sky_transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/ert/planet = 30 SECONDS /datum/shuttle_destination/ert/planet = 15 SECONDS
) )
/datum/shuttle_destination/ert/planet /datum/shuttle_destination/ert/planet

View File

@@ -35,10 +35,10 @@
preferred_interim_area = /area/skipjack_station/transit preferred_interim_area = /area/skipjack_station/transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/heist/outside_SC_1d = 1 MINUTE, /datum/shuttle_destination/heist/outside_SC_1d = 30 SECONDS,
/datum/shuttle_destination/heist/outside_SC_2d = 1 MINUTE, /datum/shuttle_destination/heist/outside_SC_2d = 30 SECONDS,
/datum/shuttle_destination/heist/outside_SC_3d = 1 MINUTE, /datum/shuttle_destination/heist/outside_SC_3d = 30 SECONDS,
/datum/shuttle_destination/heist/sky = 1 MINUTE, /datum/shuttle_destination/heist/sky = 30 SECONDS,
) )
/datum/shuttle_destination/heist/outside_SC_1d /datum/shuttle_destination/heist/outside_SC_1d
@@ -82,8 +82,12 @@
// dock_target = "skipjack_shuttle_dock_airlock" // dock_target = "skipjack_shuttle_dock_airlock"
announcer = "Southern Cross Docking Computer" announcer = "Southern Cross Docking Computer"
arrival_message = "Attention, a shuttle has arrived to the Arrivals Dock."
departure_message = "Attention, a shuttle has departed the Arrivals Dock." /datum/shuttle_destination/heist/docked_SC/get_arrival_message()
return "Attention, [master.my_shuttle.visible_name] has arrived to the Arrivals Dock."
/datum/shuttle_destination/heist/docked_SC/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed the Arrivals Dock."
/datum/shuttle_destination/heist/sky /datum/shuttle_destination/heist/sky
name = "Skies of Sif" name = "Skies of Sif"
@@ -91,7 +95,7 @@
preferred_interim_area = /area/skipjack_station/sky_transit preferred_interim_area = /area/skipjack_station/sky_transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/heist/planet = 30 SECONDS /datum/shuttle_destination/heist/planet = 15 SECONDS
) )
/datum/shuttle_destination/heist/planet /datum/shuttle_destination/heist/planet

View File

@@ -34,12 +34,14 @@
/datum/shuttle/web_shuttle/syndicate /datum/shuttle/web_shuttle/syndicate
name = "Mercenary" name = "Mercenary"
visible_name = "Unknown Vessel"
warmup_time = 0 warmup_time = 0
can_cloak = TRUE can_cloak = TRUE
cloaked = TRUE cloaked = TRUE
current_area = /area/syndicate_station/start current_area = /area/syndicate_station/start
docking_controller_tag = "merc_shuttle" docking_controller_tag = "merc_shuttle"
web_master_type = /datum/shuttle_web_master/syndie web_master_type = /datum/shuttle_web_master/syndie
flight_time_modifier = 2 // Assumption that 'larger ship + few engines = slower'
/datum/shuttle_web_master/syndie /datum/shuttle_web_master/syndie
destination_class = /datum/shuttle_destination/syndie destination_class = /datum/shuttle_destination/syndie
@@ -55,7 +57,7 @@
dock_target = "merc_base" dock_target = "merc_base"
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/syndie/orbit = 3 MINUTES, /datum/shuttle_destination/syndie/orbit = 1.5 MINUTES,
) )
/datum/shuttle_destination/syndie/orbit /datum/shuttle_destination/syndie/orbit
@@ -64,10 +66,10 @@
preferred_interim_area = /area/syndicate_station/transit preferred_interim_area = /area/syndicate_station/transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/syndie/outside_SC_1d = 1 MINUTE, /datum/shuttle_destination/syndie/outside_SC_1d = 30 SECONDS,
/datum/shuttle_destination/syndie/outside_SC_2d = 1 MINUTE, /datum/shuttle_destination/syndie/outside_SC_2d = 30 SECONDS,
/datum/shuttle_destination/syndie/outside_SC_3d = 1 MINUTE, /datum/shuttle_destination/syndie/outside_SC_3d = 30 SECONDS,
/datum/shuttle_destination/syndie/sky = 1 MINUTE /datum/shuttle_destination/syndie/sky = 30 SECONDS
) )
/datum/shuttle_destination/syndie/outside_SC_1d /datum/shuttle_destination/syndie/outside_SC_1d
@@ -110,8 +112,12 @@
dock_target = "nuke_shuttle_dock_airlock" dock_target = "nuke_shuttle_dock_airlock"
announcer = "Southern Cross Docking Computer" announcer = "Southern Cross Docking Computer"
arrival_message = "Attention, a shuttle has arrived to the Arrivals Dock."
departure_message = "Attention, a shuttle has departed the Arrivals Dock." /datum/shuttle_destination/syndie/docked_SC/get_arrival_message()
return "Attention, [master.my_shuttle.visible_name] has arrived to the Arrivals Dock."
/datum/shuttle_destination/syndie/docked_SC/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed the Arrivals Dock."
/datum/shuttle_destination/syndie/sky /datum/shuttle_destination/syndie/sky
name = "Skies of Sif" name = "Skies of Sif"
@@ -119,7 +125,7 @@
preferred_interim_area = /area/syndicate_station/sky_transit preferred_interim_area = /area/syndicate_station/sky_transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/syndie/planet = 30 SECONDS /datum/shuttle_destination/syndie/planet = 15 SECONDS
) )
/datum/shuttle_destination/syndie/planet /datum/shuttle_destination/syndie/planet

View File

@@ -5,12 +5,14 @@
/datum/shuttle/web_shuttle/ninja /datum/shuttle/web_shuttle/ninja
name = "Ninja" name = "Ninja"
visible_name = "Unknown Vessel"
warmup_time = 0 warmup_time = 0
can_cloak = TRUE can_cloak = TRUE
cloaked = TRUE cloaked = TRUE
current_area = /area/ninja_dojo/start current_area = /area/ninja_dojo/start
docking_controller_tag = "ninja_shuttle" docking_controller_tag = "ninja_shuttle"
web_master_type = /datum/shuttle_web_master/ninja web_master_type = /datum/shuttle_web_master/ninja
flight_time_modifier = 0.5 // Nippon steel.
/datum/shuttle_web_master/ninja /datum/shuttle_web_master/ninja
destination_class = /datum/shuttle_destination/ninja destination_class = /datum/shuttle_destination/ninja
@@ -24,7 +26,7 @@
dock_target = "ninja_base" dock_target = "ninja_base"
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/ninja/sky = 30 SECONDS, /datum/shuttle_destination/ninja/sky = 15 SECONDS,
) )
/datum/shuttle_destination/ninja/orbit /datum/shuttle_destination/ninja/orbit
@@ -33,10 +35,10 @@
preferred_interim_area = /area/ninja_dojo/transit preferred_interim_area = /area/ninja_dojo/transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/ninja/outside_SC_1d = 1 MINUTE, /datum/shuttle_destination/ninja/outside_SC_1d = 30 SECONDS,
/datum/shuttle_destination/ninja/outside_SC_2d = 1 MINUTE, /datum/shuttle_destination/ninja/outside_SC_2d = 30 SECONDS,
/datum/shuttle_destination/ninja/outside_SC_3d = 1 MINUTE, /datum/shuttle_destination/ninja/outside_SC_3d = 30 SECONDS,
/datum/shuttle_destination/ninja/sky = 1 MINUTE, /datum/shuttle_destination/ninja/sky = 30 SECONDS,
) )
/datum/shuttle_destination/ninja/outside_SC_1d /datum/shuttle_destination/ninja/outside_SC_1d
@@ -80,8 +82,12 @@
dock_target = "ninja_shuttle_dock_airlock" dock_target = "ninja_shuttle_dock_airlock"
announcer = "Southern Cross Docking Computer" announcer = "Southern Cross Docking Computer"
arrival_message = "Attention, a shuttle has arrived to the Arrivals Dock."
departure_message = "Attention, a shuttle has departed the Arrivals Dock." /datum/shuttle_destination/syndie/docked_SC/get_arrival_message()
return "Attention, [master.my_shuttle.visible_name] has arrived to the Arrivals Dock."
/datum/shuttle_destination/syndie/docked_SC/get_departure_message()
return "Attention, [master.my_shuttle.visible_name] has departed the Arrivals Dock."
/datum/shuttle_destination/ninja/sky /datum/shuttle_destination/ninja/sky
name = "Skies of Sif" name = "Skies of Sif"
@@ -89,7 +95,7 @@
preferred_interim_area = /area/ninja_dojo/sky_transit preferred_interim_area = /area/ninja_dojo/sky_transit
routes_to_make = list( routes_to_make = list(
/datum/shuttle_destination/ninja/planet = 30 SECONDS /datum/shuttle_destination/ninja/planet = 15 SECONDS
) )
/datum/shuttle_destination/ninja/planet /datum/shuttle_destination/ninja/planet

View File

@@ -1,3 +1,22 @@
{{if data.autopilot == 1}}
<div class='notice'>
<b><h3>AI PILOT (CLASS D) ACTIVE</h3></b>
<i>This vessel will start and stop automatically.<br>
Ensure that all non-cycling capable hatches and doors are closed, as the automated system may not be able to control them.<br>
Docking and flight controls are locked. To unlock, disable the automated flight system.</i><br>
</div>
{{/if}}
{{if data.can_rename == 1}}
<div class='item'>
<div class="itemContent">
<div style="float: left; width: 100%;">
{{:helper.link('Rename', 'pencil', {"rename_command" : 1})}}
</div>
</div>
</div>
{{/if}}
<h3>Shuttle Status</h3> <h3>Shuttle Status</h3>
{{if data.is_moving == 0}} {{if data.is_moving == 0}}
<div class="item"> <div class="item">
@@ -81,6 +100,18 @@
</div> </div>
{{/if}} {{/if}}
{{if data.can_autopilot == 1}}
<div class="item">
<div class="itemLabel">
Automated Flight Control:
</div>
<span style="float:right">
{{:helper.link('On', 'circle-check', {'autopilot_on_command' : 1}, (data.autopilot == 1)? 'selected' : null)}}
{{:helper.link('Off', 'circle-close ', {'autopilot_off_command' : 1}, (data.autopilot == 0)? 'selected' : null)}}
</div>
</div>
{{/if}}
{{/if}} {{/if}}
{{if data.is_moving == 0}} {{if data.is_moving == 0}}