Modular computers now use list of components (#20557)

* Bringing computers to the light side

Bringing computers to the light side

* Lighter and lighter

Lighter and lighter

* Missed some lists

Missed some lists

* Text to defines

Text to defines

* Last commit

Last commit

* How did this even get here

How did this even get here

* Removing bad stuff

Removing bad stuff

* Fixes verb adding and idle check

Fixes verb adding and idle check
This commit is contained in:
Razharas
2016-09-18 00:40:21 +02:00
committed by phil235
parent 6b3e788ee9
commit 186d852bc5
30 changed files with 269 additions and 217 deletions
@@ -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 << "<span class='warning'>\The [src] does not have an ID card slot!</span>"
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 << "<span class='warning'>There is no data disk in \the [src]!</span>"
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 << "<span class='notice'>You send an activation signal to \the [src], turning it on.</span>"
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