Modular PCs rewrite (#20003)

* Modular computers rework, part A

* tweaks&fixes

* Adds component-side compatibility checks

* Moves computers to SSobj

* Fixes stationary computers not using power usage vars

* Changes icon generation a bit, adds icons to broken computers

* Moves UI into it's own file

* Laptop refactor + sprite replacement

* Modular console's keyboard now lights up when powered

* minor fixes

* fixes

* bonus: wired connector, new type of recharger

* Modular computers are now devices

* code quality ocd
This commit is contained in:
Core0verload
2016-08-25 10:28:33 +12:00
committed by oranges
parent daf18f9a7a
commit 91e5b35707
56 changed files with 1760 additions and 1762 deletions
@@ -101,6 +101,6 @@
. = ..(user)
alarmdisplay += src
/datum/computer_file/program/alarm_monitor/kill_program(forced = 0)
/datum/computer_file/program/alarm_monitor/kill_program(forced = FALSE)
alarmdisplay -= src
..(forced)
..()
@@ -28,13 +28,13 @@
target = null
error = "Connection to destination relay lost."
/datum/computer_file/program/ntnet_dos/kill_program(var/forced)
/datum/computer_file/program/ntnet_dos/kill_program(forced = FALSE)
if(target)
target.dos_sources.Remove(src)
target = null
executed = 0
..(forced)
..()
/datum/computer_file/program/ntnet_dos/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
@@ -26,13 +26,13 @@
computer.visible_message("<span class='notice'>\The [computer]'s battery explodes in rain of sparks.</span>")
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
spark_system.start()
if(istype(computer, /obj/item/modular_computer/processor))
var/obj/item/modular_computer/processor/P = computer
if(P.machinery_computer.tesla_link && prob(50))
qdel(P.machinery_computer.tesla_link)
computer.visible_message("<span class='notice'>\The [computer]'s tesla link explodes in rain of sparks.</span>")
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
spark_system.start()
if(computer.recharger && prob(50))
qdel(computer.recharger)
computer.visible_message("<span class='notice'>\The [computer]'s recharger explodes in rain of sparks.</span>")
var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread
spark_system.start()
/datum/computer_file/program/revelation/ui_act(action, params)
if(..())
@@ -129,7 +129,7 @@
else
show_assignments = 1
if("PRG_print")
if(computer && computer.nano_printer) //This option should never be called if there is no printer
if(computer && computer.printer) //This option should never be called if there is no printer
if(mod_mode)
if(authorized())
var/contents = {"<h4>Access Report</h4>
@@ -145,7 +145,7 @@
if(A in known_access_rights)
contents += " [get_access_desc(A)]"
if(!computer.nano_printer.print_text(contents,"access report"))
if(!computer.printer.print_text(contents,"access report"))
usr << "<span class='notice'>Hardware error: Printer was unable to print the file. It may be out of paper.</span>"
return
else
@@ -155,7 +155,7 @@
<br>
[data_core ? data_core.get_manifest(0) : ""]
"}
if(!computer.nano_printer.print_text(contents,text("crew manifest ([])", worldtime2text())))
if(!computer.printer.print_text(contents,text("crew manifest ([])", worldtime2text())))
usr << "<span class='notice'>Hardware error: Printer was unable to print the file. It may be out of paper.</span>"
return
else
@@ -337,7 +337,7 @@
data["assignments"] = show_assignments
if(computer)
data["have_id_slot"] = !!computer.card_slot
data["have_printer"] = !!computer.nano_printer
data["have_printer"] = !!computer.printer
if(!computer.card_slot && mod_mode == 1)
mod_mode = 0 //We can't modify IDs when there is no card reader
else
@@ -12,7 +12,7 @@
size = 4
available_on_ntnet = 0
requires_ntnet = 0
var/obj/item/modular_computer/movable = null
var/obj/item/device/modular_computer/movable = null
/datum/computer_file/program/computerconfig/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
@@ -28,7 +28,6 @@
ui.set_autoupdate(state = 1)
/datum/computer_file/program/computerconfig/ui_data(mob/user)
movable = computer
if(!istype(movable))
movable = null
@@ -37,26 +36,21 @@
if(!movable)
return 0
var/list/data = list()
data = get_header_data()
var/list/hardware = movable.get_all_components()
var/list/data = get_header_data()
data["disk_size"] = movable.hard_drive.max_capacity
data["disk_used"] = movable.hard_drive.used_capacity
data["power_usage"] = movable.last_power_usage
data["battery_exists"] = movable.battery_module ? 1 : 0
if(movable.battery_module)
if(movable.battery_module && movable.battery_module.battery)
data["battery_rating"] = movable.battery_module.battery.maxcharge
data["battery_percent"] = round(movable.battery_module.battery.percent())
if(movable.battery_module)
if(movable.battery_module && movable.battery_module.battery)
data["battery"] = list("max" = movable.battery_module.battery.maxcharge, "charge" = round(movable.battery_module.battery.charge))
var/list/all_entries[0]
for(var/I in hardware)
for(var/I in movable.all_components)
var/obj/item/weapon/computer_hardware/H = I
all_entries.Add(list(list(
"name" = H.name,
@@ -14,6 +14,9 @@
if(..())
return 1
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
var/obj/item/weapon/computer_hardware/hard_drive/RHDD = computer.portable_drive
switch(action)
if("PRG_openfile")
. = 1
@@ -23,7 +26,6 @@
var/newname = sanitize(input(usr, "Enter file name or leave blank to cancel:", "File rename"))
if(!newname)
return 1
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
if(!HDD)
return 1
var/datum/computer_file/data/F = new/datum/computer_file/data()
@@ -32,7 +34,6 @@
HDD.store_file(F)
if("PRG_deletefile")
. = 1
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
if(!HDD)
return 1
var/datum/computer_file/file = HDD.find_file_by_name(params["name"])
@@ -41,7 +42,6 @@
HDD.remove_file(file)
if("PRG_usbdeletefile")
. = 1
var/obj/item/weapon/computer_hardware/hard_drive/RHDD = computer.portable_drive
if(!RHDD)
return 1
var/datum/computer_file/file = RHDD.find_file_by_name(params["name"])
@@ -54,7 +54,6 @@
error = null
if("PRG_clone")
. = 1
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
if(!HDD)
return 1
var/datum/computer_file/F = HDD.find_file_by_name(params["name"])
@@ -64,7 +63,6 @@
HDD.store_file(C)
if("PRG_rename")
. = 1
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
if(!HDD)
return 1
var/datum/computer_file/file = HDD.find_file_by_name(params["name"])
@@ -77,7 +75,6 @@
. = 1
if(!open_file)
return 1
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
if(!HDD)
return 1
var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
@@ -104,36 +101,31 @@
. = 1
if(!open_file)
return 1
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
if(!HDD)
return 1
var/datum/computer_file/data/F = HDD.find_file_by_name(open_file)
if(!F || !istype(F))
return 1
if(!computer.nano_printer)
if(!computer.printer)
error = "Missing Hardware: Your computer does not have required hardware to complete this operation."
return 1
if(!computer.nano_printer.print_text(parse_tags(F.stored_data)))
if(!computer.printer.print_text(parse_tags(F.stored_data)))
error = "Hardware error: Printer was unable to print the file. It may be out of paper."
return 1
if("PRG_copytousb")
. = 1
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive
if(!HDD || !RHDD)
return 1
var/datum/computer_file/F = HDD.find_file_by_name(params)
var/datum/computer_file/F = HDD.find_file_by_name(params["name"])
if(!F || !istype(F))
return 1
var/datum/computer_file/C = F.clone(0)
RHDD.store_file(C)
if("PRG_copyfromusb")
. = 1
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.hard_drive
var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.portable_drive
if(!HDD || !RHDD)
return 1
var/datum/computer_file/F = RHDD.find_file_by_name(params)
var/datum/computer_file/F = RHDD.find_file_by_name(params["name"])
if(!F || !istype(F))
return 1
var/datum/computer_file/C = F.clone(0)
@@ -15,7 +15,7 @@
var/download_completion = 0 //GQ of downloaded data.
var/download_netspeed = 0
var/downloaderror = ""
var/obj/item/modular_computer/my_computer = null
var/obj/item/device/modular_computer/my_computer = null
/datum/computer_file/program/ntnetdownload/proc/begin_file_download(filename)
if(downloaded_file)
@@ -27,10 +27,10 @@
return 0
// Attempting to download antag only program, but without having emagged computer. No.
if(PRG.available_on_syndinet && !computer_emagged)
if(PRG.available_on_syndinet && !computer.emagged)
return 0
if(!computer || !computer.hard_drive || !computer.hard_drive.try_store_file(PRG))
if(!computer || !computer.hard_drive || !computer.hard_drive.can_store_file(PRG))
return 0
ui_header = "downloader_running.gif"
@@ -50,7 +50,7 @@
/datum/computer_file/program/ntnetdownload/proc/abort_file_download()
if(!downloaded_file)
return
generate_network_log("Aborted download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].")
generate_network_log("Aborted download of file [hacked_download ? "**ENCRYPTED**" : "[downloaded_file.filename].[downloaded_file.filetype]"].")
downloaded_file = null
download_completion = 0
ui_header = "downloader_finished.gif"
@@ -58,7 +58,7 @@
/datum/computer_file/program/ntnetdownload/proc/complete_file_download()
if(!downloaded_file)
return
generate_network_log("Completed download of file [hacked_download ? "**ENCRYPTED**" : downloaded_file.filename].[downloaded_file.filetype].")
generate_network_log("Completed download of file [hacked_download ? "**ENCRYPTED**" : "[downloaded_file.filename].[downloaded_file.filetype]"].")
if(!computer || !computer.hard_drive || !computer.hard_drive.store_file(downloaded_file))
// The download failed
downloaderror = "I/O ERROR - Unable to save file. Check whether you have enough free space on your hard drive and whether your hard drive is properly connected. If the issue persists contact your system administrator for assistance."
@@ -101,7 +101,6 @@
return 0
/datum/computer_file/program/ntnetdownload/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if (!ui)
@@ -113,7 +112,6 @@
ui.set_autoupdate(state = 1)
/datum/computer_file/program/ntnetdownload/ui_data(mob/user)
my_computer = computer
if(!istype(my_computer))
@@ -146,7 +144,7 @@
"size" = P.size
)))
data["hackedavailable"] = 0
if(computer_emagged) // If we are running on emagged computer we have access to some "bonus" software
if(computer.emagged) // If we are running on emagged computer we have access to some "bonus" software
var/list/hacked_programs[0]
for(var/S in ntnet_global.available_antag_software)
var/datum/computer_file/program/P = S
@@ -161,4 +159,4 @@
data["downloadable_programs"] = all_entries
return data
return data
@@ -173,11 +173,11 @@
else
ui_header = "ntnrc_idle.gif"
/datum/computer_file/program/chatclient/kill_program(forced = 0)
/datum/computer_file/program/chatclient/kill_program(forced = FALSE)
if(channel)
channel.remove_client(src)
channel = null
..(forced)
..()
/datum/computer_file/program/chatclient/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state)
@@ -44,7 +44,7 @@ var/global/nttransfer_uid = 0
if(!remote)
crash_download("Connection to remote server lost")
/datum/computer_file/program/nttransfer/kill_program(forced = 0)
/datum/computer_file/program/nttransfer/kill_program(forced = FALSE)
if(downloaded_file) // Client mode, clean up variables for next use
finalize_download()
@@ -170,7 +170,7 @@ var/global/nttransfer_uid = 0
data["uploading"] = 1
data["upload_uid"] = unique_token
data["upload_clients"] = connected_clients.len
data["upload_haspassword"] = server_password ? 1 : 0
data["haspassword"] = server_password ? 1 : 0
data["upload_filename"] = "[provided_file.filename].[provided_file.filetype]"
else if (upload_menu)
var/list/all_files[0]