Updates Part Ten

This commit is contained in:
Unknown
2019-04-12 16:40:04 -04:00
parent e62eb3b068
commit a0904cb9fd
13 changed files with 252 additions and 174 deletions

View File

@@ -140,3 +140,152 @@
else else
. = valid_reagents[metadata] . = valid_reagents[metadata]
I.reagents.add_reagent(., I.reagents.get_free_space()) I.reagents.add_reagent(., I.reagents.get_free_space())
/datum/gear_tweak/tablet
var/list/ValidProcessors = list(/obj/item/weapon/computer_hardware/processor_unit/small)
var/list/ValidBatteries = list(/obj/item/weapon/computer_hardware/battery_module/nano, /obj/item/weapon/computer_hardware/battery_module/micro, /obj/item/weapon/computer_hardware/battery_module)
var/list/ValidHardDrives = list(/obj/item/weapon/computer_hardware/hard_drive/micro, /obj/item/weapon/computer_hardware/hard_drive/small, /obj/item/weapon/computer_hardware/hard_drive)
var/list/ValidNetworkCards = list(/obj/item/weapon/computer_hardware/network_card, /obj/item/weapon/computer_hardware/network_card/advanced)
var/list/ValidNanoPrinters = list(null, /obj/item/weapon/computer_hardware/nano_printer)
var/list/ValidCardSlots = list(null, /obj/item/weapon/computer_hardware/card_slot)
var/list/ValidTeslaLinks = list(null, /obj/item/weapon/computer_hardware/tesla_link)
/datum/gear_tweak/tablet/get_contents(var/list/metadata)
var/list/names = list()
var/obj/O = ValidProcessors[metadata[1]]
if(O)
names += initial(O.name)
O = ValidBatteries[metadata[2]]
if(O)
names += initial(O.name)
O = ValidHardDrives[metadata[3]]
if(O)
names += initial(O.name)
O = ValidNetworkCards[metadata[4]]
if(O)
names += initial(O.name)
O = ValidNanoPrinters[metadata[5]]
if(O)
names += initial(O.name)
O = ValidCardSlots[metadata[6]]
if(O)
names += initial(O.name)
O = ValidTeslaLinks[metadata[7]]
if(O)
names += initial(O.name)
return "[english_list(names, and_text = ", ")]"
/datum/gear_tweak/tablet/get_metadata(var/user, var/metadata)
. = list()
var/list/names = list()
var/counter = 1
for(var/i in ValidProcessors)
if(i)
var/obj/O = i
names[initial(O.name)] = counter++
else
names["None"] = counter++
var/entry = input(user, "Choose a processor.", "Character Preference") in names
. += names[entry]
names = list()
counter = 1
for(var/i in ValidBatteries)
if(i)
var/obj/O = i
names[initial(O.name)] = counter++
else
names["None"] = counter++
entry = input(user, "Choose a battery.", "Character Preference") in names
. += names[entry]
names = list()
counter = 1
for(var/i in ValidHardDrives)
if(i)
var/obj/O = i
names[initial(O.name)] = counter++
else
names["None"] = counter++
entry = input(user, "Choose a hard drive.", "Character Preference") in names
. += names[entry]
names = list()
counter = 1
for(var/i in ValidNetworkCards)
if(i)
var/obj/O = i
names[initial(O.name)] = counter++
else
names["None"] = counter++
entry = input(user, "Choose a network card.", "Character Preference") in names
. += names[entry]
names = list()
counter = 1
for(var/i in ValidNanoPrinters)
if(i)
var/obj/O = i
names[initial(O.name)] = counter++
else
names["None"] = counter++
entry = input(user, "Choose a nanoprinter.", "Character Preference") in names
. += names[entry]
names = list()
counter = 1
for(var/i in ValidCardSlots)
if(i)
var/obj/O = i
names[initial(O.name)] = counter++
else
names["None"] = counter++
entry = input(user, "Choose a card slot.", "Character Preference") in names
. += names[entry]
names = list()
counter = 1
for(var/i in ValidTeslaLinks)
if(i)
var/obj/O = i
names[initial(O.name)] = counter++
else
names["None"] = counter++
entry = input(user, "Choose a tesla link.", "Character Preference") in names
. += names[entry]
/datum/gear_tweak/tablet/get_default()
return list(1, 1, 1, 1, 1, 1, 1)
/datum/gear_tweak/tablet/tweak_item(var/obj/item/modular_computer/tablet/I, var/list/metadata)
if(ValidProcessors[metadata[1]])
var/t = ValidProcessors[metadata[1]]
I.processor_unit = new t(I)
if(ValidBatteries[metadata[2]])
var/t = ValidBatteries[metadata[2]]
I.battery_module = new t(I)
I.battery_module.charge_to_full()
if(ValidHardDrives[metadata[3]])
var/t = ValidHardDrives[metadata[3]]
I.hard_drive = new t(I)
if(ValidNetworkCards[metadata[4]])
var/t = ValidNetworkCards[metadata[4]]
I.network_card = new t(I)
if(ValidNanoPrinters[metadata[5]])
var/t = ValidNanoPrinters[metadata[5]]
I.nano_printer = new t(I)
if(ValidCardSlots[metadata[6]])
var/t = ValidCardSlots[metadata[6]]
I.card_slot = new t(I)
if(ValidTeslaLinks[metadata[7]])
var/t = ValidTeslaLinks[metadata[7]]
I.tesla_link = new t(I)

