diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index 27280edfd79..ebdedff9517 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -22,4 +22,13 @@ #define CRAFTLATHE 8 //Uses fuck if I know. For use eventually. #define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars. #define BIOGENERATOR 32 //Uses biomass -//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable. \ No newline at end of file +//Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable. + +#define MC_CPU "CPU" +#define MC_HDD "HDD" +#define MC_SDD "SDD" +#define MC_CARD "CARD" +#define MC_NET "NET" +#define MC_PRINT "PRINT" +#define MC_CELL "CELL" +#define MC_CHARGE "CHARGE" \ No newline at end of file diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 8f24ecfc84d..5254b3b511f 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -132,8 +132,9 @@ if(istype(charging, /obj/item/device/modular_computer)) var/obj/item/device/modular_computer/C = charging - if(C.battery_module) - var/obj/item/weapon/computer_hardware/battery/B = C.battery_module + var/obj/item/weapon/computer_hardware/battery/battery_module = C.all_components[MC_CELL] + if(battery_module) + var/obj/item/weapon/computer_hardware/battery/B = battery_module if(B.battery) if(B.battery.charge < B.battery.maxcharge) B.battery.give(B.battery.chargerate * recharge_coeff) diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 516293bfc27..942a114dc56 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -36,22 +36,12 @@ var/max_damage = 100 // Damage level at which the computer breaks apart. // Important hardware (must be installed for computer to work) - var/obj/item/weapon/computer_hardware/processor_unit/processor_unit // CPU. Without it the computer won't run. Better CPUs can run more programs at once. - var/obj/item/weapon/computer_hardware/hard_drive/hard_drive // Hard Drive component of this computer. Stores programs and files. - - var/obj/item/weapon/computer_hardware/battery/battery_module // Power cell connector. Power cell can be recharged. - // OR - var/obj/item/weapon/computer_hardware/recharger/recharger // Recharger. Can be used to recharge power cell or power the PC without it. // Optional hardware (improves functionality, but is not critical for computer to work) - var/obj/item/weapon/computer_hardware/network_card/network_card // Network Card component of this computer. Allows connection to NTNet. - var/obj/item/weapon/computer_hardware/card_slot/card_slot // ID Card slot component of this computer. - var/obj/item/weapon/computer_hardware/printer/printer // Printer component of this computer, for your everyday paperwork needs. - var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage - var/list/all_components = list() + var/list/all_components // List of "connection ports" in this computer and the components with which they are plugged - var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with. + var/list/idle_threads // Idle programs on background. They still receive process calls but can't be interacted with. var/obj/physical = null // Object that represents our computer. It's used for Adjacent() and UI visibility checks. @@ -63,30 +53,48 @@ physical = src ..() + all_components = list() + idle_threads = list() + /obj/item/device/modular_computer/Destroy() kill_program(forced = TRUE) STOP_PROCESSING(SSobj, src) for(var/H in all_components) - var/obj/item/weapon/computer_hardware/CH = H + var/obj/item/weapon/computer_hardware/CH = all_components[H] if(CH.holder == src) CH.holder = null qdel(CH) return ..() + +/obj/item/device/modular_computer/proc/add_verb(var/path) + switch(path) + if(MC_CARD) + verbs += /obj/item/device/modular_computer/proc/eject_id + if(MC_SDD) + verbs += /obj/item/device/modular_computer/proc/eject_disk + +/obj/item/device/modular_computer/proc/remove_verb(path) + switch(path) + if(MC_CARD) + verbs -= /obj/item/device/modular_computer/proc/eject_id + if(MC_SDD) + verbs -= /obj/item/device/modular_computer/proc/eject_disk + // Eject ID card from computer, if it has ID slot with card inside. -/obj/item/device/modular_computer/verb/eject_id() +/obj/item/device/modular_computer/proc/eject_id() set name = "Eject ID" set category = "Object" set src in view(1) if(issilicon(usr)) return - - if (usr.canUseTopic(src)) - proc_eject_id(usr) + var/obj/item/weapon/computer_hardware/card_slot/card_slot = all_components[MC_CARD] + if(usr.canUseTopic(src)) + card_slot.try_eject(, usr) // Eject ID card from computer, if it has ID slot with card inside. -/obj/item/device/modular_computer/verb/eject_disk() +/obj/item/device/modular_computer/proc/eject_disk() set name = "Eject Data Disk" set category = "Object" set src in view(1) @@ -94,30 +102,10 @@ if(issilicon(usr)) return - if (usr.canUseTopic(src)) - proc_eject_disk(usr) - -/obj/item/device/modular_computer/proc/proc_eject_id(mob/user, slot) - if(!user) - user = usr - - if(!card_slot) - user << "\The [src] does not have an ID card slot!" - return - - card_slot.try_eject(slot, user) - -/obj/item/device/modular_computer/proc/proc_eject_disk(mob/user) - if(!user) - user = usr - - if(!portable_drive) - user << "There is no data disk in \the [src]!" - return - - var/obj/item/I = portable_drive - if(uninstall_component(portable_drive, user)) - I.verb_pickup() + if(usr.canUseTopic(src)) + var/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive = all_components[MC_SDD] + if(uninstall_component(portable_drive, usr)) + portable_drive.verb_pickup() /obj/item/device/modular_computer/AltClick(mob/user) ..() @@ -125,19 +113,24 @@ 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/hard_drive/portable/portable_drive = all_components[MC_SDD] if(portable_drive) - proc_eject_disk(user) + if(uninstall_component(portable_drive, user)) + portable_drive.verb_pickup() else if(card_slot) - proc_eject_id(user) + card_slot.try_eject(, user) // 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] 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] if(card_slot) return card_slot.GetID() return ..() @@ -208,10 +201,11 @@ 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] if(recharger) recharger.enabled = 1 - if(processor_unit && use_power()) // use_power() checks if the PC is powered + if(all_components[MC_CPU] && use_power()) // use_power() checks if the PC is powered if(issynth) user << "You send an activation signal to \the [src], turning it on." else @@ -265,6 +259,9 @@ /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] + if(battery_module && battery_module.battery) switch(battery_module.battery.percent()) if(80 to 200) // 100 should be maximal but just in case.. @@ -328,6 +325,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] if(network_card) return network_card.get_signal(specific_action) else @@ -336,6 +334,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] return ntnet_global.add_log(text, network_card) /obj/item/device/modular_computer/proc/shutdown_computer(loud = 1) @@ -352,7 +351,7 @@ /obj/item/device/modular_computer/attackby(obj/item/weapon/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 = h + var/obj/item/weapon/computer_hardware/H = all_components[h] if(H.try_insert(W, user)) return diff --git a/code/modules/modular_computers/computers/item/computer_components.dm b/code/modules/modular_computers/computers/item/computer_components.dm index 3a5b68579e1..0f27580a27f 100644 --- a/code/modules/modular_computers/computers/item/computer_components.dm +++ b/code/modules/modular_computers/computers/item/computer_components.dm @@ -6,32 +6,8 @@ user << "This component is too large for \the [src]!" return FALSE - if(istype(H, /obj/item/weapon/computer_hardware/hard_drive/portable) && portable_drive) - user << "This computer's FDD is already occupied by \the [portable_drive]." - return FALSE - - else if(istype(H, /obj/item/weapon/computer_hardware/processor_unit) && processor_unit) - user << "This computer's CPU slot is already occupied by \the [processor_unit]." - return FALSE - else if(istype(H, /obj/item/weapon/computer_hardware/hard_drive) && hard_drive) - user << "This computer's data port is already occupied by \the [hard_drive]." - return FALSE - - else if(istype(H, /obj/item/weapon/computer_hardware/battery) && battery_module) - user << "This computer's power converter slot is already occupied by \the [battery_module]." - return FALSE - else if(istype(H, /obj/item/weapon/computer_hardware/recharger) && recharger) - user << "This computer's recharger slot is already occupied by \the [recharger]." - return FALSE - - else if(istype(H, /obj/item/weapon/computer_hardware/card_slot) && card_slot) - user << "This computer's card reader slot is already occupied by \the [card_slot]." - return FALSE - else if(istype(H, /obj/item/weapon/computer_hardware/network_card) && network_card) - user << "This computer's network card is already occupied by \the [network_card]." - return FALSE - else if(istype(H, /obj/item/weapon/computer_hardware/printer) && printer) - user << "This computer's printer slot is already occupied by \the [printer]." + if(all_components[H.device_type]) + user << "This computer's hardware slot is already occupied by \the [all_components[H.device_type]]." return FALSE return TRUE @@ -44,32 +20,12 @@ if(user && !user.unEquip(H)) return FALSE - if(istype(H, /obj/item/weapon/computer_hardware/hard_drive/portable)) - portable_drive = H - - else if(istype(H, /obj/item/weapon/computer_hardware/processor_unit)) - processor_unit = H - else if(istype(H, /obj/item/weapon/computer_hardware/hard_drive)) - hard_drive = H - - else if(istype(H, /obj/item/weapon/computer_hardware/battery)) - battery_module = H - else if(istype(H, /obj/item/weapon/computer_hardware/recharger)) - recharger = H - - else if(istype(H, /obj/item/weapon/computer_hardware/card_slot)) - card_slot = H - else if(istype(H, /obj/item/weapon/computer_hardware/network_card)) - network_card = H - else if(istype(H, /obj/item/weapon/computer_hardware/printer)) - printer = H + all_components[H.device_type] = H user << "You install \the [H] into \the [src]." H.forceMove(src) H.holder = src - all_components |= H H.on_install(src, user) - return TRUE // Uninstalls component. @@ -77,41 +33,22 @@ if(H.holder != src) // Not our component at all. return FALSE - if(processor_unit == H) - processor_unit = null - if(hard_drive == H) - hard_drive = null - - if(battery_module == H) - battery_module = null - if(recharger == H) - recharger = null - - if(card_slot == H) - card_slot = null - if(network_card == H) - network_card = null - if(printer == H) - printer = null - if(portable_drive == H) - portable_drive = null + all_components.Remove(H.device_type) user << "You remove \the [H] from \the [src]." H.forceMove(get_turf(src)) H.holder = null - all_components -= H H.on_remove(src, user) - if(enabled && (!processor_unit || !hard_drive || !use_power())) + if(enabled && !use_power()) shutdown_computer() update_icon() - return TRUE // Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null /obj/item/device/modular_computer/proc/find_hardware_by_name(name) for(var/i in all_components) - var/obj/O = i + var/obj/O = all_components[i] if(O.name == name) return O return null diff --git a/code/modules/modular_computers/computers/item/computer_power.dm b/code/modules/modular_computers/computers/item/computer_power.dm index f6196477000..c5aab99ce57 100644 --- a/code/modules/modular_computers/computers/item/computer_power.dm +++ b/code/modules/modular_computers/computers/item/computer_power.dm @@ -3,10 +3,14 @@ if(check_power_override()) return TRUE + var/obj/item/weapon/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] + if(battery_module && battery_module.battery && battery_module.battery.charge) var/obj/item/weapon/stock_parts/cell/cell = battery_module.battery if(cell.use(amount * CELLRATE)) @@ -17,6 +21,7 @@ return FALSE /obj/item/device/modular_computer/proc/give_power(amount) + var/obj/item/weapon/computer_hardware/battery/battery_module = all_components[MC_CELL] if(battery_module && battery_module.battery) return battery_module.battery.give(amount) return 0 @@ -34,6 +39,7 @@ // 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] if(recharger) recharger.process() diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm index a89e84b31f4..b551b98ede7 100644 --- a/code/modules/modular_computers/computers/item/computer_ui.dm +++ b/code/modules/modular_computers/computers/item/computer_ui.dm @@ -24,6 +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] if(!hard_drive || !hard_drive.stored_files || !hard_drive.stored_files.len) physical.visible_message("\The [src] beeps three times, it's screen displaying \"DISK ERROR\" warning.") return // No HDD, No HDD files list or no stored files. Something is very broken. @@ -41,6 +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] for(var/datum/computer_file/program/P in hard_drive.stored_files) var/running = 0 if(P in idle_threads) @@ -55,6 +57,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] switch(action) if("PC_exit") kill_program() @@ -64,7 +67,7 @@ return 1 if("PC_minimize") var/mob/user = usr - if(!active_program || !processor_unit) + if(!active_program || !all_components[MC_CPU]) return idle_threads.Add(active_program) @@ -112,7 +115,9 @@ update_icon() return - if(idle_threads.len >= processor_unit.max_idle_programs+1) + var/obj/item/weapon/computer_hardware/processor_unit/PU = all_components[MC_CPU] + + if(idle_threads.len > PU.max_idle_programs) user << "\The [src] displays a \"Maximal CPU load reached. Unable to run another program.\" error." return diff --git a/code/modules/modular_computers/computers/item/processor.dm b/code/modules/modular_computers/computers/item/processor.dm index 65712546ef6..d50b9f9fd30 100644 --- a/code/modules/modular_computers/computers/item/processor.dm +++ b/code/modules/modular_computers/computers/item/processor.dm @@ -23,6 +23,8 @@ CRASH("Inapropriate type passed to obj/item/device/modular_computer/processor/New()! Aborting.") return // Obtain reference to machinery computer + all_components = list() + idle_threads = list() machinery_computer = comp machinery_computer.cpu = src hardware_flag = machinery_computer.hardware_flag @@ -53,3 +55,17 @@ ..() machinery_computer.update_icon() return + +/obj/item/device/modular_computer/processor/add_verb(path) + switch(path) + if(MC_CARD) + machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_id + if(MC_SDD) + machinery_computer.verbs += /obj/machinery/modular_computer/proc/eject_disk + +/obj/item/device/modular_computer/processor/remove_verb(path) + switch(path) + if(MC_CARD) + machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_id + if(MC_SDD) + machinery_computer.verbs -= /obj/machinery/modular_computer/proc/eject_disk \ No newline at end of file diff --git a/code/modules/modular_computers/computers/item/tablet.dm b/code/modules/modular_computers/computers/item/tablet.dm index 0c8cad838de..54e27ea1d15 100644 --- a/code/modules/modular_computers/computers/item/tablet.dm +++ b/code/modules/modular_computers/computers/item/tablet.dm @@ -1,4 +1,4 @@ -/obj/item/device/modular_computer/tablet +/obj/item/device/modular_computer/tablet //Its called tablet for theme of 90ies but actually its a "big smartphone" sized name = "tablet computer" icon = 'icons/obj/modular_tablet.dmi' icon_state = "tablet" @@ -9,3 +9,4 @@ max_hardware_size = 1 w_class = 2 steel_sheet_cost = 1 + slot_flags = SLOT_ID | SLOT_BELT \ No newline at end of file diff --git a/code/modules/modular_computers/computers/machinery/console_presets.dm b/code/modules/modular_computers/computers/machinery/console_presets.dm index a4741b16745..7f16199f53f 100644 --- a/code/modules/modular_computers/computers/machinery/console_presets.dm +++ b/code/modules/modular_computers/computers/machinery/console_presets.dm @@ -30,8 +30,9 @@ desc = "A stationary computer. This one comes preloaded with engineering programs." /obj/machinery/modular_computer/console/preset/engineering/install_programs() - cpu.hard_drive.store_file(new/datum/computer_file/program/power_monitor()) - cpu.hard_drive.store_file(new/datum/computer_file/program/alarm_monitor()) + var/obj/item/weapon/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()) // ===== RESEARCH CONSOLE ===== /obj/machinery/modular_computer/console/preset/research @@ -39,9 +40,10 @@ desc = "A stationary computer. This one comes preloaded with research programs." /obj/machinery/modular_computer/console/preset/research/install_programs() - cpu.hard_drive.store_file(new/datum/computer_file/program/ntnetmonitor()) - cpu.hard_drive.store_file(new/datum/computer_file/program/nttransfer()) - cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) + var/obj/item/weapon/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()) // ===== COMMAND CONSOLE ===== @@ -52,8 +54,9 @@ _has_printer = 1 /obj/machinery/modular_computer/console/preset/command/install_programs() - cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) - cpu.hard_drive.store_file(new/datum/computer_file/program/card_mod()) + var/obj/item/weapon/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()) // ===== CIVILIAN CONSOLE ===== /obj/machinery/modular_computer/console/preset/civilian @@ -61,6 +64,6 @@ desc = "A stationary computer. This one comes preloaded with generic programs." /obj/machinery/modular_computer/console/preset/civilian/install_programs() - cpu.hard_drive.store_file(new/datum/computer_file/program/chatclient()) - cpu.hard_drive.store_file(new/datum/computer_file/program/nttransfer()) - + var/obj/item/weapon/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()) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm index 2aada0b5860..e04bc0cee73 100644 --- a/code/modules/modular_computers/computers/machinery/modular_computer.dm +++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm @@ -74,7 +74,7 @@ var/list/global_modular_computers = list() add_overlay("broken") // Eject ID card from computer, if it has ID slot with card inside. -/obj/machinery/modular_computer/verb/eject_id() +/obj/machinery/modular_computer/proc/eject_id() set name = "Eject ID" set category = "Object" set src in view(1) @@ -83,7 +83,7 @@ var/list/global_modular_computers = list() cpu.eject_id() // Eject ID card from computer, if it has ID slot with card inside. -/obj/machinery/modular_computer/verb/eject_disk() +/obj/machinery/modular_computer/proc/eject_disk() set name = "Eject Data Disk" set category = "Object" set src in view(1) @@ -109,8 +109,9 @@ var/list/global_modular_computers = list() // 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] if(cpu && cpu.enabled) // Shut down the computer - visible_message("\The [src]'s screen flickers [cpu.battery_module ? "\"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\"" : "\"EXTERNAL POWER LOSS\""] warning as it shuts down unexpectedly.") + visible_message("\The [src]'s screen flickers [battery_module ? "\"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\"" : "\"EXTERNAL POWER LOSS\""] warning as it shuts down unexpectedly.") if(cpu) cpu.shutdown_computer(0) stat |= NOPOWER @@ -119,7 +120,7 @@ var/list/global_modular_computers = list() // Modular computers can have battery in them, we handle power in previous proc, so prevent this from messing it up for us. /obj/machinery/modular_computer/power_change() - if(cpu && cpu.use_power()) // If "CPU" still has a power source, PC wouldn't go offline. + if(cpu && cpu.use_power()) // If MC_CPU still has a power source, PC wouldn't go offline. stat &= ~NOPOWER update_icon() return diff --git a/code/modules/modular_computers/computers/machinery/modular_console.dm b/code/modules/modular_computers/computers/machinery/modular_console.dm index b5b6fe7b143..cebb1f4d715 100644 --- a/code/modules/modular_computers/computers/machinery/modular_console.dm +++ b/code/modules/modular_computers/computers/machinery/modular_console.dm @@ -22,29 +22,35 @@ /obj/machinery/modular_computer/console/buildable/New() ..() // User-built consoles start as empty frames. - qdel(cpu.recharger) - qdel(cpu.network_card) - qdel(cpu.hard_drive) + 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] + qdel(recharger) + qdel(network_card) + qdel(hard_drive) /obj/machinery/modular_computer/console/New() ..() - if(cpu.battery_module) - qdel(cpu.battery_module) + var/obj/item/weapon/computer_hardware/battery/battery_module = cpu.all_components[MC_CELL] + if(battery_module) + qdel(battery_module) - cpu.install_component(new /obj/item/weapon/computer_hardware/network_card/wired) + var/obj/item/weapon/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 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) - cpu.network_card.identification_string = replacetext(replacetext(replacetext("[A.name] [console_department] Console", " ", "_"), "-", ""), "__", "_") // Replace spaces with "_" + network_card.identification_string = replacetext(replacetext(replacetext("[A.name] [console_department] Console", " ", "_"), "-", ""), "__", "_") // Replace spaces with "_" else if(A) - cpu.network_card.identification_string = replacetext(replacetext(replacetext("[A.name] Console", " ", "_"), "-", ""), "__", "_") + network_card.identification_string = replacetext(replacetext(replacetext("[A.name] Console", " ", "_"), "-", ""), "__", "_") else if(console_department) - cpu.network_card.identification_string = replacetext(replacetext(replacetext("[console_department] Console", " ", "_"), "-", ""), "__", "_") + network_card.identification_string = replacetext(replacetext(replacetext("[console_department] Console", " ", "_"), "-", ""), "__", "_") else - cpu.network_card.identification_string = "Unknown Console" + network_card.identification_string = "Unknown Console" if(cpu) cpu.screen_on = 1 update_icon() \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/program.dm b/code/modules/modular_computers/file_system/program.dm index 8ddff02fb64..46a9ea8ebc8 100644 --- a/code/modules/modular_computers/file_system/program.dm +++ b/code/modules/modular_computers/file_system/program.dm @@ -87,6 +87,11 @@ return 1 if(ishuman(user)) + var/obj/item/weapon/card/id/D + var/obj/item/weapon/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() @@ -95,7 +100,7 @@ if(!(C && istype(C))) C = null - if(!I && !C) + if(!I && !C && !D) if(loud) user << "\The [computer] flashes an \"RFID Error - Unable to scan ID\" warning." return 0 @@ -106,6 +111,9 @@ else if(C) if(access_to_check in C.GetAccess()) return 1 + else if(D) + if(access_to_check in D.GetAccess()) + return 1 if(loud) user << "\The [computer] flashes an \"Access Denied\" warning." return 0 @@ -162,7 +170,7 @@ return 1 if("PC_minimize") var/mob/user = usr - if(!computer.active_program || !computer.processor_unit) + if(!computer.active_program || !computer.all_components[MC_CPU]) return computer.idle_threads.Add(computer.active_program) diff --git a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm index d14bb885bfe..3d54938ba11 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/dos.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/dos.dm @@ -69,7 +69,8 @@ executed = 1 target.dos_sources.Add(src) if(ntnet_global.intrusion_detection_enabled) - ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [computer.network_card.get_network_tag()]") + var/obj/item/weapon/computer_hardware/network_card/network_card = computer.all_components[MC_NET] + ntnet_global.add_log("IDS WARNING - Excess traffic flood targeting relay [target.uid] detected from device: [network_card.get_network_tag()]") ntnet_global.intrusion_detection_alarm = 1 return 1 diff --git a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm index f5ae0766f74..89040ca7ae7 100644 --- a/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm +++ b/code/modules/modular_computers/file_system/programs/antagonist/revelation.dm @@ -19,16 +19,19 @@ computer.visible_message("\The [computer]'s screen brightly flashes and loud electrical buzzing is heard.") computer.enabled = 0 computer.update_icon() - qdel(computer.hard_drive) + 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] + qdel(hard_drive) computer.take_damage(25, 10, 1, 1) - if(computer.battery_module && prob(25)) - qdel(computer.battery_module) + if(battery_module && prob(25)) + qdel(battery_module) computer.visible_message("\The [computer]'s battery explodes in rain of sparks.") var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread spark_system.start() - if(computer.recharger && prob(50)) - qdel(computer.recharger) + if(recharger && prob(50)) + qdel(recharger) computer.visible_message("\The [computer]'s recharger explodes in rain of sparks.") var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread spark_system.start() diff --git a/code/modules/modular_computers/file_system/programs/card.dm b/code/modules/modular_computers/file_system/programs/card.dm index 780045d8b73..0f1b03f4b38 100644 --- a/code/modules/modular_computers/file_system/programs/card.dm +++ b/code/modules/modular_computers/file_system/programs/card.dm @@ -88,7 +88,8 @@ /datum/computer_file/program/card_mod/proc/format_jobs(list/jobs) - var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card + 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/list/formatted = list() for(var/job in jobs) formatted.Add(list(list( @@ -102,11 +103,19 @@ if(..()) return 1 + var/obj/item/weapon/computer_hardware/card_slot/card_slot + var/obj/item/weapon/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/mob/user = usr - var/obj/item/weapon/card/id/id_card = computer.card_slot.stored_card - var/obj/item/weapon/card/id/auth_card = computer.card_slot.stored_card2 + var/obj/item/weapon/card/id/id_card = card_slot.stored_card + var/obj/item/weapon/card/id/auth_card = card_slot.stored_card2 if(auth_card) user_id_card = auth_card @@ -129,7 +138,7 @@ else show_assignments = 1 if("PRG_print") - if(computer && computer.printer) //This option should never be called if there is no printer + if(computer && printer) //This option should never be called if there is no printer if(mod_mode) if(authorized()) var/contents = {"