mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-15 12:11:45 +00:00
Integrated circuits for modular computers (#80530) This PR integrates circuits for modular computers and a good bits of their programs. The peculiarity here is that modular computers have no fixed amount of unremovable components (except the base one with just a couple ports for now), instead, they're added and removed along with programs. With a few exceptions (such as the messenger and signaler), for these program circuits to work, their associated program has to be either open or in the background. For a reason or another, not all programs have a circuit associated to them, still, however the programs with a circuit are still a handful. They are: - Nanotrasen Pay System - Notepad - SiliConnect - WireCarp - MODsuit Control - Spectre Meter - Direct Messenger* - LifeConnect - Custodial Locator - Fission360 - Camera - Status Display - SignalCommander *By the by, sending messages has a cooldown, so it shouldn't be as spammy. If it turns out to not be enough, I can make it so messages from circuit will be ignored by other messenger circuits. The PR is no longer WIP. I believe modular computers could make for some interesting setups with circuits, since they're fairly flexible and stocked with features unlike many other appliances, therefore also a speck more abusable, though limits, cooldowns, logging and sanitization have been implemented to keep it in check. 🆑 add: Modular Computers now support integrated circuits. What can be done with them depends on the programs installed and whether they're running (open or background). add: Modular Consoles (the machinery) now have a small backup cell they draw power from if the power goes out. /🆑 Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
136 lines
4.2 KiB
Plaintext
136 lines
4.2 KiB
Plaintext
/datum/computer_file/program/ai_restorer
|
|
filename = "ai_restore"
|
|
filedesc = "AI Manager & Restorer"
|
|
downloader_category = PROGRAM_CATEGORY_SCIENCE
|
|
program_open_overlay = "generic"
|
|
extended_desc = "Firmware Restoration Kit, capable of reconstructing damaged AI systems. Requires direct AI connection via intellicard slot."
|
|
size = 12
|
|
can_run_on_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP
|
|
download_access = list(ACCESS_RD)
|
|
tgui_id = "NtosAiRestorer"
|
|
program_icon = "laptop-code"
|
|
|
|
/// The AI stored in the program
|
|
var/obj/item/aicard/stored_card
|
|
/// Variable dictating if we are in the process of restoring the AI in the inserted intellicard
|
|
var/restoring = FALSE
|
|
|
|
/datum/computer_file/program/ai_restorer/on_examine(obj/item/modular_computer/source, mob/user)
|
|
var/list/examine_text = list()
|
|
if(!stored_card)
|
|
examine_text += "It has a slot installed for an intelliCard."
|
|
return examine_text
|
|
|
|
if(computer.Adjacent(user))
|
|
examine_text += "It has a slot installed for an intelliCard which contains: [stored_card.name]"
|
|
else
|
|
examine_text += "It has a slot installed for an intelliCard, which appears to be occupied."
|
|
examine_text += span_info("Alt-click to eject the intelliCard.")
|
|
return examine_text
|
|
|
|
/datum/computer_file/program/ai_restorer/kill_program(mob/user)
|
|
try_eject(forced = TRUE)
|
|
return ..()
|
|
|
|
/datum/computer_file/program/ai_restorer/process_tick(seconds_per_tick)
|
|
. = ..()
|
|
if(!restoring) //Put the check here so we don't check for an ai all the time
|
|
return
|
|
|
|
var/mob/living/silicon/ai/A = stored_card.AI
|
|
if(stored_card.flush)
|
|
restoring = FALSE
|
|
return
|
|
A.adjustOxyLoss(-5, FALSE)
|
|
A.adjustFireLoss(-5, FALSE)
|
|
A.adjustBruteLoss(-5, FALSE)
|
|
|
|
// Please don't forget to update health, otherwise the below if statements will probably always fail.
|
|
A.updatehealth()
|
|
if(A.health >= 0 && A.stat == DEAD)
|
|
A.revive()
|
|
stored_card.update_appearance()
|
|
|
|
// Finished restoring
|
|
if(A.health >= 100)
|
|
restoring = FALSE
|
|
|
|
return TRUE
|
|
|
|
/datum/computer_file/program/ai_restorer/application_attackby(obj/item/attacking_item, mob/living/user)
|
|
if(!computer)
|
|
return FALSE
|
|
if(!istype(attacking_item, /obj/item/aicard))
|
|
return FALSE
|
|
|
|
if(stored_card)
|
|
to_chat(user, span_warning("You try to insert \the [attacking_item] into \the [computer.name], but the slot is occupied."))
|
|
return FALSE
|
|
if(user && !user.transferItemToLoc(attacking_item, computer))
|
|
return FALSE
|
|
|
|
stored_card = attacking_item
|
|
to_chat(user, span_notice("You insert \the [attacking_item] into \the [computer.name]."))
|
|
|
|
return TRUE
|
|
|
|
/datum/computer_file/program/ai_restorer/try_eject(mob/living/user, forced = FALSE)
|
|
if(!stored_card)
|
|
if(user)
|
|
to_chat(user, span_warning("There is no card in \the [computer.name]."))
|
|
return FALSE
|
|
|
|
if(restoring && !forced)
|
|
if(user)
|
|
to_chat(user, span_warning("Safeties prevent you from removing the card until reconstruction is complete..."))
|
|
return FALSE
|
|
|
|
if(user && computer.Adjacent(user))
|
|
to_chat(user, span_notice("You remove [stored_card] from [computer.name]."))
|
|
user.put_in_hands(stored_card)
|
|
else
|
|
stored_card.forceMove(computer.drop_location())
|
|
|
|
stored_card = null
|
|
restoring = FALSE
|
|
return TRUE
|
|
|
|
|
|
/datum/computer_file/program/ai_restorer/ui_act(action, params, datum/tgui/ui, datum/ui_state/state)
|
|
. = ..()
|
|
switch(action)
|
|
if("PRG_beginReconstruction")
|
|
if(!stored_card || !stored_card.AI)
|
|
return FALSE
|
|
var/mob/living/silicon/ai/A = stored_card.AI
|
|
if(A && A.health < 100)
|
|
restoring = TRUE
|
|
A.notify_revival("Your core files are being restored!", source = computer)
|
|
return TRUE
|
|
if("PRG_eject")
|
|
if(stored_card)
|
|
try_eject(usr)
|
|
return TRUE
|
|
|
|
/datum/computer_file/program/ai_restorer/ui_data(mob/user)
|
|
var/list/data = list()
|
|
|
|
data["ejectable"] = TRUE
|
|
data["AI_present"] = !!stored_card?.AI
|
|
data["error"] = null
|
|
|
|
if(!stored_card)
|
|
data["error"] = "Please insert an intelliCard."
|
|
else if(!stored_card.AI)
|
|
data["error"] = "No AI located..."
|
|
else if(stored_card.flush)
|
|
data["error"] = "Flush in progress!"
|
|
else
|
|
data["name"] = stored_card.AI.name
|
|
data["restoring"] = restoring
|
|
data["health"] = (stored_card.AI.health + 100) / 2
|
|
data["isDead"] = stored_card.AI.stat == DEAD
|
|
data["laws"] = stored_card.AI.laws.get_law_list(include_zeroth = TRUE, render_html = FALSE)
|
|
|
|
return data
|