diff --git a/code/modules/modular_computers/file_system/programs/skill_tracker.dm b/code/modules/modular_computers/file_system/programs/skill_tracker.dm new file mode 100644 index 00000000000..36eccef338b --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/skill_tracker.dm @@ -0,0 +1,66 @@ +/datum/computer_file/program/skill_tracker + filename = "skilltracker" + filedesc = "ExperTrak Skill Tracker" + category = PROGRAM_CATEGORY_MISC + program_icon_state = "generic" + extended_desc = "Scan and view your current marketable job skills." + size = 2 + tgui_id = "NtosSkillTracker" + program_icon = "medal" + usage_flags = PROGRAM_TABLET // Must be a handheld device to read read your chakras or whatever + +/datum/computer_file/program/skill_tracker/ui_data(mob/user) + var/list/data = get_header_data() + + var/list/skills = list() + data["skills"] = skills + + var/datum/mind/targetmind = user.mind + if(targetmind) + for (var/type in GLOB.skill_types) + var/datum/skill/skill = GetSkillRef(type) + var/lvl_num = targetmind.get_skill_level(type) + var/lvl_name = uppertext(targetmind.get_skill_level_name(type)) + var/exp = targetmind.get_skill_exp(type) + var/xp_prog_to_level = targetmind.exp_needed_to_level_up(type) + var/xp_req_to_level = 0 + if (xp_prog_to_level && lvl_num < length(SKILL_EXP_LIST)) // is it even possible to level up? + xp_req_to_level = SKILL_EXP_LIST[lvl_num+1] - SKILL_EXP_LIST[lvl_num] + + var/list/skilldata = list( + "name" = skill.name, + "desc" = skill.desc, + "title" = skill.title, + "lvl_name" = lvl_name + ) + if (exp && xp_req_to_level) + skilldata["progress_percent"] = (xp_req_to_level-xp_prog_to_level)/xp_req_to_level + skilldata["overall_percent"] = exp / SKILL_EXP_LIST[length(SKILL_EXP_LIST)] + if (lvl_num >= length(SKILL_EXP_LIST) && !(type in targetmind.skills_rewarded)) + skilldata["reward"] = TRUE + skills[++skills.len] = skilldata + + return data + +/datum/computer_file/program/skill_tracker/proc/find_skilltype(name) + for(var/type in GLOB.skill_types) + var/datum/skill/skill = GetSkillRef(type) + if(skill.name == name) + return type + + return null + +/datum/computer_file/program/skill_tracker/ui_act(action, params, datum/tgui/ui) + . = ..() + if(.) + return + + switch(action) + if("PRG_reward") + var/skill_type = find_skilltype(params["skill"]) + if(skill_type) + var/datum/skill/skill = GetSkillRef(skill_type) + var/datum/mind/mind = ui.user.mind + var/new_level = mind.get_skill_level(skill_type) + skill.try_skill_reward(mind, new_level) + return TRUE diff --git a/tgstation.dme b/tgstation.dme index b43519921fe..61a41c5833a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3289,6 +3289,7 @@ #include "code\modules\modular_computers\file_system\programs\robotact.dm" #include "code\modules\modular_computers\file_system\programs\secureye.dm" #include "code\modules\modular_computers\file_system\programs\signaler.dm" +#include "code\modules\modular_computers\file_system\programs\skill_tracker.dm" #include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" #include "code\modules\modular_computers\file_system\programs\techweb.dm" #include "code\modules\modular_computers\file_system\programs\antagonist\contract_uplink.dm" diff --git a/tgui/packages/tgui/interfaces/NtosSkillTracker.js b/tgui/packages/tgui/interfaces/NtosSkillTracker.js new file mode 100644 index 00000000000..4bc719ffb54 --- /dev/null +++ b/tgui/packages/tgui/interfaces/NtosSkillTracker.js @@ -0,0 +1,87 @@ +import { useBackend } from '../backend'; +import { Button, Section, Table, BlockQuote, ProgressBar, AnimatedNumber } from '../components'; +import { NtosWindow } from '../layouts'; + +export const NtosSkillTracker = (props, context) => { + const { act, data } = useBackend(context); + const { + skills = {}, + } = data; + return ( + + +
+ {skills.map((skill, idx) => ( +
+
+ {skill.desc} +
+
+ + + + Level + + + Level Progress + + + Overall Progress + + + + + {skill.lvl_name} + + + {skill.progress_percent ? ( + + % + + ) : ('—')} + + + {skill.overall_percent ? ( + + % + + ) : ('—')} + + + {!!skill.reward && ( + + + + + + )} +
+
+
+ ))} +
+
+
+ ); +};