View File

@@ -158,14 +158,23 @@
..() ..()
gear_tweaks = list(gear_tweak_free_color_choice) gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/cheaptablet /datum/gear/utility/cheaptablet
display_name = "cheap tablet computer" display_name = "cheap tablet computer"
display_name = "tablet computer: cheap"
path = /obj/item/modular_computer/tablet/preset/custom_loadout/cheap path = /obj/item/modular_computer/tablet/preset/custom_loadout/cheap
sort_category = "utility"
cost = 3 cost = 3
/datum/gear/normaltablet /datum/gear/utility/normaltablet
display_name = "tablet computer" display_name = "tablet computer"
display_name = "tablet computer: advanced"
path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced
sort_category = "utility"
cost = 4 cost = 4
/datum/gear/utility/customtablet
display_name = "tablet computer: custom"
path = /obj/item/modular_computer/tablet
cost = 4
/datum/gear/utility/customtablet/New()
..()
gear_tweaks += new /datum/gear_tweak/tablet()

View File

@@ -13,7 +13,8 @@
var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged var/last_battery_percent = 0 // Used for deciding if battery percentage has chandged
var/last_world_time = "00:00" var/last_world_time = "00:00"
var/list/last_header_icons var/list/last_header_icons
var/computer_emagged = 0 // Whether the computer is emagged. var/computer_emagged = FALSE // Whether the computer is emagged.
var/apc_powered = FALSE
var/base_active_power_usage = 50 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too. var/base_active_power_usage = 50 // Power usage when the computer is open (screen is active) and can be interacted with. Remember hardware can use power too.
var/base_idle_power_usage = 5 // Power usage when the computer is idle and screen is off (currently only applies to laptops) var/base_idle_power_usage = 5 // Power usage when the computer is idle and screen is off (currently only applies to laptops)
@@ -39,11 +40,12 @@
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/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/network_card/network_card // Network Card component of this computer. Allows connection to NTNet 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/hard_drive/hard_drive // Hard Drive component of this computer. Stores programs and files. 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_module/battery_module // An internal power source for this computer. Can be recharged.
// Optional hardware (improves functionality, but is not critical for computer to work) // Optional hardware (improves functionality, but is not critical for computer to work)
var/obj/item/weapon/computer_hardware/battery_module/battery_module // An internal power source for this computer. Can be recharged.
var/obj/item/weapon/computer_hardware/card_slot/card_slot // ID Card slot component of this computer. Mostly for HoP modification console that needs ID slot for modification. var/obj/item/weapon/computer_hardware/card_slot/card_slot // ID Card slot component of this computer. Mostly for HoP modification console that needs ID slot for modification.
var/obj/item/weapon/computer_hardware/nano_printer/nano_printer // Nano Printer component of this computer, for your everyday paperwork needs. var/obj/item/weapon/computer_hardware/nano_printer/nano_printer // Nano 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/obj/item/weapon/computer_hardware/hard_drive/portable/portable_drive // Portable data storage
var/obj/item/weapon/computer_hardware/tesla_link/tesla_link // Tesla Link, Allows remote charging from nearest APC.
var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with. var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with.
@@ -165,17 +167,13 @@
else else
overlays.Add(icon_state_menu) overlays.Add(icon_state_menu)
// Used by child types if they have other power source than battery
/obj/item/modular_computer/proc/check_power_override()
return 0
// Operates NanoUI // Operates NanoUI
/obj/item/modular_computer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) /obj/item/modular_computer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
if(!screen_on || !enabled) if(!screen_on || !enabled)
if(ui) if(ui)
ui.close() ui.close()
return 0 return 0
if((!battery_module || !battery_module.battery.charge) && !check_power_override()) if(!apc_power(0) && !battery_power(0))
if(ui) if(ui)
ui.close() ui.close()
return 0 return 0
@@ -233,6 +231,8 @@
qdel() qdel()
/obj/item/modular_computer/proc/turn_on(var/mob/user) /obj/item/modular_computer/proc/turn_on(var/mob/user)
if(tesla_link)
tesla_link.enabled = 1
var/issynth = issilicon(user) // Robots and AIs get different activation messages. var/issynth = issilicon(user) // Robots and AIs get different activation messages.
if(damage > broken_damage) if(damage > broken_damage)
if(issynth) if(issynth)
@@ -240,7 +240,7 @@
else else
to_chat(user, "You press the power button, but the computer fails to boot up, displaying variety of errors before shutting down again.") to_chat(user, "You press the power button, but the computer fails to boot up, displaying variety of errors before shutting down again.")
return return
if(processor_unit && ((battery_module && battery_module.battery.charge && battery_module.check_functionality()) || check_power_override())) // Battery-run and charged or non-battery but powered by APC. if(processor_unit && (apc_power(0) || battery_power(0))) // Battery-run and charged or non-battery but powered by APC.
if(issynth) if(issynth)
to_chat(user, "You send an activation signal to \the [src], turning it on") to_chat(user, "You send an activation signal to \the [src], turning it on")
else else
@@ -273,17 +273,17 @@
if(active_program) if(active_program)
if(active_program.program_state != PROGRAM_STATE_KILLED) if(active_program.program_state != PROGRAM_STATE_KILLED)
active_program.process_tick()
active_program.ntnet_status = get_ntnet_status() active_program.ntnet_status = get_ntnet_status()
active_program.computer_emagged = computer_emagged active_program.computer_emagged = computer_emagged
active_program.process_tick()
else else
active_program = null active_program = null
for(var/datum/computer_file/program/P in idle_threads) for(var/datum/computer_file/program/P in idle_threads)
if(P.program_state != PROGRAM_STATE_KILLED) if(P.program_state != PROGRAM_STATE_KILLED)
P.process_tick()
P.ntnet_status = get_ntnet_status() P.ntnet_status = get_ntnet_status()
P.computer_emagged = computer_emagged P.computer_emagged = computer_emagged
P.process_tick()
else else
idle_threads.Remove(P) idle_threads.Remove(P)
@@ -315,6 +315,9 @@
data["PC_batterypercent"] = "N/C" data["PC_batterypercent"] = "N/C"
data["PC_showbatteryicon"] = battery_module ? 1 : 0 data["PC_showbatteryicon"] = battery_module ? 1 : 0
if(tesla_link && tesla_link.enabled && apc_powered)
data["PC_apclinkicon"] = "charging.gif"
switch(get_ntnet_status()) switch(get_ntnet_status())
if(0) if(0)
data["PC_ntneticon"] = "sig_none.gif" data["PC_ntneticon"] = "sig_none.gif"
@@ -463,33 +466,56 @@
// Used in following function to reduce copypaste // Used in following function to reduce copypaste
/obj/item/modular_computer/proc/power_failure(var/malfunction = 0) /obj/item/modular_computer/proc/power_failure(var/malfunction = 0)
if(enabled) // Shut down the computer if(enabled) // Shut down the computer
visible_message("<span class='danger'>\The [src]'s screen flickers \"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\" warning as it shuts down unexpectedly.</span>") visible_message("<span class='danger'>\The [src]'s screen flickers briefly and then goes dark.</span>")
if(active_program) if(active_program)
active_program.event_powerfailure(0) active_program.event_powerfailure(0)
for(var/datum/computer_file/program/PRG in idle_threads) for(var/datum/computer_file/program/PRG in idle_threads)
PRG.event_powerfailure(1) PRG.event_powerfailure(1)
shutdown_computer(0) shutdown_computer(0)
// Tries to use power from battery. Passing 0 as parameter results in this proc returning whether battery is functional or not.
/obj/item/modular_computer/proc/battery_power(var/power_usage = 0)
apc_powered = FALSE
if(!battery_module || !battery_module.check_functionality() || battery_module.battery.charge <= 0)
return FALSE
if(battery_module.battery.use(power_usage * CELLRATE) || ((power_usage == 0) && battery_module.battery.charge))
return TRUE
return FALSE
// Tries to use power from APC, if present.
/obj/item/modular_computer/proc/apc_power(var/power_usage = 0)
apc_powered = TRUE
// Tesla link was originally limited to machinery only, but this probably works too, and the benefit of being able to power all devices from an APC outweights
// the possible minor performance loss.
if(!tesla_link || !tesla_link.check_functionality())
return FALSE
var/area/A = get_area(src)
if(!istype(A) || !A.powered(EQUIP))
return FALSE
// At this point, we know that APC can power us for this tick. Check if we also need to charge our battery, and then actually use the power.
if(battery_module && (battery_module.battery.charge < battery_module.battery.maxcharge) && (power_usage > 0))
power_usage += tesla_link.passive_charging_rate
battery_module.battery.give(tesla_link.passive_charging_rate * CELLRATE)
A.use_power(power_usage, EQUIP)
return TRUE
// Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged // Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged
/obj/item/modular_computer/proc/handle_power() /obj/item/modular_computer/proc/handle_power()
if(!battery_module || battery_module.battery.charge <= 0) // Battery-run but battery is depleted.
power_failure()
return 0
var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage
for(var/obj/item/weapon/computer_hardware/H in get_all_components()) for(var/obj/item/weapon/computer_hardware/H in get_all_components())
if(H.enabled) if(H.enabled)
power_usage += H.power_usage power_usage += H.power_usage
if(battery_module)
if(!battery_module.check_functionality())
power_failure(1)
return
battery_module.battery.use(power_usage * CELLRATE)
last_power_usage = power_usage last_power_usage = power_usage
// First tries to charge from an APC, if APC is unavailable switches to battery power. If neither works the computer fails.
if(apc_power(power_usage))
return
if(battery_power(power_usage))
return
power_failure()
/obj/item/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) /obj/item/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if(istype(W, /obj/item/weapon/card/id)) // ID Card, try to insert it. if(istype(W, /obj/item/weapon/card/id)) // ID Card, try to insert it.
var/obj/item/weapon/card/id/I = W var/obj/item/weapon/card/id/I = W
@@ -619,6 +645,12 @@
return return
found = 1 found = 1
processor_unit = H processor_unit = H
else if(istype(H, /obj/item/weapon/computer_hardware/tesla_link))
if(tesla_link)
to_chat(user, "This computer's tesla link slot is already occupied by \the [tesla_link].")
return
found = 1
tesla_link = H
if(found) if(found)
to_chat(user, "You install \the [H] into \the [src]") to_chat(user, "You install \the [H] into \the [src]")
H.holder2 = src H.holder2 = src
@@ -650,6 +682,9 @@
processor_unit = null processor_unit = null
found = 1 found = 1
critical = 1 critical = 1
if(tesla_link == H)
tesla_link = null
found = 1
if(found) if(found)
if(user) if(user)
to_chat(user, "You remove \the [H] from \the [src].") to_chat(user, "You remove \the [H] from \the [src].")
@@ -678,6 +713,8 @@
return battery_module return battery_module
if(processor_unit && (processor_unit.name == name)) if(processor_unit && (processor_unit.name == name))
return processor_unit return processor_unit
if(tesla_link && (tesla_link.name == name))
return tesla_link
return null return null
// Returns list of all components // Returns list of all components
@@ -697,6 +734,8 @@
all_components.Add(battery_module) all_components.Add(battery_module)
if(processor_unit) if(processor_unit)
all_components.Add(processor_unit) all_components.Add(processor_unit)
if(tesla_link)
all_components.Add(tesla_link)
return all_components return all_components
/obj/item/modular_computer/proc/update_uis() /obj/item/modular_computer/proc/update_uis()

