Removes network cards and printers from tablets (#70110)

This commit is contained in:
John Willard
2022-09-26 14:18:58 -04:00
committed by GitHub
parent a5ac8020a8
commit 7c990173e0
38 changed files with 298 additions and 705 deletions

View File

@@ -175,7 +175,6 @@
/area/ruin/unpowered)
"mg" = (
/obj/structure/table/reinforced,
/obj/item/computer_hardware/printer,
/turf/open/floor/pod/light,
/area/ruin/unpowered)
"mi" = (
@@ -481,7 +480,6 @@
/area/ruin/unpowered)
"HC" = (
/obj/structure/table/wood,
/obj/item/computer_hardware/printer,
/obj/machinery/light/small/broken/directional/east,
/turf/open/floor/wood,
/area/ruin/unpowered)

View File

@@ -5,8 +5,6 @@
#define MC_SDD "SDD"
#define MC_CARD "CARD"
#define MC_CARD2 "CARD2"
#define MC_NET "NET"
#define MC_PRINT "PRINT"
#define MC_CELL "CELL"
//NTNet stuff, for modular computers
@@ -43,3 +41,13 @@
#define DETOMATIX_RESIST_MINOR 1
#define DETOMATIX_RESIST_MAJOR 2
// NTNet connection signals
///When you're away from the station/mining base and not on a console, you can't access the internet
#define NTNET_NO_SIGNAL 0
///Low signal, so away from the station, but still connected
#define NTNET_LOW_SIGNAL 1
///On station, good signal
#define NTNET_GOOD_SIGNAL 2
///Using a Computer, ethernet-connected.
#define NTNET_ETHERNET_SIGNAL 3

View File

@@ -33,7 +33,7 @@
#define __NETWORK_CARGO "CARGO"
#define __NETWORK_BOTS "BOTS"
#define __NETWORK_COMPUTER "COMPUTER"
#define __NETWORK_CARDS "CARDS"
#define __NETWORK_TABLETS "TABLETS"
#define __NETWORK_CIRCUITS "CIRCUITS"
/// Various combined subnetworks
@@ -41,7 +41,7 @@
#define NETWORK_DOOR_AIRLOCKS NETWORK_NAME_COMBINE(__NETWORK_DOORS, __NETWORK_AIRLOCKS)
#define NETWORK_ATMOS_AIRALARMS NETWORK_NAME_COMBINE(__NETWORK_ATMOS, __NETWORK_AIRALARMS)
#define NETWORK_ATMOS_SCUBBERS NETWORK_NAME_COMBINE(__NETWORK_ATMOS, __NETWORK_SCUBBERS)
#define NETWORK_CARDS NETWORK_NAME_COMBINE(__NETWORK_COMPUTER, __NETWORK_CARDS)
#define NETWORK_TABLETS NETWORK_NAME_COMBINE(__NETWORK_COMPUTER, __NETWORK_TABLETS)
#define NETWORK_BOTS_CARGO NETWORK_NAME_COMBINE(__NETWORK_CARGO, __NETWORK_BOTS)

View File

@@ -215,7 +215,7 @@ SUBSYSTEM_DEF(networks)
* * network - optional, It can be a ntnet or just the text equivalent
* * hardware_id = optional, text, will look it up and return with the parent.name as well
*/
/datum/controller/subsystem/networks/proc/add_log(log_string, network = null , hardware_id = null)
/datum/controller/subsystem/networks/proc/add_log(log_string, network = null)
set waitfor = FALSE // so process keeps running
var/list/log_text = list()
log_text += "\[[station_time_timestamp()]\]"
@@ -228,15 +228,7 @@ SUBSYSTEM_DEF(networks)
else // bad network?
log_text += "{[network] *BAD*}"
if(hardware_id)
var/datum/component/ntnet_interface/conn = interfaces_by_hardware_id[hardware_id]
if(conn)
log_text += " ([hardware_id])[conn.parent]"
else
log_text += " ([hardware_id])*BAD ID*"
else
log_text += "*SYSTEM*"
log_text += " - "
log_text += "*SYSTEM* - "
log_text += log_string
log_string = log_text.Join()

View File

@@ -113,26 +113,6 @@
export_types = list(/obj/item/computer_hardware/hard_drive)
include_subtypes = TRUE
//Networking Parts
/datum/export/modular_part/networkcard/advanced
cost = CARGO_CRATE_VALUE * 0.5
unit_name = "advanced network card"
export_types = list(/obj/item/computer_hardware/network_card/advanced)
include_subtypes = FALSE
/datum/export/modular_part/networkcard/wired
cost = CARGO_CRATE_VALUE
unit_name = "wired network card"
export_types = list(/obj/item/computer_hardware/network_card/wired)
include_subtypes = FALSE
/datum/export/modular_part/networkcard/standard
cost = CARGO_CRATE_VALUE * 0.25
unit_name = "network card"
export_types = list(/obj/item/computer_hardware/network_card)
include_subtypes = TRUE
//Miscellaneous Parts
/datum/export/modular_part/idcard
@@ -141,12 +121,6 @@
export_types = list(/obj/item/computer_hardware/card_slot)
include_subtypes = TRUE
/datum/export/modular_part/miniprinter
cost = CARGO_CRATE_VALUE * 0.2
unit_name = "miniprinter"
export_types = list(/obj/item/computer_hardware/printer/mini)
include_subtypes = TRUE
/datum/export/modular_part/misc
cost = CARGO_CRATE_VALUE * 0.1
unit_name = "miscellaneous computer part"

View File

@@ -449,7 +449,7 @@
if(!modularInterface)
stack_trace("Silicon [src] ( [type] ) was somehow missing their integrated tablet. Please make a bug report.")
create_modularInterface()
var/mob/living/silicon/robot/robo = modularInterface.borgo
var/mob/living/silicon/robot/robo = modularInterface.silicon_owner
if(istype(robo))
modularInterface.borglog += "[station_time_timestamp()] - [string]"
var/datum/computer_file/program/robotact/program = modularInterface.get_robotact()

View File

