here we go again (#2456)

This commit is contained in:
LetterJay
2017-08-24 21:24:25 -05:00
committed by kevinz000
parent c7ed043fd5
commit 188193eb61
1107 changed files with 25420 additions and 25417 deletions
@@ -35,7 +35,7 @@ GLOBAL_DATUM_INIT(ntnet_global, /datum/ntnet, new)
add_log("NTNet logging system activated.")
// Simplified logging: Adds a log. log_string is mandatory parameter, source is optional.
/datum/ntnet/proc/add_log(log_string, obj/item/weapon/computer_hardware/network_card/source = null)
/datum/ntnet/proc/add_log(log_string, obj/item/computer_hardware/network_card/source = null)
var/log_text = "[worldtime2text()] - "
if(source)
log_text += "[source.get_network_tag()] - "
@@ -9,7 +9,7 @@
icon_state = "bus"
anchored = TRUE
density = TRUE
circuit = /obj/item/weapon/circuitboard/machine/ntnet_relay
circuit = /obj/item/circuitboard/machine/ntnet_relay
var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame.
var/enabled = 1 // Set to 0 if the relay was turned off
var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack
@@ -61,7 +61,7 @@
kill_program(forced = TRUE)
STOP_PROCESSING(SSobj, src)
for(var/H in all_components)
var/obj/item/weapon/computer_hardware/CH = all_components[H]
var/obj/item/computer_hardware/CH = all_components[H]
if(CH.holder == src)
CH.on_remove(src)
CH.holder = null
@@ -97,7 +97,7 @@
if(issilicon(usr))
return
var/obj/item/weapon/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
if(usr.canUseTopic(src))
card_slot.try_eject(null, usr)
@@ -108,7 +108,7 @@
if(issilicon(usr))
return
var/obj/item/weapon/computer_hardware/ai_slot/ai_slot = all_components[MC_AI]
var/obj/item/computer_hardware/ai_slot/ai_slot = all_components[MC_AI]
if(usr.canUseTopic(src))
ai_slot.try_eject(null, usr,1)
@@ -122,7 +122,7 @@
return
if(usr.canUseTopic(src))
var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD]
var/obj/item/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD]
if(uninstall_component(portable_drive, usr))
portable_drive.verb_pickup()
@@ -132,9 +132,9 @@
return
if(user.canUseTopic(src))
var/obj/item/weapon/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
var/obj/item/weapon/computer_hardware/ai_slot/ai_slot = all_components[MC_AI]
var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD]
var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
var/obj/item/computer_hardware/ai_slot/ai_slot = all_components[MC_AI]
var/obj/item/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD]
if(portable_drive)
if(uninstall_component(portable_drive, user))
portable_drive.verb_pickup()
@@ -147,13 +147,13 @@
// Gets IDs/access levels from card slot. Would be useful when/if PDAs would become modular PCs.
/obj/item/device/modular_computer/GetAccess()
var/obj/item/weapon/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
if(card_slot)
return card_slot.GetAccess()
return ..()
/obj/item/device/modular_computer/GetID()
var/obj/item/weapon/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
var/obj/item/computer_hardware/card_slot/card_slot = all_components[MC_CARD]
if(card_slot)
return card_slot.GetID()
return ..()
@@ -224,7 +224,7 @@
return
// If we have a recharger, enable it automatically. Lets computer without a battery work.
var/obj/item/weapon/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
var/obj/item/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
if(recharger)
recharger.enabled = 1
@@ -282,8 +282,8 @@
/obj/item/device/modular_computer/proc/get_header_data()
var/list/data = list()
var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL]
var/obj/item/weapon/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
var/obj/item/computer_hardware/battery/battery_module = all_components[MC_CELL]
var/obj/item/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
if(battery_module && battery_module.battery)
switch(battery_module.battery.percent())
@@ -348,7 +348,7 @@
// Returns 0 for No Signal, 1 for Low Signal and 2 for Good Signal. 3 is for wired connection (always-on)
/obj/item/device/modular_computer/proc/get_ntnet_status(specific_action = 0)
var/obj/item/weapon/computer_hardware/network_card/network_card = all_components[MC_NET]
var/obj/item/computer_hardware/network_card/network_card = all_components[MC_NET]
if(network_card)
return network_card.get_signal(specific_action)
else
@@ -357,7 +357,7 @@
/obj/item/device/modular_computer/proc/add_log(text)
if(!get_ntnet_status())
return FALSE
var/obj/item/weapon/computer_hardware/network_card/network_card = all_components[MC_NET]
var/obj/item/computer_hardware/network_card/network_card = all_components[MC_NET]
return GLOB.ntnet_global.add_log(text, network_card)
/obj/item/device/modular_computer/proc/shutdown_computer(loud = 1)
@@ -371,19 +371,19 @@
update_icon()
/obj/item/device/modular_computer/attackby(obj/item/weapon/W as obj, mob/user as mob)
/obj/item/device/modular_computer/attackby(obj/item/W as obj, mob/user as mob)
// Insert items into the components
for(var/h in all_components)
var/obj/item/weapon/computer_hardware/H = all_components[h]
var/obj/item/computer_hardware/H = all_components[h]
if(H.try_insert(W, user))
return
// Insert new hardware
if(istype(W, /obj/item/weapon/computer_hardware))
if(istype(W, /obj/item/computer_hardware))
if(install_component(W, user))
return
if(istype(W, /obj/item/weapon/wrench))
if(istype(W, /obj/item/wrench))
if(all_components.len)
to_chat(user, "<span class='warning'>Remove all components from \the [src] before disassembling it.</span>")
return
@@ -393,8 +393,8 @@
qdel(src)
return
if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(istype(W, /obj/item/weldingtool))
var/obj/item/weldingtool/WT = W
if(!WT.isOn())
to_chat(user, "<span class='warning'>\The [W] is off.</span>")
return
@@ -410,13 +410,13 @@
to_chat(user, "<span class='notice'>You repair \the [src].</span>")
return
if(istype(W, /obj/item/weapon/screwdriver))
if(istype(W, /obj/item/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/weapon/computer_hardware/H = all_components[h]
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 component_names
@@ -427,7 +427,7 @@
if(!Adjacent(user))
return
var/obj/item/weapon/computer_hardware/H = find_hardware_by_name(choice)
var/obj/item/computer_hardware/H = find_hardware_by_name(choice)
if(!H)
return
@@ -1,4 +1,4 @@
/obj/item/device/modular_computer/proc/can_install_component(obj/item/weapon/computer_hardware/H, mob/living/user = null)
/obj/item/device/modular_computer/proc/can_install_component(obj/item/computer_hardware/H, mob/living/user = null)
if(!H.can_install(src, user))
return FALSE
@@ -13,7 +13,7 @@
// Installs component.
/obj/item/device/modular_computer/proc/install_component(obj/item/weapon/computer_hardware/H, mob/living/user = null)
/obj/item/device/modular_computer/proc/install_component(obj/item/computer_hardware/H, mob/living/user = null)
if(!can_install_component(H, user))
return FALSE
@@ -29,7 +29,7 @@
// Uninstalls component.
/obj/item/device/modular_computer/proc/uninstall_component(obj/item/weapon/computer_hardware/H, mob/living/user = null)
/obj/item/device/modular_computer/proc/uninstall_component(obj/item/computer_hardware/H, mob/living/user = null)
if(H.holder != src) // Not our component at all.
return FALSE
@@ -8,7 +8,7 @@
component_probability = damage_amount * 0.66
if(component_probability)
for(var/I in all_components)
var/obj/item/weapon/computer_hardware/H = all_components[I]
var/obj/item/computer_hardware/H = all_components[I]
if(prob(component_probability))
H.take_damage(round(damage_amount*0.5), damage_type, damage_flag, 0)
@@ -22,7 +22,7 @@
var/turf/newloc = get_turf(src)
new /obj/item/stack/sheet/metal(newloc, round(steel_sheet_cost/2))
for(var/C in all_components)
var/obj/item/weapon/computer_hardware/H = all_components[C]
var/obj/item/computer_hardware/H = all_components[C]
uninstall_component(H)
H.forceMove(newloc)
if(prob(25))
@@ -3,16 +3,16 @@
if(check_power_override())
return TRUE
var/obj/item/weapon/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
var/obj/item/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
if(recharger && recharger.check_functionality())
if(recharger.use_power(amount))
return TRUE
var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL]
var/obj/item/computer_hardware/battery/battery_module = all_components[MC_CELL]
if(battery_module && battery_module.battery && battery_module.battery.charge)
var/obj/item/weapon/stock_parts/cell/cell = battery_module.battery
var/obj/item/stock_parts/cell/cell = battery_module.battery
if(cell.use(amount * GLOB.CELLRATE))
return TRUE
else // Discharge the cell anyway.
@@ -21,13 +21,13 @@
return FALSE
/obj/item/device/modular_computer/proc/give_power(amount)
var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL]
var/obj/item/computer_hardware/battery/battery_module = all_components[MC_CELL]
if(battery_module && battery_module.battery)
return battery_module.battery.give(amount)
return 0
/obj/item/device/modular_computer/get_cell()
var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL]
var/obj/item/computer_hardware/battery/battery_module = all_components[MC_CELL]
if(battery_module && battery_module.battery)
return battery_module.battery
@@ -43,13 +43,13 @@
// Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged
/obj/item/device/modular_computer/proc/handle_power()
var/obj/item/weapon/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
var/obj/item/computer_hardware/recharger/recharger = all_components[MC_CHARGE]
if(recharger)
recharger.process()
var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage
for(var/obj/item/weapon/computer_hardware/H in all_components)
for(var/obj/item/computer_hardware/H in all_components)
if(H.enabled)
power_usage += H.power_usage
@@ -24,7 +24,7 @@
// We are still here, that means there is no program loaded. Load the BIOS/ROM/OS/whatever you want to call it.
// This screen simply lists available programs and user may select them.
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len)
to_chat(user, "<span class='danger'>\The [src] beeps three times, it's screen displaying a \"DISK ERROR\" warning.</span>")
return // No HDD, No HDD files list or no stored files. Something is very broken.
@@ -42,7 +42,7 @@
/obj/item/device/modular_computer/ui_data(mob/user)
var/list/data = get_header_data()
data["programs"] = list()
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
for(var/datum/computer_file/program/P in hard_drive.stored_files)
var/running = 0
if(P in idle_threads)
@@ -60,7 +60,7 @@
/obj/item/device/modular_computer/ui_act(action, params)
if(..())
return
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
switch(action)
if("PC_exit")
kill_program()
@@ -118,7 +118,7 @@
update_icon()
return
var/obj/item/weapon/computer_hardware/processor_unit/PU = all_components[MC_CPU]
var/obj/item/computer_hardware/processor_unit/PU = all_components[MC_CPU]
if(idle_threads.len > PU.max_idle_programs)
to_chat(user, "<span class='danger'>\The [src] displays a \"Maximal CPU load reached. Unable to run another program.\" error.</span>")
@@ -1,9 +1,9 @@
/obj/item/device/modular_computer/laptop/preset/New()
. = ..()
install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
install_component(new /obj/item/weapon/computer_hardware/battery(src, /obj/item/weapon/stock_parts/cell/computer))
install_component(new /obj/item/weapon/computer_hardware/hard_drive)
install_component(new /obj/item/weapon/computer_hardware/network_card)
install_component(new /obj/item/computer_hardware/processor_unit/small)
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()
@@ -18,6 +18,6 @@
/obj/item/device/modular_computer/laptop/preset/civillian/install_programs()
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = all_components[MC_HDD]
hard_drive.store_file(new/datum/computer_file/program/chatclient())
hard_drive.store_file(new/datum/computer_file/program/nttransfer())
@@ -5,25 +5,25 @@
/obj/item/device/modular_computer/tablet/preset/cheap/New()
. = ..()
install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
install_component(new /obj/item/weapon/computer_hardware/battery(src, /obj/item/weapon/stock_parts/cell/computer/micro))
install_component(new /obj/item/weapon/computer_hardware/hard_drive/small)
install_component(new /obj/item/weapon/computer_hardware/network_card)
install_component(new /obj/item/computer_hardware/processor_unit/small)
install_component(new /obj/item/computer_hardware/battery(src, /obj/item/stock_parts/cell/computer/micro))
install_component(new /obj/item/computer_hardware/hard_drive/small)
install_component(new /obj/item/computer_hardware/network_card)
// Alternative version, an average one, for higher ranked positions mostly
/obj/item/device/modular_computer/tablet/preset/advanced/New()
. = ..()
install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
install_component(new /obj/item/weapon/computer_hardware/battery(src, /obj/item/weapon/stock_parts/cell/computer))
install_component(new /obj/item/weapon/computer_hardware/hard_drive/small)
install_component(new /obj/item/weapon/computer_hardware/network_card)
install_component(new /obj/item/weapon/computer_hardware/card_slot)
install_component(new /obj/item/weapon/computer_hardware/printer/mini)
install_component(new /obj/item/computer_hardware/processor_unit/small)
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)
install_component(new /obj/item/computer_hardware/network_card)
install_component(new /obj/item/computer_hardware/card_slot)
install_component(new /obj/item/computer_hardware/printer/mini)
/obj/item/device/modular_computer/tablet/preset/cargo/New()
. = ..()
install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
install_component(new /obj/item/weapon/computer_hardware/battery(src, /obj/item/weapon/stock_parts/cell/computer))
install_component(new /obj/item/weapon/computer_hardware/hard_drive/small)
install_component(new /obj/item/weapon/computer_hardware/network_card)
install_component(new /obj/item/weapon/computer_hardware/printer/mini)
install_component(new /obj/item/computer_hardware/processor_unit/small)
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)
install_component(new /obj/item/computer_hardware/network_card)
install_component(new /obj/item/computer_hardware/printer/mini)
@@ -9,16 +9,16 @@
. = ..()
if(!cpu)
return
cpu.install_component(new /obj/item/weapon/computer_hardware/processor_unit)
cpu.install_component(new /obj/item/computer_hardware/processor_unit)
if(_has_id_slot)
cpu.install_component(new /obj/item/weapon/computer_hardware/card_slot)
cpu.install_component(new /obj/item/computer_hardware/card_slot)
if(_has_printer)
cpu.install_component(new /obj/item/weapon/computer_hardware/printer)
cpu.install_component(new /obj/item/computer_hardware/printer)
if(_has_battery)
cpu.install_component(new /obj/item/weapon/computer_hardware/battery(cpu, /obj/item/weapon/stock_parts/cell/computer/super))
cpu.install_component(new /obj/item/computer_hardware/battery(cpu, /obj/item/stock_parts/cell/computer/super))
if(_has_ai)
cpu.install_component(new /obj/item/weapon/computer_hardware/ai_slot)
cpu.install_component(new /obj/item/computer_hardware/ai_slot)
install_programs()
// Override in child types to install preset-specific programs.
@@ -33,7 +33,7 @@
desc = "A stationary computer. This one comes preloaded with engineering programs."
/obj/machinery/modular_computer/console/preset/engineering/install_programs()
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
hard_drive.store_file(new/datum/computer_file/program/power_monitor())
hard_drive.store_file(new/datum/computer_file/program/alarm_monitor())
hard_drive.store_file(new/datum/computer_file/program/supermatter_monitor())
@@ -45,7 +45,7 @@
_has_ai = 1
/obj/machinery/modular_computer/console/preset/research/install_programs()
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
hard_drive.store_file(new/datum/computer_file/program/ntnetmonitor())
hard_drive.store_file(new/datum/computer_file/program/nttransfer())
hard_drive.store_file(new/datum/computer_file/program/chatclient())
@@ -60,7 +60,7 @@
_has_printer = 1
/obj/machinery/modular_computer/console/preset/command/install_programs()
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
hard_drive.store_file(new/datum/computer_file/program/chatclient())
hard_drive.store_file(new/datum/computer_file/program/card_mod())
@@ -70,6 +70,6 @@
desc = "A stationary computer. This one comes preloaded with generic programs."
/obj/machinery/modular_computer/console/preset/civilian/install_programs()
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
hard_drive.store_file(new/datum/computer_file/program/chatclient())
hard_drive.store_file(new/datum/computer_file/program/nttransfer())
@@ -106,7 +106,7 @@
// Used in following function to reduce copypaste
/obj/machinery/modular_computer/proc/power_failure(malfunction = 0)
var/obj/item/weapon/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL]
var/obj/item/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL]
if(cpu && cpu.enabled) // Shut down the computer
visible_message("<span class='danger'>\The [src]'s screen flickers [battery_module ? "\"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\"" : "\"EXTERNAL POWER LOSS\""] warning as it shuts down unexpectedly.</span>")
if(cpu)
@@ -124,7 +124,7 @@
..()
update_icon()
/obj/machinery/modular_computer/attackby(var/obj/item/weapon/W as obj, mob/user)
/obj/machinery/modular_computer/attackby(var/obj/item/W as obj, mob/user)
if(cpu && !(flags_1 & NODECONSTRUCT_1))
return cpu.attackby(W, user)
return ..()
@@ -22,24 +22,24 @@
/obj/machinery/modular_computer/console/buildable/Initialize()
. = ..()
// User-built consoles start as empty frames.
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = cpu.all_components[MC_HDD]
var/obj/item/weapon/computer_hardware/hard_drive/network_card = cpu.all_components[MC_NET]
var/obj/item/weapon/computer_hardware/hard_drive/recharger = cpu.all_components[MC_CHARGE]
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]
var/obj/item/computer_hardware/hard_drive/recharger = cpu.all_components[MC_CHARGE]
qdel(recharger)
qdel(network_card)
qdel(hard_drive)
/obj/machinery/modular_computer/console/Initialize()
. = ..()
var/obj/item/weapon/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL]
var/obj/item/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL]
if(battery_module)
qdel(battery_module)
var/obj/item/weapon/computer_hardware/network_card/wired/network_card = new()
var/obj/item/computer_hardware/network_card/wired/network_card = new()
cpu.install_component(network_card)
cpu.install_component(new /obj/item/weapon/computer_hardware/recharger/APC)
cpu.install_component(new /obj/item/weapon/computer_hardware/hard_drive/super) // Consoles generally have better HDDs due to lower space limitations
cpu.install_component(new /obj/item/computer_hardware/recharger/APC)
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.
@@ -2,7 +2,7 @@
var/filename = "NewFile" // Placeholder. No spacebars
var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case
var/size = 1 // File size in GQ. Integers only!
var/obj/item/weapon/computer_hardware/hard_drive/holder // Holder that contains this file.
var/obj/item/computer_hardware/hard_drive/holder // Holder that contains this file.
var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means.
var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc.
var/uid // UID of this file
@@ -91,14 +91,14 @@
return 1
if(ishuman(user))
var/obj/item/weapon/card/id/D
var/obj/item/weapon/computer_hardware/card_slot/card_slot
var/obj/item/card/id/D
var/obj/item/computer_hardware/card_slot/card_slot
if(computer && card_slot)
card_slot = computer.all_components[MC_CARD]
D = card_slot.GetID()
var/mob/living/carbon/human/h = user
var/obj/item/weapon/card/id/I = h.get_idcard()
var/obj/item/weapon/card/id/C = h.get_active_held_item()
var/obj/item/card/id/I = h.get_idcard()
var/obj/item/card/id/C = h.get_active_held_item()
if(C)
C = C.GetID()
if(!(C && istype(C)))
@@ -16,7 +16,7 @@
/datum/computer_file/program/aidiag/proc/get_ai(cardcheck)
var/obj/item/weapon/computer_hardware/ai_slot/ai_slot
var/obj/item/computer_hardware/ai_slot/ai_slot
if(computer)
ai_slot = computer.all_components[MC_AI]
@@ -47,7 +47,7 @@
return TRUE
if("PRG_eject")
if(computer.all_components[MC_AI])
var/obj/item/weapon/computer_hardware/ai_slot/ai_slot = computer.all_components[MC_AI]
var/obj/item/computer_hardware/ai_slot/ai_slot = computer.all_components[MC_AI]
if(ai_slot && ai_slot.stored_card)
ai_slot.try_eject(0,usr)
return TRUE
@@ -58,7 +58,7 @@
return
var/obj/item/device/aicard/cardhold = get_ai(2)
var/obj/item/weapon/computer_hardware/ai_slot/ai_slot = get_ai(1)
var/obj/item/computer_hardware/ai_slot/ai_slot = get_ai(1)
var/mob/living/silicon/ai/A = get_ai()
@@ -62,7 +62,7 @@
executed = 1
target.dos_sources.Add(src)
if(GLOB.ntnet_global.intrusion_detection_enabled)
var/obj/item/weapon/computer_hardware/network_card/network_card = computer.all_components[MC_NET]
var/obj/item/computer_hardware/network_card/network_card = computer.all_components[MC_NET]
GLOB.ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [network_card.get_network_tag()]")
GLOB.ntnet_global.intrusion_detection_alarm = 1
return 1
@@ -24,9 +24,9 @@
computer.visible_message("<span class='notice'>\The [computer]'s screen brightly flashes and loud electrical buzzing is heard.</span>")
computer.enabled = 0
computer.update_icon()
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
var/obj/item/weapon/computer_hardware/battery/battery_module = computer.all_components[MC_CELL]
var/obj/item/weapon/computer_hardware/recharger/recharger = computer.all_components[MC_CHARGE]
var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/battery/battery_module = computer.all_components[MC_CELL]
var/obj/item/computer_hardware/recharger/recharger = computer.all_components[MC_CHARGE]
qdel(hard_drive)
computer.take_damage(25, BRUTE, 0, 0)
if(battery_module && prob(25))
@@ -83,8 +83,8 @@
return 0
/datum/computer_file/program/card_mod/proc/format_jobs(list/jobs)
var/obj/item/weapon/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
var/obj/item/weapon/card/id/id_card = card_slot.stored_card
var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
var/obj/item/card/id/id_card = card_slot.stored_card
var/list/formatted = list()
for(var/job in jobs)
formatted.Add(list(list(
@@ -98,19 +98,19 @@
if(..())
return 1
var/obj/item/weapon/computer_hardware/card_slot/card_slot
var/obj/item/weapon/computer_hardware/printer/printer
var/obj/item/computer_hardware/card_slot/card_slot
var/obj/item/computer_hardware/printer/printer
if(computer)
card_slot = computer.all_components[MC_CARD]
printer = computer.all_components[MC_PRINT]
if(!card_slot)
return
var/obj/item/weapon/card/id/user_id_card = null
var/obj/item/card/id/user_id_card = null
var/mob/user = usr
var/obj/item/weapon/card/id/id_card = card_slot.stored_card
var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2
var/obj/item/card/id/id_card = card_slot.stored_card
var/obj/item/card/id/auth_card = card_slot.stored_card2
if(auth_card)
user_id_card = auth_card
@@ -174,7 +174,7 @@
card_slot.try_eject(1, user)
else
var/obj/item/I = usr.get_active_held_item()
if (istype(I, /obj/item/weapon/card/id))
if (istype(I, /obj/item/card/id))
if(!usr.drop_item())
return
I.forceMove(computer)
@@ -190,7 +190,7 @@
card_slot.try_eject(2, user)
else
var/obj/item/I = usr.get_active_held_item()
if (istype(I, /obj/item/weapon/card/id))
if (istype(I, /obj/item/card/id))
if(!usr.drop_item())
return
I.forceMove(computer)
@@ -285,19 +285,19 @@
return 1
/datum/computer_file/program/card_mod/proc/remove_nt_access(obj/item/weapon/card/id/id_card)
/datum/computer_file/program/card_mod/proc/remove_nt_access(obj/item/card/id/id_card)
id_card.access -= get_all_accesses()
id_card.access -= get_all_centcom_access()
/datum/computer_file/program/card_mod/proc/apply_access(obj/item/weapon/card/id/id_card, list/accesses)
/datum/computer_file/program/card_mod/proc/apply_access(obj/item/card/id/id_card, list/accesses)
id_card.access |= accesses
/datum/computer_file/program/card_mod/ui_data(mob/user)
var/list/data = get_header_data()
var/obj/item/weapon/computer_hardware/card_slot/card_slot
var/obj/item/weapon/computer_hardware/printer/printer
var/obj/item/computer_hardware/card_slot/card_slot
var/obj/item/computer_hardware/printer/printer
if(computer)
card_slot = computer.all_components[MC_CARD]
@@ -308,7 +308,7 @@
var/authed = 0
if(computer)
if(card_slot)
var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2
var/obj/item/card/id/auth_card = card_slot.stored_card2
data["auth_name"] = auth_card ? strip_html_simple(auth_card.name) : "-----"
authed = authorized()
@@ -364,7 +364,7 @@
if(mod_mode == 1 && computer)
if(card_slot)
var/obj/item/weapon/card/id/id_card = card_slot.stored_card
var/obj/item/card/id/id_card = card_slot.stored_card
data["has_id"] = !!id_card
data["id_rank"] = id_card && id_card.assignment ? html_encode(id_card.assignment) : "Unassigned"
@@ -382,7 +382,7 @@
if(card_slot.stored_card)
var/obj/item/weapon/card/id/id_card = card_slot.stored_card
var/obj/item/card/id/id_card = card_slot.stored_card
if(is_centcom)
var/list/all_centcom_access = list()
for(var/access in get_all_centcom_access())
@@ -443,9 +443,9 @@
/datum/computer_file/program/card_mod/proc/authorized()
if(!authenticated && computer)
var/obj/item/weapon/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
var/obj/item/computer_hardware/card_slot/card_slot = computer.all_components[MC_CARD]
if(card_slot)
var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2
var/obj/item/card/id/auth_card = card_slot.stored_card2
if(auth_card)
region_access = list()
if(ACCESS_CHANGE_IDS in auth_card.GetAccess())
@@ -19,8 +19,8 @@
/datum/computer_file/program/computerconfig/ui_data(mob/user)
movable = computer
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = movable.all_components[MC_HDD]
var/obj/item/weapon/computer_hardware/battery/battery_module = movable.all_components[MC_CELL]
var/obj/item/computer_hardware/hard_drive/hard_drive = movable.all_components[MC_HDD]
var/obj/item/computer_hardware/battery/battery_module = movable.all_components[MC_CELL]
if(!istype(movable))
movable = null
@@ -43,7 +43,7 @@
var/list/all_entries[0]
for(var/I in movable.all_components)
var/obj/item/weapon/computer_hardware/H = movable.all_components[I]
var/obj/item/computer_hardware/H = movable.all_components[I]
all_entries.Add(list(list(
"name" = H.name,
"desc" = H.desc,
@@ -61,7 +61,7 @@
return
switch(action)
if("PC_toggle_component")
var/obj/item/weapon/computer_hardware/H = movable.find_hardware_by_name(params["name"])
var/obj/item/computer_hardware/H = movable.find_hardware_by_name(params["name"])
if(H && istype(H))
H.enabled = !H.enabled
. = TRUE
@@ -16,9 +16,9 @@
if(..())
return 1
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD]
var/obj/item/weapon/computer_hardware/hard_drive/RHDD = computer.all_components[MC_SDD]
var/obj/item/weapon/computer_hardware/printer/printer = computer.all_components[MC_PRINT]
var/obj/item/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/RHDD = computer.all_components[MC_SDD]
var/obj/item/computer_hardware/printer/printer = computer.all_components[MC_PRINT]
switch(action)
if("PRG_openfile")
@@ -181,8 +181,8 @@
/datum/computer_file/program/filemanager/ui_data(mob/user)
var/list/data = get_header_data()
var/obj/item/weapon/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD]
var/obj/item/weapon/computer_hardware/hard_drive/portable/RHDD = computer.all_components[MC_SDD]
var/obj/item/computer_hardware/hard_drive/HDD = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/portable/RHDD = computer.all_components[MC_SDD]
if(error)
data["error"] = error
if(open_file)
@@ -32,7 +32,7 @@
if(PRG.available_on_syndinet && !computer.emagged)
return 0
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
if(!computer || !hard_drive || !hard_drive.can_store_file(PRG))
return 0
@@ -63,7 +63,7 @@
if(!downloaded_file)
return
generate_network_log("Completed download of file [hacked_download ? "**ENCRYPTED**" : "[downloaded_file.filename].[downloaded_file.filetype]"].")
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
if(!computer || !hard_drive || !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."
@@ -123,7 +123,7 @@
data["downloadspeed"] = download_netspeed
data["downloadcompletion"] = round(download_completion, 0.1)
else // No download running, pick file.
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = my_computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = my_computer.all_components[MC_HDD]
data["disk_size"] = hard_drive.max_capacity
data["disk_used"] = hard_drive.used_capacity
var/list/all_entries[0]
@@ -121,7 +121,7 @@
logfile.stored_data += "[logstring]\[BR\]"
logfile.stored_data += "\[b\]Logfile dump completed.\[/b\]"
logfile.calculate_size()
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
if(!computer || !hard_drive || !hard_drive.store_file(logfile))
if(!computer)
// This program shouldn't even be runnable without computer.
@@ -65,7 +65,7 @@
// Finishes download and attempts to store the file on HDD
/datum/computer_file/program/nttransfer/proc/finish_download()
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
if(!computer || !hard_drive || !hard_drive.store_file(downloaded_file))
error = "I/O Error: Unable to save file. Check your hard drive and try again."
finalize_download()
@@ -122,7 +122,7 @@
server_password = pass
return 1
if("PRG_uploadfile")
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
for(var/datum/computer_file/F in hard_drive.stored_files)
if("[F.uid]" == params["id"])
if(F.unsendable)
@@ -161,7 +161,7 @@
data["upload_filename"] = "[provided_file.filename].[provided_file.filetype]"
else if (upload_menu)
var/list/all_files[0]
var/obj/item/weapon/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
var/obj/item/computer_hardware/hard_drive/hard_drive = computer.all_components[MC_HDD]
for(var/datum/computer_file/F in hard_drive.stored_files)
all_files.Add(list(list(
"uid" = F.uid,
@@ -1,7 +1,7 @@
// CPU that allows the computer to run programs.
// Better CPUs are obtainable via research and can run more programs on background.
/obj/item/weapon/computer_hardware/processor_unit
/obj/item/computer_hardware/processor_unit
name = "processor board"
desc = "A standard CPU board used in most computers. It can run up to three programs simultaneously."
icon_state = "cpuboard"
@@ -13,10 +13,10 @@
var/max_idle_programs = 2 // 2 idle, + 1 active = 3 as said in description.
device_type = MC_CPU
/obj/item/weapon/computer_hardware/processor_unit/on_remove(obj/item/device/modular_computer/MC, mob/user)
/obj/item/computer_hardware/processor_unit/on_remove(obj/item/device/modular_computer/MC, mob/user)
MC.shutdown_computer()
/obj/item/weapon/computer_hardware/processor_unit/small
/obj/item/computer_hardware/processor_unit/small
name = "microprocessor"
desc = "A miniaturised CPU used in portable devices. It can run up to two programs simultaneously."
icon_state = "cpu"
@@ -25,7 +25,7 @@
max_idle_programs = 1
origin_tech = "programming=2;engineering=2"
/obj/item/weapon/computer_hardware/processor_unit/photonic
/obj/item/computer_hardware/processor_unit/photonic
name = "photonic processor board"
desc = "An advanced experimental CPU board that uses photonic core instead of regular circuitry. It can run up to five programs simultaneously, but uses a lot of power."
icon_state = "cpuboard_super"
@@ -34,7 +34,7 @@
max_idle_programs = 4
origin_tech = "programming=5;engineering=4"
/obj/item/weapon/computer_hardware/processor_unit/photonic/small
/obj/item/computer_hardware/processor_unit/photonic/small
name = "photonic microprocessor"
desc = "An advanced miniaturised CPU for use in portable devices. It uses photonic core instead of regular circuitry. It can run up to three programs simultaneously."
icon_state = "cpu_super"
@@ -1,4 +1,4 @@
/obj/item/weapon/computer_hardware
/obj/item/computer_hardware
name = "hardware"
desc = "Unknown Hardware."
icon = 'icons/obj/module.dmi'
@@ -20,18 +20,18 @@
var/malfunction_probability = 10// Chance of malfunction when the component is damaged
var/device_type
/obj/item/weapon/computer_hardware/New(var/obj/L)
/obj/item/computer_hardware/New(var/obj/L)
..()
pixel_x = rand(-8, 8)
pixel_y = rand(-8, 8)
/obj/item/weapon/computer_hardware/Destroy()
/obj/item/computer_hardware/Destroy()
if(holder)
holder.uninstall_component(src)
return ..()
/obj/item/weapon/computer_hardware/attackby(obj/item/I, mob/living/user)
/obj/item/computer_hardware/attackby(obj/item/I, mob/living/user)
// Multitool. Runs diagnostics
if(istype(I, /obj/item/device/multitool))
to_chat(user, "***** DIAGNOSTICS REPORT *****")
@@ -56,11 +56,11 @@
return ..()
// Called on multitool click, prints diagnostic information to the user.
/obj/item/weapon/computer_hardware/proc/diagnostics(var/mob/user)
/obj/item/computer_hardware/proc/diagnostics(var/mob/user)
to_chat(user, "Hardware Integrity Test... (Corruption: [damage]/[max_damage]) [damage > damage_failure ? "FAIL" : damage > damage_malfunction ? "WARN" : "PASS"]")
// Handles damage checks
/obj/item/weapon/computer_hardware/proc/check_functionality()
/obj/item/computer_hardware/proc/check_functionality()
if(!enabled) // Disabled.
return FALSE
@@ -73,7 +73,7 @@
return TRUE // Good to go.
/obj/item/weapon/computer_hardware/examine(var/mob/user)
/obj/item/computer_hardware/examine(var/mob/user)
. = ..()
if(damage > damage_failure)
to_chat(user, "<span class='danger'>It seems to be severely damaged!</span>")
@@ -83,21 +83,21 @@
to_chat(user, "<span class='notice'>It seems to be slightly damaged.</span>")
// Component-side compatibility check.
/obj/item/weapon/computer_hardware/proc/can_install(obj/item/device/modular_computer/M, mob/living/user = null)
/obj/item/computer_hardware/proc/can_install(obj/item/device/modular_computer/M, mob/living/user = null)
return can_install
// Called when component is installed into PC.
/obj/item/weapon/computer_hardware/proc/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
/obj/item/computer_hardware/proc/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
return
// Called when component is removed from PC.
/obj/item/weapon/computer_hardware/proc/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
/obj/item/computer_hardware/proc/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
try_eject(forced = 1)
// Called when someone tries to insert something in it - paper in printer, card in card reader, etc.
/obj/item/weapon/computer_hardware/proc/try_insert(obj/item/I, mob/living/user = null)
/obj/item/computer_hardware/proc/try_insert(obj/item/I, mob/living/user = null)
return FALSE
// Called when someone tries to eject something from it - card from card reader, etc.
/obj/item/weapon/computer_hardware/proc/try_eject(slot=0, mob/living/user = null, forced = 0)
/obj/item/computer_hardware/proc/try_eject(slot=0, mob/living/user = null, forced = 0)
return FALSE
@@ -1,4 +1,4 @@
/obj/item/weapon/computer_hardware/ai_slot
/obj/item/computer_hardware/ai_slot
name = "intelliCard interface slot"
desc = "A module allowing this computer to interface with most common intelliCard modules. Necessary for some programs to run properly."
power_usage = 100 //W
@@ -11,18 +11,18 @@
var/locked = FALSE
/obj/item/weapon/computer_hardware/ai_slot/examine(mob/user)
/obj/item/computer_hardware/ai_slot/examine(mob/user)
..()
if(stored_card)
to_chat(user, "There appears to be an intelliCard loaded. There appears to be a pinhole protecting a manual eject button. A screwdriver could probably press it")
/obj/item/weapon/computer_hardware/ai_slot/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
/obj/item/computer_hardware/ai_slot/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
M.add_verb(device_type)
/obj/item/weapon/computer_hardware/ai_slot/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
/obj/item/computer_hardware/ai_slot/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
M.remove_verb(device_type)
/obj/item/weapon/computer_hardware/ai_slot/try_insert(obj/item/I, mob/living/user = null)
/obj/item/computer_hardware/ai_slot/try_insert(obj/item/I, mob/living/user = null)
if(!holder)
return FALSE
@@ -41,7 +41,7 @@
return TRUE
/obj/item/weapon/computer_hardware/ai_slot/try_eject(slot=0,mob/living/user = null,forced = 0)
/obj/item/computer_hardware/ai_slot/try_eject(slot=0,mob/living/user = null,forced = 0)
if(!stored_card)
to_chat(user, "<span class='warning'>There is no card in \the [src].</span>")
return FALSE
@@ -60,10 +60,10 @@
return TRUE
return FALSE
/obj/item/weapon/computer_hardware/ai_slot/attackby(obj/item/I, mob/living/user)
/obj/item/computer_hardware/ai_slot/attackby(obj/item/I, mob/living/user)
if(..())
return
if(istype(I, /obj/item/weapon/screwdriver))
if(istype(I, /obj/item/screwdriver))
to_chat(user, "<span class='notice'>You press down on the manual eject button with \the [I].</span>")
try_eject(,user,1)
return
@@ -1,23 +1,23 @@
/obj/item/weapon/computer_hardware/battery
/obj/item/computer_hardware/battery
name = "power cell controller"
desc = "A charge controller for standard power cells, used in all kinds of modular computers."
icon_state = "cell_con"
critical = 1
malfunction_probability = 1
origin_tech = "powerstorage=1;engineering=1"
var/obj/item/weapon/stock_parts/cell/battery = null
var/obj/item/stock_parts/cell/battery = null
device_type = MC_CELL
/obj/item/weapon/computer_hardware/battery/New(loc, battery_type = null)
/obj/item/computer_hardware/battery/New(loc, battery_type = null)
if(battery_type)
battery = new battery_type(src)
..()
/obj/item/weapon/computer_hardware/battery/try_insert(obj/item/I, mob/living/user = null)
/obj/item/computer_hardware/battery/try_insert(obj/item/I, mob/living/user = null)
if(!holder)
return FALSE
if(!istype(I, /obj/item/weapon/stock_parts/cell))
if(!istype(I, /obj/item/stock_parts/cell))
return FALSE
if(battery)
@@ -37,7 +37,7 @@
return TRUE
/obj/item/weapon/computer_hardware/battery/try_eject(slot=0, mob/living/user = null, forced = 0)
/obj/item/computer_hardware/battery/try_eject(slot=0, mob/living/user = null, forced = 0)
if(!battery)
to_chat(user, "<span class='warning'>There is no power cell connected to \the [src].</span>")
return FALSE
@@ -59,7 +59,7 @@
/obj/item/weapon/stock_parts/cell/computer
/obj/item/stock_parts/cell/computer
name = "standard battery"
desc = "A standard power cell, commonly seen in high-end portable microcomputers or low-end laptops."
icon = 'icons/obj/module.dmi'
@@ -69,7 +69,7 @@
maxcharge = 750
/obj/item/weapon/stock_parts/cell/computer/advanced
/obj/item/stock_parts/cell/computer/advanced
name = "advanced battery"
desc = "An advanced power cell, often used in most laptops. It is too large to be fitted into smaller devices."
icon_state = "cell"
@@ -77,7 +77,7 @@
w_class = WEIGHT_CLASS_SMALL
maxcharge = 1500
/obj/item/weapon/stock_parts/cell/computer/super
/obj/item/stock_parts/cell/computer/super
name = "super battery"
desc = "An advanced power cell, often used in high-end laptops."
icon_state = "cell"
@@ -85,13 +85,13 @@
w_class = WEIGHT_CLASS_SMALL
maxcharge = 2000
/obj/item/weapon/stock_parts/cell/computer/micro
/obj/item/stock_parts/cell/computer/micro
name = "micro battery"
desc = "A small power cell, commonly seen in most portable microcomputers."
icon_state = "cell_micro"
maxcharge = 500
/obj/item/weapon/stock_parts/cell/computer/nano
/obj/item/stock_parts/cell/computer/nano
name = "nano battery"
desc = "A tiny power cell, commonly seen in low-end portable microcomputers."
icon_state = "cell_micro"
@@ -1,4 +1,4 @@
/obj/item/weapon/computer_hardware/card_slot
/obj/item/computer_hardware/card_slot
name = "identification card authentication module" // \improper breaks the find_hardware_by_name proc
desc = "A module allowing this computer to read or write data on ID cards. Necessary for some programs to run properly."
power_usage = 10 //W
@@ -7,14 +7,14 @@
origin_tech = "programming=2"
device_type = MC_CARD
var/obj/item/weapon/card/id/stored_card = null
var/obj/item/weapon/card/id/stored_card2 = null
var/obj/item/card/id/stored_card = null
var/obj/item/card/id/stored_card2 = null
/obj/item/weapon/computer_hardware/card_slot/Destroy()
/obj/item/computer_hardware/card_slot/Destroy()
try_eject()
return ..()
/obj/item/weapon/computer_hardware/card_slot/GetAccess()
/obj/item/computer_hardware/card_slot/GetAccess()
if(stored_card && stored_card2) // Best of both worlds
return (stored_card.GetAccess() | stored_card2.GetAccess())
else if(stored_card)
@@ -23,24 +23,24 @@
return stored_card2.GetAccess()
return ..()
/obj/item/weapon/computer_hardware/card_slot/GetID()
/obj/item/computer_hardware/card_slot/GetID()
if(stored_card)
return stored_card
else if(stored_card2)
return stored_card2
return ..()
/obj/item/weapon/computer_hardware/card_slot/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
/obj/item/computer_hardware/card_slot/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
M.add_verb(device_type)
/obj/item/weapon/computer_hardware/card_slot/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
/obj/item/computer_hardware/card_slot/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
M.remove_verb(device_type)
/obj/item/weapon/computer_hardware/card_slot/try_insert(obj/item/I, mob/living/user = null)
/obj/item/computer_hardware/card_slot/try_insert(obj/item/I, mob/living/user = null)
if(!holder)
return FALSE
if(!istype(I, /obj/item/weapon/card/id))
if(!istype(I, /obj/item/card/id))
return FALSE
if(stored_card && stored_card2)
@@ -61,7 +61,7 @@
return TRUE
/obj/item/weapon/computer_hardware/card_slot/try_eject(slot=0, mob/living/user = null, forced = 0)
/obj/item/computer_hardware/card_slot/try_eject(slot=0, mob/living/user = null, forced = 0)
if(!stored_card && !stored_card2)
to_chat(user, "<span class='warning'>There are no cards in \the [src].</span>")
return FALSE
@@ -96,15 +96,15 @@
return TRUE
return FALSE
/obj/item/weapon/computer_hardware/card_slot/attackby(obj/item/I, mob/living/user)
/obj/item/computer_hardware/card_slot/attackby(obj/item/I, mob/living/user)
if(..())
return
if(istype(I, /obj/item/weapon/screwdriver))
if(istype(I, /obj/item/screwdriver))
to_chat(user, "<span class='notice'>You press down on the manual eject button with \the [I].</span>")
try_eject(0,user)
return
/obj/item/weapon/computer_hardware/card_slot/examine(mob/user)
/obj/item/computer_hardware/card_slot/examine(mob/user)
..()
if(stored_card || stored_card2)
to_chat(user, "There appears to be something loaded in the card slots.")
@@ -1,4 +1,4 @@
/obj/item/weapon/computer_hardware/hard_drive
/obj/item/computer_hardware/hard_drive
name = "hard disk drive"
desc = "A small HDD, for use in basic computers where power efficiency is desired."
power_usage = 25
@@ -11,26 +11,26 @@
var/used_capacity = 0
var/list/stored_files = list() // List of stored files on this drive. DO NOT MODIFY DIRECTLY!
/obj/item/weapon/computer_hardware/hard_drive/on_remove(obj/item/device/modular_computer/MC, mob/user)
/obj/item/computer_hardware/hard_drive/on_remove(obj/item/device/modular_computer/MC, mob/user)
MC.shutdown_computer()
/obj/item/weapon/computer_hardware/hard_drive/proc/install_default_programs()
/obj/item/computer_hardware/hard_drive/proc/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/ntnetdownload(src)) // NTNet Downloader Utility, allows users to download more software from NTNet repository
store_file(new/datum/computer_file/program/filemanager(src)) // File manager, allows text editor functions and basic file manipulation.
/obj/item/weapon/computer_hardware/hard_drive/examine(user)
/obj/item/computer_hardware/hard_drive/examine(user)
..()
to_chat(user, "<span class='notice'>It has [max_capacity] GQ of storage capacity.</span>")
/obj/item/weapon/computer_hardware/hard_drive/diagnostics(var/mob/user)
/obj/item/computer_hardware/hard_drive/diagnostics(var/mob/user)
..()
// 999 is a byond limit that is in place. It's unlikely someone will reach that many files anyway, since you would sooner run out of space.
to_chat(user, "NT-NFS File Table Status: [stored_files.len]/999")
to_chat(user, "Storage capacity: [used_capacity]/[max_capacity]GQ")
// Use this proc to add file to the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
/obj/item/weapon/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F)
/obj/item/computer_hardware/hard_drive/proc/store_file(var/datum/computer_file/F)
if(!F || !istype(F))
return 0
@@ -53,7 +53,7 @@
return 1
// Use this proc to remove file from the drive. Returns 1 on success and 0 on failure. Contains necessary sanity checks.
/obj/item/weapon/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F)
/obj/item/computer_hardware/hard_drive/proc/remove_file(var/datum/computer_file/F)
if(!F || !istype(F))
return 0
@@ -71,7 +71,7 @@
return 0
// Loops through all stored files and recalculates used_capacity of this drive
/obj/item/weapon/computer_hardware/hard_drive/proc/recalculate_size()
/obj/item/computer_hardware/hard_drive/proc/recalculate_size()
var/total_size = 0
for(var/datum/computer_file/F in stored_files)
total_size += F.size
@@ -79,7 +79,7 @@
used_capacity = total_size
// Checks whether file can be stored on the hard drive. We can only store unique files, so this checks whether we wouldn't get a duplicity by adding a file.
/obj/item/weapon/computer_hardware/hard_drive/proc/can_store_file(var/datum/computer_file/F)
/obj/item/computer_hardware/hard_drive/proc/can_store_file(var/datum/computer_file/F)
if(!F || !istype(F))
return 0
@@ -102,7 +102,7 @@
// Tries to find the file by filename. Returns null on failure
/obj/item/weapon/computer_hardware/hard_drive/proc/find_file_by_name(var/filename)
/obj/item/computer_hardware/hard_drive/proc/find_file_by_name(var/filename)
if(!check_functionality())
return null
@@ -117,16 +117,16 @@
return F
return null
/obj/item/weapon/computer_hardware/hard_drive/Destroy()
/obj/item/computer_hardware/hard_drive/Destroy()
stored_files = null
return ..()
/obj/item/weapon/computer_hardware/hard_drive/New()
/obj/item/computer_hardware/hard_drive/New()
install_default_programs()
..()
/obj/item/weapon/computer_hardware/hard_drive/advanced
/obj/item/computer_hardware/hard_drive/advanced
name = "advanced hard disk drive"
desc = "A hybrid HDD, for use in higher grade computers where balance between power efficiency and capacity is desired."
max_capacity = 256
@@ -135,7 +135,7 @@
icon_state = "harddisk_mini"
w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/computer_hardware/hard_drive/super
/obj/item/computer_hardware/hard_drive/super
name = "super hard disk drive"
desc = "A high capacity HDD, for use in cluster storage solutions where capacity is more important than power efficiency."
max_capacity = 512
@@ -144,7 +144,7 @@
icon_state = "harddisk_mini"
w_class = WEIGHT_CLASS_SMALL
/obj/item/weapon/computer_hardware/hard_drive/cluster
/obj/item/computer_hardware/hard_drive/cluster
name = "cluster hard disk drive"
desc = "A large storage cluster consisting of multiple HDDs for usage in dedicated storage systems."
power_usage = 500
@@ -154,7 +154,7 @@
w_class = WEIGHT_CLASS_NORMAL
// For tablets, etc. - highly power efficient.
/obj/item/weapon/computer_hardware/hard_drive/small
/obj/item/computer_hardware/hard_drive/small
name = "solid state drive"
desc = "An efficient SSD for portable devices."
power_usage = 10
@@ -163,7 +163,7 @@
icon_state = "ssd_mini"
w_class = WEIGHT_CLASS_TINY
/obj/item/weapon/computer_hardware/hard_drive/micro
/obj/item/computer_hardware/hard_drive/micro
name = "micro solid state drive"
desc = "A highly efficient SSD chip for portable devices."
power_usage = 2
@@ -1,4 +1,4 @@
/obj/item/weapon/computer_hardware/network_card
/obj/item/computer_hardware/network_card
name = "network card"
desc = "A basic wireless network card for usage with standard NTNet frequencies."
power_usage = 50
@@ -12,7 +12,7 @@
device_type = MC_NET
var/global/ntnet_card_uid = 1
/obj/item/weapon/computer_hardware/network_card/diagnostics(var/mob/user)
/obj/item/computer_hardware/network_card/diagnostics(var/mob/user)
..()
to_chat(user, "NIX Unique ID: [identification_id]")
to_chat(user, "NIX User Tag: [identification_string]")
@@ -23,16 +23,16 @@
if(ethernet)
to_chat(user, "OpenEth (Physical Connection) - Physical network connection port")
/obj/item/weapon/computer_hardware/network_card/New(var/l)
/obj/item/computer_hardware/network_card/New(var/l)
..()
identification_id = ntnet_card_uid++
// Returns a string identifier of this network card
/obj/item/weapon/computer_hardware/network_card/proc/get_network_tag()
/obj/item/computer_hardware/network_card/proc/get_network_tag()
return "[identification_string] (NID [identification_id])"
// 0 - No signal, 1 - Low signal, 2 - High signal. 3 - Wired Connection
/obj/item/weapon/computer_hardware/network_card/proc/get_signal(var/specific_action = 0)
/obj/item/computer_hardware/network_card/proc/get_signal(var/specific_action = 0)
if(!holder) // Hardware is not installed in anything. No signal. How did this even get called?
return 0
@@ -61,7 +61,7 @@
return 0 // Computer is not on station and does not have upgraded network card. No signal.
/obj/item/weapon/computer_hardware/network_card/advanced
/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
@@ -72,7 +72,7 @@
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
w_class = WEIGHT_CLASS_TINY
/obj/item/weapon/computer_hardware/network_card/wired
/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
@@ -1,4 +1,4 @@
/obj/item/weapon/computer_hardware/hard_drive/portable
/obj/item/computer_hardware/hard_drive/portable
name = "data disk"
desc = "Removable disk used to store data."
power_usage = 10
@@ -9,24 +9,24 @@
origin_tech = "programming=1"
device_type = MC_SDD
/obj/item/weapon/computer_hardware/hard_drive/portable/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
/obj/item/computer_hardware/hard_drive/portable/on_install(obj/item/device/modular_computer/M, mob/living/user = null)
M.add_verb(device_type)
/obj/item/weapon/computer_hardware/hard_drive/portable/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
/obj/item/computer_hardware/hard_drive/portable/on_remove(obj/item/device/modular_computer/M, mob/living/user = null)
..()
M.remove_verb(device_type)
/obj/item/weapon/computer_hardware/hard_drive/portable/install_default_programs()
/obj/item/computer_hardware/hard_drive/portable/install_default_programs()
return // Empty by default
/obj/item/weapon/computer_hardware/hard_drive/portable/advanced
/obj/item/computer_hardware/hard_drive/portable/advanced
name = "advanced data disk"
power_usage = 20
icon_state = "datadisk5"
max_capacity = 64
origin_tech = "programming=2"
/obj/item/weapon/computer_hardware/hard_drive/portable/super
/obj/item/computer_hardware/hard_drive/portable/super
name = "super data disk"
desc = "Removable disk used to store large amounts of data."
power_usage = 40
@@ -1,4 +1,4 @@
/obj/item/weapon/computer_hardware/printer
/obj/item/computer_hardware/printer
name = "printer"
desc = "Computer-integrated printer with paper recycling module."
power_usage = 100
@@ -9,22 +9,22 @@
var/stored_paper = 20
var/max_paper = 30
/obj/item/weapon/computer_hardware/printer/diagnostics(mob/living/user)
/obj/item/computer_hardware/printer/diagnostics(mob/living/user)
..()
to_chat(user, "Paper level: [stored_paper]/[max_paper]")
/obj/item/weapon/computer_hardware/printer/examine(mob/user)
/obj/item/computer_hardware/printer/examine(mob/user)
..()
to_chat(user, "<span class='notice'>Paper level: [stored_paper]/[max_paper]</span>")
/obj/item/weapon/computer_hardware/printer/proc/print_text(var/text_to_print, var/paper_title = "")
/obj/item/computer_hardware/printer/proc/print_text(var/text_to_print, var/paper_title = "")
if(!stored_paper)
return FALSE
if(!check_functionality())
return FALSE
var/obj/item/weapon/paper/P = new/obj/item/weapon/paper(get_turf(holder))
var/obj/item/paper/P = new/obj/item/paper(get_turf(holder))
// Damaged printer causes the resulting paper to be somewhat harder to read.
if(damage > damage_malfunction)
@@ -39,8 +39,8 @@
P = null
return TRUE
/obj/item/weapon/computer_hardware/printer/try_insert(obj/item/I, mob/living/user = null)
if(istype(I, /obj/item/weapon/paper))
/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 class='warning'>You try to add \the [I] into [src], but its paper bin is full!</span>")
return FALSE
@@ -53,7 +53,7 @@
return TRUE
return FALSE
/obj/item/weapon/computer_hardware/printer/mini
/obj/item/computer_hardware/printer/mini
name = "miniprinter"
desc = "A small printer with paper recycling module."
power_usage = 50
@@ -1,21 +1,21 @@
/obj/item/weapon/computer_hardware/recharger
/obj/item/computer_hardware/recharger
critical = 1
enabled = 1
var/charge_rate = 100
device_type = MC_CHARGE
/obj/item/weapon/computer_hardware/recharger/proc/use_power(amount, charging=0)
/obj/item/computer_hardware/recharger/proc/use_power(amount, charging=0)
if(charging)
return 1
return 0
/obj/item/weapon/computer_hardware/recharger/process()
/obj/item/computer_hardware/recharger/process()
..()
var/obj/item/weapon/computer_hardware/battery/battery_module = holder.all_components[MC_CELL]
var/obj/item/computer_hardware/battery/battery_module = holder.all_components[MC_CELL]
if(!holder || !battery_module || !battery_module.battery)
return
var/obj/item/weapon/stock_parts/cell/cell = battery_module.battery
var/obj/item/stock_parts/cell/cell = battery_module.battery
if(cell.charge >= cell.maxcharge)
return
@@ -23,14 +23,14 @@
holder.give_power(charge_rate * GLOB.CELLRATE)
/obj/item/weapon/computer_hardware/recharger/APC
/obj/item/computer_hardware/recharger/APC
name = "area power connector"
desc = "A device that wirelessly recharges connected device from nearby APC."
icon_state = "charger_APC"
w_class = WEIGHT_CLASS_SMALL // Can't be installed into tablets/PDAs
origin_tech = "programming=2;engineering=2;powerstorage=3"
/obj/item/weapon/computer_hardware/recharger/APC/use_power(amount, charging=0)
/obj/item/computer_hardware/recharger/APC/use_power(amount, charging=0)
if(istype(holder.physical, /obj/machinery))
var/obj/machinery/M = holder.physical
if(M.powered())
@@ -47,20 +47,20 @@
return 1
return 0
/obj/item/weapon/computer_hardware/recharger/wired
/obj/item/computer_hardware/recharger/wired
name = "wired power connector"
desc = "A power connector that recharges connected device from nearby power wire. Incompatible with portable computers."
icon_state = "charger_wire"
w_class = WEIGHT_CLASS_NORMAL
origin_tech = "engineering=2;powerstorage=1"
/obj/item/weapon/computer_hardware/recharger/wired/can_install(obj/item/device/modular_computer/M, mob/living/user = null)
/obj/item/computer_hardware/recharger/wired/can_install(obj/item/device/modular_computer/M, mob/living/user = null)
if(istype(M.physical, /obj/machinery) && M.physical.anchored)
return ..()
to_chat(user, "<span class='warning'>\The [src] is incompatible with portable computers!</span>")
return 0
/obj/item/weapon/computer_hardware/recharger/wired/use_power(amount, charging=0)
/obj/item/computer_hardware/recharger/wired/use_power(amount, charging=0)
if(istype(holder.physical, /obj/machinery) && holder.physical.anchored)
var/obj/machinery/M = holder.physical
var/turf/T = M.loc
@@ -82,12 +82,12 @@
// This is not intended to be obtainable in-game. Intended for adminbus and debugging purposes.
/obj/item/weapon/computer_hardware/recharger/lambda
/obj/item/computer_hardware/recharger/lambda
name = "lambda coil"
desc = "A very complex device that draws power from its own bluespace dimension."
icon_state = "charger_lambda"
w_class = WEIGHT_CLASS_TINY
charge_rate = 100000
/obj/item/weapon/computer_hardware/recharger/lambda/use_power(amount, charging=0)
/obj/item/computer_hardware/recharger/lambda/use_power(amount, charging=0)
return 1
+28 -28
View File
@@ -50,116 +50,116 @@
/obj/machinery/lapvend/proc/fabricate_and_recalc_price(fabricate = 0)
total_price = 0
if(devtype == 1) // Laptop, generally cheaper to make it accessible for most station roles
var/obj/item/weapon/computer_hardware/battery/battery_module = null
var/obj/item/computer_hardware/battery/battery_module = null
if(fabricate)
fabricated_laptop = new /obj/item/device/modular_computer/laptop/buildable(src)
fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/battery)
fabricated_laptop.install_component(new /obj/item/computer_hardware/battery)
battery_module = fabricated_laptop.all_components[MC_CELL]
total_price = 99
switch(dev_cpu)
if(1)
if(fabricate)
fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
fabricated_laptop.install_component(new /obj/item/computer_hardware/processor_unit/small)
if(2)
if(fabricate)
fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/processor_unit)
fabricated_laptop.install_component(new /obj/item/computer_hardware/processor_unit)
total_price += 299
switch(dev_battery)
if(1) // Basic(750C)
if(fabricate)
battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer)
battery_module.try_insert(new /obj/item/stock_parts/cell/computer)
if(2) // Upgraded(1100C)
if(fabricate)
battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer/advanced)
battery_module.try_insert(new /obj/item/stock_parts/cell/computer/advanced)
total_price += 199
if(3) // Advanced(1500C)
if(fabricate)
battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer/super)
battery_module.try_insert(new /obj/item/stock_parts/cell/computer/super)
total_price += 499
switch(dev_disk)
if(1) // Basic(128GQ)
if(fabricate)
fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/hard_drive)
fabricated_laptop.install_component(new /obj/item/computer_hardware/hard_drive)
if(2) // Upgraded(256GQ)
if(fabricate)
fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/hard_drive/advanced)
fabricated_laptop.install_component(new /obj/item/computer_hardware/hard_drive/advanced)
total_price += 99
if(3) // Advanced(512GQ)
if(fabricate)
fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/hard_drive/super)
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/weapon/computer_hardware/network_card)
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/weapon/computer_hardware/network_card/advanced)
fabricated_laptop.install_component(new /obj/item/computer_hardware/network_card/advanced)
total_price += 299
if(dev_apc_recharger)
total_price += 399
if(fabricate)
fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/recharger/APC)
fabricated_laptop.install_component(new /obj/item/computer_hardware/recharger/APC)
if(dev_printer)
total_price += 99
if(fabricate)
fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/printer/mini)
fabricated_laptop.install_component(new /obj/item/computer_hardware/printer/mini)
if(dev_card)
total_price += 199
if(fabricate)
fabricated_laptop.install_component(new /obj/item/weapon/computer_hardware/card_slot)
fabricated_laptop.install_component(new /obj/item/computer_hardware/card_slot)
return total_price
else if(devtype == 2) // Tablet, more expensive, not everyone could probably afford this.
var/obj/item/weapon/computer_hardware/battery/battery_module = null
var/obj/item/computer_hardware/battery/battery_module = null
if(fabricate)
fabricated_tablet = new(src)
fabricated_tablet.install_component(new /obj/item/weapon/computer_hardware/battery)
fabricated_tablet.install_component(new /obj/item/weapon/computer_hardware/processor_unit/small)
fabricated_tablet.install_component(new /obj/item/computer_hardware/battery)
fabricated_tablet.install_component(new /obj/item/computer_hardware/processor_unit/small)
battery_module = fabricated_tablet.all_components[MC_CELL]
total_price = 199
switch(dev_battery)
if(1) // Basic(300C)
if(fabricate)
battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer/nano)
battery_module.try_insert(new /obj/item/stock_parts/cell/computer/nano)
if(2) // Upgraded(500C)
if(fabricate)
battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer/micro)
battery_module.try_insert(new /obj/item/stock_parts/cell/computer/micro)
total_price += 199
if(3) // Advanced(750C)
if(fabricate)
battery_module.try_insert(new /obj/item/weapon/stock_parts/cell/computer)
battery_module.try_insert(new /obj/item/stock_parts/cell/computer)
total_price += 499
switch(dev_disk)
if(1) // Basic(32GQ)
if(fabricate)
fabricated_tablet.install_component(new /obj/item/weapon/computer_hardware/hard_drive/micro)
fabricated_tablet.install_component(new /obj/item/computer_hardware/hard_drive/micro)
if(2) // Upgraded(64GQ)
if(fabricate)
fabricated_tablet.install_component(new /obj/item/weapon/computer_hardware/hard_drive/small)
fabricated_tablet.install_component(new /obj/item/computer_hardware/hard_drive/small)
total_price += 99
if(3) // Advanced(128GQ)
if(fabricate)
fabricated_tablet.install_component(new /obj/item/weapon/computer_hardware/hard_drive)
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/weapon/computer_hardware/network_card)
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/weapon/computer_hardware/network_card/advanced)
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/weapon/computer_hardware/printer)
fabricated_tablet.install_component(new/obj/item/computer_hardware/printer)
if(dev_card)
total_price += 199
if(fabricate)
fabricated_tablet.install_component(new/obj/item/weapon/computer_hardware/card_slot)
fabricated_tablet.install_component(new/obj/item/computer_hardware/card_slot)
return total_price
return 0