View File

@@ -34,11 +34,6 @@
else if(damage) else if(damage)
to_chat(user, "It is damaged.") to_chat(user, "It is damaged.")
// Power interaction is handled by our machinery part, due to machinery having APC connection.
/obj/item/modular_computer/processor/handle_power()
if(machinery_computer)
machinery_computer.handle_power()
/obj/item/modular_computer/processor/New(var/comp) /obj/item/modular_computer/processor/New(var/comp)
if(!comp || !istype(comp, /obj/machinery/modular_computer)) if(!comp || !istype(comp, /obj/machinery/modular_computer))
CRASH("Inapropriate type passed to obj/item/modular_computer/processor/New()! Aborting.") CRASH("Inapropriate type passed to obj/item/modular_computer/processor/New()! Aborting.")
@@ -55,31 +50,10 @@
/obj/item/modular_computer/processor/relay_qdel() /obj/item/modular_computer/processor/relay_qdel()
qdel(machinery_computer) qdel(machinery_computer)
/obj/item/modular_computer/processor/find_hardware_by_name(var/N)
var/obj/item/weapon/computer_hardware/H = machinery_computer.find_hardware_by_name(N)
if(H)
return H
else
return ..()
/obj/item/modular_computer/processor/update_icon() /obj/item/modular_computer/processor/update_icon()
if(machinery_computer) if(machinery_computer)
return machinery_computer.update_icon() return machinery_computer.update_icon()
/obj/item/modular_computer/processor/get_header_data()
var/list/L = ..()
if(machinery_computer.tesla_link && machinery_computer.tesla_link.enabled && machinery_computer.powered())
L["PC_apclinkicon"] = "charging.gif"
return L
// Checks whether the machinery computer doesn't take power from APC network
/obj/item/modular_computer/processor/check_power_override()
if(!machinery_computer)
return 0
if(!machinery_computer.tesla_link || !machinery_computer.tesla_link.enabled)
return 0
return machinery_computer.powered()
// This thing is not meant to be used on it's own, get topic data from our machinery owner. // This thing is not meant to be used on it's own, get topic data from our machinery owner.
/obj/item/modular_computer/processor/CanUseTopic(user, state) /obj/item/modular_computer/processor/CanUseTopic(user, state)
if(!machinery_computer) if(!machinery_computer)
@@ -94,40 +68,8 @@
machinery_computer.use_power = 0 machinery_computer.use_power = 0
return return
// Tesla links only work on machinery types, so we'll override the default try_install_component() proc
/obj/item/modular_computer/processor/try_install_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0)
if(istype(H, /obj/item/weapon/computer_hardware/tesla_link))
if(machinery_computer.tesla_link)
to_chat(user, "This computer's tesla link slot is already occupied by \the [machinery_computer.tesla_link].")
return
var/obj/item/weapon/computer_hardware/tesla_link/L = H
L.holder = machinery_computer
machinery_computer.tesla_link = L
found = 1
..(user, H, found)
/obj/item/modular_computer/processor/uninstall_component(var/mob/living/user, var/obj/item/weapon/computer_hardware/H, var/found = 0, var/critical = 0)
if(machinery_computer.tesla_link == H)
machinery_computer.tesla_link = null
var/obj/item/weapon/computer_hardware/tesla_link/L = H
L.holder = null
found = 1
..(user, H, found, critical)
/obj/item/modular_computer/processor/get_all_components()
var/list/all_components = ..()
if(machinery_computer && machinery_computer.tesla_link)
all_components.Add(machinery_computer.tesla_link)
return all_components
// Perform adjacency checks on our machinery counterpart, rather than on ourselves. // Perform adjacency checks on our machinery counterpart, rather than on ourselves.
/obj/item/modular_computer/processor/Adjacent(var/atom/neighbor) /obj/item/modular_computer/processor/Adjacent(var/atom/neighbor)
if(!machinery_computer) if(!machinery_computer)
return 0 return 0
return machinery_computer.Adjacent(neighbor) return machinery_computer.Adjacent(neighbor)
/obj/item/modular_computer/processor/turn_on(var/mob/user)
// If we have a tesla link on our machinery counterpart, enable it automatically. Lets computer without a battery work.
if(machinery_computer && machinery_computer.tesla_link)
machinery_computer.tesla_link.enabled = 1
..()