@@ -22,7 +22,9 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
var/screen_on = 1 // Whether the computer is active/opened/it's screen is on.
var/device_theme = "ntos" // Sets the theme for the main menu, hardware config, and file browser apps. Overridden by certain non-NT devices.
var/datum/computer_file/program/active_program = null // A currently active program running on the computer.
var/hardware_flag = 0 // A flag that describes this device type
///The type of device this computer is, as a flag
var/hardware_flag = NONE
// Options: PROGRAM_ALL PROGRAM_CONSOLE | | PROGRAM_LAPTOP | PROGRAM_TABLET
var/last_power_usage = 0
var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged
var/last_world_time = "00:00"
@@ -80,6 +82,11 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
/// Stored pAI in the computer
var/obj/item/pai_card/inserted_pai = null
///The amount of paper currently stored in the PDA
var/stored_paper = 10
///The max amount of paper that can be held at once.
var/max_paper = 30
/obj/item/modular_computer/Initialize(mapload)
. = ..()
@@ -97,6 +104,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
update_appearance()
register_context()
init_network_id(NETWORK_TABLETS)
Add_Messenger()
/obj/item/modular_computer/Destroy()
@@ -229,6 +237,18 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
return ..()
/obj/item/modular_computer/proc/print_text(text_to_print, paper_title = "")
if(!stored_paper)
return FALSE
var/obj/item/paper/printed_paper = new /obj/item/paper(drop_location())
printed_paper.add_raw_text(text_to_print)
if(paper_title)
printed_paper.name = paper_title
printed_paper.update_appearance()
stored_paper--
return TRUE
/obj/item/modular_computer/InsertID(obj/item/inserting_item)
var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2]
@@ -295,11 +315,6 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
else if(atom_integrity < max_integrity)
. += span_warning("It is damaged.")
var/obj/item/computer_hardware/hard_drive/hdd = all_components[MC_HDD]
for(var/datum/computer_file/app_examine as anything in hdd.stored_files)
if(app_examine.on_examine(src, user))
. += app_examine.on_examine(src, user)
var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
var/obj/item/computer_hardware/card_slot/card_slot2 = all_components[MC_CARD2]
var/multiple_slots = istype(card_slot) && istype(card_slot2)
@@ -316,12 +331,16 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
else
. += "It has [multiple_slots ? "two slots" : "a slot"] installed for identification cards."
var/obj/item/computer_hardware/printer/printer_slot = all_components[MC_PRINT]
if(printer_slot)
. += "It has a printer installed."
if(Adjacent(user))
. += "The printer's paper levels are at: [printer_slot.stored_paper]/[printer_slot.max_paper].</span>"
/obj/item/modular_computer/examine_more(mob/user)
. = ..()
var/obj/item/computer_hardware/hard_drive/hdd = all_components[MC_HDD]
if(hdd)
for(var/datum/computer_file/app_examine as anything in hdd.stored_files)
if(app_examine.on_examine(src, user))
. += app_examine.on_examine(src, user)
if(Adjacent(user))
. += span_notice("Paper level: [stored_paper] / [max_paper].")
/obj/item/modular_computer/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
@@ -492,13 +511,13 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
data["PC_showbatteryicon"] = battery_module ? 1 : 0
switch(get_ntnet_status())
if(0)
if(NTNET_NO_SIGNAL)
data["PC_ntneticon"] = "sig_none.gif"
if(1)
if(NTNET_LOW_SIGNAL)
data["PC_ntneticon"] = "sig_low.gif"
if(2)
if(NTNET_GOOD_SIGNAL)
data["PC_ntneticon"] = "sig_high.gif"
if(3)
if(NTNET_ETHERNET_SIGNAL)
data["PC_ntneticon"] = "sig_lan.gif"
if(length(idle_threads))
@@ -574,18 +593,31 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
// Returns 0 for No Signal, 1 for Low Signal and 2 for Good Signal. 3 is for wired connection (always-on)
/obj/item/modular_computer/proc/get_ntnet_status(specific_action = 0)
var/obj/item/computer_hardware/network_card/network_card = all_components[MC_NET]
if(network_card)
return network_card.get_signal(specific_action)
else
return 0
if(!SSnetworks.station_network || !SSnetworks.station_network.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal.
return NTNET_NO_SIGNAL
// computers are connected through ethernet
if(hardware_flag & PROGRAM_CONSOLE)
return NTNET_ETHERNET_SIGNAL
var/turf/current_turf = get_turf(src)
if(!current_turf || !istype(current_turf))
return NTNET_NO_SIGNAL
if(is_station_level(current_turf.z))
if(hardware_flag & PROGRAM_LAPTOP) //laptops can connect to ethernet but they have to be on station for that
return NTNET_ETHERNET_SIGNAL
return NTNET_GOOD_SIGNAL
else if(is_mining_level(current_turf.z))
return NTNET_LOW_SIGNAL
return NTNET_NO_SIGNAL
/obj/item/modular_computer/proc/add_log(text)
if(!get_ntnet_status())
return FALSE
var/obj/item/computer_hardware/network_card/network_card = all_components[MC_NET]
return SSnetworks.add_log(text, network_card.network_id, network_card.hardware_id)
return SSnetworks.add_log(text, network_id)
/obj/item/modular_computer/proc/shutdown_computer(loud = 1)
kill_program(forced = TRUE)
@@ -638,7 +670,77 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
/obj/item/modular_computer/proc/UpdateDisplay()
name = "[saved_identification] ([saved_job])"
/obj/item/modular_computer/attackby(obj/item/attacking_item, mob/user, params)
// Check for ID first
if(isidcard(attacking_item) && InsertID(attacking_item))
return
// Check for cash next
var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
if(card_slot && iscash(attacking_item))
var/obj/item/card/id/inserted_id = card_slot.GetID()
if(inserted_id)
inserted_id.attackby(attacking_item, user) // If we do, try and put that attacking object in
return
// Inserting a pAI
if(istype(attacking_item, /obj/item/pai_card) && !inserted_pai)
if(!user.transferItemToLoc(attacking_item, src))
return
inserted_pai = attacking_item
to_chat(user, span_notice("You slot \the [attacking_item] into [src]."))
return
// Check if any Applications need it
var/obj/item/computer_hardware/hard_drive/hdd = all_components[MC_HDD]
if(hdd)
for(var/datum/computer_file/item_holding_app as anything in hdd.stored_files)
if(item_holding_app.try_insert(attacking_item, user))
return
if(istype(attacking_item, /obj/item/paper))
if(stored_paper >= max_paper)
to_chat(user, span_warning("You try to add \the [attacking_item] into [src], but it can't hold any more!"))
return
if(!user.temporarilyRemoveItemFromInventory(attacking_item))
return FALSE
to_chat(user, span_notice("You insert \the [attacking_item] into [src]'s paper recycler."))
qdel(attacking_item)
stored_paper++
return
if(istype(attacking_item, /obj/item/paper_bin))
var/obj/item/paper_bin/bin = attacking_item
if(bin.total_paper <= 0)
to_chat(user, span_notice("\The [bin] is empty!"))
return
var/papers_added //just to keep track
while((bin.total_paper > 0) && (stored_paper < max_paper))
papers_added++
stored_paper++
bin.remove_paper()
if(!papers_added)
return
to_chat(user, span_notice("Added in [papers_added] new sheets. You now have [stored_paper] / [max_paper] printing paper stored."))
bin.update_appearance()
return
// Insert items into the components
for(var/h in all_components)
var/obj/item/computer_hardware/H = all_components[h]
if(H.try_insert(attacking_item, user))
return
// Insert new hardware
if(istype(attacking_item, /obj/item/computer_hardware) && upgradable)
if(install_component(attacking_item, user))
playsound(src, 'sound/machines/card_slide.ogg', 50)
return
return ..()
/obj/item/modular_computer/screwdriver_act(mob/user, obj/item/tool)
. = ..()
if(!deconstructable)
return
if(!length(all_components))
@@ -650,97 +752,49 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar
component_names.Add(H.name)
var/choice = tgui_input_list(user, "Component to uninstall", "Computer maintenance", sort_list(component_names))
if(isnull(choice))
return
if(!Adjacent(user))
return
var/obj/item/computer_hardware/H = find_hardware_by_name(choice)
if(!H)
return
return TOOL_ACT_TOOLTYPE_SUCCESS
tool.play_tool_sound(src, user, 20, volume=20)
uninstall_component(H, user)
return
return TOOL_ACT_TOOLTYPE_SUCCESS
/obj/item/modular_computer/attackby(obj/item/attacking_item, mob/user, params)
// Check for ID first
if(isidcard(attacking_item) && InsertID(attacking_item))
return
// Insert a PAI.
if(istype(attacking_item, /obj/item/pai_card) && !inserted_pai)
if(!user.transferItemToLoc(attacking_item, src))
return
inserted_pai = attacking_item
to_chat(user, span_notice("You slot \the [attacking_item] into [src]."))
return
var/obj/item/computer_hardware/hard_drive/hdd = all_components[MC_HDD]
// Scan a photo.
if(istype(attacking_item, /obj/item/photo))
var/obj/item/photo/pic = attacking_item
if(hdd)
for(var/datum/computer_file/program/messenger/messenger in hdd.stored_files)
saved_image = pic.picture
messenger.ProcessPhoto()
return
// Insert items into the components
for(var/h in all_components)
var/obj/item/computer_hardware/H = all_components[h]
if(H.try_insert(attacking_item, user))
return
// Insert items into applications
for(var/datum/computer_file/item_holding_app as anything in hdd.stored_files)
if(item_holding_app.try_insert(attacking_item, user))
return
// Insert new hardware
if(istype(attacking_item, /obj/item/computer_hardware) && upgradable)
if(install_component(attacking_item, user))
playsound(src, 'sound/machines/card_slide.ogg', 50)
return
if(attacking_item.tool_behaviour == TOOL_WRENCH)
/obj/item/modular_computer/wrench_act(mob/living/user, obj/item/tool)
. = ..()
if(length(all_components))
balloon_alert(user, "remove the other components!")
return
attacking_item.play_tool_sound(src, user, 20, volume=20)
new /obj/item/stack/sheet/iron( get_turf(src.loc), steel_sheet_cost )
return TOOL_ACT_TOOLTYPE_SUCCESS
tool.play_tool_sound(src, user, 20, volume=20)
new /obj/item/stack/sheet/iron(get_turf(loc), steel_sheet_cost)
user.balloon_alert(user, "disassembled")
relay_qdel()
qdel(src)
return
return TOOL_ACT_TOOLTYPE_SUCCESS
if(attacking_item.tool_behaviour == TOOL_WELDER)
/obj/item/modular_computer/welder_act(mob/living/user, obj/item/tool)
. = ..()
if(atom_integrity == max_integrity)
to_chat(user, span_warning("\The [src] does not require repairs."))
return
return TOOL_ACT_TOOLTYPE_SUCCESS
if(!attacking_item.tool_start_check(user, amount=1))
return
if(!tool.tool_start_check(user, amount=1))
return TOOL_ACT_TOOLTYPE_SUCCESS
to_chat(user, span_notice("You begin repairing damage to \the [src]..."))
if(attacking_item.use_tool(src, user, 20, volume=50, amount=1))
if(!tool.use_tool(src, user, 20, volume=50, amount=1))
return TOOL_ACT_TOOLTYPE_SUCCESS
atom_integrity = max_integrity
to_chat(user, span_notice("You repair \the [src]."))
update_appearance()
return
return TOOL_ACT_TOOLTYPE_SUCCESS
var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
// Check to see if we have an ID inside, and a valid input for money
if(card_slot?.GetID() && iscash(attacking_item))
var/obj/item/card/id/id = card_slot.GetID()
id.attackby(attacking_item, user) // If we do, try and put that attacking object in
return
..()
// Used by processor to relay qdel() to machinery type.
/obj/item/modular_computer/proc/relay_qdel()

View File

@@ -2,20 +2,15 @@
. = ..()
install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer))
install_component(new /obj/item/computer_hardware/hard_drive)
install_component(new /obj/item/computer_hardware/network_card)
install_programs()
/obj/item/modular_computer/laptop/preset/proc/install_programs()
return
/obj/item/modular_computer/laptop/preset/civilian
desc = "A low-end laptop often used for personal recreation."
/obj/item/modular_computer/laptop/preset/civilian/install_programs()
var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
hard_drive.store_file(new/datum/computer_file/program/chatclient())

