mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-11 10:11:09 +00:00
* Remove hideous inline tab indentation, and bans it in contributing guidelines * a Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com> Co-authored-by: Gandalf2k15 <jzo123@hotmail.com>
128 lines
3.3 KiB
Plaintext
128 lines
3.3 KiB
Plaintext
/datum/computer_file/program/aidiag
|
|
filename = "aidiag"
|
|
filedesc = "NT FRK"
|
|
category = PROGRAM_CATEGORY_ROBO
|
|
program_icon_state = "generic"
|
|
extended_desc = "Firmware Restoration Kit, capable of reconstructing damaged AI systems. Requires direct AI connection via intellicard slot."
|
|
size = 12
|
|
requires_ntnet = FALSE
|
|
usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP
|
|
transfer_access = ACCESS_HEADS
|
|
available_on_ntnet = TRUE
|
|
tgui_id = "NtosAiRestorer"
|
|
program_icon = "laptop-code"
|
|
/// Variable dictating if we are in the process of restoring the AI in the inserted intellicard
|
|
var/restoring = FALSE
|
|
|
|
/datum/computer_file/program/aidiag/proc/get_ai(cardcheck)
|
|
|
|
var/obj/item/computer_hardware/ai_slot/ai_slot
|
|
|
|
if(computer)
|
|
ai_slot = computer.all_components[MC_AI]
|
|
|
|
if(computer && ai_slot?.check_functionality())
|
|
if(cardcheck == 1)
|
|
return ai_slot
|
|
if(ai_slot.enabled && ai_slot.stored_card)
|
|
if(cardcheck == 2)
|
|
return ai_slot.stored_card
|
|
if(ai_slot.stored_card.AI)
|
|
return ai_slot.stored_card.AI
|
|
|
|
return
|
|
|
|
/datum/computer_file/program/aidiag/ui_act(action, params)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
|
|
var/mob/living/silicon/ai/A = get_ai()
|
|
if(!A)
|
|
restoring = FALSE
|
|
|
|
switch(action)
|
|
if("PRG_beginReconstruction")
|
|
if(A && A.health < 100)
|
|
restoring = TRUE
|
|
A.notify_ghost_cloning("Your core files are being restored!", source = computer)
|
|
return TRUE
|
|
if("PRG_eject")
|
|
if(computer.all_components[MC_AI])
|
|
var/obj/item/computer_hardware/ai_slot/ai_slot = computer.all_components[MC_AI]
|
|
if(ai_slot?.stored_card)
|
|
ai_slot.try_eject(usr)
|
|
return TRUE
|
|
|
|
/datum/computer_file/program/aidiag/process_tick()
|
|
. = ..()
|
|
if(!restoring) //Put the check here so we don't check for an ai all the time
|
|
return
|
|
var/obj/item/aicard/cardhold = get_ai(2)
|
|
|
|
var/obj/item/computer_hardware/ai_slot/ai_slot = get_ai(1)
|
|
|
|
|
|
var/mob/living/silicon/ai/A = get_ai()
|
|
if(!A || !cardhold)
|
|
restoring = FALSE // If the AI was removed, stop the restoration sequence.
|
|
if(ai_slot)
|
|
ai_slot.locked = FALSE
|
|
return
|
|
|
|
if(cardhold.flush)
|
|
ai_slot.locked = FALSE
|
|
restoring = FALSE
|
|
return
|
|
ai_slot.locked = TRUE
|
|
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(full_heal = FALSE, admin_revive = FALSE)
|
|
cardhold.update_icon()
|
|
|
|
// Finished restoring
|
|
if(A.health >= 100)
|
|
ai_slot.locked = FALSE
|
|
restoring = FALSE
|
|
|
|
return TRUE
|
|
|
|
|
|
/datum/computer_file/program/aidiag/ui_data(mob/user)
|
|
var/list/data = get_header_data()
|
|
var/mob/living/silicon/ai/AI = get_ai()
|
|
|
|
var/obj/item/aicard/aicard = get_ai(2)
|
|
|
|
data["ejectable"] = TRUE
|
|
data["AI_present"] = FALSE
|
|
data["error"] = null
|
|
if(!aicard)
|
|
data["error"] = "Please insert an intelliCard."
|
|
else
|
|
if(!AI)
|
|
data["error"] = "No AI located"
|
|
else
|
|
var/obj/item/aicard/cardhold = AI.loc
|
|
if(cardhold.flush)
|
|
data["error"] = "Flush in progress"
|
|
else
|
|
data["AI_present"] = TRUE
|
|
data["name"] = AI.name
|
|
data["restoring"] = restoring
|
|
data["health"] = (AI.health + 100) / 2
|
|
data["isDead"] = AI.stat == DEAD
|
|
data["laws"] = AI.laws.get_law_list(include_zeroth = TRUE, render_html = FALSE)
|
|
|
|
return data
|
|
|
|
/datum/computer_file/program/aidiag/kill_program(forced)
|
|
restoring = FALSE
|
|
return ..()
|