View File

@@ -8,6 +8,7 @@
battery_module.charge_to_full() battery_module.charge_to_full()
hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/micro(src) hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/micro(src)
network_card = new/obj/item/weapon/computer_hardware/network_card(src) network_card = new/obj/item/weapon/computer_hardware/network_card(src)
tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(src)
// Alternative version, an average one, for higher ranked positions mostly // Alternative version, an average one, for higher ranked positions mostly
/obj/item/modular_computer/tablet/preset/custom_loadout/advanced/New() /obj/item/modular_computer/tablet/preset/custom_loadout/advanced/New()
@@ -18,4 +19,5 @@
hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/small(src) hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/small(src)
network_card = new/obj/item/weapon/computer_hardware/network_card(src) network_card = new/obj/item/weapon/computer_hardware/network_card(src)
nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(src) nano_printer = new/obj/item/weapon/computer_hardware/nano_printer(src)
card_slot = new/obj/item/weapon/computer_hardware/card_slot(src) card_slot = new/obj/item/weapon/computer_hardware/card_slot(src)
tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(src)

View File

@@ -7,7 +7,6 @@ var/list/global_modular_computers = list()
name = "modular computer" name = "modular computer"
desc = "An advanced computer." desc = "An advanced computer."
var/battery_powered = 0 // Whether computer should be battery powered. It is set automatically
use_power = 0 use_power = 0
var/hardware_flag = 0 // A flag that describes this device type var/hardware_flag = 0 // A flag that describes this device type
var/last_power_usage = 0 // Power usage during last tick var/last_power_usage = 0 // Power usage during last tick
@@ -29,9 +28,6 @@ var/list/global_modular_computers = list()
var/_max_damage = 100 var/_max_damage = 100
var/_break_damage = 50 var/_break_damage = 50
var/obj/item/weapon/computer_hardware/tesla_link/tesla_link // Tesla Link component of this computer. Allows remote charging from nearest APC.
var/obj/item/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things. var/obj/item/modular_computer/processor/cpu = null // CPU that handles most logic while this type only handles power and other specific things.
/obj/machinery/modular_computer/attack_ghost(var/mob/observer/dead/user) /obj/machinery/modular_computer/attack_ghost(var/mob/observer/dead/user)
@@ -46,7 +42,7 @@ var/list/global_modular_computers = list()
overlays.Cut() overlays.Cut()
if(!cpu || !cpu.enabled) if(!cpu || !cpu.enabled)
if (!(stat & NOPOWER) || battery_powered) if (!(stat & NOPOWER))
overlays.Add(screen_icon_screensaver) overlays.Add(screen_icon_screensaver)
set_light(0) set_light(0)
return return
@@ -102,72 +98,6 @@ var/list/global_modular_computers = list()
cpu.name = src.name cpu.name = src.name
cpu.process(1) cpu.process(1)
// Checks all hardware pieces to determine if name matches, if yes, returns the hardware piece, otherwise returns null
/obj/machinery/modular_computer/proc/find_hardware_by_name(var/N)
if(tesla_link && (tesla_link.name == N))
return tesla_link
return null
// Used in following function to reduce copypaste
/obj/machinery/modular_computer/proc/power_failure(var/malfunction = 0)
if(cpu && cpu.enabled) // Shut down the computer
visible_message("<span class='danger'>\The [src]'s screen flickers [cpu.battery_module ? "\"BATTERY [malfunction ? "MALFUNCTION" : "CRITICAL"]\"" : "\"EXTERNAL POWER LOSS\""] warning as it shuts down unexpectedly.</span>")
if(cpu)
cpu.shutdown_computer(0)
battery_powered = 0
stat |= NOPOWER
update_icon()
// Called by cpu item's process() automatically, handles our power interaction.
/obj/machinery/modular_computer/proc/handle_power()
if(cpu.battery_module && cpu.battery_module.battery.charge <= 0) // Battery-run but battery is depleted.
power_failure()
return 0
else if(!cpu.battery_module && (!powered() || !tesla_link || !tesla_link.enabled || !tesla_link.check_functionality())) // Not battery run, but lacking APC connection.
power_failure()
return 0
else if(stat & NOPOWER)
stat &= ~NOPOWER
if(cpu.battery_module && cpu.battery_module.battery.charge)
battery_powered = 1
else
battery_powered = 0
var/power_usage = cpu.screen_on ? base_active_power_usage : base_idle_power_usage
for(var/obj/item/weapon/computer_hardware/CH in src.cpu.get_all_components())
if(CH.enabled)
power_usage += CH.power_usage
// Wireless APC connection exists.
if(tesla_link && tesla_link.enabled && tesla_link.check_functionality())
idle_power_usage = power_usage
active_power_usage = idle_power_usage + 100 // APCLink only charges at 100W rate, but covers any power usage.
use_power = 1
// Battery is not fully charged. Begin slowly recharging.
if(cpu.battery_module && (cpu.battery_module.battery.charge < cpu.battery_module.battery.maxcharge))
use_power = 2
if(cpu.battery_module && powered() && (use_power == 2)) // Battery charging itself
cpu.battery_module.battery.give(100 * CELLRATE)
else if(cpu.battery_module && !powered()) // Unpowered, but battery covers the usage.
cpu.battery_module.battery.use(idle_power_usage * CELLRATE)
else // No wireless connection run only on battery.
use_power = 0
if (cpu.battery_module)
if(!cpu.battery_module.check_functionality())
power_failure(1)
return
cpu.battery_module.battery.use(power_usage * CELLRATE)
cpu.last_power_usage = power_usage
// 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(battery_powered)
return
..()
/obj/machinery/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) /obj/machinery/modular_computer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob)
if(cpu) if(cpu)
return cpu.attackby(W, user) return cpu.attackby(W, user)

