Replaces Subsystems (mostly) with internal computing device (#7798)

This is for robots.
This commit is contained in:
Karolis
2020-01-04 12:36:03 +01:00
committed by Matt Atlas
parent 7dc0fdded5
commit b820f601fa
18 changed files with 151 additions and 129 deletions
@@ -1,11 +1,9 @@
/mob/living/silicon
var/register_alarms = 1
var/datum/nano_module/alarm_monitor/all/alarm_monitor
var/datum/nano_module/atmos_control/atmos_control
var/datum/nano_module/crew_monitor/crew_monitor
var/datum/nano_module/law_manager/law_manager
var/datum/nano_module/power_monitor/power_monitor
var/datum/nano_module/rcon/rcon
var/obj/item/modular_computer/silicon/computer
/mob/living/silicon/ai
var/datum/nano_module/computer_ntnetmonitor/ntnet_monitor
@@ -13,18 +11,16 @@
/mob/living/silicon
var/list/silicon_subsystems = list(
/mob/living/silicon/proc/subsystem_alarm_monitor,
/mob/living/silicon/proc/subsystem_law_manager
/mob/living/silicon/proc/subsystem_law_manager,
/mob/living/silicon/proc/computer_interact
)
/mob/living/silicon/ai
silicon_subsystems = list(
/mob/living/silicon/proc/subsystem_alarm_monitor,
/mob/living/silicon/proc/subsystem_atmos_control,
/mob/living/silicon/proc/subsystem_crew_monitor,
/mob/living/silicon/proc/subsystem_law_manager,
/mob/living/silicon/proc/subsystem_power_monitor,
/mob/living/silicon/proc/subsystem_rcon,
/mob/living/silicon/ai/proc/subsystem_ntnet_monitor
/mob/living/silicon/ai/proc/subsystem_ntnet_monitor,
/mob/living/silicon/proc/computer_interact
)
/mob/living/silicon/robot/syndicate
@@ -32,38 +28,21 @@
silicon_subsystems = list(/mob/living/silicon/proc/subsystem_law_manager)
/mob/living/silicon/Destroy()
qdel(alarm_monitor)
alarm_monitor = null
qdel(atmos_control)
atmos_control = null
qdel(crew_monitor)
crew_monitor = null
qdel(law_manager)
law_manager = null
qdel(power_monitor)
power_monitor = null
qdel(rcon)
rcon = null
QDEL_NULL(alarm_monitor)
QDEL_NULL(law_manager)
QDEL_NULL(computer)
return ..()
/mob/living/silicon/ai/Destroy()
qdel(ntnet_monitor)
ntnet_monitor = null
QDEL_NULL(ntnet_monitor)
return ..()
/mob/living/silicon/proc/init_subsystems()
computer = new/obj/item/modular_computer/silicon/preset(src)
alarm_monitor = new(src)
atmos_control = new(src)
crew_monitor = new(src)
law_manager = new(src)
power_monitor = new(src)
rcon = new(src)
if(!register_alarms)
@@ -77,6 +56,15 @@
..()
ntnet_monitor = new(src)
/****************
* Computer *
*****************/
/mob/living/silicon/proc/computer_interact()
set name = "Open Computer Interface"
set category = "Subystems"
computer.attack_self(src)
/********************
* Alarm Monitor *
********************/
@@ -86,24 +74,6 @@
alarm_monitor.ui_interact(usr, state = self_state)
/********************
* Atmos Control *
********************/
/mob/living/silicon/proc/subsystem_atmos_control()
set category = "Subystems"
set name = "Atmospherics Control"
atmos_control.ui_interact(usr, state = self_state)
/********************
* Crew Monitor *
********************/
/mob/living/silicon/proc/subsystem_crew_monitor()
set category = "Subystems"
set name = "Crew Monitor"
crew_monitor.ui_interact(usr, state = self_state)
/****************
* Law Manager *
****************/
@@ -120,22 +90,4 @@
set name = "NTNet Monitoring"
set category = "Subystems"
ntnet_monitor.ui_interact(usr, state = conscious_state)
/********************
* Power Monitor *
********************/
/mob/living/silicon/proc/subsystem_power_monitor()
set category = "Subystems"
set name = "Power Monitor"
power_monitor.ui_interact(usr, state = self_state)
/************
* RCON *
************/
/mob/living/silicon/proc/subsystem_rcon()
set category = "Subystems"
set name = "RCON"
rcon.ui_interact(usr, state = self_state)
ntnet_monitor.ui_interact(usr, state = conscious_state)
@@ -186,7 +186,6 @@ var/global/list/robot_modules = list(
name = "medical robot module"
channels = list("Medical" = 1)
networks = list(NETWORK_MEDICAL)
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
can_be_pushed = 0
sprites = list(
"Basic" = "robotmedi",
@@ -337,7 +336,6 @@ var/global/list/robot_modules = list(
name = "engineering robot module"
channels = list("Engineering" = 1)
networks = list(NETWORK_ENGINEERING)
subsystems = list(/mob/living/silicon/proc/subsystem_power_monitor)
supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack)
sprites = list(
"Basic" = "robotengi",
@@ -771,7 +769,6 @@ var/global/list/robot_modules = list(
name = "combat robot module"
channels = list("Security" = 1)
networks = list(NETWORK_SECURITY)
subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor)
sprites = list("Roller" = "droid-combat")
can_be_pushed = 0
supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack)
@@ -977,10 +974,6 @@ var/global/list/robot_modules = list(
"Response Team" = 1,
"AI Private" = 1
)
subsystems = list(
/mob/living/silicon/proc/subsystem_crew_monitor,
/mob/living/silicon/proc/subsystem_power_monitor
)
sprites = list("Roller" = "droid-combat") //TMP
can_be_pushed = 0
@@ -31,7 +31,7 @@
else
idle_threads.Remove(P)
working = hard_drive && processor_unit && damage < broken_damage && (apc_power(0) || battery_power(0))
working = hard_drive && processor_unit && damage < broken_damage && computer_use_power()
check_update_ui_need()
if (working && enabled && world.time > ambience_last_played + 30 SECONDS && prob(3))
@@ -125,7 +125,7 @@
else
to_chat(user, "You press the power button, but the computer fails to boot up, displaying variety of errors before shutting down again.")
return
if(processor_unit && (apc_power(0) || battery_power(0))) // Battery-run and charged or non-battery but powered by APC.
if(processor_unit && computer_use_power()) // Battery-run and charged or non-battery but powered by APC.
if(issynth)
to_chat(user, "You send an activation signal to \the [src], turning it on")
else
@@ -38,6 +38,16 @@
A.use_power(power_usage, EQUIP)
return TRUE
// Tries to use power in general (Abstraction)
/obj/item/modular_computer/proc/computer_use_power(var/power_usage = 0)
// 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 TRUE
if(battery_power(power_usage))
return TRUE
return FALSE
// Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged
/obj/item/modular_computer/proc/handle_power()
var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage
@@ -47,13 +57,8 @@
power_usage += H.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))
if (power_has_failed)
power_has_failed = FALSE
update_icon()
return
if(battery_power(power_usage))
if(computer_use_power(power_usage))
if (power_has_failed)
power_has_failed = FALSE
update_icon()
@@ -5,7 +5,7 @@
if(ui)
ui.close()
return
if(!apc_power(0) && !battery_power(0))
if(!computer_use_power())
if(ui)
ui.close()
return
@@ -0,0 +1,48 @@
/obj/item/modular_computer/silicon
name = "internal computing device"
desc = "A synthetic computer."
hardware_flag = PROGRAM_SILICON
icon_state_unpowered = "laptop-open"
icon = 'icons/obj/modular_laptop.dmi'
icon_state = "laptop-open"
icon_state_broken = "laptop-broken"
base_idle_power_usage = 5
base_active_power_usage = 25
max_hardware_size = 2
max_damage = 50
w_class = 3
var/mob/living/silicon/computer_host // Thing that contains this computer. Used for silicon computers
/obj/item/modular_computer/silicon/Initialize(mapload)
. = ..()
if(istype(loc, /mob/living/silicon))
computer_host = loc
else
return
// Let's remove integrated verbs for ejecting things.
verbs -= /obj/item/modular_computer/verb/eject_ai
verbs -= /obj/item/modular_computer/verb/eject_id
verbs -= /obj/item/modular_computer/verb/eject_usb
/obj/item/modular_computer/silicon/computer_use_power(power_usage)
// If we have host like AI, borg or pAI we handle there power
if(computer_host)
// If host is borg, we use power from it's cell, like anyone other module
if(istype(computer_host, /mob/living/silicon/robot))
var/mob/living/silicon/robot/R = computer_host
return R.cell_use_power(power_usage)
// If we are in AI or pAI we just don't botherwith power use.
return TRUE
else
// If we don't have host, then we let regular computer code handle power - like batteries and tesla coils
return ..()
/obj/item/modular_computer/silicon/Destroy()
computer_host = null
return ..()
/obj/item/modular_computer/silicon/Click(location, control, params)
if (!istype(usr, /mob/living/silicon) && host == usr)
return attack_self(usr)
return ..()
@@ -0,0 +1,14 @@
/obj/item/modular_computer/silicon/preset
enrolled = 2
/obj/item/modular_computer/silicon/preset/install_default_hardware()
. = ..()
processor_unit = new/obj/item/computer_hardware/processor_unit(src)
hard_drive = new/obj/item/computer_hardware/hard_drive(src)
network_card = new/obj/item/computer_hardware/network_card(src)
/obj/item/modular_computer/silicon/preset/install_default_programs()
hard_drive.store_file(new /datum/computer_file/program/filemanager())
hard_drive.store_file(new /datum/computer_file/program/ntnetdownload())
hard_drive.remove_file(hard_drive.find_file_by_name("clientmanager"))
@@ -72,7 +72,7 @@
requires_ntnet = 1
network_destination = "atmospheric control system"
requires_ntnet_feature = NTNET_SYSTEMCONTROL
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_SILICON
size = 17
color = LIGHT_COLOR_CYAN
@@ -87,7 +87,7 @@
requires_ntnet = 1
network_destination = "RCON remote control system"
requires_ntnet_feature = NTNET_SYSTEMCONTROL
usage_flags = PROGRAM_CONSOLE
usage_flags = PROGRAM_CONSOLE | PROGRAM_SILICON
size = 19
color = LIGHT_COLOR_GREEN
@@ -103,6 +103,6 @@
requires_ntnet = 1
network_destination = "APC Coordinator"
requires_ntnet_feature = NTNET_SYSTEMCONTROL
usage_flags = PROGRAM_CONSOLE
usage_flags = PROGRAM_CONSOLE | PROGRAM_SILICON
size = 9
color = LIGHT_COLOR_GREEN
@@ -13,6 +13,7 @@
nanomodule_path = /datum/nano_module/arcade_classic/ // Path of relevant nano module. The nano module is defined further in the file.
var/picked_enemy_name
color = LIGHT_COLOR_BLUE
usage_flags = PROGRAM_ALL_REGULAR
// Blatantly stolen and shortened version from arcade machines. Generates a random enemy name
/datum/computer_file/program/game/arcade/proc/random_enemy_name()
@@ -7,6 +7,7 @@
requires_ntnet = 0 // This particular program does not require NTNet network conectivity...
available_on_ntnet = 1 // ... but we want it to be available for download.
nanomodule_path = /datum/nano_module/program/sudoku // Path of relevant nano module. The nano module is defined further in the file.
usage_flags = PROGRAM_ALL_REGULAR
/datum/nano_module/program/sudoku
var/list/grid = null
@@ -8,7 +8,7 @@
requires_ntnet = 1
network_destination = "crew lifesigns monitoring system"
size = 11
usage_flags = PROGRAM_LAPTOP | PROGRAM_TELESCREEN | PROGRAM_CONSOLE
usage_flags = PROGRAM_LAPTOP | PROGRAM_TELESCREEN | PROGRAM_CONSOLE | PROGRAM_SILICON
color = LIGHT_COLOR_CYAN
/datum/computer_file/program/suit_sensors/ui_interact(mob/user)
@@ -36,6 +36,7 @@
requires_ntnet = 1
required_access_download = access_heads
color = LIGHT_COLOR_ORANGE
usage_flags = PROGRAM_ALL_REGULAR
/datum/nano_module/camera_monitor
name = "Camera Monitoring program"