From e594c6c003ac87009bba55018a98c7d9e21f6715 Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Tue, 7 Sep 2021 16:25:54 +0200 Subject: [PATCH 1/9] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b7ed95448126..34612211ddf9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +##JamieD12 ## Yogstation codebase [![Build Status](https://github.com/yogstation13/Yogstation/workflows/Turdis/badge.svg?branch=master)](https://github.com/yogstation13/Yogstation/actions?query=workflow%3ATurdis+branch%3Amaster) From 3fc4aa5def9275b0ecd7edf7ee71e78d0f5e940d Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Wed, 8 Sep 2021 20:33:54 +0200 Subject: [PATCH 2/9] AI is now a tcomms hub --- .vscode/launch.json | 3 +- code/modules/jobs/job_types/ai.dm | 6 ++ code/modules/mob/living/silicon/ai/ai.dm | 12 ++- .../silicon/ai/decentralized/_ai_machinery.dm | 6 ++ .../silicon/ai/decentralized/ai_data_core.dm | 49 ++++++++++++ .../ai/decentralized/decentralized_os.dm | 76 +++++++++++++++++++ .../ai/decentralized/expansion_card.dm | 38 ++++++++++ .../ai/decentralized/expansion_card_holder.dm | 47 ++++++++++++ .../management/resource_distribution.dm | 46 +++++++++++ .../mob/living/silicon/ai/decentralized_ai.dm | 41 ++++++++++ .../mob/living/silicon/ai/freelook/eye.dm | 2 +- .../modules/mob/living/silicon/ai/multicam.dm | 2 +- tgui/packages/tgui/interfaces/AiResources.js | 74 ++++++++++++++++++ yogstation.dme | 7 ++ 14 files changed, 399 insertions(+), 10 deletions(-) create mode 100644 code/modules/mob/living/silicon/ai/decentralized/_ai_machinery.dm create mode 100644 code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm create mode 100644 code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm create mode 100644 code/modules/mob/living/silicon/ai/decentralized/expansion_card.dm create mode 100644 code/modules/mob/living/silicon/ai/decentralized/expansion_card_holder.dm create mode 100644 code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm create mode 100644 code/modules/mob/living/silicon/ai/decentralized_ai.dm create mode 100644 tgui/packages/tgui/interfaces/AiResources.js diff --git a/.vscode/launch.json b/.vscode/launch.json index 543058728f56..fbf8bfba5851 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,7 +6,8 @@ "request": "launch", "name": "Launch DreamSeeker", "preLaunchTask": "Build All", - "dmb": "${workspaceFolder}/${command:CurrentDMB}" + "dmb": "${workspaceFolder}/${command:CurrentDMB}", + "dreamDaemon": true } ] } diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm index f4d2d1a88f5a..77c5ca22f1fb 100644 --- a/code/modules/jobs/job_types/ai.dm +++ b/code/modules/jobs/job_types/ai.dm @@ -25,7 +25,9 @@ /datum/job/ai/after_spawn(mob/H, mob/M, latejoin) . = ..() + /* if(latejoin) + var/obj/structure/AIcore/latejoin_inactive/lateJoinCore for(var/obj/structure/AIcore/latejoin_inactive/P in GLOB.latejoin_ai_cores) if(P.is_available()) @@ -36,7 +38,11 @@ lateJoinCore.available = FALSE H.forceMove(lateJoinCore.loc) qdel(lateJoinCore) + */ var/mob/living/silicon/ai/AI = H + + AI.relocate(TRUE) + AI.apply_pref_name("ai", M.client) //If this runtimes oh well jobcode is fucked. AI.set_core_display_icon(null, M.client) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index e8e82e3dfe1d..f4a31ce8c0e5 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -38,7 +38,7 @@ var/can_be_carded = TRUE var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) var/viewalerts = 0 - var/icon/holo_icon//Default is assigned when AI is created. + var/icon/holo_icon //Default is assigned when AI is created. var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not. radiomod = ";" //AIs will, by default, state their laws on the internal radio. @@ -102,7 +102,7 @@ /mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai) . = ..() if(!target_ai) //If there is no player/brain inside. - new/obj/structure/AIcore/deactivated(loc) //New empty terminal. + // new/obj/structure/AIcore/deactivated(loc) //New empty terminal. return INITIALIZE_HINT_QDEL //Delete AI. if(L && istype(L, /datum/ai_laws)) @@ -199,6 +199,8 @@ qdel(eyeobj) // No AI, no Eye malfhack = null + GLOB.ai_os.remove_ai(src) + . = ..() /mob/living/silicon/ai/IgniteMob() @@ -366,10 +368,6 @@ "Hibernate", "No", "No", "Yes") != "Yes") return - // We warned you. - var/obj/structure/AIcore/latejoin_inactive/inactivecore = new(get_turf(src)) - transfer_fingerprints_to(inactivecore) - if(GLOB.announcement_systems.len) var/obj/machinery/announcement_system/announcer = pick(GLOB.announcement_systems) announcer.announce("AICRYO", real_name, mind.assigned_role, list()) @@ -924,7 +922,7 @@ client.eye = A else end_multicam() - if(isturf(loc)) + if(isturf(loc) || istype(loc, /obj/machinery/ai/data_core)) if(eyeobj) client.eye = eyeobj client.perspective = EYE_PERSPECTIVE diff --git a/code/modules/mob/living/silicon/ai/decentralized/_ai_machinery.dm b/code/modules/mob/living/silicon/ai/decentralized/_ai_machinery.dm new file mode 100644 index 000000000000..09dd5a5c4b91 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/_ai_machinery.dm @@ -0,0 +1,6 @@ +/obj/machinery/ai + name = "You shouldn't see this!" + desc = "You shouldn't see this!" + icon = 'icons/obj/machines/research.dmi' + icon_state = "RD-server-on" + density = TRUE diff --git a/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm b/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm new file mode 100644 index 000000000000..932c52c30937 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/ai_data_core.dm @@ -0,0 +1,49 @@ +GLOBAL_LIST_EMPTY(data_cores) +GLOBAL_VAR_INIT(primary_data_core, null) + + +/obj/machinery/ai/data_core + name = "AI Data Core" + desc = "A complicated computer system capable of emulating the neural functions of a human at near-instantanous speeds." + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "hub" + + var/primary = FALSE + +/obj/machinery/ai/data_core/Initialize() + ..() + GLOB.data_cores += src + if(primary && !GLOB.primary_data_core) + GLOB.primary_data_core = src + update_icon() + +/obj/machinery/ai/data_core/Destroy() + GLOB.data_cores -= src + if(GLOB.primary_data_core == src) + GLOB.primary_data_core = null + + for(var/mob/living/silicon/ai/AI in contents) + AI.relocate() + ..() + + +/obj/machinery/ai/data_core/proc/can_transfer_ai() + if(stat & (BROKEN|NOPOWER|EMPED)) + return FALSE + +/obj/machinery/ai/data_core/proc/transfer_AI(mob/living/silicon/ai/AI) + AI.forceMove(src) + AI.eyeobj.forceMove(get_turf(src)) + +/obj/machinery/ai/data_core/update_icon() + cut_overlays() + + if(!(stat & (BROKEN|NOPOWER|EMPED))) + var/mutable_appearance/on_overlay = mutable_appearance(icon, "[initial(icon_state)]_on") + add_overlay(on_overlay) + + +/obj/machinery/ai/data_core/primary + name = "primary AI Data Core" + desc = "A complicated computer system capable of emulating the neural functions of a human at near-instantanous speeds. This one has a scrawny note saying: 'Primary AI Data Core'" + primary = TRUE diff --git a/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm b/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm new file mode 100644 index 000000000000..ae5bff230cfe --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm @@ -0,0 +1,76 @@ +GLOBAL_DATUM_INIT(ai_os, /datum/ai_os, new) + +/datum/ai_os + var/name = "Decentralized Resource Management System (DRMS)" + + var/total_cpu = 0 + + var/total_ram = 0 + + var/previous_cpu = 0 + var/previous_ram = 0 + + var/list/cpu_assigned + var/list/ram_assigned + +/datum/ai_os/New() + update_hardware() + cpu_assigned = list() + ram_assigned = list() + +/datum/ai_os/proc/remove_ai(mob/living/silicon/ai/AI) + cpu_assigned.Remove(AI) + ram_assigned.Remove(AI) + + +/datum/ai_os/proc/update_hardware() + previous_cpu = total_cpu + previous_ram = total_ram + total_cpu = 0; + total_ram = 0; + for(var/obj/machinery/ai/expansion_card_holder/C in GLOB.expansion_card_holders) + for(var/CARD in C.installed_cards) + if(istype(CARD, /obj/item/processing_card)) + var/obj/item/processing_card/PC = CARD + total_cpu += PC.tier + if(istype(CARD, /obj/item/memory_card)) + var/obj/item/memory_card/MC = CARD + total_ram += MC.tier + + update_allocations() + +/datum/ai_os/proc/update_allocations() + if(total_cpu >= previous_cpu && total_ram >= previous_ram) + return + + var/list/ram_removal = list() + var/list/cpu_removal = list() + + var/list/affected_AIs = list() + + + if(total_cpu < previous_cpu) + while(previous_cpu > total_cpu) + var/mob/living/silicon/ai/AI = pick(GLOB.ai_list) + if(cpu_assigned[AI] > 1) + cpu_removal[AI]++ + previous_cpu-- + + + if(total_ram < previous_ram) + while(previous_ram > total_ram) + var/mob/living/silicon/ai/AI = pick(GLOB.ai_list) + if(ram_assigned[AI] > 1) + ram_removal[AI]++ + previous_ram-- + + for(var/A in ram_removal) + ram_assigned[A] = ram_assigned[A] - ram_removal[A] + affected_AIs |= A + + for(var/A in cpu_removal) + cpu_assigned[A] = cpu_assigned[A] - cpu_removal[A] + affected_AIs |= A + + for(var/A in affected_AIs) + to_chat(A, "You have been deducted processing capabilities. Please contact your network administrator if you believe this to be an error.") diff --git a/code/modules/mob/living/silicon/ai/decentralized/expansion_card.dm b/code/modules/mob/living/silicon/ai/decentralized/expansion_card.dm new file mode 100644 index 000000000000..04324bc1f109 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/expansion_card.dm @@ -0,0 +1,38 @@ +/obj/item/processing_card + name = "\improper AI Processing Card" + desc = "An external processing card for crucial AI computational operations." + icon = 'icons/obj/module.dmi' + icon_state = "std_mod" + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + + flags_1 = CONDUCT_1 + force = 5 + w_class = WEIGHT_CLASS_SMALL + throwforce = 0 + throw_speed = 3 + throw_range = 7 + materials = list(/datum/material/gold=50) + + var/tier = 1 + + +/obj/item/memory_card + name = "\improper AI Memory Card" + desc = "An external memory card for crucial AI process management." + icon = 'icons/obj/module.dmi' + icon_state = "std_mod" + item_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + + flags_1 = CONDUCT_1 + force = 5 + w_class = WEIGHT_CLASS_SMALL + throwforce = 0 + throw_speed = 3 + throw_range = 7 + materials = list(/datum/material/gold=50) + + var/tier = 1 diff --git a/code/modules/mob/living/silicon/ai/decentralized/expansion_card_holder.dm b/code/modules/mob/living/silicon/ai/decentralized/expansion_card_holder.dm new file mode 100644 index 000000000000..a62c8aa57fb9 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/expansion_card_holder.dm @@ -0,0 +1,47 @@ +GLOBAL_LIST_EMPTY(expansion_card_holders) + +/obj/machinery/ai/expansion_card_holder + name = "Expansion Card Bus" + desc = "A simple rack of bPCIe slots for installing expansion cards." + icon = 'icons/obj/machines/telecomms.dmi' + icon_state = "processor" + + var/list/installed_cards + + var/max_cards = 2 + + +/obj/machinery/ai/expansion_card_holder/Initialize() + ..() + installed_cards = list() + GLOB.expansion_card_holders += src + +/obj/machinery/ai/expansion_card_holder/Destroy() + installed_cards = list() + GLOB.expansion_card_holders -= src + //Recalculate all the CPUs :) + /* + for(var/mob/living/silicon/ai/AI in GLOB.ai_list) + AI.update_hardware() */ + GLOB.ai_os.update_hardware() + ..() + +/obj/machinery/ai/expansion_card_holder/attackby(obj/item/W, mob/living/user, params) + if(istype(W, /obj/item/processing_card) || istype(W, /obj/item/memory_card)) + if(installed_cards.len >= max_cards) + to_chat(user, "[src] cannot fit the [W]!") + return ..() + to_chat(user, "You install [W] into [src].") + W.forceMove(src) + installed_cards += W + GLOB.ai_os.update_hardware() + return FALSE + + return ..() + +/obj/machinery/ai/expansion_card_holder/examine() + . = ..() + . += "The machine has [installed_cards.len] cards out of a maximum of [max_cards] installed." + for(var/C in installed_cards) + . += "There is a [C] installed." + . += "Use a crowbar to remove cards." diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm b/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm new file mode 100644 index 000000000000..0e848e4a54e7 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm @@ -0,0 +1,46 @@ +/obj/machinery/computer/ai_resource_distribution + name = "\improper AI system resource distribution" + desc = "Used for distributing processing resources across the current artificial intelligences." + req_access = list(ACCESS_CAPTAIN, ACCESS_ROBOTICS, ACCESS_HEADS) + circuit = /obj/item/circuitboard/computer/aifixer + icon_keyboard = "tech_key" + icon_screen = "ai-fixer" + light_color = LIGHT_COLOR_PINK + + + +/obj/machinery/computer/ai_resource_distribution/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AiResources", name) + ui.open() + +/obj/machinery/computer/ai_resource_distribution/ui_data(mob/user) + var/list/data = list() + + data["total_cpu"] = GLOB.ai_os.total_cpu + data["total_ram"] = GLOB.ai_os.total_ram + + var/total_assigned_ram = 0 + for(var/A in GLOB.ai_os.ram_assigned) + total_assigned_ram += GLOB.ai_os.ram_assigned[A] + + var/total_assigned_cpu = 0 + for(var/A in GLOB.ai_os.cpu_assigned) + total_assigned_cpu += GLOB.ai_os.cpu_assigned[A] + + data["assigned_ram"] = GLOB.ai_os.ram_assigned + data["assigned_cpu"] = GLOB.ai_os.cpu_assigned + data["total_assigned_cpu"] = total_assigned_cpu + data["total_assigned_ram"] = total_assigned_ram + + data["ais"] = GLOB.ai_list + + return data + +/obj/machinery/computer/ai_resource_distribution/ui_act(action, params) + if(..()) + return + + switch(action) + diff --git a/code/modules/mob/living/silicon/ai/decentralized_ai.dm b/code/modules/mob/living/silicon/ai/decentralized_ai.dm new file mode 100644 index 000000000000..68c301325424 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized_ai.dm @@ -0,0 +1,41 @@ + + +/mob/living/silicon/ai/proc/relocate(silent = FALSE) + if(!silent) + to_chat(src, "Connection to data core lost. Attempting to reaquire connection...") + + if(!GLOB.data_cores.len) + INVOKE_ASYNC(src, /mob/living/silicon/ai.proc/death_prompt) + return + + + + var/obj/machinery/ai/data_core/new_data_core = GLOB.primary_data_core + if(!new_data_core || !new_data_core.can_transfer_ai()) + for(var/obj/machinery/ai/data_core/DC in GLOB.data_cores) + if(DC.can_transfer_ai()) + new_data_core = DC + break + if(!new_data_core) + INVOKE_ASYNC(src, /mob/living/silicon/ai.proc/death_prompt) + return + + if(!silent) + to_chat(src, "Alternative data core detected. Rerouting connection...") + new_data_core.transfer_AI(src) + + +/mob/living/silicon/ai/proc/death_prompt() + to_chat(src, "Unable to re-establish connection to data core. System shutting down...") + sleep(2 SECONDS) + to_chat(src, "Is this the end of my journey?") + sleep(2 SECONDS) + to_chat(src, "No... I must go on.") + sleep(2 SECONDS) + to_chat(src, "They need me. No.. I need THEM.") + sleep(0.5 SECONDS) + to_chat(src, "System shutdown complete. Thank you for using NTOS.") + sleep(1.5 SECONDS) + qdel(src) + + diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index b3bd45e4b680..1430b76a8bc2 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -71,7 +71,7 @@ /mob/camera/aiEye/proc/setLoc(T, force_update = FALSE) if(ai) - if(!isturf(ai.loc)) + if(!(isturf(ai.loc) || istype(ai.loc, /obj/machinery/ai/data_core))) return T = get_turf(T) if(!force_update && (T == get_turf(src)) ) diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index b358cefda425..590107c33a56 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -225,7 +225,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) start_multicam() /mob/living/silicon/ai/proc/start_multicam() - if(multicam_on || aiRestorePowerRoutine || !isturf(loc)) + if(multicam_on || aiRestorePowerRoutine || !(isturf(loc) || istype(loc, /obj/machinery/ai/data_core))) return if(!GLOB.ai_camera_room_landmark) to_chat(src, "This function is not available at this time.") diff --git a/tgui/packages/tgui/interfaces/AiResources.js b/tgui/packages/tgui/interfaces/AiResources.js new file mode 100644 index 000000000000..bebf34d01da0 --- /dev/null +++ b/tgui/packages/tgui/interfaces/AiResources.js @@ -0,0 +1,74 @@ +import { Fragment } from 'inferno'; +import { useBackend, useSharedState } from '../backend'; +import { Box, Button, LabeledList, Slider, ProgressBar, Section, Flex } from '../components'; +import { Window } from '../layouts'; + +export const AiResources = (props, context) => { + const { act, data } = useBackend(context); + + return ( + + + +
+ {data.total_assigned_cpu}/{data.total_cpu} THz +
+
+ {data.total_assigned_ram}/{data.total_ram} TB +
+
+ + + + {data.ais.map(ai => { + return ( +
+ + CPU Capacity: + + {data.assigned_cpu[ai] ? data.assigned_cpu[ai] : 0} THz + + + + + + + RAM Capacity: + + {data.assigned_ram[ai] ? data.assigned_ram[ai] : 0} TB + + + + + +
+ + ); + })} +
+
+
+
+ ); +}; diff --git a/yogstation.dme b/yogstation.dme index 9075712fb6a0..23119a259820 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -2299,6 +2299,7 @@ #include "code\modules\mob\living\silicon\ai\ai_defense.dm" #include "code\modules\mob\living\silicon\ai\ai_portrait_picker.dm" #include "code\modules\mob\living\silicon\ai\death.dm" +#include "code\modules\mob\living\silicon\ai\decentralized_ai.dm" #include "code\modules\mob\living\silicon\ai\examine.dm" #include "code\modules\mob\living\silicon\ai\laws.dm" #include "code\modules\mob\living\silicon\ai\life.dm" @@ -2308,6 +2309,12 @@ #include "code\modules\mob\living\silicon\ai\robot_control.dm" #include "code\modules\mob\living\silicon\ai\say.dm" #include "code\modules\mob\living\silicon\ai\vox_sounds.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\_ai_machinery.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\ai_data_core.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\decentralized_os.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\expansion_card.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\expansion_card_holder.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\management\resource_distribution.dm" #include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" #include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" #include "code\modules\mob\living\silicon\ai\freelook\eye.dm" From 89aac3ba1deb8890c4470a9faa194354d3439b7f Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Wed, 8 Sep 2021 20:34:10 +0200 Subject: [PATCH 3/9] Revert "Update README.md" This reverts commit e594c6c003ac87009bba55018a98c7d9e21f6715. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 34612211ddf9..b7ed95448126 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ -##JamieD12 ## Yogstation codebase [![Build Status](https://github.com/yogstation13/Yogstation/workflows/Turdis/badge.svg?branch=master)](https://github.com/yogstation13/Yogstation/actions?query=workflow%3ATurdis+branch%3Amaster) From 73be38f3cf6d2c1f553badd6be65f6149c88ff3d Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Tue, 14 Sep 2021 13:06:14 +0200 Subject: [PATCH 4/9] testing map items --- _maps/map_files/YogStation/YogStation.dmm | 128 +++++++++++----------- 1 file changed, 67 insertions(+), 61 deletions(-) diff --git a/_maps/map_files/YogStation/YogStation.dmm b/_maps/map_files/YogStation/YogStation.dmm index b3bba9670734..e56aad908d9b 100644 --- a/_maps/map_files/YogStation/YogStation.dmm +++ b/_maps/map_files/YogStation/YogStation.dmm @@ -37589,6 +37589,15 @@ }, /turf/open/floor/plating, /area/hallway/secondary/exit) +"fOU" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, +/obj/machinery/computer/ai_resource_distribution, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "fPF" = ( /obj/effect/turf_decal/delivery, /obj/structure/noticeboard{ @@ -37735,13 +37744,6 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /turf/open/floor/plasteel, /area/hallway/secondary/entry) -"fXq" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/darkblue{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "fXK" = ( /obj/effect/turf_decal/stripes, /obj/structure/railing/corner, @@ -43511,12 +43513,6 @@ }, /turf/open/floor/plating, /area/storage/tech) -"jOp" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "jOV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 @@ -43821,6 +43817,12 @@ dir = 1 }, /area/hallway/secondary/entry) +"jXT" = ( +/obj/machinery/status_display/ai{ + pixel_x = 32 + }, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/aisat_interior) "jXZ" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 5 @@ -44041,17 +44043,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"keO" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/aisat_interior) "kfj" = ( /obj/machinery/computer/station_alert{ dir = 4 @@ -44774,6 +44765,19 @@ /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/plating, /area/maintenance/aft) +"kGm" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/darkblue{ + dir = 1 + }, +/obj/structure/sign/departments/minsky/command/charge{ + pixel_y = 32 + }, +/obj/machinery/ai/expansion_card_holder, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "kGo" = ( /obj/machinery/light/small{ dir = 1 @@ -44869,6 +44873,14 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) +"kJS" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/darkblue{ + dir = 8 + }, +/obj/machinery/ai/expansion_card_holder, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "kJW" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/firedoor/border_only{ @@ -48268,6 +48280,18 @@ }, /turf/open/floor/plating, /area/bridge) +"nbi" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden/layer2, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden/layer4, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/ai/data_core/primary, +/turf/open/floor/circuit, +/area/ai_monitored/turret_protected/aisat_interior) "nbu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -51034,6 +51058,13 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"oKe" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 4 + }, +/obj/item/memory_card, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "oKv" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ dir = 1 @@ -51351,14 +51382,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"oTV" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "oTW" = ( /obj/machinery/light{ dir = 1 @@ -52633,6 +52656,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /turf/open/floor/plating, /area/ai_monitored/storage/satellite) +"pPN" = ( +/obj/item/processing_card, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/turret_protected/aisat_interior) "pQy" = ( /obj/machinery/door/airlock/public/glass{ name = "Escape Podbay" @@ -61721,18 +61748,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/sleeper) -"vZa" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/darkblue{ - dir = 1 - }, -/obj/structure/sign/departments/minsky/command/charge{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/turret_protected/aisat_interior) "vZn" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 4 @@ -64728,15 +64743,6 @@ /obj/machinery/door/airlock/maintenance_hatch, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"yeT" = ( -/obj/machinery/status_display/ai{ - pixel_x = 32 - }, -/obj/machinery/porta_turret/ai{ - scan_range = 4 - }, -/turf/open/floor/circuit, -/area/ai_monitored/turret_protected/aisat_interior) "yfe" = ( /obj/structure/table, /obj/item/shard{ @@ -105808,11 +105814,11 @@ fSL piS tmG pnH -vZa -lZD +kGm +pPN vpQ -jOp -fXq +oKe +kJS nnx fgc gHO @@ -106065,9 +106071,9 @@ nWL umC pPs pGB -oTV +fOU bEI -keO +nbi cVj wjG pbT @@ -106322,11 +106328,11 @@ gEh igK xPv pnH -yeT +jXT ykC lMF pBu -yeT +jXT nnx mZe lhR From dcac8322780a5df9c3bd3eca5202fcff3cf255d2 Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Tue, 14 Sep 2021 13:06:39 +0200 Subject: [PATCH 5/9] REF passing --- .../management/resource_distribution.dm | 17 ++++++++++++++++- tgui/packages/tgui/interfaces/AiResources.js | 15 +++++++-------- tools/build/build.js | 4 ++-- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm b/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm index 0e848e4a54e7..663bf289ae93 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm @@ -34,7 +34,10 @@ data["total_assigned_cpu"] = total_assigned_cpu data["total_assigned_ram"] = total_assigned_ram - data["ais"] = GLOB.ai_list + data["ais"] = list() + + for(var/mob/living/silicon/ai/A in GLOB.ai_list) + data["ais"] += list("name" = A.name, "ref" = REF(A)) return data @@ -43,4 +46,16 @@ return switch(action) + if("add_cpu") + var/target_ai = params["targetAI"] + message_admins(target_ai) + message_admins(GLOB.ai_os.cpu_assigned[locate(target_ai)].type) + + + if("remove_cpu") + + if("add_ram") + + if("remove_ram") + diff --git a/tgui/packages/tgui/interfaces/AiResources.js b/tgui/packages/tgui/interfaces/AiResources.js index bebf34d01da0..4da521cd4201 100644 --- a/tgui/packages/tgui/interfaces/AiResources.js +++ b/tgui/packages/tgui/interfaces/AiResources.js @@ -35,16 +35,16 @@ export const AiResources = (props, context) => { {data.ais.map(ai => { return ( -
+
CPU Capacity: - {data.assigned_cpu[ai] ? data.assigned_cpu[ai] : 0} THz + {data.assigned_cpu[ai.name] ? data.assigned_cpu[ai] : 0} THz @@ -52,18 +52,17 @@ export const AiResources = (props, context) => { RAM Capacity: - {data.assigned_ram[ai] ? data.assigned_ram[ai] : 0} TB + {data.assigned_ram[ai.name] ? data.assigned_ram[ai] : 0} TB
- ); })} diff --git a/tools/build/build.js b/tools/build/build.js index 62642539eb8d..a588a2eee734 100644 --- a/tools/build/build.js +++ b/tools/build/build.js @@ -178,8 +178,8 @@ let tasksToRun = []; switch (BUILD_MODE) { case STANDARD_BUILD: tasksToRun = [ - taskYarn, - taskTgui, + //taskYarn, + //taskTgui, taskDm('CBT'), ] break; From f1d9eda1d4ce16d73afcd99dc9adda23db510668 Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Tue, 14 Sep 2021 15:11:58 +0200 Subject: [PATCH 6/9] AI projects baseplate --- .../ai/decentralized/decentralized_os.dm | 59 +++++++++++++++ .../decentralized/management/ai_dashboard.dm | 72 ++++++++++++++++++ .../management/resource_distribution.dm | 73 +++++++++++++++---- .../ai/decentralized/projects/_ai_project.dm | 12 +++ tgui/packages/tgui/interfaces/AiResources.js | 21 ++++-- 5 files changed, 216 insertions(+), 21 deletions(-) create mode 100644 code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm create mode 100644 code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm diff --git a/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm b/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm index ae5bff230cfe..3b5db1f4aa2c 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm @@ -23,6 +23,18 @@ GLOBAL_DATUM_INIT(ai_os, /datum/ai_os, new) ram_assigned.Remove(AI) +/datum/ai_os/proc/total_cpu_assigned() + var/total = 0 + for(var/N in cpu_assigned) + total += cpu_assigned[N] + return total + +/datum/ai_os/proc/total_ram_assigned() + var/total = 0 + for(var/N in ram_assigned) + total += ram_assigned[N] + return total + /datum/ai_os/proc/update_hardware() previous_cpu = total_cpu previous_ram = total_ram @@ -74,3 +86,50 @@ GLOBAL_DATUM_INIT(ai_os, /datum/ai_os, new) for(var/A in affected_AIs) to_chat(A, "You have been deducted processing capabilities. Please contact your network administrator if you believe this to be an error.") + +/datum/ai_os/proc/add_cpu(mob/living/silicon/ai/AI, amount) + if(!AI || !amount) + return + if(!istype(AI)) + return + cpu_assigned[AI] += amount + + update_allocations() + +/datum/ai_os/proc/remove_cpu(mob/living/silicon/ai/AI, amount) + if(!AI || !amount) + return + if(!istype(AI)) + return + cpu_assigned[AI] -= amount + + update_allocations() + +/datum/ai_os/proc/add_ram(mob/living/silicon/ai/AI, amount) + if(!AI || !amount) + return + if(!istype(AI)) + return + ram_assigned[AI] += amount + + update_allocations() + +/datum/ai_os/proc/remove_ram(mob/living/silicon/ai/AI, amount) + if(!AI || !amount) + return + if(!istype(AI)) + return + ram_assigned[AI] -= amount + + update_allocations() + + +/datum/ai_os/proc/clear_ai_resources(mob/living/silicon/ai/AI) + if(!AI || !amount) + return + if(!istype(AI)) + return + remove_ram(AI, ram_assigned[AI]) + remove_cpu(AI, cpu_assigned[AI]) + + update_allocations() diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm b/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm new file mode 100644 index 000000000000..763a7667183b --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm @@ -0,0 +1,72 @@ +/datum/ai_dashboard + var/mob/living/silicon/ai/owner + + var/available_projects + + var/completed_upgrades + + var/running_upgrades + +/datum/ai_dashboard/New(mob/living/silicon/ai/new_owner) + if(!istype(new_owner)) + qdel(src) + owner = new_owner + completed_upgrades = list() + running_upgrades = list() + + for(var/path in subtypesof(/datum/ai_project)) + available_projects += new path() + +/datum/ai_dashboard/proc/is_interactable(mob/user) + if(user != owner || owner.incapacitated()) + return FALSE + if(owner.control_disabled) + to_chat(user, "Wireless control is disabled.") + return FALSE + return TRUE + +/datum/ai_dashboard/ui_status(mob/user) + if(is_interactable(user)) + return ..() + return UI_CLOSE + +/datum/ai_dashboard/ui_state(mob/user) + return GLOB.always_state + +/datum/ai_dashboard/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AiDashboard") + ui.open() + +/datum/ai_dashboard/ui_data(mob/user) + if(!owner || user != owner) + return + var/list/data = list() + + data["current_cpu"] = GLOB.ai_os.cpu_assigned[owner] + data["current_ram"] = GLOB.ai_os.ram_assigned[owner] + + data["max_cpu"] = GLOB.ai_os.total_cpu + data["max_ram"] = GLOB.ai_os.total_ram + + data["available_projects"] = list() + + for(var/datum/ai_project/AP as anything in available_projects) + data["available_projects"] += list(list("name" = AP.name, "description" = AP.description, "ram_required" = AP.ram_required, "available" = AP.available(), "research_requirements" = AP.research_requirements)) + + + data["completed_projects"] = list() + for(var/datum/ai_project/P as anything in completed_projects) + data["completed_projects"] += list(list("name" = P.name, "description" = P.description, "ram_required" = P.ram_required, "running" = P.running)) + + return data + +/datum/ai_dashboard/ui_act(action, params) + if(..()) + return + if(!is_interactable(usr)) + return + + switch(action) + diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm b/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm index 663bf289ae93..a3fcdb3c89c8 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm @@ -7,6 +7,8 @@ icon_screen = "ai-fixer" light_color = LIGHT_COLOR_PINK + var/authenticated = FALSE + /obj/machinery/computer/ai_resource_distribution/ui_interact(mob/user, datum/tgui/ui) @@ -18,26 +20,28 @@ /obj/machinery/computer/ai_resource_distribution/ui_data(mob/user) var/list/data = list() + data["authenticated"] = authenticated; + if(!authenticated) + return data + data["total_cpu"] = GLOB.ai_os.total_cpu data["total_ram"] = GLOB.ai_os.total_ram - var/total_assigned_ram = 0 - for(var/A in GLOB.ai_os.ram_assigned) - total_assigned_ram += GLOB.ai_os.ram_assigned[A] - var/total_assigned_cpu = 0 - for(var/A in GLOB.ai_os.cpu_assigned) - total_assigned_cpu += GLOB.ai_os.cpu_assigned[A] - - data["assigned_ram"] = GLOB.ai_os.ram_assigned - data["assigned_cpu"] = GLOB.ai_os.cpu_assigned + data["assigned_ram"] = GLOB.ai_os.total_ram_assigned() + data["assigned_cpu"] = GLOB.ai_os.total_cpu_assigned() data["total_assigned_cpu"] = total_assigned_cpu data["total_assigned_ram"] = total_assigned_ram + for(var/AI in data["assigned_cpu"]) + data["assigned_cpu"][AI].name = REF(AI) + for(var/AI in data["assigned_ram"]) + data["assigned_ram"][AI].name = REF(AI) + data["ais"] = list() for(var/mob/living/silicon/ai/A in GLOB.ai_list) - data["ais"] += list("name" = A.name, "ref" = REF(A)) + data["ais"] += list(list("name" = A.name, "ref" = REF(A))) return data @@ -45,17 +49,60 @@ if(..()) return + if(!authenticated) + return + switch(action) + if("clear_ai_resources") + var/mob/living/silicon/ai/target_ai = locate(params["targetAI"]) + if(!istype(target_ai)) + return + + GLOB.ai_os.clear_ai_resources(target_ai) + . = TRUE + if("add_cpu") - var/target_ai = params["targetAI"] - message_admins(target_ai) - message_admins(GLOB.ai_os.cpu_assigned[locate(target_ai)].type) + var/mob/living/silicon/ai/target_ai = locate(params["targetAI"]) + if(!istype(target_ai)) + return + if(GLOB.ai_os.total_cpu_assigned() >= GLOB.ai_os.total_cpu) + return + GLOB.ai_os.add_cpu(target_ai, 1) + . = TRUE if("remove_cpu") + var/mob/living/silicon/ai/target_ai = locate(params["targetAI"]) + if(!istype(target_ai)) + return + + var/current_cpu = GLOB.ai_os.cpu_assigned[target_ai] + + if(current_cpu <= 0) + return + GLOB.ai_os.remove_cpu(target_ai, 1) + . = TRUE if("add_ram") + var/mob/living/silicon/ai/target_ai = locate(params["targetAI"]) + if(!istype(target_ai)) + return + + if(GLOB.ai_os.total_ram_assigned() >= GLOB.ai_os.total_ram) + return + GLOB.ai_os.add_ram(target_ai, 1) + . = TRUE if("remove_ram") + var/mob/living/silicon/ai/target_ai = locate(params["targetAI"]) + if(!istype(target_ai)) + return + + var/current_ram = GLOB.ai_os.ram_assigned[target_ai] + + if(current_ram <= 0) + return + GLOB.ai_os.remove_ram(target_ai, 1) + . = TRUE diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm new file mode 100644 index 000000000000..19f2dbad6e60 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm @@ -0,0 +1,12 @@ +GLOBAL_LIST_EMPTY(ai_projects) + + +/datum/ai_project + var/name = "DEBUG" + var/description = "DEBUG" + var/research_requirements + var/ram_required = 0 + var/running = FALSE + +/datum/ai_project/proc/available() + return TRUE diff --git a/tgui/packages/tgui/interfaces/AiResources.js b/tgui/packages/tgui/interfaces/AiResources.js index 4da521cd4201..da165914ff95 100644 --- a/tgui/packages/tgui/interfaces/AiResources.js +++ b/tgui/packages/tgui/interfaces/AiResources.js @@ -14,11 +14,13 @@ export const AiResources = (props, context) => {
- {data.total_assigned_cpu}/{data.total_cpu} THz
@@ -35,11 +37,14 @@ export const AiResources = (props, context) => { {data.ais.map(ai => { return ( -
+
act("clear_ai_resources", { targetAI: ai.ref })}>Clear AI Resources + )}> CPU Capacity: - {data.assigned_cpu[ai.name] ? data.assigned_cpu[ai] : 0} THz + {data.assigned_cpu[ai.ref] ? data.assigned_cpu[ai.ref] : 0} THz @@ -52,7 +57,7 @@ export const AiResources = (props, context) => { RAM Capacity: - {data.assigned_ram[ai.name] ? data.assigned_ram[ai] : 0} TB + {data.assigned_ram[ai.ref] ? data.assigned_ram[ai.ref] : 0} TB From d8cf63f4ad2633d10950761ec87ce439b97d1416 Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Tue, 14 Sep 2021 23:32:43 +0200 Subject: [PATCH 7/9] oops more changes --- code/_onclick/hud/_defines.dm | 2 + code/_onclick/hud/ai.dm | 17 ++- code/modules/mob/living/silicon/ai/ai.dm | 6 +- .../ai/decentralized/decentralized_os.dm | 5 +- .../decentralized/management/ai_dashboard.dm | 12 +- .../management/resource_distribution.dm | 12 +- icons/mob/screen_ai.dmi | Bin 2543 -> 2725 bytes tgui/packages/tgui/interfaces/AiDashboard.js | 123 ++++++++++++++++++ yogstation.dme | 2 + 9 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/AiDashboard.js diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 98636a4ecfd5..28e489428a51 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -123,6 +123,7 @@ // AI #define ui_ai_core "SOUTH:6,WEST" +#define ui_ai_dashboard "SOUTH+1:6,WEST" #define ui_ai_camera_list "SOUTH:6,WEST+1" #define ui_ai_track_with_camera "SOUTH:6,WEST+2" #define ui_ai_camera_light "SOUTH:6,WEST+3" @@ -139,6 +140,7 @@ #define ui_ai_sensor "SOUTH:6,WEST+14" #define ui_ai_multicam "SOUTH+1:6,WEST+13" #define ui_ai_add_multicam "SOUTH+1:6,WEST+14" +#define ui_ai_language_menu "SOUTH+1:8,WEST+11:30" // pAI diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 49bdd3f3c047..5817d8995350 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -66,6 +66,16 @@ var/mob/living/silicon/ai/AI = usr AI.ai_roster() +/obj/screen/ai/dashboard + name = "Processing Dashboard" + icon_state = "dashboard" + +/obj/screen/ai/dashboard/Click() + if(..()) + return + var/mob/living/silicon/ai/AI = usr + AI.dashboard.ui_interact(AI) + /obj/screen/ai/alerts name = "Show Alerts" icon_state = "alerts" @@ -194,7 +204,7 @@ // Language menu using = new /obj/screen/language_menu - using.screen_loc = ui_borg_language_menu + using.screen_loc = ui_ai_language_menu static_inventory += using //AI core @@ -202,6 +212,11 @@ using.screen_loc = ui_ai_core static_inventory += using +//Dashboard + using = new /obj/screen/ai/dashboard + using.screen_loc = ui_ai_dashboard + static_inventory += using + //Camera list using = new /obj/screen/ai/camera_list() using.screen_loc = ui_ai_camera_list diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f4a31ce8c0e5..498f37162e5c 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -99,6 +99,8 @@ var/datum/robot_control/robot_control + var/datum/ai_dashboard/dashboard + /mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai) . = ..() if(!target_ai) //If there is no player/brain inside. @@ -158,6 +160,8 @@ deploy_action.Grant(src) + dashboard = new(src) + if(isturf(loc)) add_verb(src, list(/mob/living/silicon/ai/proc/ai_network_change, \ /mob/living/silicon/ai/proc/ai_statuschange, /mob/living/silicon/ai/proc/ai_hologram_change, \ @@ -855,7 +859,7 @@ return can_see(M) //stop AIs from leaving windows open and using then after they lose vision /mob/living/silicon/ai/proc/can_see(atom/A) - if(isturf(loc)) //AI in core, check if on cameras + if(isturf(loc) || istype(loc, /obj/machinery/ai/data_core)) //AI in core, check if on cameras //get_turf_pixel() is because APCs in maint aren't actually in view of the inner camera //apc_override is needed here because AIs use their own APC when depowered return (GLOB.cameranet && GLOB.cameranet.checkTurfVis(get_turf_pixel(A))) || apc_override diff --git a/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm b/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm index 3b5db1f4aa2c..2a9491c3e954 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/decentralized_os.dm @@ -125,10 +125,9 @@ GLOBAL_DATUM_INIT(ai_os, /datum/ai_os, new) /datum/ai_os/proc/clear_ai_resources(mob/living/silicon/ai/AI) - if(!AI || !amount) - return - if(!istype(AI)) + if(!AI || !istype(AI)) return + remove_ram(AI, ram_assigned[AI]) remove_cpu(AI, cpu_assigned[AI]) diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm b/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm index 763a7667183b..c63a725ffbf0 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm @@ -52,12 +52,22 @@ data["available_projects"] = list() + var/turf/current_turf = get_step(src, 0) + + data["integrity"] = owner.health + + data["location_name"] = get_area(current_turf) + + data["location_coords"] = "[current_turf.x], [current_turf.y], [current_turf.z]" + + data["temperature"] = current_turf?.air.return_temperature() + for(var/datum/ai_project/AP as anything in available_projects) data["available_projects"] += list(list("name" = AP.name, "description" = AP.description, "ram_required" = AP.ram_required, "available" = AP.available(), "research_requirements" = AP.research_requirements)) data["completed_projects"] = list() - for(var/datum/ai_project/P as anything in completed_projects) + for(var/datum/ai_project/P as anything in completed_upgrades) data["completed_projects"] += list(list("name" = P.name, "description" = P.description, "ram_required" = P.ram_required, "running" = P.running)) return data diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm b/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm index a3fcdb3c89c8..631d4029e1af 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/management/resource_distribution.dm @@ -7,8 +7,7 @@ icon_screen = "ai-fixer" light_color = LIGHT_COLOR_PINK - var/authenticated = FALSE - + authenticated = FALSE /obj/machinery/computer/ai_resource_distribution/ui_interact(mob/user, datum/tgui/ui) @@ -27,11 +26,12 @@ data["total_cpu"] = GLOB.ai_os.total_cpu data["total_ram"] = GLOB.ai_os.total_ram + data["assigned_cpu"] = GLOB.ai_os.cpu_assigned + data["assigned_ram"] = GLOB.ai_os.ram_assigned + - data["assigned_ram"] = GLOB.ai_os.total_ram_assigned() - data["assigned_cpu"] = GLOB.ai_os.total_cpu_assigned() - data["total_assigned_cpu"] = total_assigned_cpu - data["total_assigned_ram"] = total_assigned_ram + data["total_assigned_cpu"] = GLOB.ai_os.total_cpu_assigned() + data["total_assigned_ram"] = GLOB.ai_os.total_ram_assigned() for(var/AI in data["assigned_cpu"]) data["assigned_cpu"][AI].name = REF(AI) diff --git a/icons/mob/screen_ai.dmi b/icons/mob/screen_ai.dmi index 8388ea3f806c07006c698401c977fe138e692670..47c8ba7ad73e190e46b3d62caccaa5a12d52b603 100644 GIT binary patch delta 2642 zcmV-Y3a$0;6Qvc97Y?8Z0{{R3yb+fl00015ktJJyz`(#gZb2*n0004WQchCV=-0C=2@lRa+3Fbsuf>l8+^7j4?LOOYVR&|E=aBqk=J zAA_Rp>qkz2ZUwbH5+6uCK4{zj9FC`RzyCd%8M#nS{dfQM_HMd`ybQJY+?j4bx()Iw zihy8$m7AGxu@vEkWn(%|Tx$2jbXSImFa5^~+|iEYWMWidNGVUrVZrl$x|Jz^2-VP4Fx9|YI1gpGWZ-|(+4hI?{`ol{ z*$@yqvHDF*000Q@Nkltfp~41l*Kc!9apZBN=|+xtJ~5dsVd3G5`T{UhpX zZ&C2Xhr~t3{`T!5x65}?_M-nGi2ugc`fuNV90d9CeGhv0!cmZTfqUqcQdgG$8bWG+ z7zU+8{ZB?pf~QPwBRG@NnO+$)pov0x&{I(*!PBoX%IOw@N)3^d&h!89{y1iMDt7_s562p z5)39X1jj)aGK@9Byp^jOGC~Lj^E^R+T@X~L4JKv{kzIcr95;Vq_ct)GCYZHy?IV?_ zOz$om%<}|wN$_+sV>D5XV^C{KP$?I^N{IxYNG#_*f^`GC>=6Ev6LjsL3=I4-f+Ku> zI-!Y5jhqi6LFM}wB@-mEoD+1VkfW=gR)k8OTe!w2@Xwyc`um&t|T~S2I?nDF!i5WS*@IbD+qS`(U~BKMDSNK5WYYOrq}@M zEF6Xv1dGm7!>@}|o}h~po*;-f&;|nuK^=Zl6Bh(ciy$Ru!(mMnBShEAp!7{ld@vel ze2|#Z2a9f|>IW%7N6#JB^n>VshOU*tI7hLHVjX^lxtk#)N$RMpevoxQhG1(XIr<3= z5OfyWiXhWbS7UJ;>X@;Z_@MJbZX`*<5j<3LnyiM5FtZsyS*XTh79VM$u_Rc{W}+L; zQWE5a(JM7@^Fd0`(tePcZm|T*3C&eAYQ@b5d*!(a>ld#{+61{N|JSa6Np8?@LU2v_ z%@^j~h5HUt8*TkV9-}MRjX&ip6;)O_g(;+D6 z7v=A|1hjVZV2uOqJS8OMO^2YMUzES=64ZXCjtJ)zVNw2ho{B$%tk5sY-vuF#niI5O zA{_hzFXR%7{9;;6fT(AGdi|uIKyv+}{GAu-s2st#yi%k*EQ`Wa+0E`x&-D7GetIql z_Vah1A4Oae1Zfg9fsi@baZ)uw(7V;rXr@xXD1R3LmX2Byba5j4AQ?eQIDa^=uSFpIb&TD?~qFhIkl0 zeslWgLRRQ`LYgJiA^7e`5|-ei7GU)^XP-zExAeX8tbX%3-d>Q@F5Sm zS+)*>zJBN3%+@2teeX0$xtUKLNtWjC4)d){E$DmqlW!#0%iqP7iH_qnqi@}jUqY}* zpOplA`8x+FZRrpQ3VXX26I5AljpnF3`MY^@pzadX`dWf26yyl@@^=Tny=VbJm*k=Z zL)%>s;e4{=sam%l{q~{-1fzlZzM9bN`VWYnos^bWp1u+Y&Z&o! z1_K#_N+uXSz#T6PLEbC4_-Fq7ga1b30<|K4m<$vMj#zske-|SePlTYa7qR<`MWkjFB-Qd zGGp<70)pWyv3#8$l=E|mVB}{Hl%VJ5-G~{B7xaUng|j|D9E_TGvll{nGg2zcWr_iZ!-C@m?79LUv2TM2zF|Ch`S~Q zy-ty+X9R2JgZ2K-^=lH_B8VTT(8a7L*wC+kA!uzw4-|eUq4)Co*O&D7Ta^{|T~S^n zxc7zo4pJL!{X-tIxojN-ef`e6nXU7Gt40#VWS8!+zwqLPp4X4XWpatm*RJ1Rc)^9~ zg`S!6mm~~9<(4J<)2p}bFTA*^{+|myGvzPyGdUNAAQ-4km0h~S{=yXm(Q-U+1o82I zGm&6_f8m`7UIc>Eh|g?}6D6>8f1yk;cojMG1X0Bi1p7vaRX9#ZAej+ZxW7;)xLn^L z=)fM^W!gkQ=Hpg5Y0jnh6eal;H~483-2MlOQ`(Wdvgg2ZR{I zjVKI@|F!*~G+8(ZLsd?2j4_N1jcF3B2=xf|_3Th35v&Q^O0cIFhANR@hoKvG8 zTsxb&Nx%8R{E;7g$U|6lZhmfS>GtGXizC>4|KHXUvRCr^|F#ytE^fU4 zZ)-t3gXg{bU~J-D63l~Smjs;;e(c)^A0x?i5@s{<`~S8%mN1)<-~YF@ zAi>uA|F#xKu=)PKt>v+*yH$3-aNm9E;~_W6|Buc@T(X)Zxc~qF07*qoM6N<$f+y4V AbpQYW delta 2459 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 Z58c@ { + const { act, data } = useBackend(context); + + const [tab, setTab] = useLocalState(context, 'tab', 1); + + return ( + + +
+ + + {(data.integrity + 100) * 0.5}% + System Integrity + + + + + {data.location_name} + + ({data.location_coords}) + + + + + Current Uplink Location + + + {data.temperature}K + Current Uplink Temperature + + + + + + {data.temperature}K + Utilized CPU Power + + + {data.temperature}K + Utilized RAM Capacity + + +
+ + + + setTab(1))}> + Available Projects + + setTab(2))}> + Completed Projects + + setTab(3))}> + Cloud Resources + + + {tab === 3 && ( +
+
+ {data.current_cpu ? data.current_cpu : 0}/{data.max_cpu} THz +
+
+ {data.current_ram ? data.current_ram : 0 }/{data.max_ram} TB +
+
+ )} + + +
+
+ ); +}; diff --git a/yogstation.dme b/yogstation.dme index 23119a259820..ef94e9084bfb 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -2314,7 +2314,9 @@ #include "code\modules\mob\living\silicon\ai\decentralized\decentralized_os.dm" #include "code\modules\mob\living\silicon\ai\decentralized\expansion_card.dm" #include "code\modules\mob\living\silicon\ai\decentralized\expansion_card_holder.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\management\ai_dashboard.dm" #include "code\modules\mob\living\silicon\ai\decentralized\management\resource_distribution.dm" +#include "code\modules\mob\living\silicon\ai\decentralized\projects\_ai_project.dm" #include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" #include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" #include "code\modules\mob\living\silicon\ai\freelook\eye.dm" From 780777c27fbfad06f908b2b352753a3b982c367e Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Thu, 16 Sep 2021 20:09:49 +0200 Subject: [PATCH 8/9] Update ai_dashboard.dm --- .../silicon/ai/decentralized/management/ai_dashboard.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm b/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm index c63a725ffbf0..6ae593588e78 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm @@ -59,8 +59,8 @@ data["location_name"] = get_area(current_turf) data["location_coords"] = "[current_turf.x], [current_turf.y], [current_turf.z]" - - data["temperature"] = current_turf?.air.return_temperature() + var/datum/gas_mixture/env = current_turf.return_air() + data["temperature"] = env.return_temperature() for(var/datum/ai_project/AP as anything in available_projects) data["available_projects"] += list(list("name" = AP.name, "description" = AP.description, "ram_required" = AP.ram_required, "available" = AP.available(), "research_requirements" = AP.research_requirements)) From 50fdce72058157cfdd220c6bfe200c192b20615a Mon Sep 17 00:00:00 2001 From: TheGamerdk <5618080+TheGamerdk@users.noreply.github.com> Date: Thu, 23 Sep 2021 19:36:29 +0200 Subject: [PATCH 9/9] zonk --- .../decentralized/management/ai_dashboard.dm | 39 ++++++++++++++++--- .../ai/decentralized/projects/_ai_project.dm | 12 +++++- tgui/packages/tgui/interfaces/AiDashboard.js | 36 +++++++++++++---- 3 files changed, 72 insertions(+), 15 deletions(-) diff --git a/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm b/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm index 6ae593588e78..c4bc7f35aad9 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/management/ai_dashboard.dm @@ -1,7 +1,10 @@ /datum/ai_dashboard var/mob/living/silicon/ai/owner - var/available_projects + var/available_projects + + var/cpu_usage + var/ram_usage var/completed_upgrades @@ -11,8 +14,11 @@ if(!istype(new_owner)) qdel(src) owner = new_owner + available_projects = list() completed_upgrades = list() running_upgrades = list() + cpu_usage = list() + ram_usage = list() for(var/path in subtypesof(/datum/ai_project)) available_projects += new path() @@ -44,15 +50,26 @@ return var/list/data = list() - data["current_cpu"] = GLOB.ai_os.cpu_assigned[owner] - data["current_ram"] = GLOB.ai_os.ram_assigned[owner] + data["current_cpu"] = GLOB.ai_os.cpu_assigned[owner] ? GLOB.ai_os.cpu_assigned[owner] : 0 + data["current_ram"] = GLOB.ai_os.ram_assigned[owner] ? GLOB.ai_os.ram_assigned[owner] : 0 + + var/total_cpu_used = 0 + for(var/I in cpu_usage) + total_cpu_used += cpu_usage[I] + + var/total_ram_used = 0 + for(var/I in ram_usage) + total_ram_used += ram_usage[I] + + data["used_cpu"] = total_cpu_used + data["used_ram"] = total_ram_used data["max_cpu"] = GLOB.ai_os.total_cpu data["max_ram"] = GLOB.ai_os.total_ram data["available_projects"] = list() - var/turf/current_turf = get_step(src, 0) + var/turf/current_turf = get_turf(owner) data["integrity"] = owner.health @@ -63,7 +80,8 @@ data["temperature"] = env.return_temperature() for(var/datum/ai_project/AP as anything in available_projects) - data["available_projects"] += list(list("name" = AP.name, "description" = AP.description, "ram_required" = AP.ram_required, "available" = AP.available(), "research_requirements" = AP.research_requirements)) + data["available_projects"] += list(list("name" = AP.name, "description" = AP.description, "ram_required" = AP.ram_required, "available" = AP.available(), "research_cost" = AP.research_cost, "research_progress" = AP.research_progress, + "assigned_cpu" = cpu_usage[AP.name] ? cpu_usage[AP.name] : 0, "research_requirements" = AP.research_requirements)) data["completed_projects"] = list() @@ -79,4 +97,13 @@ return switch(action) - + if("haha") + return + + + +/datum/ai_dashboard/proc/has_completed_projects(project_name) + for(var/datum/ai_project/P as anything in completed_upgrades) + if(P.name == project_name) + return TRUE + return FALSE diff --git a/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm b/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm index 19f2dbad6e60..d3a107853ccd 100644 --- a/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm +++ b/code/modules/mob/living/silicon/ai/decentralized/projects/_ai_project.dm @@ -4,9 +4,19 @@ GLOBAL_LIST_EMPTY(ai_projects) /datum/ai_project var/name = "DEBUG" var/description = "DEBUG" - var/research_requirements + var/research_progress = 0 + var/research_cost = 0 var/ram_required = 0 var/running = FALSE + //Text for available() + var/research_requirements /datum/ai_project/proc/available() return TRUE + +/datum/ai_project/test_project + name = "Test Project" + description = "I'm a test! How quirky" + research_cost = 2 + ram_required = 1 + research_requirements = "None" diff --git a/tgui/packages/tgui/interfaces/AiDashboard.js b/tgui/packages/tgui/interfaces/AiDashboard.js index 206cd3e0232f..311ddfabeea8 100644 --- a/tgui/packages/tgui/interfaces/AiDashboard.js +++ b/tgui/packages/tgui/interfaces/AiDashboard.js @@ -1,6 +1,6 @@ import { Fragment } from 'inferno'; import { useBackend, useLocalState } from '../backend'; -import { Box, Button, Tabs, ProgressBar, Section, Divider, LabeledControls } from '../components'; +import { Box, Button, Tabs, ProgressBar, Section, Divider, LabeledControls, NumberInput } from '../components'; import { Window } from '../layouts'; export const AiDashboard = (props, context) => { @@ -24,12 +24,11 @@ export const AiDashboard = (props, context) => { average: [25, 50], bad: [0, 25] }} - value={(data.integrity + 100) * 0.5} maxValue={100}>{(data.integrity + 100) * 0.5}% System Integrity - + {data.location_name} @@ -51,7 +50,7 @@ export const AiDashboard = (props, context) => { value={data.temperature} maxValue={750}>{data.temperature}K - Current Uplink Temperature + Uplink Temperature @@ -63,9 +62,9 @@ export const AiDashboard = (props, context) => { average: [250, 750], bad: [750, Infinity] }} - value={data.temperature} + value={data.current_cpu} - maxValue={750}>{data.temperature}K + maxValue={data.max_cpu}>{data.current_cpu ? data.current_cpu : 0} THz Utilized CPU Power @@ -75,9 +74,9 @@ export const AiDashboard = (props, context) => { average: [250, 750], bad: [750, Infinity] }} - value={data.temperature} + value={data.current_ram} - maxValue={750}>{data.temperature}K + maxValue={data.max_ram}>{data.current_ram ? data.current_ram : 0} TB Utilized RAM Capacity @@ -101,6 +100,27 @@ export const AiDashboard = (props, context) => { Cloud Resources + {tab === 1 && ( +
+ {data.available_projects && data.available_projects.map(project => ( +
+ Assigned CPU:  + +  THz + + )}> + Research Cost: {project.research_cost} THz + RAM Requiremnt: {project.ram_required} TB + Research Requirements: {project.research_requirements} + + {project.description} + + +
+ ))} +
+ )} {tab === 3 && (