View File

@@ -21,15 +21,14 @@
/obj/machinery/modular_computer/console/buildable/New() /obj/machinery/modular_computer/console/buildable/New()
..() ..()
// User-built consoles start as empty frames. // User-built consoles start as empty frames.
qdel(tesla_link) qdel(cpu.tesla_link)
qdel(cpu.network_card) qdel(cpu.network_card)
qdel(cpu.hard_drive) qdel(cpu.hard_drive)
/obj/machinery/modular_computer/console/New() /obj/machinery/modular_computer/console/New()
..() ..()
cpu.battery_module = null
cpu.network_card = new/obj/item/weapon/computer_hardware/network_card/wired(src) cpu.network_card = new/obj/item/weapon/computer_hardware/network_card/wired(src)
tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(src) cpu.tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(src)
cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/super(src) // Consoles generally have better HDDs due to lower space limitations cpu.hard_drive = new/obj/item/weapon/computer_hardware/hard_drive/super(src) // Consoles generally have better HDDs due to lower space limitations
var/area/A = get_area(src) 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. // 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.

View File

@@ -67,7 +67,7 @@
/obj/machinery/modular_computer/laptop/buildable/New() /obj/machinery/modular_computer/laptop/buildable/New()
..() ..()
// User-built consoles start as empty frames. // User-built consoles start as empty frames.
qdel(tesla_link) qdel(cpu.tesla_link)
qdel(cpu.network_card) qdel(cpu.network_card)
qdel(cpu.hard_drive) qdel(cpu.hard_drive)

