From 35f8fe4a2b5a53111ae8b3f6e67a13af0ac0f4ed Mon Sep 17 00:00:00 2001 From: Kashargul Date: Thu, 19 Sep 2024 20:51:49 +0200 Subject: [PATCH] upgrade and PKA tab --- code/modules/admin/modify_robot.dm | 144 ++++++++- .../ModifyRobotTabs/ModifyRobotModules.tsx | 280 +++++++++--------- .../ModifyRobotTabs/ModifyRobotPKA.tsx | 69 +++++ .../ModifyRobotTabs/ModifyRobotUpgrades.tsx | 110 +++++++ .../interfaces/ModifyRobot/components.tsx | 12 + .../tgui/interfaces/ModifyRobot/constants.ts | 6 + .../tgui/interfaces/ModifyRobot/index.tsx | 73 +++-- .../tgui/interfaces/ModifyRobot/types.ts | 27 ++ 8 files changed, 564 insertions(+), 157 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx create mode 100644 tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotUpgrades.tsx create mode 100644 tgui/packages/tgui/interfaces/ModifyRobot/components.tsx create mode 100644 tgui/packages/tgui/interfaces/ModifyRobot/constants.ts diff --git a/code/modules/admin/modify_robot.dm b/code/modules/admin/modify_robot.dm index 2cd6dc80e28..62f812ff22b 100644 --- a/code/modules/admin/modify_robot.dm +++ b/code/modules/admin/modify_robot.dm @@ -33,6 +33,7 @@ /datum/eventkit/modify_robot/tgui_data(mob/user) . = list() + // Target section for general data if(target) .["target"] = list() .["target"]["name"] = target.name @@ -45,7 +46,9 @@ if(!target.restrict_modules_to.Find(entry)) possible_restrictions += entry .["target"]["possible_restrictions"] = possible_restrictions + // Target section for options once a module has been selected if(target.module) + .["target"]["active"] = target.icon_selected .["target"]["front"] = icon2base64(get_flat_icon(target,dir=SOUTH,no_anim=TRUE)) .["target"]["side"] = icon2base64(get_flat_icon(target,dir=WEST,no_anim=TRUE)) .["target"]["back"] = icon2base64(get_flat_icon(target,dir=NORTH,no_anim=TRUE)) @@ -57,6 +60,78 @@ for(var/module in robot_modules) module_options += module .["model_options"] = module_options + // Data for the upgrade options + var/list/whitelisted_upgrades = list() + var/list/blacklisted_upgrades = list() + for(var/datum/design/item/prosfab/robot_upgrade/restricted/upgrade) + if(!(initial(upgrade.build_path) in target.module.supported_upgrades)) + whitelisted_upgrades += list(list("name" = initial(upgrade.name), "path" = "[initial(upgrade.build_path)]")) + else + blacklisted_upgrades += list(list("name" = initial(upgrade.name), "path" = "[initial(upgrade.build_path)]")) + .["target"]["whitelisted_upgrades"] = whitelisted_upgrades + .["target"]["blacklisted_upgrades"] = blacklisted_upgrades + var/list/utility_upgrades = list() + for(var/datum/design/item/prosfab/robot_upgrade/utility/upgrade) + if(!(target.has_upgrade(initial(upgrade.build_path)))) + utility_upgrades += list(list("name" = initial(upgrade.name), "path" = "[initial(upgrade.build_path)]")) + .["target"]["utility_upgrades"] = utility_upgrades + var/list/basic_upgrades = list() + for(var/datum/design/item/prosfab/robot_upgrade/basic/upgrade) + if(!(target.has_upgrade(initial(upgrade.build_path)))) + basic_upgrades += list(list("name" = initial(upgrade.name), "path" = "[initial(upgrade.build_path)]", "installed" = 0)) + else + basic_upgrades += list(list("name" = initial(upgrade.name), "path" = "[initial(upgrade.build_path)]", "installed" = 1)) + .["target"]["basic_upgrades"] = basic_upgrades + var/list/advanced_upgrades = list() + for(var/datum/design/item/prosfab/robot_upgrade/advanced/upgrade) + if(!(target.has_upgrade(initial(upgrade.build_path)))) + advanced_upgrades += list(list("name" = initial(upgrade.name), "path" = "[initial(upgrade.build_path)]", "installed" = 0)) + else + advanced_upgrades += list(list("name" = initial(upgrade.name), "path" = "[initial(upgrade.build_path)]", "installed" = 1)) + .["target"]["advanced_upgrades"] = advanced_upgrades + var/list/restricted_upgrades = list() + for(var/datum/design/item/prosfab/robot_upgrade/restricted/upgrade) + if(!(target.has_upgrade(initial(upgrade.build_path)))) + if(!(initial(upgrade.build_path) in target.module.supported_upgrades)) + restricted_upgrades += list(list("name" = initial(upgrade.name), "path" = "[initial(upgrade.build_path)]", "installed" = 2)) + continue + restricted_upgrades += list(list("name" = initial(upgrade.name), "path" = "[initial(upgrade.build_path)]", "installed" = 0)) + else + restricted_upgrades += list(list("name" = initial(upgrade.name), "path" = "[initial(upgrade.build_path)]", "installed" = 1)) + .["target"]["restricted_upgrades"] = restricted_upgrades + var/obj/item/weapon/gun/energy/kinetic_accelerator/kin = locate() in target.module.modules + if(kin) + .["target"]["pka"] = list() + var/list/installed_modkits = list() + for(var/obj/item/borg/upgrade/modkit/modkit in kin.modkits) + installed_modkits += list(list("name" = modkit.name, "ref" = "\ref[modkit]", "costs" = modkit.cost)) + .["target"]["pka"]["installed_modkits"] = installed_modkits + var/list/modkits = list() + for(var/modkit in typesof(/obj/item/borg/upgrade/modkit)) + var/obj/item/borg/upgrade/modkit/single_modkit = modkit + if(single_modkit == /obj/item/borg/upgrade/modkit) + continue + if(kin.get_remaining_mod_capacity() < initial(single_modkit.cost)) + modkits += list(list("name" = initial(single_modkit.name), "path" = single_modkit, "costs" = initial(single_modkit.cost), "denied" = TRUE, "denied_by" = "Insufficient capacity!")) + continue + if(initial(single_modkit.denied_type)) + var/number_of_denied = 0 + var/denied = FALSE + for(var/A in kin.get_modkits()) + var/obj/item/borg/upgrade/modkit/M = A + if(istype(M, initial(single_modkit.denied_type))) + number_of_denied++ + if(number_of_denied >= initial(single_modkit.maximum_of_type)) + modkits += list(list("name" = initial(single_modkit.name), "path" = single_modkit, "costs" = initial(single_modkit.cost), "denied" = TRUE, "denied_by" = "[initial(initial(single_modkit.denied_type).name)]")) + denied = TRUE + break + if(denied) + continue + modkits += list(list("name" = initial(single_modkit.name), "path" = single_modkit, "costs" = initial(single_modkit.cost))) + .["target"]["pka"]["modkits"] = modkits + .["target"]["pka"]["capacity"] = kin.get_remaining_mod_capacity() + .["target"]["pka"]["max_capacity"] = kin.max_mod_capacity + // Section for source data for the module we might want to salvage if(source) .["source"] = list() .["source"]["model"] = source.module @@ -89,6 +164,11 @@ if(.) return switch(action) + if("rename") + target.name = params["new_name"] + target.custom_name = params["new_name"] + target.real_name = params["new_name"] + return TRUE if("select_target") target = locate(params["new_target"]) return TRUE @@ -119,7 +199,7 @@ target.module_reset(FALSE) return TRUE if("add_module") - var/obj/item/add_item = locate(params["new_module"]) + var/obj/item/add_item = locate(params["module"]) if(!add_item) return TRUE source.module.emag.Remove(add_item) @@ -172,7 +252,7 @@ item_with_matter.plastic = target.module.synths[found] return TRUE if("rem_module") - var/obj/item/rem_item = locate(params["old_module"]) + var/obj/item/rem_item = locate(params["module"]) target.uneq_all() target.hud_used.update_robot_modules_display(TRUE) target.module.emag.Remove(rem_item) @@ -180,3 +260,63 @@ target.module.contents.Remove(rem_item) qdel(rem_item) return TRUE + if("swap_module") + if(!source) + return FALSE + var/mod_type = source.modtype + qdel(source.module) + var/module_type = robot_modules[target.modtype] + source.modtype = target.modtype + new module_type(source) + source.sprite_datum = target.sprite_datum + source.update_icon() + source.emag_items = 1 + // Target + target.uneq_all() + target.hud_used.update_robot_modules_display(TRUE) + qdel(target.module) + target.modtype = mod_type + module_type = robot_modules[mod_type] + target.transform_with_anim() + new module_type(target) + target.hands.icon_state = target.get_hud_module_icon() + target.hud_used.update_robot_modules_display() + return TRUE + if("add_compatibility") + target.module.supported_upgrades |= text2path(params["upgrade"]) + return TRUE + if("rem_compatibility") + target.module.supported_upgrades.Remove(text2path(params["upgrade"])) + return TRUE + if("add_upgrade") + var/new_upgrade = text2path(params["upgrade"]) + if(new_upgrade == /obj/item/borg/upgrade/utility/reset) + var/obj/item/borg/upgrade/utility/reset/rmodul = new_upgrade + if(tgui_alert(usr, "Are you sure that you want to install [initial(rmodul.name)] and reset the robot's module?","Confirm",list("Yes","No"))!="Yes") + return FALSE + var/obj/item/borg/upgrade/U = new new_upgrade(null) + if(new_upgrade == /obj/item/borg/upgrade/utility/rename) + var/obj/item/borg/upgrade/utility/rename/UN = U + var/new_name = sanitizeSafe(tgui_input_text(usr, "Enter new robot name", "Robot Reclassification", UN.heldname, MAX_NAME_LEN), MAX_NAME_LEN) + if(new_name) + UN.heldname = new_name + U = UN + if(istype(U, /obj/item/borg/upgrade/restricted)) + target.module.supported_upgrades |= new_upgrade + if(!U.action(target)) + return FALSE + U.loc = target + target.hud_used.update_robot_modules_display() + return TRUE + if("install_modkit") + var/new_modkit = text2path(params["modkit"]) + var/obj/item/weapon/gun/energy/kinetic_accelerator/kin = locate() in target.module.modules + var/obj/item/borg/upgrade/modkit/M = new new_modkit(null) + M.install(kin, target) + return TRUE + if("remove_modkit") + var/obj/item/weapon/gun/energy/kinetic_accelerator/kin = locate() in target.module.modules + var/obj/item/rem_kit = locate(params["modkit"]) + kin.modkits.Remove(rem_kit) + qdel(rem_kit) + return TRUE diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotModules.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotModules.tsx index 9e0ebb34d50..606d8bc65e5 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotModules.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotModules.tsx @@ -16,6 +16,7 @@ import { Stack, } from 'tgui/components'; +import { NoSpriteWarning } from '../components'; import { Module, Source, Target } from '../types'; export const ModifyRobotModules = (props: { @@ -29,145 +30,73 @@ export const ModifyRobotModules = (props: { const [searchModuleText, setSearchModulText] = useState(''); return ( - - -
- Robot to salvage - - act('select_source', { - new_source: value, - }) - } - /> - {!!source && ( - <> - - + {!target.active && } + + +
+ Robot to salvage + + act('select_source', { + new_source: value, + }) + } + /> + {!!source && ( + - - setSearchSourceText(value)} - /> - - - - {prepareSearch(source.modules, searchSourceText).map( - (modul_option, i) => { - return ( - - ); - }, - )} - - - - )} -
-
- - -
- {target ? target.module : ''} - act('reset_module')} - tooltip="Allows to reset the module back to default." - > - Reset Module - - - + + + + - ); - }, - )} - - -
-
-
+ + + +
+ {target ? target.module : ''} + act('reset_module')} + tooltip="Allows to reset the module back to default." + > + Reset Module + + + +
+
+ + ); }; @@ -184,3 +113,80 @@ function prepareSearch(modules: Module[], searchText: string = ''): Module[] { }, ])(modules); } + +const SelectionField = (props: { + previewImage: string | null; + searchText: string; + onSearchText: Function; + action: string; + buttonIcon: string; + buttonColor: string; + modules: Module[]; +}) => { + const { act } = useBackend(); + const { + previewImage, + searchText, + onSearchText, + action, + modules, + buttonIcon, + buttonColor, + } = props; + + return ( + <> + + + + onSearchText(value)} + /> + + + + {prepareSearch(modules, searchText).map((modul_option, i) => { + return ( + + ); + })} + + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx new file mode 100644 index 00000000000..8df540316e6 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotPKA.tsx @@ -0,0 +1,69 @@ +import { useBackend } from 'tgui/backend'; +import { Box, Button, Flex, NoticeBox } from 'tgui/components'; + +import { NoSpriteWarning } from '../components'; +import { Target } from '../types'; + +export const ModifyRobotPKA = (props: { target: Target }) => { + const { act } = useBackend(); + const { target } = props; + + return ( + <> + {!target.active && } + {!target.pka ? ( + {target.name} has no PKA installed. + ) : ( + + + Remaining Capacity: {target.pka.capacity} + {target.pka.modkits.map((modkit, i) => { + return ( + + ); + })} + + + + + Used Capacity: {target.pka.max_capacity - target.pka.capacity} + + {target.pka.installed_modkits.map((modkit, i) => { + return ( + + ); + })} + + + )} + + ); +}; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotUpgrades.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotUpgrades.tsx new file mode 100644 index 00000000000..e2ee0026408 --- /dev/null +++ b/tgui/packages/tgui/interfaces/ModifyRobot/ModifyRobotTabs/ModifyRobotUpgrades.tsx @@ -0,0 +1,110 @@ +import { useBackend } from 'tgui/backend'; +import { Button, Flex, Image, Section, Stack } from 'tgui/components'; + +import { NoSpriteWarning } from '../components'; +import { install2col } from '../constants'; +import { Target, Upgrade } from '../types'; + +export const ModifyRobotUpgrades = (props: { target: Target }) => { + const { target } = props; + + return ( + <> + {!target.active && } + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +const UpgradeSection = (props: { + title: string; + upgrades: Upgrade[]; + action: string; +}) => { + const { act } = useBackend(); + const { title, upgrades, action } = props; + return ( +
+ + + {upgrades.map((upgrade, i) => { + return ( + + ); + })} + + +
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/components.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/components.tsx new file mode 100644 index 00000000000..60d3219e4db --- /dev/null +++ b/tgui/packages/tgui/interfaces/ModifyRobot/components.tsx @@ -0,0 +1,12 @@ +import { NoticeBox } from 'tgui/components'; + +export const NoSpriteWarning = (props: { name: string }) => { + const { name } = props; + + return ( + + Warning, {name} has not yet chosen a sprite. Functionality might be + limited. + + ); +}; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/constants.ts b/tgui/packages/tgui/interfaces/ModifyRobot/constants.ts new file mode 100644 index 00000000000..ab554eb3c3e --- /dev/null +++ b/tgui/packages/tgui/interfaces/ModifyRobot/constants.ts @@ -0,0 +1,6 @@ +export const install2col = { + undefined: '', + 0: 'red', + 1: 'green', + 2: 'grey', +}; diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx b/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx index 438d89f5b71..330bdb2b1a5 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx +++ b/tgui/packages/tgui/interfaces/ModifyRobot/index.tsx @@ -2,16 +2,21 @@ import { useState } from 'react'; import { useBackend } from 'tgui/backend'; import { Box, + Button, Divider, Dropdown, + Input, LabeledList, NoticeBox, + Stack, Tabs, } from 'tgui/components'; import { Window } from 'tgui/layouts'; import { ModifyRobotNoModule } from './ModifyRobotNoModule'; import { ModifyRobotModules } from './ModifyRobotTabs/ModifyRobotModules'; +import { ModifyRobotPKA } from './ModifyRobotTabs/ModifyRobotPKA'; +import { ModifyRobotUpgrades } from './ModifyRobotTabs/ModifyRobotUpgrades'; import { Data } from './types'; export const ModifyRobot = (props) => { @@ -19,7 +24,8 @@ export const ModifyRobot = (props) => { const { target, all_robots, source, model_options } = data; - const [tab, setTab] = useState(0); + const [tab, setTab] = useState(0); + const [robotName, setRobotName] = useState(target ? target.name : ''); const tabs: React.JSX.Element[] = []; @@ -30,16 +36,17 @@ export const ModifyRobot = (props) => { model_options={model_options!} /> ); - tabs[1] = ; - tabs[2] = ; + tabs[1] = ; + tabs[2] = ; tabs[3] = ; tabs[4] = ; tabs[5] = ; tabs[6] = ; + tabs[7] = ; return ( - - + + {target ? ( {target.name} @@ -50,15 +57,42 @@ export const ModifyRobot = (props) => { )} - - act('select_target', { - new_target: value, - }) - } - /> + + + + act('select_target', { + new_target: value, + }) + } + /> + + {!!target && ( + <> + + setRobotName(value)} + /> + + + + + + )} + @@ -75,18 +109,21 @@ export const ModifyRobot = (props) => { Upgrade Manager setTab(2)}> - Radio Manager + PKA setTab(3)}> - Component Manager + Radio Manager setTab(4)}> - Access Manager + Component Manager setTab(5)}> - Law Manager + Access Manager setTab(6)}> + Law Manager + + setTab(7)}> Law Sets diff --git a/tgui/packages/tgui/interfaces/ModifyRobot/types.ts b/tgui/packages/tgui/interfaces/ModifyRobot/types.ts index b0e6bf2a462..599fb4fb5e3 100644 --- a/tgui/packages/tgui/interfaces/ModifyRobot/types.ts +++ b/tgui/packages/tgui/interfaces/ModifyRobot/types.ts @@ -16,6 +16,7 @@ export type Target = { name: string; ckey: string; module: string; + active: BooleanLike; crisis_override: BooleanLike; active_restrictions: string[]; possible_restrictions: string[]; @@ -23,6 +24,32 @@ export type Target = { side: string | null; back: string | null; modules: Module[]; + whitelisted_upgrades: Upgrade[]; + blacklisted_upgrades: Upgrade[]; + utility_upgrades: Upgrade[]; + basic_upgrades: Upgrade[]; + advanced_upgrades: Upgrade[]; + restricted_upgrades: Upgrade[]; + pka: + | { + modkits: { + name: string; + path: string; + costs: number; + denied: BooleanLike; + denied_by: string; + }[]; + installed_modkits: { name: string; ref: string; costs: number }[]; + capacity: number; + max_capacity: number; + } + | undefined; +}; + +export type Upgrade = { + name: string; + path: string; + installed: number; }; export type Source = {