/obj/machinery/computer/shuttle_control/specops name = "special operations shuttle console" shuttle_tag = "Special Operations" req_access = list(ACCESS_CENTCOM_ERT) /obj/machinery/computer/shuttle_control/specops/attack_ai(user as mob) to_chat(user, "Access Denied.") return 1 // Formerly /datum/shuttle/autodock/ferry/multidock/specops /datum/shuttle/autodock/ferry/specops var/specops_return_delay = 6000 // After moving, the amount of time that must pass before the shuttle may move again var/specops_countdown_time = 600 // Length of the countdown when moving the shuttle var/obj/item/radio/intercom/announcer = null var/reset_time = 0 // The world.time at which the shuttle will be ready to move again. var/launch_prep = 0 var/cancel_countdown = 0 category = /datum/shuttle/autodock/ferry/specops /datum/shuttle/autodock/ferry/specops/New() ..() announcer = new /obj/item/radio/intercom(null) // We need a fake AI to announce some stuff below. Otherwise it will be wonky. announcer.config(list("Response Team" = 0)) /datum/shuttle/autodock/ferry/specops/proc/radio_announce(var/message) if(announcer) announcer.autosay(message, "A.L.I.C.E.", "Response Team") /datum/shuttle/autodock/ferry/specops/launch(var/user) if (!can_launch()) return if (istype(user, /obj/machinery/computer)) var/obj/machinery/computer/C = user if(world.time <= reset_time) C.visible_message("[(LEGACY_MAP_DATUM).boss_name] will not allow the Special Operations shuttle to launch yet.") if (((world.time - reset_time)/10) > 60) C.visible_message("[-((world.time - reset_time)/10)/60] minutes remain!") else C.visible_message("[-(world.time - reset_time)/10] seconds remain!") return C.visible_message("The Special Operations shuttle will depart in [(specops_countdown_time/10)] seconds.") // Returning if (location) radio_announce("THE SPECIAL OPERATIONS SHUTTLE IS PREPARING TO RETURN") else radio_announce("THE SPECIAL OPERATIONS SHUTTLE IS PREPARING FOR LAUNCH") sleep_until_launch() if (location) var/obj/machinery/light/small/readylight/light = locate() in shuttle_area if(light) light.set_state(0) // Launch radio_announce("ALERT: INITIATING LAUNCH SEQUENCE") ..(user) /datum/shuttle/autodock/ferry/specops/perform_shuttle_move() ..() spawn(2 SECONDS) if (!location) // Just arrived home for(var/turf/T in get_area_turfs(shuttle_area)) var/mob/M = locate(/mob) in T to_chat(M, "You have arrived at [(LEGACY_MAP_DATUM).boss_name]. Operation has ended!") else // Fust left for the station launch_mauraders() for(var/turf/T in get_area_turfs(shuttle_area)) var/mob/M = locate(/mob) in T to_chat(M, "You have arrived at [station_name()]. Commence operation!") var/obj/machinery/light/small/readylight/light = locate() in T if(light) light.set_state(1) /datum/shuttle/autodock/ferry/specops/cancel_launch() if (!can_cancel()) return cancel_countdown = 1 radio_announce("ALERT: LAUNCH SEQUENCE ABORTED") if (istype(in_use, /obj/machinery/computer)) var/obj/machinery/computer/C = in_use C.visible_message("Launch sequence aborted.") ..() /datum/shuttle/autodock/ferry/specops/can_launch() if(launch_prep) return 0 return ..() // Should be fine to allow forcing. process_state only becomes WAIT_LAUNCH after the countdown is over. ///datum/shuttle/autodock/ferry/specops/can_force() // return 0 /datum/shuttle/autodock/ferry/specops/can_cancel() if(launch_prep) return 1 return ..() /datum/shuttle/autodock/ferry/specops/proc/sleep_until_launch() var/message_tracker[] = list(0,1,2,3,5,10,30,45) // Create a a list with potential time values. var/launch_time = world.time + specops_countdown_time var/time_until_launch cancel_countdown = 0 launch_prep = 1 while(!cancel_countdown && (launch_time - world.time) > 0) var/ticksleft = launch_time - world.time //if(ticksleft > 1e5) // launch_time = world.timeofday + 10 // midnight rollover time_until_launch = (ticksleft / 10) // All this does is announce the time before launch. var/rounded_time_left = round(time_until_launch) // Round time so that it will report only once, not in fractions. if(rounded_time_left in message_tracker) // If that time is in the list for message announce. radio_announce("ALERT: [rounded_time_left] SECOND[(rounded_time_left!=1)?"S":""] REMAIN") message_tracker -= rounded_time_left // Remove the number from the list so it won't be called again next cycle. // Should call all the numbers but lag could mean some issues. Oh well. Not much I can do about that. sleep(5) launch_prep = 0 /proc/launch_mauraders() var/area/centcom/specops/special_ops = locate() // Where is the specops area located? // Begin Marauder launchpad. spawn(0) // So it parallel processes it. for(var/obj/machinery/door/blast/M in special_ops) switch(M.id) if("ASSAULT0") spawn(10) // 1 second delay between each. M.open() if("ASSAULT1") spawn(20) M.open() if("ASSAULT2") spawn(30) M.open() if("ASSAULT3") spawn(40) M.open() sleep(10) var/spawn_marauder[] = new() for(var/obj/landmark/L in GLOB.landmarks_list) if(L.name == "Marauder Entry") spawn_marauder.Add(L) for(var/obj/landmark/L in GLOB.landmarks_list) if(L.name == "Marauder Exit") var/obj/effect/portal/P = new(L.loc) P.invisibility = 101 // So it is not seen by anyone. P.target = pick(spawn_marauder) // Where the marauder will arrive. spawn_marauder.Remove(P.target) sleep(10) for(var/obj/machinery/mass_driver/M in special_ops) switch(M.id) if("ASSAULT0") spawn(10) M.drive() if("ASSAULT1") spawn(20) M.drive() if("ASSAULT2") spawn(30) M.drive() if("ASSAULT3") spawn(40) M.drive() sleep(50) // Doors remain open for 5 seconds. for(var/obj/machinery/door/blast/M in special_ops) switch(M.id) // Doors close at the same time. if("ASSAULT0") spawn(0) M.close() if("ASSAULT1") spawn(0) M.close() if("ASSAULT2") spawn(0) M.close() if("ASSAULT3") spawn(0) M.close() special_ops.readyreset() // Reset firealarm after the team launched. // End Marauder launchpad.