View File

@@ -29,8 +29,8 @@
s.start() s.start()
if(istype(computer, /obj/item/modular_computer/processor)) if(istype(computer, /obj/item/modular_computer/processor))
var/obj/item/modular_computer/processor/P = computer var/obj/item/modular_computer/processor/P = computer
if(P.machinery_computer.tesla_link && prob(50)) if(P.tesla_link && prob(50))
qdel(P.machinery_computer.tesla_link) qdel(P.tesla_link)
computer.visible_message("<span class='notice'>\The [computer]'s tesla link explodes in rain of sparks.</span>") computer.visible_message("<span class='notice'>\The [computer]'s tesla link explodes in rain of sparks.</span>")
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(10, 1, computer.loc) s.set_up(10, 1, computer.loc)

View File

@@ -63,6 +63,9 @@
// Handles damage checks // Handles damage checks
/obj/item/weapon/computer_hardware/proc/check_functionality() /obj/item/weapon/computer_hardware/proc/check_functionality()
// Turned off
if(!enabled)
return 0
// Too damaged to work at all. // Too damaged to work at all.
if(damage > damage_failure) if(damage > damage_failure)
return 0 return 0

View File

@@ -4,9 +4,10 @@
critical = 0 critical = 0
enabled = 1 enabled = 1
icon_state = "teslalink" icon_state = "teslalink"
hardware_size = 2 // Can't be installed into tablets hardware_size = 1
origin_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2) origin_tech = list(TECH_DATA = 2, TECH_POWER = 3, TECH_ENGINEERING = 2)
var/obj/machinery/modular_computer/holder var/obj/machinery/modular_computer/holder
var/passive_charging_rate = 250 // W
/obj/item/weapon/computer_hardware/tesla_link/New(var/obj/L) /obj/item/weapon/computer_hardware/tesla_link/New(var/obj/L)
if(istype(L, /obj/machinery/modular_computer)) if(istype(L, /obj/machinery/modular_computer))
@@ -15,6 +16,6 @@
..(L) ..(L)
/obj/item/weapon/computer_hardware/tesla_link/Destroy() /obj/item/weapon/computer_hardware/tesla_link/Destroy()
if(holder && (holder.tesla_link == src)) if(holder2 && (holder2.tesla_link == src))
holder.tesla_link = null holder2.tesla_link = null
..() ..()