View File

@@ -17,7 +17,7 @@
machinery_computer.cpu = null
machinery_computer.UnregisterSignal(src, COMSIG_ATOM_UPDATED_ICON)
machinery_computer = null
. = ..()
return ..()
/obj/item/modular_computer/processor/New(comp)
..()

View File

@@ -102,16 +102,12 @@
/datum/computer_file/program/phys_scanner/chemistry,
/datum/computer_file/program/signal_commander,
)
/obj/item/modular_computer/tablet/pda/heads/quartermaster/Initialize(mapload)
. = ..()
install_component(new /obj/item/computer_hardware/printer/mini)
/obj/item/modular_computer/tablet/pda/heads/quartermaster
name = "quartermaster PDA"
greyscale_config = /datum/greyscale_config/tablet/stripe_thick
greyscale_colors = "#D6B328#6506CA#927444"
inserted_item = /obj/item/pen/survival
stored_paper = 20
default_applications = list(
/datum/computer_file/program/crew_manifest,
/datum/computer_file/program/status,
@@ -122,10 +118,6 @@
/datum/computer_file/program/robocontrol,
)
/obj/item/modular_computer/tablet/pda/heads/quartermaster/Initialize(mapload)
. = ..()
install_component(new /obj/item/computer_hardware/printer/mini)
/**
* Security
*/
@@ -257,6 +249,7 @@
/obj/item/modular_computer/tablet/pda/cargo
name = "cargo technician PDA"
greyscale_colors = "#D6B328#6506CA"
stored_paper = 20
default_applications = list(
/datum/computer_file/program/shipping,
/datum/computer_file/program/budgetorders,

View File

@@ -174,8 +174,8 @@
has_light = FALSE //tablet light button actually enables/disables the borg lamp
comp_light_luminosity = 0
has_variants = FALSE
///Ref to the silicon we're installed in. Set by the borg during our creation.
var/mob/living/silicon/borgo
///Ref to the silicon we're installed in. Set by the silicon itself during its creation.
var/mob/living/silicon/silicon_owner
///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
@@ -184,21 +184,38 @@
/obj/item/modular_computer/tablet/integrated/Initialize(mapload)
. = ..()
vis_flags |= VIS_INHERIT_ID
borgo = loc
if(!istype(borgo))
borgo = null
silicon_owner = loc
if(!istype(silicon_owner))
silicon_owner = null
stack_trace("[type] initialized outside of a borg, deleting.")
return INITIALIZE_HINT_QDEL
/obj/item/modular_computer/tablet/integrated/Destroy()
borgo = null
silicon_owner = null
return ..()
/obj/item/modular_computer/tablet/integrated/turn_on(mob/user, open_ui = FALSE)
if(borgo?.stat != DEAD)
if(silicon_owner?.stat != DEAD)
return ..()
return FALSE
/obj/item/modular_computer/tablet/integrated/get_ntnet_status(specific_action = 0)
//No borg found
if(!silicon_owner)
return FALSE
// no AIs/pAIs
var/mob/living/silicon/robot/cyborg_check = silicon_owner
if(!istype(cyborg_check))
return ..()
//lockdown restricts borg networking
if(cyborg_check.lockcharge)
return FALSE
//borg cell dying restricts borg networking
if(!cyborg_check.cell || cyborg_check.cell.charge == 0)
return FALSE
return ..()
/**
* Returns a ref to the RoboTact app, creating the app if need be.
*
@@ -210,44 +227,44 @@
* RoboTact is supposed to be undeletable, so these will create runtime messages.
*/
/obj/item/modular_computer/tablet/integrated/proc/get_robotact()
if(!borgo)
if(!silicon_owner)
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.")
stack_trace("Cyborg [silicon_owner] ( [silicon_owner.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.")
CRASH("Cyborg [silicon_owner]'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
if(iscyborg(borgo))
var/mob/living/silicon/robot/robo = borgo
if(iscyborg(silicon_owner))
var/mob/living/silicon/robot/robo = silicon_owner
.["light_on"] = robo.lamp_enabled
.["comp_light_color"] = robo.lamp_color
//Makes the flashlight button affect the borg rather than the tablet
/obj/item/modular_computer/tablet/integrated/toggle_flashlight()
if(!borgo || QDELETED(borgo))
if(!silicon_owner || QDELETED(silicon_owner))
return FALSE
if(iscyborg(borgo))
var/mob/living/silicon/robot/robo = borgo
if(iscyborg(silicon_owner))
var/mob/living/silicon/robot/robo = silicon_owner
robo.toggle_headlamp()
return TRUE
//Makes the flashlight color setting affect the borg rather than the tablet
/obj/item/modular_computer/tablet/integrated/set_flashlight_color(color)
if(!borgo || QDELETED(borgo) || !color)
if(!silicon_owner || QDELETED(silicon_owner) || !color)
return FALSE
if(iscyborg(borgo))
var/mob/living/silicon/robot/robo = borgo
if(iscyborg(silicon_owner))
var/mob/living/silicon/robot/robo = silicon_owner
robo.lamp_color = color
robo.toggle_headlamp(FALSE, TRUE)
return TRUE
@@ -264,8 +281,8 @@
/obj/item/modular_computer/tablet/integrated/syndicate/Initialize(mapload)
. = ..()
if(iscyborg(borgo))
var/mob/living/silicon/robot/robo = borgo
if(iscyborg(silicon_owner))
var/mob/living/silicon/robot/robo = silicon_owner
robo.lamp_color = COLOR_RED //Syndicate likes it red
// Round start tablets
@@ -305,7 +322,6 @@
. = ..()
install_component(new /obj/item/computer_hardware/hard_drive/small)
install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer))
install_component(new /obj/item/computer_hardware/network_card)
install_component(new /obj/item/computer_hardware/card_slot)
if(!isnull(default_applications))

