From d0d6689263883b3be42e43134fba59aad0d066fa Mon Sep 17 00:00:00 2001 From: Neerti Date: Sun, 14 Jan 2018 14:03:58 -0500 Subject: [PATCH] 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. --- code/controllers/shuttle_controller.dm | 8 +- .../technomancer/spells/spawner/darkness.dm | 5 +- .../technomancer/spells/spawner/destablize.dm | 8 +- .../technomancer/spells/spawner/fire_blast.dm | 8 +- .../technomancer/spells/spawner/pulsar.dm | 8 +- .../technomancer/spells/spawner/spawner.dm | 16 --- code/game/objects/effects/misc.dm | 26 +++- code/modules/blob2/blobs/base_blob.dm | 4 - code/modules/shuttles/shuttle.dm | 15 ++ code/modules/shuttles/shuttle_arrivals.dm | 4 +- code/modules/shuttles/shuttle_ferry.dm | 2 +- code/modules/shuttles/shuttles_web.dm | 117 +++++++++++++++- code/modules/shuttles/web_datums.dm | 125 +++++++++++++++-- icons/effects/effects.dmi | Bin 397070 -> 396490 bytes maps/southern_cross/shuttles/crew_shuttles.dm | 132 ++++++++++++++---- maps/southern_cross/shuttles/ert.dm | 20 +-- maps/southern_cross/shuttles/heist.dm | 18 ++- maps/southern_cross/shuttles/merc.dm | 22 +-- maps/southern_cross/shuttles/ninja.dm | 22 +-- nano/templates/flight.tmpl | 31 ++++ 20 files changed, 478 insertions(+), 113 deletions(-) diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 51833046098..f68957ddb55 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -8,8 +8,12 @@ var/global/datum/shuttle_controller/shuttle_controller /datum/shuttle_controller/proc/process() //process ferry shuttles - for (var/datum/shuttle/ferry/shuttle in process_shuttles) - if (shuttle.process_state || shuttle.always_process) + for (var/datum/shuttle/shuttle in process_shuttles) + if(istype(shuttle, /datum/shuttle/ferry)) + var/datum/shuttle/ferry/F = shuttle + if(F.process_state || F.always_process) + F.process() + else shuttle.process() diff --git a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm index be978e7ee44..d83602aa68b 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm @@ -25,5 +25,6 @@ /obj/effect/temporary_effect/darkness name = "darkness" time_to_die = 2 MINUTES - new_light_range = 6 - new_light_power = -20 \ No newline at end of file + invisibility = 101 + light_range = 6 + light_power = -20 \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/spawner/destablize.dm b/code/game/gamemodes/technomancer/spells/spawner/destablize.dm index 1f7df21125b..29381701ca5 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/destablize.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/destablize.dm @@ -26,13 +26,11 @@ /obj/effect/temporary_effect/destablize name = "destablizing disturbance" desc = "This can't be good..." - icon = 'icons/effects/effects.dmi' icon_state = "blueshatter" time_to_die = null - invisibility = 0 - new_light_range = 6 - new_light_power = 20 - new_light_color = "#C26DDE" + light_range = 6 + light_power = 20 + light_color = "#C26DDE" var/pulses_remaining = 40 // Lasts 20 seconds. var/instability_power = 5 var/instability_range = 6 diff --git a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm index ff1a3f7644f..69444a4c7b1 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm @@ -22,13 +22,11 @@ /obj/effect/temporary_effect/fire_blast name = "fire blast" desc = "Run!" - icon = 'icons/effects/effects.dmi' icon_state = "at_shield1" time_to_die = 2.5 SECONDS // After which we go boom. - invisibility = 0 - new_light_range = 4 - new_light_power = 5 - new_light_color = "#FF6A00" + light_range = 4 + light_power = 5 + light_color = "#FF6A00" /obj/effect/temporary_effect/fire_blast/Destroy() explosion(get_turf(src), -1, 1, 2, 5, adminlog = 1) diff --git a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm index df13fd2460f..5641df2f87b 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm @@ -28,13 +28,11 @@ /obj/effect/temporary_effect/pulsar name = "pulsar" desc = "Not a real pulsar, but still emits loads of EMP." - icon = 'icons/effects/effects.dmi' icon_state = "shield2" time_to_die = null - invisibility = 0 - new_light_range = 4 - new_light_power = 5 - new_light_color = "#2ECCFA" + light_range = 4 + light_power = 5 + light_color = "#2ECCFA" var/pulses_remaining = 3 /obj/effect/temporary_effect/pulsar/New() diff --git a/code/game/gamemodes/technomancer/spells/spawner/spawner.dm b/code/game/gamemodes/technomancer/spells/spawner/spawner.dm index 218c4467398..ba86e700bb9 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/spawner.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/spawner.dm @@ -6,22 +6,6 @@ aspect = 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) var/turf/T = get_turf(hit_atom) if(T) diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 6cc507aeecc..48026296d77 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -7,6 +7,19 @@ density = 1 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. /obj/effect/temporary_effect/cleave_attack name = "cleaving attack" @@ -16,12 +29,19 @@ layer = 6 time_to_die = 6 alpha = 140 - invisibility = 0 mouse_opacity = 0 - new_light_range = 0 - new_light_power = 0 pixel_x = -32 pixel_y = -32 /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) + +/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. + ..() \ No newline at end of file diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm index 01692144cfa..5bd83a0cee6 100644 --- a/code/modules/blob2/blobs/base_blob.dm +++ b/code/modules/blob2/blobs/base_blob.dm @@ -281,15 +281,11 @@ var/list/blobs = list() /obj/effect/temporary_effect/blob_attack name = "blob" desc = "The blob lashing out at something." - icon = 'icons/effects/effects.dmi' icon_state = "blob_attack" layer = 5.2 time_to_die = 6 alpha = 140 - invisibility = 0 mouse_opacity = 0 - new_light_range = 0 - new_light_power = 0 /obj/structure/grille/blob_act() qdel(src) diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index d9dea08d99a..18795972d79 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -37,12 +37,20 @@ supply_controller.shuttle = null . = ..() +/datum/shuttle/proc/process() + return + /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!" +// 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. /datum/shuttle/proc/pre_warmup_checks() return TRUE @@ -70,6 +78,7 @@ spawn(warmup_time*10) make_sounds(origin, HYPERSPACE_WARMUP) + create_warning_effect(destination) sleep(5 SECONDS) // so the sound finishes. if(!post_warmup_checks()) @@ -102,6 +111,7 @@ spawn(warmup_time*10) 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. if(!post_warmup_checks()) @@ -122,11 +132,16 @@ move(departing, interim, direction) var/last_progress_sound = 0 + var/made_warning = FALSE while (world.time < arrive_time) // Make the shuttle make sounds every four seconds, since the sound file is five seconds. if(last_progress_sound + 4 SECONDS < world.time) make_sounds(interim, HYPERSPACE_PROGRESS) last_progress_sound = world.time + + if(arrive_time - world.time <= 5 SECONDS && !made_warning) + made_warning = TRUE + create_warning_effect(destination) sleep(5) move(interim, destination, direction) diff --git a/code/modules/shuttles/shuttle_arrivals.dm b/code/modules/shuttles/shuttle_arrivals.dm index 7b8a6026c85..d0f71d54b16 100644 --- a/code/modules/shuttles/shuttle_arrivals.dm +++ b/code/modules/shuttles/shuttle_arrivals.dm @@ -57,9 +57,9 @@ ..() // 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) - to_chat(M, message) + M.show_message(message, 2) /* /datum/shuttle/ferry/arrivals/current_dock_target() diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm index c122da96f1f..f279ce5d343 100644 --- a/code/modules/shuttles/shuttle_ferry.dm +++ b/code/modules/shuttles/shuttle_ferry.dm @@ -76,7 +76,7 @@ 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. */ -/datum/shuttle/ferry/proc/process() +/datum/shuttle/ferry/process() switch(process_state) if (WAIT_LAUNCH) if (skip_docking_checks() || docking_controller.can_launch()) diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm index 07ff4cbc936..8eee5be9b78 100644 --- a/code/modules/shuttles/shuttles_web.dm +++ b/code/modules/shuttles/shuttles_web.dm @@ -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. /datum/shuttle/web_shuttle 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/can_cloak = FALSE - var/cooldown = 5 SECONDS + var/cooldown = 0 var/last_move = 0 //the time at which we last moved var/area/current_area = null var/datum/shuttle_web_master/web_master = null var/web_master_type = null 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 /datum/shuttle/web_shuttle/New() current_area = locate(current_area) web_master = new web_master_type(src) 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() @@ -39,6 +51,78 @@ /datum/shuttle/web_shuttle/proc/build_destinations() 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 = "shuttle autopilot states, \"[message]\"" + message_passengers(current_area, padded_message) + +/datum/shuttle/web_shuttle/proc/rename_shuttle(mob/user) + if(!can_rename) + to_chat(user, "You can't rename this vessel.") + 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, "You've renamed the vessel to '[sanitized_name]'.") + message_admins("[key_name_admin(user)] renamed shuttle '[visible_name]' to '[sanitized_name]'.") + visible_name = sanitized_name + else + to_chat(user, "The name you supplied was invalid. Try another name.") + /obj/machinery/computer/shuttle_control/web name = "flight computer" icon_state = "flightcomp_center" @@ -174,13 +258,16 @@ "travel_progress" = between(0, percent_finished, 100), "time_left" = round( (total_time - elapsed_time) / 10), "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) 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.open() ui.set_auto_update(1) @@ -202,13 +289,22 @@ ui_interact(usr) if (WS.moving_status != SHUTTLE_IDLE) - usr << "[shuttle_tag] vessel is busy moving." + usr << "[WS.visible_name] is busy moving." return + if(href_list["rename_command"]) + WS.rename_shuttle(usr) + if(href_list["dock_command"]) + if(WS.autopilot) + to_chat(usr, "The autopilot must be disabled before you can control the vessel manually.") + return WS.dock() if(href_list["undock_command"]) + if(WS.autopilot) + to_chat(usr, "The autopilot must be disabled before you can control the vessel manually.") + return WS.undock() if(href_list["cloak_command"]) @@ -223,7 +319,17 @@ WS.cloaked = FALSE to_chat(usr, "Ship stealth systems have been deactivated. The station will be warned of our arrival.") + 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(WS.autopilot) + to_chat(usr, "The autopilot must be disabled before you can control the vessel manually.") + return + if((WS.last_move + WS.cooldown) > world.time) usr << "The ship's drive is inoperable while the engines are charging." return @@ -245,7 +351,8 @@ return WS.web_master.future_destination = target_destination - to_chat(usr, "[shuttle_tag] flight computer received command.") + to_chat(usr, "[WS.visible_name] flight computer received command.") + 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 diff --git a/code/modules/shuttles/web_datums.dm b/code/modules/shuttles/web_datums.dm index 17cd7257254..d30df26863b 100644 --- a/code/modules/shuttles/web_datums.dm +++ b/code/modules/shuttles/web_datums.dm @@ -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. /datum/shuttle_route @@ -39,6 +43,10 @@ return target.name +/**************** + * Destinations * + ****************/ + // This is the second datum, and contains information on all the potential destinations for a specific shuttle. /datum/shuttle_destination 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/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/departure_message = null // Message said if the ship exits 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. // 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' @@ -101,18 +109,23 @@ /datum/shuttle_destination/proc/exit(var/datum/shuttle_destination/new_destination) announce_departure() +/datum/shuttle_destination/proc/get_departure_message() + return null /datum/shuttle_destination/proc/announce_departure() - if(isnull(departure_message) || master.my_shuttle.cloaked) + if(isnull(get_departure_message()) || master.my_shuttle.cloaked) 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() - if(isnull(arrival_message) || master.my_shuttle.cloaked) + if(isnull(get_arrival_message()) || master.my_shuttle.cloaked) 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) // First, check to make sure this doesn't cause a duplicate route. @@ -131,6 +144,17 @@ /datum/shuttle_destination/proc/flight_failure() 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. // It is also responsible for instancing all the destinations it has control over, and linking them together. /datum/shuttle_web_master @@ -141,12 +165,17 @@ var/list/destinations = list() // List of currently instanced 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) my_shuttle = new_shuttle if(new_destination_class) destination_class = new_destination_class build_destinations() current_destination = get_destination_by_type(starting_destination) + build_autopaths() /datum/shuttle_web_master/Destroy() my_shuttle = null @@ -189,4 +218,84 @@ return current_destination /datum/shuttle_web_master/proc/get_destination_by_type(var/type_to_get) - return locate(type_to_get) in destinations \ No newline at end of file + 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) diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index b96d107773a5b1c73249cc2b74fe6669c5172fdd..948a55d9f1e6ec000579b40df42d1e9c3253202d 100644 GIT binary patch delta 21217 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 delta 21802 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 +

AI PILOT (CLASS D) ACTIVE

+ This vessel will start and stop automatically.
+ Ensure that all non-cycling capable hatches and doors are closed, as the automated system may not be able to control them.
+ Docking and flight controls are locked. To unlock, disable the automated flight system.

+ +{{/if}} + +{{if data.can_rename == 1}} +
+
+
+ {{:helper.link('Rename', 'pencil', {"rename_command" : 1})}} +
+
+
+{{/if}} +

Shuttle Status

{{if data.is_moving == 0}}
@@ -81,6 +100,18 @@
{{/if}} + {{if data.can_autopilot == 1}} +
+
+ Automated Flight Control: +
+ + {{: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)}} +
+ + {{/if}} + {{/if}} {{if data.is_moving == 0}}