View File

@@ -23,7 +23,7 @@
var/dev_battery = 1 // 1: Default, 2: Upgraded, 3: Advanced var/dev_battery = 1 // 1: Default, 2: Upgraded, 3: Advanced
var/dev_disk = 1 // 1: Default, 2: Upgraded, 3: Advanced var/dev_disk = 1 // 1: Default, 2: Upgraded, 3: Advanced
var/dev_netcard = 0 // 0: None, 1: Basic, 2: Long-Range var/dev_netcard = 0 // 0: None, 1: Basic, 2: Long-Range
var/dev_tesla = 0 // 0: None, 1: Standard (LAPTOP ONLY) var/dev_tesla = 0 // 0: None, 1: Standard
var/dev_nanoprint = 0 // 0: None, 1: Standard var/dev_nanoprint = 0 // 0: None, 1: Standard
var/dev_card = 0 // 0: None, 1: Standard var/dev_card = 0 // 0: None, 1: Standard
@@ -96,7 +96,7 @@
if(dev_tesla) if(dev_tesla)
total_price += 399 total_price += 399
if(fabricate) if(fabricate)
fabricated_laptop.tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(fabricated_laptop) fabricated_laptop.cpu.tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(fabricated_laptop.cpu)
if(dev_nanoprint) if(dev_nanoprint)
total_price += 99 total_price += 99
if(fabricate) if(fabricate)
@@ -153,6 +153,10 @@
total_price += 199 total_price += 199
if(fabricate) if(fabricate)
fabricated_tablet.card_slot = new/obj/item/weapon/computer_hardware/card_slot(fabricated_tablet) fabricated_tablet.card_slot = new/obj/item/weapon/computer_hardware/card_slot(fabricated_tablet)
if(dev_tesla)
total_price += 399
if(fabricate)
fabricated_tablet.tesla_link = new/obj/item/weapon/computer_hardware/tesla_link(fabricated_tablet)
return total_price return total_price
return 0 return 0

