Merge remote-tracking branch 'citadel/master' into mobility_flags
This commit is contained in:
+206
-206
@@ -1,206 +1,206 @@
|
||||
/obj/docking_port/mobile/arrivals
|
||||
name = "arrivals shuttle"
|
||||
id = "arrivals"
|
||||
|
||||
dwidth = 3
|
||||
width = 7
|
||||
height = 15
|
||||
dir = WEST
|
||||
port_direction = SOUTH
|
||||
|
||||
callTime = INFINITY
|
||||
ignitionTime = 50
|
||||
|
||||
movement_force = list("KNOCKDOWN" = 3, "THROW" = 0)
|
||||
|
||||
var/sound_played
|
||||
var/damaged //too damaged to undock?
|
||||
var/list/areas //areas in our shuttle
|
||||
var/list/queued_announces //people coming in that we have to announce
|
||||
var/obj/machinery/requests_console/console
|
||||
var/force_depart = FALSE
|
||||
var/perma_docked = FALSE //highlander with RESPAWN??? OH GOD!!!
|
||||
var/obj/docking_port/stationary/target_dock // for badminry
|
||||
|
||||
/obj/docking_port/mobile/arrivals/Initialize(mapload)
|
||||
. = ..()
|
||||
preferred_direction = dir
|
||||
return INITIALIZE_HINT_LATELOAD //for latejoin list
|
||||
|
||||
/obj/docking_port/mobile/arrivals/register()
|
||||
..()
|
||||
if(SSshuttle.arrivals)
|
||||
WARNING("More than one arrivals docking_port placed on map! Ignoring duplicates.")
|
||||
SSshuttle.arrivals = src
|
||||
|
||||
/obj/docking_port/mobile/arrivals/LateInitialize()
|
||||
areas = list()
|
||||
|
||||
var/list/new_latejoin = list()
|
||||
for(var/area/shuttle/arrival/A in GLOB.sortedAreas)
|
||||
for(var/obj/structure/chair/C in A)
|
||||
new_latejoin += C
|
||||
if(!console)
|
||||
console = locate(/obj/machinery/requests_console) in A
|
||||
areas += A
|
||||
|
||||
if(SSjob.latejoin_trackers.len)
|
||||
WARNING("Map contains predefined latejoin spawn points and an arrivals shuttle. Using the arrivals shuttle.")
|
||||
|
||||
if(!new_latejoin.len)
|
||||
WARNING("Arrivals shuttle contains no chairs for spawn points. Reverting to latejoin landmarks.")
|
||||
if(!SSjob.latejoin_trackers.len)
|
||||
WARNING("No latejoin landmarks exist. Players will spawn unbuckled on the shuttle.")
|
||||
return
|
||||
|
||||
SSjob.latejoin_trackers = new_latejoin
|
||||
|
||||
/obj/docking_port/mobile/arrivals/check()
|
||||
. = ..()
|
||||
|
||||
if(perma_docked)
|
||||
if(mode != SHUTTLE_CALL)
|
||||
sound_played = FALSE
|
||||
mode = SHUTTLE_IDLE
|
||||
else
|
||||
SendToStation()
|
||||
return
|
||||
|
||||
if(damaged)
|
||||
if(!CheckTurfsPressure())
|
||||
damaged = FALSE
|
||||
if(console)
|
||||
console.say("Repairs complete, launching soon.")
|
||||
return
|
||||
|
||||
//If this proc is high on the profiler add a cooldown to the stuff after this line
|
||||
|
||||
else if(CheckTurfsPressure())
|
||||
damaged = TRUE
|
||||
if(console)
|
||||
console.say("Alert, hull breach detected!")
|
||||
var/obj/machinery/announcement_system/announcer = safepick(GLOB.announcement_systems)
|
||||
if(!QDELETED(announcer))
|
||||
announcer.announce("ARRIVALS_BROKEN", channels = list())
|
||||
if(mode != SHUTTLE_CALL)
|
||||
sound_played = FALSE
|
||||
mode = SHUTTLE_IDLE
|
||||
else
|
||||
SendToStation()
|
||||
return
|
||||
|
||||
var/found_awake = PersonCheck() || NukeDiskCheck()
|
||||
if(mode == SHUTTLE_CALL)
|
||||
if(found_awake)
|
||||
SendToStation()
|
||||
else if(mode == SHUTTLE_IGNITING)
|
||||
if(found_awake && !force_depart)
|
||||
mode = SHUTTLE_IDLE
|
||||
sound_played = FALSE
|
||||
else if(!sound_played)
|
||||
hyperspace_sound(HYPERSPACE_WARMUP, areas)
|
||||
sound_played = TRUE
|
||||
else if(!found_awake)
|
||||
Launch(FALSE)
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/CheckTurfsPressure()
|
||||
for(var/I in SSjob.latejoin_trackers)
|
||||
var/turf/open/T = get_turf(I)
|
||||
var/pressure = T.air.return_pressure()
|
||||
if(pressure < HAZARD_LOW_PRESSURE || pressure > HAZARD_HIGH_PRESSURE) //simple safety check
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/PersonCheck()
|
||||
for(var/V in GLOB.player_list)
|
||||
var/mob/M = V
|
||||
if((get_area(M) in areas) && M.stat != DEAD)
|
||||
if(!iscameramob(M))
|
||||
return TRUE
|
||||
var/mob/camera/C = M
|
||||
if(C.move_on_shuttle)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/NukeDiskCheck()
|
||||
for (var/obj/item/disk/nuclear/N in GLOB.poi_list)
|
||||
if (get_area(N) in areas)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/SendToStation()
|
||||
var/dockTime = CONFIG_GET(number/arrivals_shuttle_dock_window)
|
||||
if(mode == SHUTTLE_CALL && timeLeft(1) > dockTime)
|
||||
if(console)
|
||||
console.say(damaged ? "Initiating emergency docking for repairs!" : "Now approaching: [station_name()].")
|
||||
hyperspace_sound(HYPERSPACE_LAUNCH, areas) //for the new guy
|
||||
setTimer(dockTime)
|
||||
|
||||
/obj/docking_port/mobile/arrivals/initiate_docking(obj/docking_port/stationary/S1, force=FALSE)
|
||||
var/docked = S1 == assigned_transit
|
||||
sound_played = FALSE
|
||||
if(docked) //about to launch
|
||||
if(!force_depart)
|
||||
var/cancel_reason
|
||||
if(PersonCheck())
|
||||
cancel_reason = "lifeform dectected on board"
|
||||
else if(NukeDiskCheck())
|
||||
cancel_reason = "critical station device detected on board"
|
||||
if(cancel_reason)
|
||||
mode = SHUTTLE_IDLE
|
||||
if(console)
|
||||
console.say("Launch cancelled, [cancel_reason].")
|
||||
return
|
||||
force_depart = FALSE
|
||||
. = ..()
|
||||
if(!. && !docked && !damaged)
|
||||
if(console)
|
||||
console.say("Welcome to your new life, employees!")
|
||||
for(var/L in queued_announces)
|
||||
var/datum/callback/C = L
|
||||
C.Invoke()
|
||||
LAZYCLEARLIST(queued_announces)
|
||||
|
||||
/obj/docking_port/mobile/arrivals/check_effects()
|
||||
..()
|
||||
if(mode == SHUTTLE_CALL && !sound_played && timeLeft(1) <= HYPERSPACE_END_TIME)
|
||||
sound_played = TRUE
|
||||
hyperspace_sound(HYPERSPACE_END, areas)
|
||||
|
||||
/obj/docking_port/mobile/arrivals/canDock(obj/docking_port/stationary/S)
|
||||
. = ..()
|
||||
if(. == SHUTTLE_ALREADY_DOCKED)
|
||||
. = SHUTTLE_CAN_DOCK
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/Launch(pickingup)
|
||||
if(pickingup)
|
||||
force_depart = TRUE
|
||||
if(mode == SHUTTLE_IDLE)
|
||||
if(console)
|
||||
console.say(pickingup ? "Departing immediately for new employee pickup." : "Shuttle departing.")
|
||||
var/obj/docking_port/stationary/target = target_dock
|
||||
if(QDELETED(target))
|
||||
target = SSshuttle.getDock("arrivals_stationary")
|
||||
request(target) //we will intentionally never return SHUTTLE_ALREADY_DOCKED
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/RequireUndocked(mob/user)
|
||||
if(mode == SHUTTLE_CALL || damaged)
|
||||
return
|
||||
|
||||
Launch(TRUE)
|
||||
|
||||
to_chat(user, "<span class='notice'>Calling your shuttle. One moment...</span>")
|
||||
while(mode != SHUTTLE_CALL && !damaged)
|
||||
stoplag()
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/QueueAnnounce(mob, rank)
|
||||
if(mode != SHUTTLE_CALL)
|
||||
AnnounceArrival(mob, rank)
|
||||
else
|
||||
LAZYADD(queued_announces, CALLBACK(GLOBAL_PROC, .proc/AnnounceArrival, mob, rank))
|
||||
|
||||
/obj/docking_port/mobile/arrivals/vv_edit_var(var_name, var_value)
|
||||
switch(var_name)
|
||||
if("perma_docked")
|
||||
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("arrivals shuttle", "[var_value ? "stopped" : "started"]"))
|
||||
return ..()
|
||||
/obj/docking_port/mobile/arrivals
|
||||
name = "arrivals shuttle"
|
||||
id = "arrivals"
|
||||
|
||||
dwidth = 3
|
||||
width = 7
|
||||
height = 15
|
||||
dir = WEST
|
||||
port_direction = SOUTH
|
||||
|
||||
callTime = INFINITY
|
||||
ignitionTime = 50
|
||||
|
||||
movement_force = list("KNOCKDOWN" = 3, "THROW" = 0)
|
||||
|
||||
var/sound_played
|
||||
var/damaged //too damaged to undock?
|
||||
var/list/areas //areas in our shuttle
|
||||
var/list/queued_announces //people coming in that we have to announce
|
||||
var/obj/machinery/requests_console/console
|
||||
var/force_depart = FALSE
|
||||
var/perma_docked = FALSE //highlander with RESPAWN??? OH GOD!!!
|
||||
var/obj/docking_port/stationary/target_dock // for badminry
|
||||
|
||||
/obj/docking_port/mobile/arrivals/Initialize(mapload)
|
||||
. = ..()
|
||||
preferred_direction = dir
|
||||
return INITIALIZE_HINT_LATELOAD //for latejoin list
|
||||
|
||||
/obj/docking_port/mobile/arrivals/register()
|
||||
..()
|
||||
if(SSshuttle.arrivals)
|
||||
WARNING("More than one arrivals docking_port placed on map! Ignoring duplicates.")
|
||||
SSshuttle.arrivals = src
|
||||
|
||||
/obj/docking_port/mobile/arrivals/LateInitialize()
|
||||
areas = list()
|
||||
|
||||
var/list/new_latejoin = list()
|
||||
for(var/area/shuttle/arrival/A in GLOB.sortedAreas)
|
||||
for(var/obj/structure/chair/C in A)
|
||||
new_latejoin += C
|
||||
if(!console)
|
||||
console = locate(/obj/machinery/requests_console) in A
|
||||
areas += A
|
||||
|
||||
if(SSjob.latejoin_trackers.len)
|
||||
WARNING("Map contains predefined latejoin spawn points and an arrivals shuttle. Using the arrivals shuttle.")
|
||||
|
||||
if(!new_latejoin.len)
|
||||
WARNING("Arrivals shuttle contains no chairs for spawn points. Reverting to latejoin landmarks.")
|
||||
if(!SSjob.latejoin_trackers.len)
|
||||
WARNING("No latejoin landmarks exist. Players will spawn unbuckled on the shuttle.")
|
||||
return
|
||||
|
||||
SSjob.latejoin_trackers = new_latejoin
|
||||
|
||||
/obj/docking_port/mobile/arrivals/check()
|
||||
. = ..()
|
||||
|
||||
if(perma_docked)
|
||||
if(mode != SHUTTLE_CALL)
|
||||
sound_played = FALSE
|
||||
mode = SHUTTLE_IDLE
|
||||
else
|
||||
SendToStation()
|
||||
return
|
||||
|
||||
if(damaged)
|
||||
if(!CheckTurfsPressure())
|
||||
damaged = FALSE
|
||||
if(console)
|
||||
console.say("Repairs complete, launching soon.")
|
||||
return
|
||||
|
||||
//If this proc is high on the profiler add a cooldown to the stuff after this line
|
||||
|
||||
else if(CheckTurfsPressure())
|
||||
damaged = TRUE
|
||||
if(console)
|
||||
console.say("Alert, hull breach detected!")
|
||||
var/obj/machinery/announcement_system/announcer = safepick(GLOB.announcement_systems)
|
||||
if(!QDELETED(announcer))
|
||||
announcer.announce("ARRIVALS_BROKEN", channels = list())
|
||||
if(mode != SHUTTLE_CALL)
|
||||
sound_played = FALSE
|
||||
mode = SHUTTLE_IDLE
|
||||
else
|
||||
SendToStation()
|
||||
return
|
||||
|
||||
var/found_awake = PersonCheck() || NukeDiskCheck()
|
||||
if(mode == SHUTTLE_CALL)
|
||||
if(found_awake)
|
||||
SendToStation()
|
||||
else if(mode == SHUTTLE_IGNITING)
|
||||
if(found_awake && !force_depart)
|
||||
mode = SHUTTLE_IDLE
|
||||
sound_played = FALSE
|
||||
else if(!sound_played)
|
||||
hyperspace_sound(HYPERSPACE_WARMUP, areas)
|
||||
sound_played = TRUE
|
||||
else if(!found_awake)
|
||||
Launch(FALSE)
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/CheckTurfsPressure()
|
||||
for(var/I in SSjob.latejoin_trackers)
|
||||
var/turf/open/T = get_turf(I)
|
||||
var/pressure = T.air.return_pressure()
|
||||
if(pressure < HAZARD_LOW_PRESSURE || pressure > HAZARD_HIGH_PRESSURE) //simple safety check
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/PersonCheck()
|
||||
for(var/V in GLOB.player_list)
|
||||
var/mob/M = V
|
||||
if((get_area(M) in areas) && M.stat != DEAD)
|
||||
if(!iscameramob(M))
|
||||
return TRUE
|
||||
var/mob/camera/C = M
|
||||
if(C.move_on_shuttle)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/NukeDiskCheck()
|
||||
for (var/obj/item/disk/nuclear/N in GLOB.poi_list)
|
||||
if (get_area(N) in areas)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/SendToStation()
|
||||
var/dockTime = CONFIG_GET(number/arrivals_shuttle_dock_window)
|
||||
if(mode == SHUTTLE_CALL && timeLeft(1) > dockTime)
|
||||
if(console)
|
||||
console.say(damaged ? "Initiating emergency docking for repairs!" : "Now approaching: [station_name()].")
|
||||
hyperspace_sound(HYPERSPACE_LAUNCH, areas) //for the new guy
|
||||
setTimer(dockTime)
|
||||
|
||||
/obj/docking_port/mobile/arrivals/initiate_docking(obj/docking_port/stationary/S1, force=FALSE)
|
||||
var/docked = S1 == assigned_transit
|
||||
sound_played = FALSE
|
||||
if(docked) //about to launch
|
||||
if(!force_depart)
|
||||
var/cancel_reason
|
||||
if(PersonCheck())
|
||||
cancel_reason = "lifeform dectected on board"
|
||||
else if(NukeDiskCheck())
|
||||
cancel_reason = "critical station device detected on board"
|
||||
if(cancel_reason)
|
||||
mode = SHUTTLE_IDLE
|
||||
if(console)
|
||||
console.say("Launch cancelled, [cancel_reason].")
|
||||
return
|
||||
force_depart = FALSE
|
||||
. = ..()
|
||||
if(!. && !docked && !damaged)
|
||||
if(console)
|
||||
console.say("Welcome to your new life, employees!")
|
||||
for(var/L in queued_announces)
|
||||
var/datum/callback/C = L
|
||||
C.Invoke()
|
||||
LAZYCLEARLIST(queued_announces)
|
||||
|
||||
/obj/docking_port/mobile/arrivals/check_effects()
|
||||
..()
|
||||
if(mode == SHUTTLE_CALL && !sound_played && timeLeft(1) <= HYPERSPACE_END_TIME)
|
||||
sound_played = TRUE
|
||||
hyperspace_sound(HYPERSPACE_END, areas)
|
||||
|
||||
/obj/docking_port/mobile/arrivals/canDock(obj/docking_port/stationary/S)
|
||||
. = ..()
|
||||
if(. == SHUTTLE_ALREADY_DOCKED)
|
||||
. = SHUTTLE_CAN_DOCK
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/Launch(pickingup)
|
||||
if(pickingup)
|
||||
force_depart = TRUE
|
||||
if(mode == SHUTTLE_IDLE)
|
||||
if(console)
|
||||
console.say(pickingup ? "Departing immediately for new employee pickup." : "Shuttle departing.")
|
||||
var/obj/docking_port/stationary/target = target_dock
|
||||
if(QDELETED(target))
|
||||
target = SSshuttle.getDock("arrivals_stationary")
|
||||
request(target) //we will intentionally never return SHUTTLE_ALREADY_DOCKED
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/RequireUndocked(mob/user)
|
||||
if(mode == SHUTTLE_CALL || damaged)
|
||||
return
|
||||
|
||||
Launch(TRUE)
|
||||
|
||||
to_chat(user, "<span class='notice'>Calling your shuttle. One moment...</span>")
|
||||
while(mode != SHUTTLE_CALL && !damaged)
|
||||
stoplag()
|
||||
|
||||
/obj/docking_port/mobile/arrivals/proc/QueueAnnounce(mob, rank)
|
||||
if(mode != SHUTTLE_CALL)
|
||||
AnnounceArrival(mob, rank)
|
||||
else
|
||||
LAZYADD(queued_announces, CALLBACK(GLOBAL_PROC, .proc/AnnounceArrival, mob, rank))
|
||||
|
||||
/obj/docking_port/mobile/arrivals/vv_edit_var(var_name, var_value)
|
||||
switch(var_name)
|
||||
if("perma_docked")
|
||||
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("arrivals shuttle", "[var_value ? "stopped" : "started"]"))
|
||||
return ..()
|
||||
|
||||
@@ -1,76 +1,76 @@
|
||||
/obj/machinery/computer/shuttle
|
||||
name = "shuttle console"
|
||||
desc = "A shuttle control computer."
|
||||
icon_screen = "shuttle"
|
||||
icon_keyboard = "tech_key"
|
||||
light_color = LIGHT_COLOR_CYAN
|
||||
req_access = list( )
|
||||
var/shuttleId
|
||||
var/possible_destinations = ""
|
||||
var/admin_controlled
|
||||
var/no_destination_swap = 0
|
||||
|
||||
/obj/machinery/computer/shuttle/ui_interact(mob/user)
|
||||
. = ..()
|
||||
var/list/options = params2list(possible_destinations)
|
||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
||||
var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]<br><br>"
|
||||
if(M)
|
||||
var/destination_found
|
||||
for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
|
||||
if(!options.Find(S.id))
|
||||
continue
|
||||
if(!M.check_dock(S, silent=TRUE))
|
||||
continue
|
||||
destination_found = 1
|
||||
dat += "<A href='?src=[REF(src)];move=[S.id]'>Send to [S.name]</A><br>"
|
||||
if(!destination_found)
|
||||
dat += "<B>Shuttle Locked</B><br>"
|
||||
if(admin_controlled)
|
||||
dat += "Authorized personnel only<br>"
|
||||
dat += "<A href='?src=[REF(src)];request=1]'>Request Authorization</A><br>"
|
||||
dat += "<a href='?src=[REF(user)];mach_close=computer'>Close</a>"
|
||||
|
||||
var/datum/browser/popup = new(user, "computer", M ? M.name : "shuttle", 300, 200)
|
||||
popup.set_content("<center>[dat]</center>")
|
||||
popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/computer/shuttle/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
if(!allowed(usr))
|
||||
to_chat(usr, "<span class='danger'>Access denied.</span>")
|
||||
return
|
||||
|
||||
if(href_list["move"])
|
||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
||||
if(M.launch_status == ENDGAME_LAUNCHED)
|
||||
to_chat(usr, "<span class='warning'>You've already escaped. Never going back to that place again!</span>")
|
||||
return
|
||||
if(no_destination_swap)
|
||||
if(M.mode != SHUTTLE_IDLE)
|
||||
to_chat(usr, "<span class='warning'>Shuttle already in transit.</span>")
|
||||
return
|
||||
switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1))
|
||||
if(0)
|
||||
say("Shuttle departing. Please stand away from the doors.")
|
||||
if(1)
|
||||
to_chat(usr, "<span class='warning'>Invalid shuttle requested.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>Unable to comply.</span>")
|
||||
|
||||
/obj/machinery/computer/shuttle/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
req_access = list()
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='notice'>You fried the consoles ID checking system.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/shuttle/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
|
||||
if(port && (shuttleId == initial(shuttleId) || override))
|
||||
/obj/machinery/computer/shuttle
|
||||
name = "shuttle console"
|
||||
desc = "A shuttle control computer."
|
||||
icon_screen = "shuttle"
|
||||
icon_keyboard = "tech_key"
|
||||
light_color = LIGHT_COLOR_CYAN
|
||||
req_access = list( )
|
||||
var/shuttleId
|
||||
var/possible_destinations = ""
|
||||
var/admin_controlled
|
||||
var/no_destination_swap = 0
|
||||
|
||||
/obj/machinery/computer/shuttle/ui_interact(mob/user)
|
||||
. = ..()
|
||||
var/list/options = params2list(possible_destinations)
|
||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
||||
var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]<br><br>"
|
||||
if(M)
|
||||
var/destination_found
|
||||
for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
|
||||
if(!options.Find(S.id))
|
||||
continue
|
||||
if(!M.check_dock(S, silent=TRUE))
|
||||
continue
|
||||
destination_found = 1
|
||||
dat += "<A href='?src=[REF(src)];move=[S.id]'>Send to [S.name]</A><br>"
|
||||
if(!destination_found)
|
||||
dat += "<B>Shuttle Locked</B><br>"
|
||||
if(admin_controlled)
|
||||
dat += "Authorized personnel only<br>"
|
||||
dat += "<A href='?src=[REF(src)];request=1]'>Request Authorization</A><br>"
|
||||
dat += "<a href='?src=[REF(user)];mach_close=computer'>Close</a>"
|
||||
|
||||
var/datum/browser/popup = new(user, "computer", M ? M.name : "shuttle", 300, 200)
|
||||
popup.set_content("<center>[dat]</center>")
|
||||
popup.set_title_image(usr.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/computer/shuttle/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
src.add_fingerprint(usr)
|
||||
if(!allowed(usr))
|
||||
to_chat(usr, "<span class='danger'>Access denied.</span>")
|
||||
return
|
||||
|
||||
if(href_list["move"])
|
||||
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
||||
if(M.launch_status == ENDGAME_LAUNCHED)
|
||||
to_chat(usr, "<span class='warning'>You've already escaped. Never going back to that place again!</span>")
|
||||
return
|
||||
if(no_destination_swap)
|
||||
if(M.mode != SHUTTLE_IDLE)
|
||||
to_chat(usr, "<span class='warning'>Shuttle already in transit.</span>")
|
||||
return
|
||||
switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1))
|
||||
if(0)
|
||||
say("Shuttle departing. Please stand away from the doors.")
|
||||
if(1)
|
||||
to_chat(usr, "<span class='warning'>Invalid shuttle requested.</span>")
|
||||
else
|
||||
to_chat(usr, "<span class='notice'>Unable to comply.</span>")
|
||||
|
||||
/obj/machinery/computer/shuttle/emag_act(mob/user)
|
||||
. = ..()
|
||||
if(obj_flags & EMAGGED)
|
||||
return
|
||||
req_access = list()
|
||||
obj_flags |= EMAGGED
|
||||
to_chat(user, "<span class='notice'>You fried the consoles ID checking system.</span>")
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/shuttle/proc/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
|
||||
if(port && (shuttleId == initial(shuttleId) || override))
|
||||
shuttleId = port.id
|
||||
@@ -1,40 +1,40 @@
|
||||
/obj/machinery/computer/shuttle/ferry
|
||||
name = "transport ferry console"
|
||||
desc = "A console that controls the transport ferry."
|
||||
circuit = /obj/item/circuitboard/computer/ferry
|
||||
shuttleId = "ferry"
|
||||
possible_destinations = "ferry_home;ferry_away"
|
||||
req_access = list(ACCESS_CENT_GENERAL)
|
||||
|
||||
var/allow_silicons = FALSE
|
||||
var/allow_emag = FALSE
|
||||
|
||||
/obj/machinery/computer/shuttle/ferry/emag_act(mob/user)
|
||||
if(!allow_emag)
|
||||
to_chat(user, "<span class='warning'>[src]'s security firewall is far too powerful for you to bypass.</span>")
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/shuttle/ferry/attack_ai()
|
||||
return allow_silicons ? ..() : FALSE
|
||||
|
||||
/obj/machinery/computer/shuttle/ferry/attack_robot()
|
||||
return allow_silicons ? ..() : FALSE
|
||||
|
||||
/obj/machinery/computer/shuttle/ferry/request
|
||||
name = "ferry console"
|
||||
circuit = /obj/item/circuitboard/computer/ferry/request
|
||||
var/last_request //prevents spamming admins
|
||||
var/cooldown = 600
|
||||
possible_destinations = "ferry_home;ferry_away"
|
||||
req_access = list(ACCESS_CENT_GENERAL)
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["request"])
|
||||
if(last_request && (last_request + cooldown > world.time))
|
||||
return
|
||||
last_request = world.time
|
||||
to_chat(usr, "<span class='notice'>Your request has been received by CentCom.</span>")
|
||||
to_chat(GLOB.admins, "<b>FERRY: <font color='#3d5bc3'>[ADMIN_LOOKUPFLW(usr)] (<A HREF='?_src_=holder;[HrefToken()];secrets=moveferry'>Move Ferry</a>)</b> is requesting to move the transport ferry to CentCom.</font>")
|
||||
/obj/machinery/computer/shuttle/ferry
|
||||
name = "transport ferry console"
|
||||
desc = "A console that controls the transport ferry."
|
||||
circuit = /obj/item/circuitboard/computer/ferry
|
||||
shuttleId = "ferry"
|
||||
possible_destinations = "ferry_home;ferry_away"
|
||||
req_access = list(ACCESS_CENT_GENERAL)
|
||||
|
||||
var/allow_silicons = FALSE
|
||||
var/allow_emag = FALSE
|
||||
|
||||
/obj/machinery/computer/shuttle/ferry/emag_act(mob/user)
|
||||
if(!allow_emag)
|
||||
to_chat(user, "<span class='warning'>[src]'s security firewall is far too powerful for you to bypass.</span>")
|
||||
return SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/shuttle/ferry/attack_ai()
|
||||
return allow_silicons ? ..() : FALSE
|
||||
|
||||
/obj/machinery/computer/shuttle/ferry/attack_robot()
|
||||
return allow_silicons ? ..() : FALSE
|
||||
|
||||
/obj/machinery/computer/shuttle/ferry/request
|
||||
name = "ferry console"
|
||||
circuit = /obj/item/circuitboard/computer/ferry/request
|
||||
var/last_request //prevents spamming admins
|
||||
var/cooldown = 600
|
||||
possible_destinations = "ferry_home;ferry_away"
|
||||
req_access = list(ACCESS_CENT_GENERAL)
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list)
|
||||
..()
|
||||
if(href_list["request"])
|
||||
if(last_request && (last_request + cooldown > world.time))
|
||||
return
|
||||
last_request = world.time
|
||||
to_chat(usr, "<span class='notice'>Your request has been received by CentCom.</span>")
|
||||
to_chat(GLOB.admins, "<b>FERRY: <font color='#3d5bc3'>[ADMIN_LOOKUPFLW(usr)] (<A HREF='?_src_=holder;[HrefToken()];secrets=moveferry'>Move Ferry</a>)</b> is requesting to move the transport ferry to CentCom.</font>")
|
||||
|
||||
@@ -166,13 +166,12 @@ GLOBAL_LIST_INIT(cargo_shuttle_leave_behind_typecache, typecacheof(list(
|
||||
msg += export_text + "\n"
|
||||
SSshuttle.points += ex.total_value[E]
|
||||
|
||||
for(var/datum/reagent/R in ex.total_reagents)
|
||||
var/amount = ex.total_reagents[R]
|
||||
var/value = amount*R.value
|
||||
if(!value)
|
||||
continue
|
||||
msg += "[value] credits: received [amount]u of [R.name].\n"
|
||||
for(var/chem in ex.reagents_value)
|
||||
var/value = ex.reagents_value[chem]
|
||||
msg += "[value] credits: received [ex.reagents_volume[chem]]u of [chem].\n"
|
||||
SSshuttle.points += value
|
||||
|
||||
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
|
||||
|
||||
SSshuttle.centcom_message = msg
|
||||
investigate_log("Shuttle contents sold for [SSshuttle.points - presale_points] credits. Contents: [ex.exported_atoms || "none."] Message: [SSshuttle.centcom_message || "none."]", INVESTIGATE_CARGO)
|
||||
|
||||
@@ -1,67 +1,67 @@
|
||||
#define SYNDICATE_CHALLENGE_TIMER 12000 //20 minutes
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate
|
||||
name = "syndicate shuttle terminal"
|
||||
desc = "The terminal used to control the syndicate transport shuttle."
|
||||
circuit = /obj/item/circuitboard/computer/syndicate_shuttle
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
light_color = LIGHT_COLOR_RED
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
shuttleId = "syndicate"
|
||||
possible_destinations = "syndicate_away;syndicate_z5;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s;syndicate_custom"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate/recall
|
||||
name = "syndicate shuttle recall terminal"
|
||||
desc = "Use this if your friends left you behind."
|
||||
possible_destinations = "syndicate_away"
|
||||
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate/Topic(href, href_list)
|
||||
if(href_list["move"])
|
||||
var/obj/item/circuitboard/computer/syndicate_shuttle/board = circuit
|
||||
if(board.challenge && world.time < SYNDICATE_CHALLENGE_TIMER)
|
||||
to_chat(usr, "<span class='warning'>You've issued a combat challenge to the station! You've got to give them at least [DisplayTimeText(SYNDICATE_CHALLENGE_TIMER - world.time)] more to allow them to prepare.</span>")
|
||||
return 0
|
||||
board.moved = TRUE
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate/allowed(mob/M)
|
||||
if(issilicon(M) && !(ROLE_SYNDICATE in M.faction))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate/drop_pod
|
||||
name = "syndicate assault pod control"
|
||||
desc = "Controls the drop pod's launch system."
|
||||
icon = 'icons/obj/terminals.dmi'
|
||||
icon_state = "dorm_available"
|
||||
light_color = LIGHT_COLOR_BLUE
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
shuttleId = "steel_rain"
|
||||
possible_destinations = null
|
||||
clockwork = TRUE //it'd look weird
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate/drop_pod/Topic(href, href_list)
|
||||
if(href_list["move"])
|
||||
if(!is_centcom_level(z))
|
||||
to_chat(usr, "<span class='warning'>Pods are one way!</span>")
|
||||
return 0
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate
|
||||
name = "syndicate shuttle navigation computer"
|
||||
desc = "Used to designate a precise transit location for the syndicate shuttle."
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
shuttleId = "syndicate"
|
||||
lock_override = CAMERA_LOCK_STATION
|
||||
shuttlePortId = "syndicate_custom"
|
||||
jumpto_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1)
|
||||
view_range = 13
|
||||
x_offset = -7
|
||||
y_offset = -1
|
||||
see_hidden = TRUE
|
||||
|
||||
#define SYNDICATE_CHALLENGE_TIMER 12000 //20 minutes
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate
|
||||
name = "syndicate shuttle terminal"
|
||||
desc = "The terminal used to control the syndicate transport shuttle."
|
||||
circuit = /obj/item/circuitboard/computer/syndicate_shuttle
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
light_color = LIGHT_COLOR_RED
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
shuttleId = "syndicate"
|
||||
possible_destinations = "syndicate_away;syndicate_z5;syndicate_ne;syndicate_nw;syndicate_n;syndicate_se;syndicate_sw;syndicate_s;syndicate_custom"
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate/recall
|
||||
name = "syndicate shuttle recall terminal"
|
||||
desc = "Use this if your friends left you behind."
|
||||
possible_destinations = "syndicate_away"
|
||||
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate/Topic(href, href_list)
|
||||
if(href_list["move"])
|
||||
var/obj/item/circuitboard/computer/syndicate_shuttle/board = circuit
|
||||
if(board.challenge && world.time < SYNDICATE_CHALLENGE_TIMER)
|
||||
to_chat(usr, "<span class='warning'>You've issued a combat challenge to the station! You've got to give them at least [DisplayTimeText(SYNDICATE_CHALLENGE_TIMER - world.time)] more to allow them to prepare.</span>")
|
||||
return 0
|
||||
board.moved = TRUE
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate/allowed(mob/M)
|
||||
if(issilicon(M) && !(ROLE_SYNDICATE in M.faction))
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate/drop_pod
|
||||
name = "syndicate assault pod control"
|
||||
desc = "Controls the drop pod's launch system."
|
||||
icon = 'icons/obj/terminals.dmi'
|
||||
icon_state = "dorm_available"
|
||||
light_color = LIGHT_COLOR_BLUE
|
||||
req_access = list(ACCESS_SYNDICATE)
|
||||
shuttleId = "steel_rain"
|
||||
possible_destinations = null
|
||||
clockwork = TRUE //it'd look weird
|
||||
|
||||
/obj/machinery/computer/shuttle/syndicate/drop_pod/Topic(href, href_list)
|
||||
if(href_list["move"])
|
||||
if(!is_centcom_level(z))
|
||||
to_chat(usr, "<span class='warning'>Pods are one way!</span>")
|
||||
return 0
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/syndicate
|
||||
name = "syndicate shuttle navigation computer"
|
||||
desc = "Used to designate a precise transit location for the syndicate shuttle."
|
||||
icon_screen = "syndishuttle"
|
||||
icon_keyboard = "syndie_key"
|
||||
shuttleId = "syndicate"
|
||||
lock_override = CAMERA_LOCK_STATION
|
||||
shuttlePortId = "syndicate_custom"
|
||||
jumpto_ports = list("syndicate_ne" = 1, "syndicate_nw" = 1, "syndicate_n" = 1, "syndicate_se" = 1, "syndicate_sw" = 1, "syndicate_s" = 1)
|
||||
view_range = 13
|
||||
x_offset = -7
|
||||
y_offset = -1
|
||||
see_hidden = TRUE
|
||||
|
||||
#undef SYNDICATE_CHALLENGE_TIMER
|
||||
@@ -1,56 +1,56 @@
|
||||
/obj/machinery/computer/shuttle/white_ship
|
||||
name = "White Ship Console"
|
||||
desc = "Used to control the White Ship."
|
||||
circuit = /obj/item/circuitboard/computer/white_ship
|
||||
shuttleId = "whiteship"
|
||||
possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;whiteship_custom"
|
||||
|
||||
/obj/machinery/computer/shuttle/white_ship/pod
|
||||
name = "Salvage Pod Console"
|
||||
desc = "Used to control the Salvage Pod."
|
||||
circuit = /obj/item/circuitboard/computer/white_ship/pod
|
||||
shuttleId = "whiteship_pod"
|
||||
possible_destinations = "whiteship_pod_home;whiteship_pod_custom"
|
||||
|
||||
/obj/machinery/computer/shuttle/white_ship/pod/recall
|
||||
name = "Salvage Pod Recall Console"
|
||||
desc = "Used to recall the Salvage Pod."
|
||||
circuit = /obj/item/circuitboard/computer/white_ship/pod/recall
|
||||
possible_destinations = "whiteship_pod_home"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship
|
||||
name = "White Ship Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the White Ship."
|
||||
shuttleId = "whiteship"
|
||||
lock_override = NONE
|
||||
shuttlePortId = "whiteship_custom"
|
||||
jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1)
|
||||
view_range = 18
|
||||
x_offset = -6
|
||||
y_offset = -10
|
||||
designate_time = 100
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/pod
|
||||
name = "Salvage Pod Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the Salvage Pod."
|
||||
shuttleId = "whiteship_pod"
|
||||
shuttlePortId = "whiteship_pod_custom"
|
||||
jumpto_ports = list("whiteship_pod_home" = 1)
|
||||
view_range = 7
|
||||
x_offset = -2
|
||||
y_offset = 0
|
||||
designate_time = 0
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Initialize()
|
||||
. = ..()
|
||||
GLOB.jam_on_wardec += src
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Destroy()
|
||||
GLOB.jam_on_wardec -= src
|
||||
return ..()
|
||||
|
||||
/obj/effect/spawner/lootdrop/whiteship_cere_ripley
|
||||
name = "25% mech 75% wreckage ripley spawner"
|
||||
loot = list(/obj/mecha/working/ripley/mining = 1,
|
||||
/obj/structure/mecha_wreckage/ripley = 5)
|
||||
lootdoubles = FALSE
|
||||
/obj/machinery/computer/shuttle/white_ship
|
||||
name = "White Ship Console"
|
||||
desc = "Used to control the White Ship."
|
||||
circuit = /obj/item/circuitboard/computer/white_ship
|
||||
shuttleId = "whiteship"
|
||||
possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_lavaland;whiteship_custom"
|
||||
|
||||
/obj/machinery/computer/shuttle/white_ship/pod
|
||||
name = "Salvage Pod Console"
|
||||
desc = "Used to control the Salvage Pod."
|
||||
circuit = /obj/item/circuitboard/computer/white_ship/pod
|
||||
shuttleId = "whiteship_pod"
|
||||
possible_destinations = "whiteship_pod_home;whiteship_pod_custom"
|
||||
|
||||
/obj/machinery/computer/shuttle/white_ship/pod/recall
|
||||
name = "Salvage Pod Recall Console"
|
||||
desc = "Used to recall the Salvage Pod."
|
||||
circuit = /obj/item/circuitboard/computer/white_ship/pod/recall
|
||||
possible_destinations = "whiteship_pod_home"
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship
|
||||
name = "White Ship Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the White Ship."
|
||||
shuttleId = "whiteship"
|
||||
lock_override = NONE
|
||||
shuttlePortId = "whiteship_custom"
|
||||
jumpto_ports = list("whiteship_away" = 1, "whiteship_home" = 1, "whiteship_z4" = 1)
|
||||
view_range = 18
|
||||
x_offset = -6
|
||||
y_offset = -10
|
||||
designate_time = 100
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/pod
|
||||
name = "Salvage Pod Navigation Computer"
|
||||
desc = "Used to designate a precise transit location for the Salvage Pod."
|
||||
shuttleId = "whiteship_pod"
|
||||
shuttlePortId = "whiteship_pod_custom"
|
||||
jumpto_ports = list("whiteship_pod_home" = 1)
|
||||
view_range = 7
|
||||
x_offset = -2
|
||||
y_offset = 0
|
||||
designate_time = 0
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Initialize()
|
||||
. = ..()
|
||||
GLOB.jam_on_wardec += src
|
||||
|
||||
/obj/machinery/computer/camera_advanced/shuttle_docker/whiteship/Destroy()
|
||||
GLOB.jam_on_wardec -= src
|
||||
return ..()
|
||||
|
||||
/obj/effect/spawner/lootdrop/whiteship_cere_ripley
|
||||
name = "25% mech 75% wreckage ripley spawner"
|
||||
loot = list(/obj/mecha/working/ripley/mining = 1,
|
||||
/obj/structure/mecha_wreckage/ripley = 5)
|
||||
lootdoubles = FALSE
|
||||
|
||||
Reference in New Issue
Block a user