mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-21 04:48:18 +01:00
Exosuit program, tracking, and downloader improvements (#1264)
A minor project focusing on Modular computers and exosuits. Changelog is small, since most of this is changes to unreleased content In brief: Adds an exosuit monitor program Fixes many visual issues with the downloader program Tweaks Exosuit killswitch and EMP mechanics
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking
|
||||
name = "Exosuit tracking beacon"
|
||||
desc = "Device used to transmit exosuit data."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "motion2"
|
||||
origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
|
||||
var/control = 0//
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/initialize()
|
||||
if (in_mecha())
|
||||
exo_beacons.Add(src)//For the sake of exosuits which spawn with a preinstalled tracking beacon
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info()
|
||||
if(!in_mecha())
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
var/cell_charge = M.get_charge()
|
||||
var/answer = {"<b>Name:</b> [M.name]<br>
|
||||
<b>Integrity:</b> [M.health/initial(M.health)*100]%<br>
|
||||
<b>Cell charge:</b> [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"]<br>
|
||||
<b>Airtank:</b> [M.return_pressure()]kPa<br>
|
||||
<b>Pilot:</b> [M.occupant||"None"]<br>
|
||||
<b>Location:</b> [get_area(M)||"Unknown"]<br>
|
||||
<b>Active equipment:</b> [M.selected||"None"]"}
|
||||
if(istype(M, /obj/mecha/working/ripley))
|
||||
var/obj/mecha/working/ripley/RM = M
|
||||
answer += "<b>Used cargo space:</b> [RM.cargo.len/RM.cargo_capacity*100]%<br>"
|
||||
|
||||
return answer
|
||||
|
||||
|
||||
//Alternate version of this proc for nanoui
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_info_nano()
|
||||
if(!in_mecha())
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
var/cell_charge = M.get_charge()
|
||||
var/list/answer = list()
|
||||
answer["name"] = M.name
|
||||
answer["health"] = round((M.health/initial(M.health))*100, 0.1)
|
||||
answer["charge"] = "[isnull(cell_charge)?"Not found":M.cell.percent()]%"
|
||||
answer["air"] = "[M.return_pressure()]"
|
||||
if (M.occupant)
|
||||
answer["pilot"] = M.occupant.name
|
||||
answer["location"] = get_area(M)
|
||||
answer["active"] = M.selected || "None"
|
||||
answer["ref"] = "\ref[src]"
|
||||
answer["control"] = control
|
||||
|
||||
if(istype(M, /obj/mecha/working/ripley))
|
||||
var/obj/mecha/working/ripley/RM = M
|
||||
answer["cargo"] = "[RM.cargo.len/RM.cargo_capacity*100]"
|
||||
|
||||
return answer
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/install(var/obj/mecha/M, var/mob/living/user = null)
|
||||
if (!istype(M))
|
||||
return
|
||||
|
||||
if (M.state < 3)
|
||||
user << span("warning", "You need to open the maintenance panel in order to install \the [src]")
|
||||
return
|
||||
|
||||
for (var/obj/item/mecha_parts/mecha_tracking/B in M.contents)
|
||||
user << span("warning", "[M] already has a tracker installed. Please remove the existing one.")
|
||||
return
|
||||
|
||||
user.drop_from_inventory(src)
|
||||
src.forceMove(M)
|
||||
playsound(get_turf(user), 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
exo_beacons.Add(src)
|
||||
user.visible_message("[user] installs [src] in [M].", "You install [src] in [M]")
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/uninstall(var/mob/living/user)
|
||||
var/obj/mecha/M = in_mecha()
|
||||
if (!M)//This should never happen
|
||||
return
|
||||
|
||||
user.put_in_hands(src)
|
||||
exo_beacons.Remove(src)
|
||||
user.visible_message("[user] removes [src] from [M].", "You remove [src] from [M]")
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/emp_act()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/ex_act()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/in_mecha()
|
||||
if(istype(src.loc, /obj/mecha))
|
||||
return src.loc
|
||||
return 0
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/shock(var/mob/user)
|
||||
return//No killswitch on the basic version
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking/proc/get_mecha_log()
|
||||
if(!src.in_mecha())
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
return M.get_log_html()
|
||||
|
||||
|
||||
|
||||
|
||||
//Subclass of tracking beacon which has the killswitch function
|
||||
/obj/item/mecha_parts/mecha_tracking/control
|
||||
control = 1
|
||||
name = "Exosuit Control Beacon"
|
||||
desc = "Device used to transmit exosuit data. Allows an administrator to trigger a killswitch and remotely shutdown the exosuit."
|
||||
|
||||
//Remote killswitch fucks everything up.
|
||||
//The suit is probably not unsalvageable, but will require extensive repairs and be crippled
|
||||
/obj/item/mecha_parts/mecha_tracking/control/shock(var/mob/user)
|
||||
var/obj/mecha/M = in_mecha()
|
||||
if(M)
|
||||
M.occupant_message(span("danger", "Remote termination protocol initiated. This exosuit is now shutting down, please exit immediately. Continued operation may incur disciplinary action or death of user."))
|
||||
M.emp_act(1)
|
||||
M.random_internal_damage(95)//Trigger all possible forms of internal damage
|
||||
M.misconfigure_systems(95)
|
||||
//Screw up all systems, including maintenance mode which will cause immediate stop
|
||||
M.log_message("Remote termination protocol initiated by [user].",1)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/storage/box/mechabeacons
|
||||
name = "Exosuit Control Beacons"
|
||||
|
||||
/obj/item/weapon/storage/box/mechabeacons/New()
|
||||
..()
|
||||
new /obj/item/mecha_parts/mecha_tracking/control(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking/control(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking/control(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking/control(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking/control(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking/control(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking/control(src)
|
||||
@@ -97,7 +97,7 @@
|
||||
M.say("*scream")
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/mecha_part_fabricator/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
/obj/machinery/mecha_part_fabricator/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
|
||||
var/data[0]
|
||||
|
||||
var/datum/design/current = queue.len ? queue[1] : null
|
||||
|
||||
+46
-15
@@ -343,6 +343,37 @@
|
||||
if(src_object in view(2, src))
|
||||
return STATUS_UPDATE //if they're close enough, allow the occupant to see the screen through the viewport or whatever.
|
||||
|
||||
//Menu for physically removing things from the suit while fiddling around in the maintenance panel
|
||||
/obj/mecha/proc/removal_menu(var/mob/living/user)
|
||||
var/list/options = list()
|
||||
if(src.cell)
|
||||
options += "Power Cell"
|
||||
|
||||
var/obj/item/mecha_parts/mecha_tracking/beacon = locate(/obj/item/mecha_parts/mecha_tracking) in src
|
||||
if (beacon)
|
||||
options += "Tracking Beacon"
|
||||
|
||||
if (!options.len)
|
||||
user << "There are no components in [src] that can be removed"
|
||||
return
|
||||
|
||||
var/choice = input(user, "Choose a component to remove.", "Component removal") as null|anything in options
|
||||
|
||||
if (!choice || !user)
|
||||
return
|
||||
|
||||
switch(choice)
|
||||
if("Power Cell")
|
||||
if (!cell)
|
||||
return
|
||||
user.put_in_hands(cell)
|
||||
cell = null
|
||||
user << "You unscrew and pry out the powercell."
|
||||
log_message("Powercell removed.")
|
||||
if ("Tracking Beacon")
|
||||
if (beacon && beacon.loc == src)//safety
|
||||
beacon.uninstall(user)
|
||||
|
||||
/obj/mecha/proc/melee_action(atom/target)
|
||||
return
|
||||
|
||||
@@ -706,8 +737,10 @@
|
||||
|
||||
/obj/mecha/emp_act(severity)
|
||||
if(get_charge())
|
||||
use_power((6500)/severity)
|
||||
take_damage(40 / severity,"energy")
|
||||
use_power((4000)/severity)
|
||||
take_damage(30 / severity,"energy")
|
||||
random_internal_damage(7/severity)
|
||||
misconfigure_systems(10/severity)
|
||||
src.log_message("EMP detected",1)
|
||||
check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),1)
|
||||
return
|
||||
@@ -755,17 +788,21 @@
|
||||
if(state==1)
|
||||
state = 2
|
||||
user << "You undo the securing bolts."
|
||||
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
|
||||
else if(state==2)
|
||||
state = 1
|
||||
user << "You tighten the securing bolts."
|
||||
playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
|
||||
return
|
||||
else if(istype(W, /obj/item/weapon/crowbar))
|
||||
if(state==2)
|
||||
state = 3
|
||||
user << "You open the hatch to the power unit"
|
||||
playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
else if(state==3)
|
||||
state=2
|
||||
user << "You close the hatch to the power unit"
|
||||
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
|
||||
return
|
||||
else if(istype(W, /obj/item/stack/cable_coil))
|
||||
if(state == 3 && hasInternalDamage(MECHA_INT_SHORT_CIRCUIT))
|
||||
@@ -780,15 +817,10 @@
|
||||
if(hasInternalDamage(MECHA_INT_TEMP_CONTROL))
|
||||
clearInternalDamage(MECHA_INT_TEMP_CONTROL)
|
||||
user << "You repair the damaged temperature controller."
|
||||
else if(state==3 && src.cell)
|
||||
src.cell.forceMove(src.loc)
|
||||
src.cell = null
|
||||
state = 4
|
||||
user << "You unscrew and pry out the powercell."
|
||||
src.log_message("Powercell removed.")
|
||||
else if(state==4 && src.cell)
|
||||
state=3
|
||||
user << "You screw the cell in place."
|
||||
|
||||
else if(state==3)
|
||||
removal_menu(user)
|
||||
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/device/multitool))
|
||||
@@ -804,7 +836,7 @@
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/weapon/cell))
|
||||
if(state==4)
|
||||
if(state==3)
|
||||
if(!src.cell)
|
||||
user << "You install the powercell"
|
||||
user.drop_item()
|
||||
@@ -833,9 +865,8 @@
|
||||
return
|
||||
|
||||
else if(istype(W, /obj/item/mecha_parts/mecha_tracking))
|
||||
user.drop_from_inventory(W)
|
||||
W.forceMove(src)
|
||||
user.visible_message("[user] attaches [W] to [src].", "You attach [W] to [src]")
|
||||
var/obj/item/mecha_parts/mecha_tracking/C = W
|
||||
C.install(src, user)
|
||||
return
|
||||
|
||||
else
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
//Note: This console is deprecated.
|
||||
//The exosuit control program in modular computers is its successor
|
||||
|
||||
/obj/machinery/computer/mecha
|
||||
name = "Exosuit Control"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
@@ -10,119 +13,57 @@
|
||||
var/screen = 0
|
||||
var/stored_data
|
||||
|
||||
attack_ai(var/mob/user as mob)
|
||||
/obj/machinery/computer/mecha/attack_ai(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<html><head><title>[src.name]</title><style>h3 {margin: 0px; padding: 0px;}</style></head><body>"
|
||||
if(screen == 0)
|
||||
dat += "<h3>Tracking beacons data</h3>"
|
||||
for(var/obj/item/mecha_parts/mecha_tracking/TR in world)
|
||||
var/answer = TR.get_mecha_info()
|
||||
if(answer)
|
||||
dat += {"<hr>[answer]<br/>
|
||||
<a href='?src=\ref[src];send_message=\ref[TR]'>Send message</a><br/>
|
||||
<a href='?src=\ref[src];get_log=\ref[TR]'>Show exosuit log</a> | <a style='color: #f00;' href='?src=\ref[src];shock=\ref[TR]'>(EMP pulse)</a><br>"}
|
||||
|
||||
if(screen==1)
|
||||
dat += "<h3>Log contents</h3>"
|
||||
dat += "<a href='?src=\ref[src];return=1'>Return</a><hr>"
|
||||
dat += "[stored_data]"
|
||||
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>(Refresh)</A><BR>"
|
||||
dat += "</body></html>"
|
||||
|
||||
user << browse(dat, "window=computer;size=400x500")
|
||||
onclose(user, "computer")
|
||||
/obj/machinery/computer/mecha/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
user.set_machine(src)
|
||||
var/dat = "<html><head><title>[src.name]</title><style>h3 {margin: 0px; padding: 0px;}</style></head><body>"
|
||||
if(screen == 0)
|
||||
dat += "<h3>Tracking beacons data</h3>"
|
||||
for(var/obj/item/mecha_parts/mecha_tracking/TR in world)
|
||||
var/answer = TR.get_mecha_info()
|
||||
if(answer)
|
||||
dat += {"<hr>[answer]<br/>
|
||||
<a href='?src=\ref[src];send_message=\ref[TR]'>Send message</a><br/>
|
||||
<a href='?src=\ref[src];get_log=\ref[TR]'>Show exosuit log</a> | <a style='color: #f00;' href='?src=\ref[src];shock=\ref[TR]'>(EMP pulse)</a><br>"}
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
||||
if(href_list["send_message"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("send_message")
|
||||
var/message = sanitize(input(usr,"Input message","Transmit message") as text)
|
||||
var/obj/mecha/M = MT.in_mecha()
|
||||
if(message && M)
|
||||
M.occupant_message(message)
|
||||
return
|
||||
if(href_list["shock"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("shock")
|
||||
MT.shock()
|
||||
if(href_list["get_log"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("get_log")
|
||||
stored_data = MT.get_mecha_log()
|
||||
screen = 1
|
||||
if(href_list["return"])
|
||||
screen = 0
|
||||
src.updateUsrDialog()
|
||||
if(screen==1)
|
||||
dat += "<h3>Log contents</h3>"
|
||||
dat += "<a href='?src=\ref[src];return=1'>Return</a><hr>"
|
||||
dat += "[stored_data]"
|
||||
|
||||
dat += "<A href='?src=\ref[src];refresh=1'>(Refresh)</A><BR>"
|
||||
dat += "</body></html>"
|
||||
|
||||
user << browse(dat, "window=computer;size=400x500")
|
||||
onclose(user, "computer")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/mecha/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_tracking
|
||||
name = "Exosuit tracking beacon"
|
||||
desc = "Device used to transmit exosuit data."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "motion2"
|
||||
origin_tech = list(TECH_DATA = 2, TECH_MAGNET = 2)
|
||||
|
||||
proc/get_mecha_info()
|
||||
if(!in_mecha())
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
var/cell_charge = M.get_charge()
|
||||
var/answer = {"<b>Name:</b> [M.name]<br>
|
||||
<b>Integrity:</b> [M.health/initial(M.health)*100]%<br>
|
||||
<b>Cell charge:</b> [isnull(cell_charge)?"Not found":"[M.cell.percent()]%"]<br>
|
||||
<b>Airtank:</b> [M.return_pressure()]kPa<br>
|
||||
<b>Pilot:</b> [M.occupant||"None"]<br>
|
||||
<b>Location:</b> [get_area(M)||"Unknown"]<br>
|
||||
<b>Active equipment:</b> [M.selected||"None"]"}
|
||||
if(istype(M, /obj/mecha/working/ripley))
|
||||
var/obj/mecha/working/ripley/RM = M
|
||||
answer += "<b>Used cargo space:</b> [RM.cargo.len/RM.cargo_capacity*100]%<br>"
|
||||
|
||||
return answer
|
||||
|
||||
emp_act()
|
||||
qdel(src)
|
||||
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
||||
if(href_list["send_message"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("send_message")
|
||||
var/message = sanitize(input(usr,"Input message","Transmit message") as text)
|
||||
var/obj/mecha/M = MT.in_mecha()
|
||||
if(message && M)
|
||||
M.occupant_message(message)
|
||||
return
|
||||
|
||||
ex_act()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
proc/in_mecha()
|
||||
if(istype(src.loc, /obj/mecha))
|
||||
return src.loc
|
||||
return 0
|
||||
|
||||
proc/shock()
|
||||
var/obj/mecha/M = in_mecha()
|
||||
if(M)
|
||||
M.emp_act(2)
|
||||
qdel(src)
|
||||
|
||||
proc/get_mecha_log()
|
||||
if(!src.in_mecha())
|
||||
return 0
|
||||
var/obj/mecha/M = src.loc
|
||||
return M.get_log_html()
|
||||
if(href_list["shock"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("shock")
|
||||
MT.shock()
|
||||
if(href_list["get_log"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("get_log")
|
||||
stored_data = MT.get_mecha_log()
|
||||
screen = 1
|
||||
if(href_list["return"])
|
||||
screen = 0
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
|
||||
|
||||
/obj/item/weapon/storage/box/mechabeacons
|
||||
name = "Exosuit Tracking Beacons"
|
||||
New()
|
||||
..()
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
new /obj/item/mecha_parts/mecha_tracking(src)
|
||||
|
||||
@@ -164,3 +164,7 @@ var/list/station_departments = list("Command", "Medical", "Engineering", "Scienc
|
||||
var/global/const/TICKS_IN_DAY = 864000
|
||||
var/global/const/TICKS_IN_HOUR = 36000
|
||||
var/global/const/TICKS_IN_SECOND = 10
|
||||
|
||||
|
||||
//List of exosuit tracking beacons, to save performance
|
||||
var/global/list/exo_beacons = list()
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
// ===== RESEARCH CONSOLE =====
|
||||
/obj/machinery/modular_computer/console/preset/research
|
||||
console_department = "Medbay"
|
||||
console_department = "Research"
|
||||
desc = "A stationary computer. This one comes preloaded with research programs."
|
||||
|
||||
/obj/machinery/modular_computer/console/preset/research/install_programs()
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/datum/computer_file/program/exosuit_monitor
|
||||
filename = "exosuitmonitor"
|
||||
filedesc = "Exosuit monitoring and control"
|
||||
nanomodule_path = /datum/nano_module/exosuit_control
|
||||
program_icon_state = "mecha"
|
||||
extended_desc = "This program allows remote monitoring and administration of exosuits with tracking beacons installed."
|
||||
required_access = access_robotics
|
||||
requires_ntnet = 1
|
||||
size = 8
|
||||
@@ -16,8 +16,9 @@
|
||||
var/download_completion = 0 //GQ of downloaded data.
|
||||
var/download_netspeed = 0
|
||||
var/downloaderror = ""
|
||||
var/downstream_variance = 0.1
|
||||
|
||||
/datum/computer_file/program/ntnetdownload/proc/begin_file_download(var/filename)
|
||||
/datum/computer_file/program/ntnetdownload/proc/begin_file_download(var/filename, var/user = null)
|
||||
if(downloaded_file)
|
||||
return 0
|
||||
|
||||
@@ -46,6 +47,9 @@
|
||||
hacked_download = 0
|
||||
|
||||
downloaded_file = PRG.clone()
|
||||
if (user)
|
||||
spawn()
|
||||
ui_interact(user)
|
||||
|
||||
/datum/computer_file/program/ntnetdownload/proc/abort_file_download()
|
||||
if(!downloaded_file)
|
||||
@@ -71,6 +75,7 @@
|
||||
return
|
||||
if(download_completion >= downloaded_file.size)
|
||||
complete_file_download()
|
||||
return
|
||||
// Download speed according to connectivity state. NTNet server is assumed to be on unlimited speed so we're limited by our local connectivity
|
||||
download_netspeed = 0
|
||||
// Speed defines are found in misc.dm
|
||||
@@ -81,14 +86,20 @@
|
||||
download_netspeed = NTNETSPEED_HIGHSIGNAL
|
||||
if(3)
|
||||
download_netspeed = NTNETSPEED_ETHERNET
|
||||
download_completion += download_netspeed
|
||||
|
||||
var/delta = ((rand()-0.5)*2)*downstream_variance*download_netspeed
|
||||
//Download speed varies +/- 10% each proc. Adds a more realistic feel
|
||||
|
||||
download_netspeed += delta
|
||||
download_netspeed = round(download_netspeed, 0.002)//3 decimal places
|
||||
download_completion = min(download_completion + download_netspeed, downloaded_file.size)
|
||||
|
||||
/datum/computer_file/program/ntnetdownload/Topic(href, href_list)
|
||||
if(..())
|
||||
return 1
|
||||
if(href_list["PRG_downloadfile"])
|
||||
if(!downloaded_file)
|
||||
begin_file_download(href_list["PRG_downloadfile"])
|
||||
begin_file_download(href_list["PRG_downloadfile"], usr)
|
||||
return 1
|
||||
if(href_list["PRG_reseterror"])
|
||||
if(downloaderror)
|
||||
@@ -125,8 +136,8 @@
|
||||
data["downloadname"] = prog.downloaded_file.filename
|
||||
data["downloaddesc"] = prog.downloaded_file.filedesc
|
||||
data["downloadsize"] = prog.downloaded_file.size
|
||||
data["downloadspeed"] = prog.download_netspeed
|
||||
data["downloadcompletion"] = round(prog.download_completion, 0.1)
|
||||
data["downloadspeed"] = (prog.download_netspeed * 0.5)//It updates every two seconds
|
||||
data["downloadcompletion"] = round(prog.download_completion, 0.01)
|
||||
else // No download running, pick file.
|
||||
data["disk_size"] = my_computer.hard_drive.max_capacity
|
||||
data["disk_used"] = my_computer.hard_drive.used_capacity
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/datum/nano_module/exosuit_control
|
||||
name = "Exosuit Monitoring and Control"
|
||||
var/stored_data
|
||||
var/screen = 0
|
||||
|
||||
// If PC is not null header template is loaded. Use PC.get_header_data() to get relevant nanoui data from it. All data entries begin with "PC_...."
|
||||
// In future it may be expanded to other modular computer devices.
|
||||
/datum/nano_module/exosuit_control/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = default_state)
|
||||
var/list/data = list()
|
||||
if(program)
|
||||
data = program.get_header_data()
|
||||
|
||||
data["screen"] = screen
|
||||
switch (screen)
|
||||
if (0)
|
||||
var/list/beacons = list()
|
||||
for(var/obj/item/mecha_parts/mecha_tracking/TR in exo_beacons)
|
||||
beacons.len++
|
||||
beacons[beacons.len] = TR.get_mecha_info_nano()
|
||||
|
||||
data["beacons"] = beacons
|
||||
if (1)
|
||||
data["log"] = stored_data
|
||||
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
|
||||
if (!ui)
|
||||
ui = new(user, src, ui_key, "exosuit_control.tmpl", "Exosuit Control and Monitoring", 800, 500, state = state)
|
||||
if(program) // This is necessary to ensure the status bar remains updated along with rest of the UI.
|
||||
ui.auto_update_layout = 1
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
|
||||
|
||||
/datum/nano_module/exosuit_control/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
var/datum/topic_input/filter = new /datum/topic_input(href,href_list)
|
||||
if(href_list["send_message"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("send_message")
|
||||
var/message = sanitize(input(usr,"Input message","Transmit message") as text)
|
||||
var/obj/mecha/M = MT.in_mecha()
|
||||
if(message && M)
|
||||
M.occupant_message(message)
|
||||
return
|
||||
if(href_list["shock"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("shock")
|
||||
|
||||
var/response = alert(usr,"Are you certain you wish to terminate this exosuit? Executing this procedure will render it inoperable, and should only be used in extreme circumstances. Improper use will result in your being held liable for damage to Nanotrasen property","Confirm shutdown","Destroy","Cancel")
|
||||
if (response == "Destroy")
|
||||
MT.shock(usr)
|
||||
if(href_list["get_log"])
|
||||
var/obj/item/mecha_parts/mecha_tracking/MT = filter.getObj("get_log")
|
||||
stored_data = MT.get_mecha_log()
|
||||
screen = 1
|
||||
if(href_list["return"])
|
||||
screen = 0
|
||||
|
||||
if (usr)
|
||||
spawn()
|
||||
program.ui_interact(usr)
|
||||
return
|
||||
@@ -387,12 +387,20 @@
|
||||
|
||||
/datum/design/item/mecha_tracking
|
||||
name = "Exosuit tracking beacon"
|
||||
id = "exotrack"
|
||||
build_type = MECHFAB
|
||||
time = 5
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 500)
|
||||
build_path = /obj/item/mecha_parts/mecha_tracking
|
||||
category = "Misc"
|
||||
|
||||
/datum/design/item/mecha_tracking/control
|
||||
name = "Exosuit control beacon"
|
||||
id = "exocontrol"
|
||||
time = 30
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 3000)
|
||||
build_path = /obj/item/mecha_parts/mecha_tracking/control
|
||||
|
||||
/datum/design/item/mecha
|
||||
build_type = MECHFAB
|
||||
category = "Exosuit Equipment"
|
||||
|
||||
Reference in New Issue
Block a user