View File

@@ -3,9 +3,3 @@
. = ..()
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(mapload)
. = ..()
install_component(new /obj/item/computer_hardware/network_card/integrated)

View File

@@ -1,7 +1,6 @@
/obj/machinery/modular_computer/console/preset
// Can be changed to give devices specific hardware
var/_has_second_id_slot = FALSE
var/_has_printer = FALSE
var/_has_battery = FALSE
/obj/machinery/modular_computer/console/preset/Initialize(mapload)
@@ -12,8 +11,6 @@
cpu.install_component(new /obj/item/computer_hardware/card_slot)
if(_has_second_id_slot)
cpu.install_component(new /obj/item/computer_hardware/card_slot/secondary)
if(_has_printer)
cpu.install_component(new /obj/item/computer_hardware/printer)
if(_has_battery)
cpu.install_component(new /obj/item/computer_hardware/battery(cpu, /obj/item/stock_parts/cell/computer/super))
install_programs()
@@ -55,7 +52,6 @@
name = "command console"
desc = "A stationary computer. This one comes preloaded with command programs."
_has_second_id_slot = TRUE
_has_printer = TRUE
/obj/machinery/modular_computer/console/preset/command/install_programs()
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
@@ -69,7 +65,6 @@
name = "identification console"
desc = "A stationary computer. This one comes preloaded with identification modification programs."
_has_second_id_slot = TRUE
_has_printer = TRUE
/obj/machinery/modular_computer/console/preset/id/install_programs()
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
@@ -106,7 +101,6 @@
console_department = "Civilian"
name = "curator console"
desc = "A stationary computer. This one comes preloaded with art programs."
_has_printer = TRUE
/obj/machinery/modular_computer/console/preset/curator/install_programs()
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]

View File

@@ -22,9 +22,7 @@
. = ..()
// User-built consoles start as empty frames.
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/network_card = cpu.all_components[MC_NET]
qdel(hard_drive)
qdel(network_card)
/obj/machinery/modular_computer/console/Initialize(mapload)
. = ..()
@@ -32,21 +30,8 @@
if(battery_module)
qdel(battery_module)
var/obj/item/computer_hardware/network_card/wired/network_card = new()
cpu.install_component(network_card)
cpu.install_component(new /obj/item/computer_hardware/hard_drive/super) // Consoles generally have better HDDs due to lower space limitations
var/area/A = get_area(src)
// Attempts to set this console's tag according to our area. Since some areas have stuff like "XX - YY" in their names we try to remove that too.
if(A && console_department)
network_card.identification_string = replacetext(replacetext(replacetext("[A.name] [console_department] Console", " ", "_"), "-", ""), "__", "_") // Replace spaces with "_"
else if(A)
network_card.identification_string = replacetext(replacetext(replacetext("[A.name] Console", " ", "_"), "-", ""), "__", "_")
else if(console_department)
network_card.identification_string = replacetext(replacetext(replacetext("[console_department] Console", " ", "_"), "-", ""), "__", "_")
else
network_card.identification_string = "Unknown Console"
if(cpu)
cpu.screen_on = 1
cpu.screen_on = TRUE
update_appearance()

View File

@@ -49,7 +49,7 @@
/datum/computer_file/proc/on_examine(obj/item/modular_computer/source, mob/user)
return null
/// Called when someone tries to insert something one of your applications needs, like an Intellicard for AI restoration.
/// Called when someone tries to insert something one of your applications needs, like an Intellicard for AI restoration. Return TRUE to cancel attackby chain.
/datum/computer_file/proc/try_insert(obj/item/attacking_item, mob/living/user)
return FALSE

View File

@@ -87,11 +87,6 @@
return FALSE
return TRUE
/datum/computer_file/program/proc/get_signal(specific_action = 0)
if(computer)
return computer.get_ntnet_status(specific_action)
return 0
// Called by Process() on device that runs us, once every tick.
/datum/computer_file/program/proc/process_tick(delta_time)
return TRUE

View File

@@ -63,8 +63,7 @@
executed = TRUE
target.dos_sources.Add(src)
if(SSnetworks.station_network.intrusion_detection_enabled)
var/obj/item/computer_hardware/network_card/network_card = computer.all_components[MC_NET]
SSnetworks.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [network_card.get_network_tag()]")
SSnetworks.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [computer.name]")
SSnetworks.station_network.intrusion_detection_alarm = TRUE
return TRUE

View File

@@ -21,8 +21,8 @@
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_userdanger("SYSTEM PURGE DETECTED/"))
addtimer(CALLBACK(modularInterface.borgo, /mob/living/silicon/robot/.proc/death), 2 SECONDS, TIMER_UNIQUE)
to_chat(modularInterface.silicon_owner,span_userdanger("SYSTEM PURGE DETECTED/"))
addtimer(CALLBACK(modularInterface.silicon_owner, /mob/living/silicon/robot/.proc/death), 2 SECONDS, TIMER_UNIQUE)
return
computer.visible_message(span_notice("\The [computer]'s screen brightly flashes and loud electrical buzzing is heard."))

View File

@@ -98,10 +98,6 @@
if(.)
return
var/obj/item/computer_hardware/printer/printer
if(computer)
printer = computer.all_components[MC_PRINT]
usr.played_game()
var/gamerSkillLevel = 0
@@ -153,10 +149,7 @@
enemy_check()
return TRUE
if("Dispense_Tickets")
if(!printer)
to_chat(usr, span_notice("Hardware error: A printer is required to redeem tickets."))
return
if(printer.stored_paper <= 0)
if(computer.stored_paper <= 0)
to_chat(usr, span_notice("Hardware error: Printer is out of paper."))
return
else
@@ -165,7 +158,7 @@
new /obj/item/stack/arcadeticket((get_turf(computer)), 1)
to_chat(usr, span_notice("[computer] dispenses a ticket!"))
ticket_count -= 1
printer.stored_paper -= 1
computer.stored_paper -= 1
else
to_chat(usr, span_notice("You don't have any stored tickets!"))
return TRUE

View File

@@ -80,11 +80,9 @@
var/obj/item/computer_hardware/card_slot/card_slot
var/obj/item/computer_hardware/card_slot/card_slot2
var/obj/item/computer_hardware/printer/printer
if(computer)
card_slot = computer.all_components[MC_CARD]
card_slot2 = computer.all_components[MC_CARD2]
printer = computer.all_components[MC_PRINT]
if(!card_slot || !card_slot2)
return
@@ -109,7 +107,7 @@
return TRUE
// Print a report.
if("PRG_print")
if(!computer || !printer)
if(!computer)
return TRUE
if(!authenticated_card)
return TRUE
@@ -126,7 +124,7 @@
if(A in known_access_rights)
contents += " [SSid_access.get_access_desc(A)]"
if(!printer.print_text(contents,"access report - [target_id_card.registered_name ? target_id_card.registered_name : "Unregistered"]"))
if(!computer.print_text(contents, "access report - [target_id_card.registered_name ? target_id_card.registered_name : "Unregistered"]"))
to_chat(usr, span_notice("Hardware error: Printer was unable to print the file. It may be out of paper."))
return TRUE
else
@@ -308,18 +306,14 @@
var/obj/item/computer_hardware/card_slot/card_slot
var/obj/item/computer_hardware/card_slot/card_slot2
var/obj/item/computer_hardware/printer/printer
if(computer)
card_slot = computer.all_components[MC_CARD]
card_slot2 = computer.all_components[MC_CARD2]
printer = computer.all_components[MC_PRINT]
data["have_auth_card"] = !!(card_slot)
data["have_id_slot"] = !!(card_slot2)
data["have_printer"] = !!(printer)
else
data["have_id_slot"] = FALSE
data["have_printer"] = FALSE
if(!card_slot2)
return data //We're just gonna error out on the js side at this point anyway

