This commit is contained in:
249
code/modules/modular_computers/file_system/programs/radar.dm
Normal file
249
code/modules/modular_computers/file_system/programs/radar.dm
Normal file
@@ -0,0 +1,249 @@
|
||||
/datum/computer_file/program/radar //generic parent that handles most of the process
|
||||
filename = "genericfinder"
|
||||
filedesc = "debug_finder"
|
||||
ui_header = "borg_mon.gif" //DEBUG -- new icon before PR
|
||||
program_icon_state = "generic"
|
||||
extended_desc = "generic"
|
||||
requires_ntnet = TRUE
|
||||
transfer_access = null
|
||||
available_on_ntnet = FALSE
|
||||
network_destination = "tracking program"
|
||||
size = 5
|
||||
tgui_id = "NtosRadar"
|
||||
ui_x = 800
|
||||
ui_y = 600
|
||||
special_assets = list(
|
||||
/datum/asset/simple/radar_assets,
|
||||
)
|
||||
///List of trackable entities. Updated by the scan() proc.
|
||||
var/list/objects
|
||||
///Ref of the last trackable object selected by the user in the tgui window. Updated in the ui_act() proc.
|
||||
var/atom/selected
|
||||
///Used to store when the next scan is available. Updated by the scan() proc.
|
||||
var/next_scan = 0
|
||||
|
||||
/datum/computer_file/program/radar/kill_program(forced = FALSE)
|
||||
objects = list()
|
||||
selected = null
|
||||
return ..()
|
||||
|
||||
/datum/computer_file/program/radar/ui_data(mob/user)
|
||||
var/list/data = get_header_data()
|
||||
data["selected"] = selected
|
||||
data["objects"] = list()
|
||||
data["scanning"] = (world.time < next_scan)
|
||||
for(var/list/i in objects)
|
||||
var/list/objectdata = list(
|
||||
ref = i["ref"],
|
||||
name = i["name"],
|
||||
)
|
||||
data["object"] += list(objectdata)
|
||||
|
||||
data["target"] = list()
|
||||
var/list/trackinfo = track()
|
||||
if(trackinfo)
|
||||
data["target"] = trackinfo
|
||||
return data
|
||||
|
||||
/datum/computer_file/program/radar/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
|
||||
switch(action)
|
||||
if("selecttarget")
|
||||
selected = params["ref"]
|
||||
if("scan")
|
||||
scan()
|
||||
|
||||
/**
|
||||
*Updates tracking information of the selected target.
|
||||
*
|
||||
*The track() proc updates the entire set of information about the location
|
||||
*of the target, including whether the Ntos window should use a pinpointer
|
||||
*crosshair over the up/down arrows, or none in favor of a rotating arrow
|
||||
*for far away targets. This information is returned in the form of a list.
|
||||
*
|
||||
*/
|
||||
/datum/computer_file/program/radar/proc/track()
|
||||
return
|
||||
|
||||
/**
|
||||
*
|
||||
*Checks the trackability of the selected target.
|
||||
*
|
||||
*If the target is on the computer's Z level, or both are on station Z
|
||||
*levels, and the target isn't untrackable, return TRUE.
|
||||
*Arguments:
|
||||
**arg1 is the atom being evaluated.
|
||||
*/
|
||||
/datum/computer_file/program/radar/proc/trackable(atom/movable/signal)
|
||||
if(!signal)
|
||||
return FALSE
|
||||
var/turf/here = get_turf(computer)
|
||||
var/turf/there = get_turf(signal)
|
||||
return (there.z == here.z) || (is_station_level(here.z) && is_station_level(there.z))
|
||||
|
||||
/**
|
||||
*
|
||||
*Runs a scan of all the trackable atoms.
|
||||
*
|
||||
*Checks each entry in the GLOB of the specific trackable atoms against
|
||||
*the track() proc, and fill the objects list with lists containing the
|
||||
*atoms' names and REFs. The objects list is handed to the tgui screen
|
||||
*for displaying to, and being selected by, the user. A two second
|
||||
*sleep is used to delay the scan, both for thematical reasons as well
|
||||
*as to limit the load players may place on the server using these
|
||||
*somewhat costly loops.
|
||||
*/
|
||||
/datum/computer_file/program/radar/proc/scan()
|
||||
return
|
||||
|
||||
///////////////////
|
||||
//Suit Sensor App//
|
||||
///////////////////
|
||||
|
||||
///A program that tracks crew members via suit sensors
|
||||
/datum/computer_file/program/radar/lifeline
|
||||
filename = "Lifeline"
|
||||
filedesc = "Lifeline"
|
||||
program_icon_state = "generic"
|
||||
extended_desc = "This program allows for tracking of crew members via their suit sensors."
|
||||
requires_ntnet = TRUE
|
||||
transfer_access = ACCESS_MEDICAL
|
||||
available_on_ntnet = TRUE
|
||||
|
||||
/datum/computer_file/program/radar/lifeline/track()
|
||||
var/mob/living/carbon/human/humanoid = locate(selected) in GLOB.human_list
|
||||
if(!istype(humanoid) || !trackable(humanoid))
|
||||
return
|
||||
|
||||
var/turf/here_turf = (get_turf(computer))
|
||||
var/turf/target_turf = (get_turf(humanoid))
|
||||
var/userot = FALSE
|
||||
var/rot = 0
|
||||
var/pointer="crosshairs"
|
||||
var/locx = (target_turf.x - here_turf.x)
|
||||
var/locy = (here_turf.y - target_turf.y)
|
||||
if(get_dist_euclidian(here_turf, target_turf) > 24) //If they're too far away, we need the angle for the arrow along the edge of the radar display
|
||||
userot = TRUE
|
||||
rot = round(Get_Angle(here_turf, target_turf))
|
||||
else
|
||||
locx = locx + 24
|
||||
locy = locy + 24
|
||||
if(target_turf.z > here_turf.z)
|
||||
pointer="caret-up"
|
||||
else if(target_turf.z < here_turf.z)
|
||||
pointer="caret-down"
|
||||
var/list/trackinfo = list(
|
||||
locx = locx,
|
||||
locy = locy,
|
||||
userot = userot,
|
||||
rot = rot,
|
||||
arrowstyle = "ntosradarpointer.png", //For the rotation arrow, it's stupid I know
|
||||
color = "green",
|
||||
pointer = pointer,
|
||||
)
|
||||
return trackinfo
|
||||
|
||||
/datum/computer_file/program/radar/lifeline/scan()
|
||||
if(world.time < next_scan)
|
||||
return
|
||||
next_scan = world.time + (2 SECONDS)
|
||||
objects = list()
|
||||
for(var/i in GLOB.human_list)
|
||||
var/mob/living/carbon/human/humanoid = i
|
||||
if(!trackable(humanoid))
|
||||
continue
|
||||
var/crewmember_name = "Unknown"
|
||||
if(humanoid.wear_id)
|
||||
var/obj/item/card/id/ID = humanoid.wear_id.GetID()
|
||||
if(ID && ID.registered_name)
|
||||
crewmember_name = ID.registered_name
|
||||
var/list/crewinfo = list(
|
||||
ref = REF(humanoid),
|
||||
name = crewmember_name,
|
||||
)
|
||||
objects += list(crewinfo)
|
||||
|
||||
/datum/computer_file/program/radar/lifeline/trackable(mob/living/carbon/human/humanoid)
|
||||
if(!humanoid || !istype(humanoid))
|
||||
return FALSE
|
||||
if(..() && istype(humanoid.w_uniform, /obj/item/clothing/under))
|
||||
|
||||
var/obj/item/clothing/under/uniform = humanoid.w_uniform
|
||||
if(!uniform.has_sensor || (uniform.sensor_mode < SENSOR_COORDS)) // Suit sensors must be on maximum.
|
||||
return FALSE
|
||||
|
||||
return TRUE
|
||||
|
||||
////////////////////////
|
||||
//Nuke Disk Finder App//
|
||||
////////////////////////
|
||||
|
||||
///A program that tracks crew members via suit sensors
|
||||
/datum/computer_file/program/radar/fission360
|
||||
filename = "Fission360"
|
||||
filedesc = "Fission360"
|
||||
program_icon_state = "generic"
|
||||
extended_desc = "This program allows for tracking of nuclear authorization disks and warheads."
|
||||
requires_ntnet = FALSE
|
||||
transfer_access = null
|
||||
available_on_ntnet = FALSE
|
||||
available_on_syndinet = TRUE
|
||||
tgui_id = "NtosRadarSyndicate"
|
||||
|
||||
/datum/computer_file/program/radar/fission360/track()
|
||||
var/obj/nuke = locate(selected) in GLOB.poi_list
|
||||
if(!trackable(nuke))
|
||||
return
|
||||
|
||||
var/turf/here_turf = (get_turf(computer))
|
||||
var/turf/target_turf = (get_turf(nuke))
|
||||
var/userot = FALSE
|
||||
var/rot = 0
|
||||
var/pointer="crosshairs"
|
||||
var/locx = (target_turf.x - here_turf.x)
|
||||
var/locy = (here_turf.y - target_turf.y)
|
||||
if(get_dist_euclidian(here_turf, target_turf) > 24) //If they're too far away, we need the angle for the arrow along the edge of the radar display
|
||||
userot = TRUE
|
||||
rot = round(Get_Angle(here_turf, target_turf))
|
||||
else
|
||||
locx = locx + 24
|
||||
locy = locy + 24
|
||||
if(target_turf.z > here_turf.z)
|
||||
pointer="caret-up"
|
||||
else if(target_turf.z < here_turf.z)
|
||||
pointer="caret-down"
|
||||
var/list/trackinfo = list(
|
||||
locx = locx,
|
||||
locy = locy,
|
||||
userot = userot,
|
||||
rot = rot,
|
||||
arrowstyle = "ntosradarpointerS.png",
|
||||
color = "red",
|
||||
pointer = pointer,
|
||||
)
|
||||
return trackinfo
|
||||
|
||||
/datum/computer_file/program/radar/fission360/scan()
|
||||
if(world.time < next_scan)
|
||||
return
|
||||
next_scan = world.time + (2 SECONDS)
|
||||
objects = list()
|
||||
for(var/i in GLOB.nuke_list)
|
||||
var/obj/machinery/nuclearbomb/nuke = i
|
||||
if(!trackable(nuke))
|
||||
continue
|
||||
|
||||
var/list/nukeinfo = list(
|
||||
ref = REF(nuke),
|
||||
name = nuke.name,
|
||||
)
|
||||
objects += list(nukeinfo)
|
||||
var/obj/item/disk/nuclear/disk = locate() in GLOB.poi_list
|
||||
if(trackable(disk))
|
||||
var/list/nukeinfo = list(
|
||||
ref = REF(disk),
|
||||
name = disk.name,
|
||||
)
|
||||
objects += list(nukeinfo)
|
||||
Reference in New Issue
Block a user