upload files
This commit is contained in:
@@ -386,32 +386,32 @@
|
||||
to_chat(user, "<span class='notice'>You repair \the [src].</span>")
|
||||
return
|
||||
|
||||
if(W.tool_behaviour == TOOL_SCREWDRIVER)
|
||||
if(!all_components.len)
|
||||
to_chat(user, "<span class='warning'>This device doesn't have any components installed.</span>")
|
||||
return
|
||||
var/list/component_names = list()
|
||||
for(var/h in all_components)
|
||||
var/obj/item/computer_hardware/H = all_components[h]
|
||||
component_names.Add(H.name)
|
||||
..()
|
||||
|
||||
var/choice = input(user, "Which component do you want to uninstall?", "Computer maintenance", null) as null|anything in sortList(component_names)
|
||||
/obj/item/modular_computer/screwdriver_act(mob/user, obj/item/tool)
|
||||
if(!all_components.len)
|
||||
to_chat(user, "<span class='warning'>This device doesn't have any components installed.</span>")
|
||||
return
|
||||
var/list/component_names = list()
|
||||
for(var/h in all_components)
|
||||
var/obj/item/computer_hardware/H = all_components[h]
|
||||
component_names.Add(H.name)
|
||||
|
||||
if(!choice)
|
||||
return
|
||||
var/choice = input(user, "Which component do you want to uninstall?", "Computer maintenance", null) as null|anything in sortList(component_names)
|
||||
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
|
||||
var/obj/item/computer_hardware/H = find_hardware_by_name(choice)
|
||||
|
||||
if(!H)
|
||||
return
|
||||
|
||||
uninstall_component(H, user)
|
||||
if(!choice)
|
||||
return
|
||||
|
||||
..()
|
||||
if(!Adjacent(user))
|
||||
return
|
||||
|
||||
var/obj/item/computer_hardware/H = find_hardware_by_name(choice)
|
||||
|
||||
if(!H)
|
||||
return
|
||||
|
||||
uninstall_component(H, user)
|
||||
return
|
||||
|
||||
// Used by processor to relay qdel() to machinery type.
|
||||
/obj/item/modular_computer/proc/relay_qdel()
|
||||
|
||||
@@ -47,7 +47,9 @@
|
||||
|
||||
data["login"] = list()
|
||||
var/obj/item/computer_hardware/card_slot/cardholder = all_components[MC_CARD]
|
||||
data["cardholder"] = FALSE
|
||||
if(cardholder)
|
||||
data["cardholder"] = TRUE
|
||||
var/obj/item/card/id/stored_card = cardholder.GetID()
|
||||
if(stored_card)
|
||||
var/stored_name = stored_card.registered_name
|
||||
|
||||
@@ -0,0 +1,98 @@
|
||||
/// Borg Built-in tablet interface
|
||||
/obj/item/modular_computer/tablet/integrated
|
||||
name = "modular interface"
|
||||
icon_state = "tablet-silicon"
|
||||
has_light = FALSE //tablet light button actually enables/disables the borg lamp
|
||||
comp_light_luminosity = 0
|
||||
has_variants = FALSE
|
||||
///Ref to the borg we're installed in. Set by the borg during our creation.
|
||||
var/mob/living/silicon/robot/borgo
|
||||
///Ref to the RoboTact app. Important enough to borgs to deserve a ref.
|
||||
var/datum/computer_file/program/robotact/robotact
|
||||
///IC log that borgs can view in their personal management app
|
||||
var/list/borglog = list()
|
||||
|
||||
/obj/item/modular_computer/tablet/integrated/Initialize(mapload)
|
||||
. = ..()
|
||||
vis_flags |= VIS_INHERIT_ID
|
||||
borgo = loc
|
||||
if(!istype(borgo))
|
||||
borgo = null
|
||||
stack_trace("[type] initialized outside of a borg, deleting.")
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/item/modular_computer/tablet/integrated/Destroy()
|
||||
borgo = null
|
||||
return ..()
|
||||
|
||||
/obj/item/modular_computer/tablet/integrated/turn_on(mob/user)
|
||||
if(borgo?.stat != DEAD)
|
||||
return ..()
|
||||
return FALSE
|
||||
|
||||
/**
|
||||
* Returns a ref to the RoboTact app, creating the app if need be.
|
||||
*
|
||||
* The RoboTact app is important for borgs, and so should always be available.
|
||||
* This proc will look for it in the tablet's robotact var, then check the
|
||||
* hard drive if the robotact var is unset, and finally attempt to create a new
|
||||
* copy if the hard drive does not contain the app. If the hard drive rejects
|
||||
* the new copy (such as due to lack of space), the proc will crash with an error.
|
||||
* RoboTact is supposed to be undeletable, so these will create runtime messages.
|
||||
*/
|
||||
/obj/item/modular_computer/tablet/integrated/proc/get_robotact()
|
||||
if(!borgo)
|
||||
return null
|
||||
if(!robotact)
|
||||
var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
|
||||
robotact = hard_drive.find_file_by_name("robotact")
|
||||
if(!robotact)
|
||||
stack_trace("Cyborg [borgo] ( [borgo.type] ) was somehow missing their self-manage app in their tablet. A new copy has been created.")
|
||||
robotact = new(hard_drive)
|
||||
if(!hard_drive.store_file(robotact))
|
||||
qdel(robotact)
|
||||
robotact = null
|
||||
CRASH("Cyborg [borgo]'s tablet hard drive rejected recieving a new copy of the self-manage app. To fix, check the hard drive's space remaining. Please make a bug report about this.")
|
||||
return robotact
|
||||
|
||||
//Makes the light settings reflect the borg's headlamp settings
|
||||
/obj/item/modular_computer/tablet/integrated/ui_data(mob/user)
|
||||
. = ..()
|
||||
.["has_light"] = TRUE
|
||||
.["light_on"] = borgo?.lamp_enabled
|
||||
.["comp_light_color"] = borgo?.lamp_color
|
||||
|
||||
//Overrides the ui_act to make the flashlight controls link to the borg instead
|
||||
/obj/item/modular_computer/tablet/integrated/ui_act(action, params)
|
||||
switch(action)
|
||||
if("PC_toggle_light")
|
||||
if(!borgo)
|
||||
return FALSE
|
||||
borgo.toggle_headlamp()
|
||||
return TRUE
|
||||
|
||||
if("PC_light_color")
|
||||
if(!borgo)
|
||||
return FALSE
|
||||
var/mob/user = usr
|
||||
var/new_color
|
||||
while(!new_color)
|
||||
new_color = input(user, "Choose a new color for [src]'s flashlight.", "Light Color",light_color) as color|null
|
||||
if(!new_color || QDELETED(borgo))
|
||||
return
|
||||
if(color_hex2num(new_color) < 200) //Colors too dark are rejected
|
||||
to_chat(user, "<span class='warning'>That color is too dark! Choose a lighter one.</span>")
|
||||
new_color = null
|
||||
borgo.lamp_color = new_color
|
||||
borgo.toggle_headlamp(FALSE, TRUE)
|
||||
return TRUE
|
||||
return ..()
|
||||
|
||||
/obj/item/modular_computer/tablet/integrated/syndicate
|
||||
icon_state = "tablet-silicon-syndicate"
|
||||
device_theme = "syndicate"
|
||||
|
||||
|
||||
/obj/item/modular_computer/tablet/integrated/syndicate/Initialize()
|
||||
. = ..()
|
||||
borgo.lamp_color = COLOR_RED //Syndicate likes it red
|
||||
@@ -41,6 +41,7 @@
|
||||
comp_light_luminosity = 6.3
|
||||
has_variants = FALSE
|
||||
device_theme = "syndicate"
|
||||
light_color = COLOR_RED
|
||||
|
||||
/obj/item/modular_computer/tablet/nukeops/emag_act(mob/user)
|
||||
if(!enabled)
|
||||
|
||||
@@ -67,3 +67,11 @@
|
||||
install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer))
|
||||
install_component(new /obj/item/computer_hardware/hard_drive/small/nukeops)
|
||||
install_component(new /obj/item/computer_hardware/network_card)
|
||||
|
||||
//Borg Built-in tablet
|
||||
/obj/item/modular_computer/tablet/integrated/Initialize()
|
||||
. = ..()
|
||||
install_component(new /obj/item/computer_hardware/processor_unit/small)
|
||||
install_component(new /obj/item/computer_hardware/hard_drive/small/integrated)
|
||||
install_component(new /obj/item/computer_hardware/recharger/cyborg)
|
||||
install_component(new /obj/item/computer_hardware/network_card/integrated)
|
||||
|
||||
@@ -146,3 +146,7 @@
|
||||
/obj/machinery/modular_computer/bullet_act(obj/item/projectile/Proj)
|
||||
if(cpu)
|
||||
cpu.bullet_act(Proj)
|
||||
|
||||
/obj/machinery/modular_computer/screwdriver_act(mob/user, obj/item/tool)
|
||||
if(cpu)
|
||||
return cpu.screwdriver_act(user, tool)
|
||||
|
||||
@@ -17,6 +17,12 @@
|
||||
|
||||
/datum/computer_file/program/revelation/proc/activate()
|
||||
if(computer)
|
||||
if(istype(computer, /obj/item/modular_computer/tablet/integrated)) //If this is a borg's integrated tablet
|
||||
var/obj/item/modular_computer/tablet/integrated/modularInterface = computer
|
||||
to_chat(modularInterface.borgo,"<span class='userdanger'>SYSTEM PURGE DETECTED/</span>")
|
||||
addtimer(CALLBACK(modularInterface.borgo, /mob/living/silicon/robot/.proc/death), 2 SECONDS, TIMER_UNIQUE)
|
||||
return
|
||||
|
||||
computer.visible_message("<span class='notice'>\The [computer]'s screen brightly flashes and loud electrical buzzing is heard.</span>")
|
||||
computer.enabled = FALSE
|
||||
computer.update_icon()
|
||||
|
||||
@@ -54,10 +54,14 @@
|
||||
var/ID = checkID()
|
||||
if(!ID)
|
||||
return
|
||||
if(R.stat == DEAD) //Dead borgs will listen to you no longer
|
||||
to_chat(usr, "<span class='warn'>Error -- Could not open a connection to unit:[R]</span>")
|
||||
var/message = stripped_input(usr, message = "Enter message to be sent to remote cyborg.", title = "Send Message")
|
||||
if(!message)
|
||||
return
|
||||
to_chat(R, "<br><br><span class='notice'>Message from [ID] -- \"[message]\"</span><br>")
|
||||
to_chat(usr, "Message sent to [R]: [message]")
|
||||
R.logevent("Message from [ID] -- \"[message]\"")
|
||||
SEND_SOUND(R, 'sound/machines/twobeep_high.ogg')
|
||||
if(R.connected_ai)
|
||||
to_chat(R.connected_ai, "<br><br><span class='notice'>Message from [ID] to [R] -- \"[message]\"</span><br>")
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
/datum/computer_file/program/robotact
|
||||
filename = "robotact"
|
||||
filedesc = "RoboTact"
|
||||
extended_desc = "A built-in app for cyborg self-management and diagnostics."
|
||||
ui_header = "robotact.gif" //DEBUG -- new icon before PR
|
||||
program_icon_state = "command"
|
||||
requires_ntnet = FALSE
|
||||
transfer_access = null
|
||||
available_on_ntnet = FALSE
|
||||
unsendable = TRUE
|
||||
undeletable = TRUE
|
||||
usage_flags = PROGRAM_TABLET
|
||||
size = 5
|
||||
tgui_id = "NtosRobotact"
|
||||
///A typed reference to the computer, specifying the borg tablet type
|
||||
var/obj/item/modular_computer/tablet/integrated/tablet
|
||||
|
||||
/datum/computer_file/program/robotact/Destroy()
|
||||
tablet = null
|
||||
return ..()
|
||||
|
||||
/datum/computer_file/program/robotact/run_program(mob/living/user)
|
||||
if(!istype(computer, /obj/item/modular_computer/tablet/integrated))
|
||||
to_chat(user, "<span class='warning'>A warning flashes across \the [computer]: Device Incompatible.</span>")
|
||||
return FALSE
|
||||
. = ..()
|
||||
if(.)
|
||||
tablet = computer
|
||||
if(tablet.device_theme == "syndicate")
|
||||
program_icon_state = "command-syndicate"
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/computer_file/program/robotact/ui_data(mob/user)
|
||||
var/list/data = get_header_data()
|
||||
if(!iscyborg(user))
|
||||
return data
|
||||
var/mob/living/silicon/robot/borgo = tablet.borgo
|
||||
|
||||
data["name"] = borgo.name
|
||||
data["designation"] = borgo.designation //Borgo module type
|
||||
data["masterAI"] = borgo.connected_ai //Master AI
|
||||
|
||||
var/charge = 0
|
||||
var/maxcharge = 1
|
||||
if(borgo.cell)
|
||||
charge = borgo.cell.charge
|
||||
maxcharge = borgo.cell.maxcharge
|
||||
data["charge"] = charge //Current cell charge
|
||||
data["maxcharge"] = maxcharge //Cell max charge
|
||||
data["integrity"] = ((borgo.health + 100) / 2) //Borgo health, as percentage
|
||||
data["lampIntensity"] = borgo.lamp_intensity //Borgo lamp power setting
|
||||
data["sensors"] = "[borgo.sensors_on?"ACTIVE":"DISABLED"]"
|
||||
data["printerPictures"] = borgo.connected_ai? borgo.connected_ai.aicamera.stored.len : borgo.aicamera.stored.len //Number of pictures taken, synced to AI if available
|
||||
data["printerToner"] = borgo.toner //amount of toner
|
||||
data["printerTonerMax"] = borgo.tonermax //It's a variable, might as well use it
|
||||
data["thrustersInstalled"] = borgo.ionpulse //If we have a thruster uprade
|
||||
data["thrustersStatus"] = "[borgo.ionpulse_on?"ACTIVE":"DISABLED"]" //Feedback for thruster status
|
||||
data["lampPowerUse"] = clamp(borgo.lamp_enabled ? (borgo.lamp_intensity - 2) : 0 * 2,1,borgo.cell.charge)
|
||||
|
||||
//DEBUG -- Cover, TRUE for locked
|
||||
data["cover"] = "[borgo.locked? "LOCKED":"UNLOCKED"]"
|
||||
//Ability to move. FAULT if lockdown wire is cut, DISABLED if borg locked, ENABLED otherwise
|
||||
data["locomotion"] = "[borgo.wires.is_cut(WIRE_LOCKDOWN)?"FAULT":"[borgo.locked_down?"DISABLED":"ENABLED"]"]"
|
||||
//Module wire. FAULT if cut, NOMINAL otherwise
|
||||
data["wireModule"] = "[borgo.wires.is_cut(WIRE_RESET_MODULE)?"FAULT":"NOMINAL"]"
|
||||
//DEBUG -- Camera(net) wire. FAULT if cut (or no cameranet camera), DISABLED if pulse-disabled, NOMINAL otherwise
|
||||
data["wireCamera"] = "[!borgo.builtInCamera || borgo.wires.is_cut(WIRE_CAMERA)?"FAULT":"[borgo.builtInCamera.can_use()?"NOMINAL":"DISABLED"]"]"
|
||||
//AI wire. FAULT if wire is cut, CONNECTED if connected to AI, READY otherwise
|
||||
data["wireAI"] = "[borgo.wires.is_cut(WIRE_AI)?"FAULT":"[borgo.connected_ai?"CONNECTED":"READY"]"]"
|
||||
//Law sync wire. FAULT if cut, NOMINAL otherwise
|
||||
data["wireLaw"] = "[borgo.wires.is_cut(WIRE_LAWSYNC)?"FAULT":"NOMINAL"]"
|
||||
|
||||
return data
|
||||
|
||||
/datum/computer_file/program/robotact/ui_static_data(mob/user)
|
||||
var/list/data = list()
|
||||
if(!iscyborg(user))
|
||||
return data
|
||||
var/mob/living/silicon/robot/borgo = user
|
||||
|
||||
data["Laws"] = borgo.laws.get_law_list(TRUE, TRUE, FALSE)
|
||||
data["borgLog"] = tablet.borglog
|
||||
data["borgUpgrades"] = borgo.upgrades
|
||||
return data
|
||||
|
||||
/datum/computer_file/program/robotact/ui_act(action, params)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
|
||||
var/mob/living/silicon/robot/borgo = tablet.borgo
|
||||
|
||||
switch(action)
|
||||
if("coverunlock")
|
||||
if(borgo.locked)
|
||||
borgo.locked = FALSE
|
||||
borgo.update_icons()
|
||||
if(borgo.emagged)
|
||||
borgo.logevent("ChÃ¥vÃis cover lock has been [borgo.locked ? "engaged" : "released"]") //"The cover interface glitches out for a split second"
|
||||
else
|
||||
borgo.logevent("Chassis cover lock has been [borgo.locked ? "engaged" : "released"]")
|
||||
|
||||
if("lawchannel")
|
||||
borgo.set_autosay()
|
||||
|
||||
if("lawstate")
|
||||
borgo.checklaws()
|
||||
|
||||
if("alertPower")
|
||||
if(borgo.stat == CONSCIOUS)
|
||||
if(!borgo.cell || !borgo.cell.charge)
|
||||
borgo.visible_message("<span class='notice'>The power warning light on <span class='name'>[borgo]</span> flashes urgently.</span>", \
|
||||
"You announce you are operating in low power mode.")
|
||||
playsound(borgo, 'sound/machines/buzz-two.ogg', 50, FALSE)
|
||||
|
||||
if("toggleSensors")
|
||||
borgo.toggle_sensors()
|
||||
|
||||
if("viewImage")
|
||||
if(borgo.connected_ai)
|
||||
borgo.connected_ai.aicamera?.viewpictures(usr)
|
||||
else
|
||||
borgo.aicamera?.viewpictures(usr)
|
||||
|
||||
if("printImage")
|
||||
var/obj/item/camera/siliconcam/robot_camera/borgcam = borgo.aicamera
|
||||
borgcam?.borgprint(usr)
|
||||
|
||||
if("toggleThrusters")
|
||||
borgo.toggle_ionpulse()
|
||||
|
||||
if("lampIntensity")
|
||||
borgo.lamp_intensity = params["ref"]
|
||||
borgo.toggle_headlamp(FALSE, TRUE)
|
||||
|
||||
/**
|
||||
* Forces a full update of the UI, if currently open.
|
||||
*
|
||||
* Forces an update that includes refreshing ui_static_data. Called by
|
||||
* law changes and borg log additions.
|
||||
*/
|
||||
/datum/computer_file/program/robotact/proc/force_full_update()
|
||||
if(tablet)
|
||||
var/datum/tgui/active_ui = SStgui.get_open_ui(tablet.borgo, src)
|
||||
if(active_ui)
|
||||
active_ui.send_full_update()
|
||||
@@ -184,3 +184,9 @@
|
||||
max_capacity = 32
|
||||
icon_state = "ssd_micro"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
|
||||
// For borg integrated tablets. No downloader.
|
||||
/obj/item/computer_hardware/hard_drive/small/integrated/install_default_programs()
|
||||
store_file(new /datum/computer_file/program/computerconfig(src)) // Computer configuration utility, allows hardware control and displays more info than status bar
|
||||
store_file(new /datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation.
|
||||
store_file(new /datum/computer_file/program/robotact(src))
|
||||
|
||||
@@ -77,3 +77,23 @@
|
||||
power_usage = 100 // Better range but higher power usage.
|
||||
icon_state = "net_wired"
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
|
||||
/obj/item/computer_hardware/network_card/integrated //Borg tablet version, only works while the borg has power and is not locked
|
||||
name = "cyborg data link"
|
||||
|
||||
/obj/item/computer_hardware/network_card/integrated/get_signal(specific_action = 0)
|
||||
var/obj/item/modular_computer/tablet/integrated/modularInterface = holder
|
||||
|
||||
if(!modularInterface || !istype(modularInterface))
|
||||
return FALSE //wrong type of tablet
|
||||
|
||||
if(!modularInterface.borgo)
|
||||
return FALSE //No borg found
|
||||
|
||||
if(modularInterface.borgo.locked_down)
|
||||
return FALSE //lockdown restricts borg networking
|
||||
|
||||
if(!modularInterface.borgo.cell || modularInterface.borgo.cell.charge == 0)
|
||||
return FALSE //borg cell dying restricts borg networking
|
||||
|
||||
return ..()
|
||||
|
||||
@@ -89,3 +89,12 @@
|
||||
|
||||
/obj/item/computer_hardware/recharger/lambda/use_power(amount, charging=0)
|
||||
return 1
|
||||
|
||||
/// This recharger exists only in borg built-in tablets. I would have tied it to the borg's cell but
|
||||
/// the program that displays laws should always be usable, and the exceptions were starting to pile.
|
||||
/obj/item/computer_hardware/recharger/cyborg
|
||||
name = "modular interface power harness"
|
||||
desc = "A standard connection to power a small computer device from a cyborg's chassis."
|
||||
|
||||
/obj/item/computer_hardware/recharger/cyborg/use_power(amount, charging=0)
|
||||
return TRUE
|
||||
|
||||
Reference in New Issue
Block a user