View File

@@ -20,11 +20,9 @@
var/list/data = get_header_data()
var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
var/obj/item/computer_hardware/printer/printer = computer.all_components[MC_PRINT]
var/obj/item/card/id/id_card = card_slot ? card_slot.stored_card : null
data["has_id_slot"] = !!card_slot
data["has_printer"] = !!printer
data["paperamt"] = printer ? "[printer.stored_paper] / [printer.max_paper]" : null
data["paperamt"] = "[computer.stored_paper] / [computer.max_paper]"
data["card_owner"] = card_slot?.stored_card ? id_card.registered_name : "No Card Inserted."
data["current_user"] = payments_acc ? payments_acc.account_holder : null
data["barcode_split"] = cut_multiplier * 100
@@ -39,9 +37,8 @@
// Get components
var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
var/obj/item/computer_hardware/printer/printer = computer.all_components[MC_PRINT]
var/obj/item/card/id/id_card = card_slot ? card_slot.stored_card : null
if(!card_slot || !printer) //We need both to successfully use this app.
if(!card_slot) //We need both to successfully use this app.
return
switch(action)
@@ -62,10 +59,7 @@
var/potential_cut = input("How much would you like to pay out to the registered card?","Percentage Profit ([round(cut_min*100)]% - [round(cut_max*100)]%)") as num|null
cut_multiplier = potential_cut ? clamp(round(potential_cut/100, cut_min), cut_min, cut_max) : initial(cut_multiplier)
if("print")
if(!printer)
to_chat(usr, span_notice("Hardware error: A printer is required to print barcodes."))
return
if(printer.stored_paper <= 0)
if(computer.stored_paper <= 0)
to_chat(usr, span_notice("Hardware error: Printer is out of paper."))
return
if(!payments_acc)
@@ -74,5 +68,5 @@
var/obj/item/barcode/barcode = new /obj/item/barcode(get_turf(ui_host()))
barcode.payments_acc = payments_acc
barcode.cut_multiplier = cut_multiplier
printer.stored_paper--
computer.stored_paper--
to_chat(usr, span_notice("The computer prints out a barcode."))

View File