View File

@@ -34,10 +34,10 @@
<td>{{:helper.link('Standard', null, { "hw_cpu" : 1 }, data.hw_cpu == 1 ? 'selected' : null)}} <td>{{:helper.link('Standard', null, { "hw_cpu" : 1 }, data.hw_cpu == 1 ? 'selected' : null)}}
<td>{{:helper.link('Advanced', null, { "hw_cpu" : 2 }, data.hw_cpu == 2 ? 'selected' : null)}} <td>{{:helper.link('Advanced', null, { "hw_cpu" : 2 }, data.hw_cpu == 2 ? 'selected' : null)}}
<tr> <tr>
{{/if}}
<td><b>Tesla Relay:</b> <td><b>Tesla Relay:</b>
<td>{{:helper.link('None', null, { "hw_tesla" : 0 }, data.hw_tesla == 0 ? 'selected' : null)}} <td>{{:helper.link('None', null, { "hw_tesla" : 0 }, data.hw_tesla == 0 ? 'selected' : null)}}
<td>{{:helper.link('Standard', null, { "hw_tesla" : 1 }, data.hw_tesla == 1 ? 'selected' : null)}} <td>{{:helper.link('Standard', null, { "hw_tesla" : 1 }, data.hw_tesla == 1 ? 'selected' : null)}}
{{/if}}
<tr> <tr>
<td><b>Nano Printer:</b> <td><b>Nano Printer:</b>
<td>{{:helper.link('None', null, { "hw_nanoprint" : 0 }, data.hw_nanoprint == 0 ? 'selected' : null)}} <td>{{:helper.link('None', null, { "hw_nanoprint" : 0 }, data.hw_nanoprint == 0 ? 'selected' : null)}}
@@ -53,11 +53,11 @@
<hr> <hr>
<b>Battery</b> allows your device to operate without external utility power source. Advanced batteries increase battery life.<br> <b>Battery</b> allows your device to operate without external utility power source. Advanced batteries increase battery life.<br>
<b>Hard Drive</b> stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.<br> <b>Hard Drive</b> stores file on your device. Advanced drives can store more files, but use more power, shortening battery life.<br>
<b>Network Card</b> allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts.<br> <b>Network Card</b> allows your device to wirelessly connect to stationwide NTNet network. Basic cards are limited to on-station use, while advanced cards can operate anywhere near the station, which includes the asteroid outposts. Advanced cards also tend to have better bandwidth.<br>
<b>Processor Unit</b> is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.<br> <b>Processor Unit</b> is critical for your device's functionality. It allows you to run programs from your hard drive. Advanced CPUs use more power, but allow you to run more programs on background at once.<br>
<b>Tesla Relay</b> is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source. This component is currently unavailable on tablet computers due to size restrictions.<br> <b>Tesla Relay</b> is an advanced wireless power relay that allows your device to connect to nearby area power controller to provide alternative power source.<br>
<b>Nano Printer</b> is device that allows for various paperwork manipulations, such as, scanning of documents or printing new ones. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.<br> <b>Nano Printer</b> is device that allows printing of various documents. This device was certified EcoFriendlyPlus and is capable of recycling existing paper for printing purposes.<br>
<b>Card Reader</b> adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards. <b>Card Reader</b> adds a slot that allows you to manipulate RFID cards. Please note that this is not necessary to allow the device to read your identification, it is just necessary to manipulate other cards.<br>
</div> </div>
{{else data.state == 2}} {{else data.state == 2}}
<h2>Step 3: Payment</h2> <h2>Step 3: Payment</h2>