@@ -12,21 +12,8 @@
detomatix_resistance = DETOMATIX_RESIST_MAJOR
/datum/computer_file/program/crew_manifest/ui_static_data(mob/user)
var/list/data = list()
data["manifest"] = GLOB.data_core.get_manifest()
return data
/datum/computer_file/program/crew_manifest/ui_data(mob/user)
var/list/data = get_header_data()
var/obj/item/computer_hardware/printer/printer
if(computer)
printer = computer.all_components[MC_PRINT]
if(computer)
data["have_printer"] = !!printer
else
data["have_printer"] = FALSE
data["manifest"] = GLOB.data_core.get_manifest()
return data
/datum/computer_file/program/crew_manifest/ui_act(action, params, datum/tgui/ui)
@@ -34,18 +21,14 @@
if(.)
return
var/obj/item/computer_hardware/printer/printer
if(computer)
printer = computer.all_components[MC_PRINT]
switch(action)
if("PRG_print")
if(computer && printer) //This option should never be called if there is no printer
if(computer) //This option should never be called if there is no printer
var/contents = {"<h4>Crew Manifest</h4>
<br>
[GLOB.data_core ? GLOB.data_core.get_manifest_html(0) : ""]
"}
if(!printer.print_text(contents,text("crew manifest ([])", station_time_timestamp())))
if(!computer.print_text(contents,text("crew manifest ([])", station_time_timestamp())))
to_chat(usr, span_notice("Hardware error: Printer was unable to print the file. It may be out of paper."))
return
else

View File

@@ -49,6 +49,14 @@
/// Whether this app can send messages to all.
var/spam_mode = FALSE
/datum/computer_file/program/messenger/try_insert(obj/item/attacking_item, mob/living/user)
if(!istype(attacking_item, /obj/item/photo))
return FALSE
var/obj/item/photo/pic = attacking_item
computer.saved_image = pic.picture
ProcessPhoto()
return TRUE
/datum/computer_file/program/messenger/proc/ScrubMessengerList()
var/list/dictionary = list()

View File

@@ -67,17 +67,10 @@
matching_paintings = SSpersistent_paintings.painting_ui_data(filter = search_mode, search_text = search_string)
/datum/computer_file/program/portrait_printer/proc/print_painting(selected_painting)
//printer check!
var/obj/item/computer_hardware/printer/printer
if(computer)
printer = computer.all_components[MC_PRINT]
if(!printer)
to_chat(usr, span_notice("Hardware error: A printer is required to print a canvas."))
return
if(printer.stored_paper < CANVAS_PAPER_COST)
if(computer.stored_paper < CANVAS_PAPER_COST)
to_chat(usr, span_notice("Printing error: Your printer needs at least [CANVAS_PAPER_COST] paper to print a canvas."))
return
printer.stored_paper -= CANVAS_PAPER_COST
computer.stored_paper -= CANVAS_PAPER_COST
//canvas printing!
var/datum/painting/chosen_portrait = locate(selected_painting) in SSpersistent_paintings.paintings

View File

@@ -34,41 +34,41 @@
//Implied, since we can't run on non tablets
var/obj/item/modular_computer/tablet/integrated/tablet = computer
var/mob/living/silicon/robot/borgo = tablet.borgo
var/mob/living/silicon/robot/cyborg = tablet.silicon_owner
data["name"] = borgo.name
data["designation"] = borgo.model //Borgo model type
data["masterAI"] = borgo.connected_ai //Master AI
data["name"] = cyborg.name
data["designation"] = cyborg.model
data["masterAI"] = cyborg.connected_ai //Master AI
var/charge = 0
var/maxcharge = 1
if(borgo.cell)
charge = borgo.cell.charge
maxcharge = borgo.cell.maxcharge
if(cyborg.cell)
charge = cyborg.cell.charge
maxcharge = cyborg.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["selfDestructAble"] = (borgo.emagged || istype(borgo, /mob/living/silicon/robot/model/syndicate/))
data["integrity"] = ((cyborg.health + 100) / 2) //health, as percentage
data["lampIntensity"] = cyborg.lamp_intensity //lamp power setting
data["sensors"] = "[cyborg.sensors_on?"ACTIVE":"DISABLED"]"
data["printerPictures"] = cyborg.connected_ai? cyborg.connected_ai.aicamera.stored.len : cyborg.aicamera.stored.len //Number of pictures taken, synced to AI if available
data["printerToner"] = cyborg.toner //amount of toner
data["printerTonerMax"] = cyborg.tonermax //It's a variable, might as well use it
data["thrustersInstalled"] = cyborg.ionpulse //If we have a thruster uprade
data["thrustersStatus"] = "[cyborg.ionpulse_on?"ACTIVE":"DISABLED"]" //Feedback for thruster status
data["selfDestructAble"] = (cyborg.emagged || istype(cyborg, /mob/living/silicon/robot/model/syndicate))
//Cover, TRUE for locked
data["cover"] = "[borgo.locked? "LOCKED":"UNLOCKED"]"
data["cover"] = "[cyborg.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.lockcharge?"DISABLED":"ENABLED"]"]"
data["locomotion"] = "[cyborg.wires.is_cut(WIRE_LOCKDOWN)?"FAULT":"[cyborg.lockcharge?"DISABLED":"ENABLED"]"]"
//Model wire. FAULT if cut, NOMINAL otherwise
data["wireModule"] = "[borgo.wires.is_cut(WIRE_RESET_MODEL)?"FAULT":"NOMINAL"]"
data["wireModule"] = "[cyborg.wires.is_cut(WIRE_RESET_MODEL)?"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"]"]"
data["wireCamera"] = "[!cyborg.builtInCamera || cyborg.wires.is_cut(WIRE_CAMERA)?"FAULT":"[cyborg.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"]"]"
data["wireAI"] = "[cyborg.wires.is_cut(WIRE_AI)?"FAULT":"[cyborg.connected_ai?"CONNECTED":"READY"]"]"
//Law sync wire. FAULT if cut, NOMINAL otherwise
data["wireLaw"] = "[borgo.wires.is_cut(WIRE_LAWSYNC)?"FAULT":"NOMINAL"]"
data["wireLaw"] = "[cyborg.wires.is_cut(WIRE_LAWSYNC)?"FAULT":"NOMINAL"]"
return data
@@ -76,13 +76,13 @@
var/list/data = list()
if(!iscyborg(user))
return data
var/mob/living/silicon/robot/borgo = user
var/mob/living/silicon/robot/cyborg = user
//Implied
var/obj/item/modular_computer/tablet/integrated/tablet = computer
data["Laws"] = borgo.laws.get_law_list(TRUE, TRUE, FALSE)
data["Laws"] = cyborg.laws.get_law_list(TRUE, TRUE, FALSE)
data["borgLog"] = tablet.borglog
data["borgUpgrades"] = borgo.upgrades
data["borgUpgrades"] = cyborg.upgrades
return data
/datum/computer_file/program/robotact/ui_act(action, params)
@@ -91,56 +91,56 @@
return
//Implied type, memes
var/obj/item/modular_computer/tablet/integrated/tablet = computer
var/mob/living/silicon/robot/borgo = tablet.borgo
var/mob/living/silicon/robot/cyborg = tablet.silicon_owner
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"
if(cyborg.locked)
cyborg.locked = FALSE
cyborg.update_icons()
if(cyborg.emagged)
cyborg.logevent("ChÃ¥vÃis cover lock has been [cyborg.locked ? "engaged" : "released"]") //"The cover interface glitches out for a split second"
else
borgo.logevent("Chassis cover lock has been [borgo.locked ? "engaged" : "released"]")
cyborg.logevent("Chassis cover lock has been [cyborg.locked ? "engaged" : "released"]")
if("lawchannel")
borgo.set_autosay()
cyborg.set_autosay()
if("lawstate")
borgo.checklaws()
cyborg.checklaws()
if("alertPower")
if(borgo.stat == CONSCIOUS)
if(!borgo.cell || !borgo.cell.charge)
borgo.visible_message(span_notice("The power warning light on [span_name("[borgo]")] flashes urgently."), \
if(cyborg.stat == CONSCIOUS)
if(!cyborg.cell || !cyborg.cell.charge)
cyborg.visible_message(span_notice("The power warning light on [span_name("[cyborg]")] flashes urgently."), \
"You announce you are operating in low power mode.")
playsound(borgo, 'sound/machines/buzz-two.ogg', 50, FALSE)
playsound(cyborg, 'sound/machines/buzz-two.ogg', 50, FALSE)
if("toggleSensors")
borgo.toggle_sensors()
cyborg.toggle_sensors()
if("viewImage")
if(borgo.connected_ai)
borgo.connected_ai.aicamera?.viewpictures(usr)
if(cyborg.connected_ai)
cyborg.connected_ai.aicamera?.viewpictures(usr)
else
borgo.aicamera?.viewpictures(usr)
cyborg.aicamera?.viewpictures(usr)
if("printImage")
var/obj/item/camera/siliconcam/robot_camera/borgcam = borgo.aicamera
var/obj/item/camera/siliconcam/robot_camera/borgcam = cyborg.aicamera
borgcam?.borgprint(usr)
if("toggleThrusters")
borgo.toggle_ionpulse()
cyborg.toggle_ionpulse()
if("lampIntensity")
borgo.lamp_intensity = params["ref"]
borgo.toggle_headlamp(FALSE, TRUE)
cyborg.lamp_intensity = params["ref"]
cyborg.toggle_headlamp(FALSE, TRUE)
if("selfDestruct")
if(borgo.stat || borgo.lockcharge) //No detonation while stunned or locked down
if(cyborg.stat || cyborg.lockcharge) //No detonation while stunned or locked down
return
if(borgo.emagged || istype(borgo, /mob/living/silicon/robot/model/syndicate/)) //This option shouldn't even be showing otherwise
borgo.self_destruct(borgo)
if(cyborg.emagged || istype(cyborg, /mob/living/silicon/robot/model/syndicate)) //This option shouldn't even be showing otherwise
cyborg.self_destruct(cyborg)
/**
* Forces a full update of the UI, if currently open.
@@ -152,6 +152,6 @@
if(!istype(computer, /obj/item/modular_computer/tablet/integrated))
return
var/obj/item/modular_computer/tablet/integrated/tablet = computer
var/datum/tgui/active_ui = SStgui.get_open_ui(tablet.borgo, src)
var/datum/tgui/active_ui = SStgui.get_open_ui(tablet.silicon_owner, src)
if(active_ui)
active_ui.send_full_update()

View File

@@ -1,101 +0,0 @@
/obj/item/computer_hardware/network_card
name = "network card"
desc = "A basic wireless network card for usage with standard NTNet frequencies."
power_usage = 50
icon_state = "radio_mini"
var/hardware_id = null // Identification ID. Technically MAC address of this device. Can't be changed by user.
var/identification_string = "" // Identification string, technically nickname seen in the network. Can be set by user.
var/long_range = 0
var/ethernet = 0 // Hard-wired, therefore always on, ignores NTNet wireless checks.
malfunction_probability = 1
device_type = MC_NET
/obj/item/computer_hardware/network_card/Initialize(mapload)
. = ..()
init_network_id(NETWORK_CARDS)
/obj/item/computer_hardware/network_card/diagnostics(mob/user)
..()
to_chat(user, "NIX Unique ID: [hardware_id]")
to_chat(user, "NIX User Tag: [identification_string]")
to_chat(user, "Supported protocols:")
to_chat(user, "511.m SFS (Subspace) - Standard Frequency Spread")
if(long_range)
to_chat(user, "511.n WFS/HB (Subspace) - Wide Frequency Spread/High Bandiwdth")
if(ethernet)
to_chat(user, "OpenEth (Physical Connection) - Physical network connection port")
// Returns a string identifier of this network card
/obj/item/computer_hardware/network_card/proc/get_network_tag()
return "[identification_string] (NID [hardware_id])"
// 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection
/obj/item/computer_hardware/network_card/proc/get_signal(specific_action = 0)
if(!holder) // Hardware is not installed in anything. No signal. How did this even get called?
return 0
if(!check_functionality())
return 0
if(ethernet) // Computer is connected via wired connection.
return 3
if(!SSnetworks.station_network || !SSnetworks.station_network.check_function(specific_action)) // NTNet is down and we are not connected via wired connection. No signal.
return 0
if(holder)
var/turf/T = get_turf(holder)
if((T && istype(T)) && (is_station_level(T.z) || is_mining_level(T.z)))
// Computer is on station. Low/High signal depending on what type of network card you have
if(long_range)
return 2
else
return 1
if(long_range) // Computer is not on station, but it has upgraded network card. Low signal.
return 1
return 0 // Computer is not on station and does not have upgraded network card. No signal.
/obj/item/computer_hardware/network_card/advanced
name = "advanced network card"
desc = "An advanced network card for usage with standard NTNet frequencies. Its transmitter is strong enough to connect even off-station."
long_range = 1
power_usage = 100 // Better range but higher power usage.
icon_state = "radio"
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
/obj/item/computer_hardware/network_card/wired
name = "wired network card"
desc = "An advanced network card for usage with standard NTNet frequencies. This one also supports wired connection."
ethernet = 1
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
var/mob/living/silicon/robot/robo = modularInterface.borgo
if(istype(robo))
if(robo.lockcharge)
return FALSE //lockdown restricts borg networking
if(!robo.cell || robo.cell.charge == 0)
return FALSE //borg cell dying restricts borg networking
return ..()

View File

@@ -1,100 +0,0 @@
/obj/item/computer_hardware/printer
name = "printer"
desc = "Computer-integrated printer with paper recycling module."
power_usage = 100
icon_state = "printer"
w_class = WEIGHT_CLASS_NORMAL
device_type = MC_PRINT
expansion_hw = TRUE
var/stored_paper = 20
var/max_paper = 30
/obj/item/computer_hardware/printer/diagnostics(mob/living/user)
..()
to_chat(user, span_notice("Paper level: [stored_paper]/[max_paper]."))
/obj/item/computer_hardware/printer/examine(mob/user)
. = ..()
. += span_notice("Paper level: [stored_paper]/[max_paper].")
/obj/item/computer_hardware/printer/proc/print_text(text_to_print, paper_title = "")
if(!stored_paper)
return FALSE
if(!check_functionality())
return FALSE
var/obj/item/paper/printed_paper = new/obj/item/paper(holder.drop_location())
// Damaged printer causes the resulting paper to be somewhat harder to read.
if(damage > damage_malfunction)
printed_paper.add_raw_text(stars(text_to_print, 100-malfunction_probability))
else
printed_paper.add_raw_text(text_to_print)
if(paper_title)
printed_paper.name = paper_title
printed_paper.update_appearance()
stored_paper--
return TRUE
/obj/item/computer_hardware/printer/try_insert(obj/item/I, mob/living/user = null)
if(istype(I, /obj/item/paper))
if(stored_paper >= max_paper)
to_chat(user, span_warning("You try to add \the [I] into [src], but its paper bin is full!"))
return FALSE
if(user && !user.temporarilyRemoveItemFromInventory(I))
return FALSE
to_chat(user, span_notice("You insert \the [I] into [src]'s paper recycler."))
qdel(I)
stored_paper++
return TRUE
if(istype(I, /obj/item/paper_bin))
var/obj/item/paper_bin/bin = I
if(bin.total_paper > 0)
if(stored_paper >= max_paper)
balloon_alert(user, "it's full!")
return FALSE
/// Number of sheets we're adding
var/num_to_add = 0
for(var/obj/item/paper/paper_in_stack as anything in bin.paper_stack) // Search for the first blank sheet of paper, then toss it in
if(paper_in_stack.get_total_length()) // Uh oh, paper has words!
continue
if(istype(paper_in_stack, /obj/item/paper/carbon)) // Add both the carbon, and the copy
var/obj/item/paper/carbon/carbon_paper = paper_in_stack
if(!carbon_paper.copied && ((max_paper - stored_paper) >= 2)) // See if there's room for both
num_to_add = 2
else
num_to_add = 1
bin.paper_stack -= paper_in_stack
bin.total_paper -= 1
qdel(paper_in_stack)
stored_paper += num_to_add
break // All full!
if (num_to_add == 0 && bin.total_paper > 0)
bin.total_paper -= 1
num_to_add = 1
stored_paper += 1
bin.update_appearance()
if(!num_to_add)
balloon_alert(user, "everything is written on!")
else
balloon_alert(user, "pulled in [num_to_add] sheets\s of paper")
return TRUE
else
balloon_alert(user, "the bin is empty!")
return FALSE
return FALSE
/obj/item/computer_hardware/printer/mini
name = "miniprinter"
desc = "A small printer with paper recycling module."
power_usage = 50
icon_state = "printer_mini"
w_class = WEIGHT_CLASS_TINY
stored_paper = 5
max_paper = 15

View File

@@ -21,8 +21,6 @@
// Device loadout
var/dev_battery = 1 // 1: Default, 2: Upgraded, 3: Advanced
var/dev_disk = 1 // 1: Default, 2: Upgraded, 3: Advanced
var/dev_netcard = 0 // 0: None, 1: Basic, 2: Long-Range
var/dev_printer = 0 // 0: None, 1: Standard
var/dev_card = 0 // 0: None, 1: Standard
// Removes all traces of old order and allows you to begin configuration from scratch.
@@ -37,8 +35,6 @@
fabricated_tablet = null
dev_battery = 1
dev_disk = 1
dev_netcard = 0
dev_printer = 0
dev_card = 0
// Recalculates the price and optionally even fabricates the device.
@@ -76,19 +72,6 @@
if(fabricate)
fabricated_laptop.install_component(new /obj/item/computer_hardware/hard_drive/super)
total_price += 299
switch(dev_netcard)
if(1) // Basic(Short-Range)
if(fabricate)
fabricated_laptop.install_component(new /obj/item/computer_hardware/network_card)
total_price += 99
if(2) // Advanced (Long Range)
if(fabricate)
fabricated_laptop.install_component(new /obj/item/computer_hardware/network_card/advanced)
total_price += 299
if(dev_printer)
total_price += 99
if(fabricate)
fabricated_laptop.install_component(new /obj/item/computer_hardware/printer/mini)
if(dev_card)
total_price += 199
if(fabricate)
@@ -127,19 +110,6 @@
if(fabricate)
fabricated_tablet.install_component(new /obj/item/computer_hardware/hard_drive)
total_price += 299
switch(dev_netcard)
if(1) // Basic(Short-Range)
if(fabricate)
fabricated_tablet.install_component(new/obj/item/computer_hardware/network_card)
total_price += 99
if(2) // Advanced (Long Range)
if(fabricate)
fabricated_tablet.install_component(new/obj/item/computer_hardware/network_card/advanced)
total_price += 299
if(dev_printer)
total_price += 99
if(fabricate)
fabricated_tablet.install_component(new/obj/item/computer_hardware/printer/mini)
if(dev_card)
total_price += 199
if(fabricate)
@@ -185,14 +155,6 @@
dev_disk = text2num(params["disk"])
fabricate_and_recalc_price(FALSE)
return TRUE
if("hw_netcard")
dev_netcard = text2num(params["netcard"])
fabricate_and_recalc_price(FALSE)
return TRUE
if("hw_nanoprint")
dev_printer = text2num(params["print"])
fabricate_and_recalc_price(FALSE)
return TRUE
if("hw_card")
dev_card = text2num(params["card"])
fabricate_and_recalc_price(FALSE)
@@ -255,8 +217,6 @@
data["devtype"] = devtype
data["hw_battery"] = dev_battery
data["hw_disk"] = dev_disk
data["hw_netcard"] = dev_netcard
data["hw_nanoprint"] = dev_printer
data["hw_card"] = dev_card
if(state == 1 || state == 2)
data["totalprice"] = total_price

View File

@@ -129,6 +129,12 @@
/obj/item/paper_bin/proc/at_overlay_limit()
return overlays.len >= MAX_ATOM_OVERLAYS - 1
/obj/item/paper_bin/proc/remove_paper(amount = 1)
var/obj/item/paper/top_paper = pop(paper_stack)
if(top_paper)
qdel(top_paper)
total_paper -= amount
/obj/item/paper_bin/examine(mob/user)
. = ..()
if(total_paper)

View File

@@ -56,34 +56,6 @@
category = list(RND_CATEGORY_COMPUTER_PARTS)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING
// Network cards
/datum/design/netcard/basic
name = "Network Card"
id = "netcard_basic"
build_type = IMPRINTER | AWAY_IMPRINTER
materials = list(/datum/material/iron = 250, /datum/material/glass = 100)
build_path = /obj/item/computer_hardware/network_card
category = list(RND_CATEGORY_COMPUTER_PARTS)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING
/datum/design/netcard/advanced
name = "Advanced Network Card"
id = "netcard_advanced"
build_type = IMPRINTER | AWAY_IMPRINTER
materials = list(/datum/material/iron = 500, /datum/material/glass = 200)
build_path = /obj/item/computer_hardware/network_card/advanced
category = list(RND_CATEGORY_COMPUTER_PARTS)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING
/datum/design/netcard/wired
name = "Wired Network Card"
id = "netcard_wired"
build_type = IMPRINTER | AWAY_IMPRINTER
materials = list(/datum/material/iron = 2500, /datum/material/glass = 400)
build_path = /obj/item/computer_hardware/network_card/wired
category = list(RND_CATEGORY_COMPUTER_PARTS)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING
// Data disks
/datum/design/portabledrive/basic
name = "Data Disk"
@@ -122,16 +94,6 @@
category = list(RND_CATEGORY_COMPUTER_PARTS)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING
// Mini printer
/datum/design/miniprinter
name = "Miniprinter"
id = "miniprinter"
build_type = PROTOLATHE | AWAY_LATHE
materials = list(/datum/material/iron = 600)
build_path = /obj/item/computer_hardware/printer/mini
category = list(RND_CATEGORY_COMPUTER_PARTS)
departmental_flags = DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING
// Batteries
/datum/design/battery/controller
name = "Power Cell Controller"

View File

@@ -1062,10 +1062,6 @@
"hdd_basic",
"hdd_cluster",
"hdd_super",
"miniprinter",
"netcard_advanced",
"netcard_basic",
"netcard_wired",
"portadrive_advanced",
"portadrive_basic",
"portadrive_super",

View File

@@ -16,7 +16,7 @@
__NETWORK_DOORS, __NETWORK_ATMOS, __NETWORK_SCUBBERS,
__NETWORK_AIRALARMS, __NETWORK_CONTROL, __NETWORK_STORAGE,
__NETWORK_CARGO, __NETWORK_BOTS, __NETWORK_COMPUTER,
__NETWORK_CARDS)
__NETWORK_TABLETS)
var/number_of_names_to_test = 50
var/length_of_test_network = 5

View File

@@ -11,7 +11,6 @@
/obj/item/computer_hardware/hard_drive = 4,
/obj/item/computer_hardware/hard_drive/portable = 8,
/obj/item/computer_hardware/hard_drive/small = 4,
/obj/item/computer_hardware/network_card = 8,
/obj/item/computer_hardware/battery = 8,
/obj/item/modular_computer/laptop = 4,
/obj/item/modular_computer/tablet = 4,
@@ -19,7 +18,6 @@
)
premium = list(
/obj/item/computer_hardware/card_slot = 2,
/obj/item/computer_hardware/printer/mini = 2,
/obj/item/pai_card = 2,
)
refill_canister = /obj/item/vending_refill/modularpc

View File

@@ -3867,9 +3867,7 @@
#include "code\modules\modular_computers\hardware\battery_module.dm"
#include "code\modules\modular_computers\hardware\card_slot.dm"
#include "code\modules\modular_computers\hardware\hard_drive.dm"
#include "code\modules\modular_computers\hardware\network_card.dm"
#include "code\modules\modular_computers\hardware\portable_disk.dm"
#include "code\modules\modular_computers\hardware\printer.dm"
#include "code\modules\modular_computers\hardware\program_disks.dm"
#include "code\modules\modular_computers\hardware\virus_disk.dm"
#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm"

View File

@@ -178,89 +178,6 @@ const CfStep2 = (props, context) => {
/>
</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell bold position="relative">
<Tooltip
content={multiline`
Allows your device to wirelessly connect to stationwide NTNet
network. Basic cards are limited to on-station use, while
advanced cards can operate anywhere near the station, which
includes asteroid outposts
`}
position="right">
Network Card:
</Tooltip>
</Table.Cell>
<Table.Cell>
<Button
content="None"
selected={data.hw_netcard === 0}
onClick={() =>
act('hw_netcard', {
netcard: '0',
})
}
/>
</Table.Cell>
<Table.Cell>
<Button
content="Standard"
selected={data.hw_netcard === 1}
onClick={() =>
act('hw_netcard', {
netcard: '1',
})
}
/>
</Table.Cell>
<Table.Cell>
<Button
content="Advanced"
selected={data.hw_netcard === 2}
onClick={() =>
act('hw_netcard', {
netcard: '2',
})
}
/>
</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell bold position="relative">
<Tooltip
content={multiline`
A device that allows for various paperwork manipulations,
such as, scanning of documents or printing new ones.
This device was certified EcoFriendlyPlus and is capable of
recycling existing paper for printing purposes.
`}
position="right">
Nano Printer:
</Tooltip>
</Table.Cell>
<Table.Cell>
<Button
content="None"
selected={data.hw_nanoprint === 0}
onClick={() =>
act('hw_nanoprint', {
print: '0',
})
}
/>
</Table.Cell>
<Table.Cell>
<Button
content="Standard"
selected={data.hw_nanoprint === 1}
onClick={() =>
act('hw_nanoprint', {
print: '1',
})
}
/>
</Table.Cell>
</Table.Row>
<Table.Row>
<Table.Cell bold position="relative">
<Tooltip

View File

@@ -135,7 +135,7 @@ const IDCardTabs = (props, context) => {
export const IDCardLogin = (props, context) => {
const { act, data } = useBackend(context);
const { authenticatedUser, has_id, have_printer, authIDName } = data;
const { authenticatedUser, has_id, authIDName } = data;
return (
<Section
@@ -145,7 +145,7 @@ export const IDCardLogin = (props, context) => {
<Button
icon="print"
content="Print"
disabled={!have_printer || !has_id}
disabled={!has_id}
onClick={() => act('PRG_print')}
/>
<Button

View File

@@ -5,7 +5,7 @@ import { NtosWindow } from '../layouts';
export const NtosCrewManifest = (props, context) => {
const { act, data } = useBackend(context);
const { have_printer, manifest = {} } = data;
const { manifest = {} } = data;
return (
<NtosWindow width={400} height={480}>
<NtosWindow.Content scrollable>
@@ -15,7 +15,6 @@ export const NtosCrewManifest = (props, context) => {
<Button
icon="print"
content="Print"
disabled={!have_printer}
onClick={() => act('PRG_print')}
/>
}>

View File

@@ -6,7 +6,6 @@ import { NtosWindow } from '../layouts';
type Data = {
current_user: string;
card_owner: string;
has_printer: BooleanLike;
paperamt: number;
barcode_split: number;
has_id_slot: BooleanLike;
@@ -26,8 +25,7 @@ export const NtosShipping = () => {
/** Returns information about the current user, available paper, etc */
const ShippingHub = (props, context) => {
const { act, data } = useBackend<Data>(context);
const { current_user, card_owner, has_printer, paperamt, barcode_split } =
data;
const { current_user, card_owner, paperamt, barcode_split } = data;
return (
<Section
@@ -46,9 +44,7 @@ const ShippingHub = (props, context) => {
<LabeledList.Item label="Inserted Card">
{card_owner || 'N/A'}
</LabeledList.Item>
<LabeledList.Item label="Available Paper">
{has_printer ? paperamt : 'N/A'}
</LabeledList.Item>
<LabeledList.Item label="Available Paper">{paperamt}</LabeledList.Item>
<LabeledList.Item label="Profit on Sale">
{barcode_split}%
</LabeledList.Item>
@@ -60,7 +56,7 @@ const ShippingHub = (props, context) => {
/** Returns shipping options */
const ShippingOptions = (props, context) => {
const { act, data } = useBackend<Data>(context);
const { has_id_slot, has_printer, current_user } = data;
const { has_id_slot, current_user } = data;
return (
<Section title="Shipping Options">
@@ -79,7 +75,7 @@ const ShippingOptions = (props, context) => {
icon="print"
tooltip="Print a barcode to use on a wrapped package."
tooltipPosition="right"
disabled={!has_printer || !current_user}
disabled={!current_user}
onClick={() => act('print')}
content="Print Barcode"
/>