-- AltSystem Data Definitions -- Contains skill data (fetched from TRP3 profile), item options, defense options, and modifier constants. AltSystem = AltSystem or {} AltSystem.Data = {} -- Skill levels and their modifiers AltSystem.Data.SkillLevels = { ["Novice"] = -2, ["Adept"] = 0, ["Expert"] = 2, ["Master"] = 4, } -- The "Unskilled" entry is always the first (default) skill local UNSKILLED_ENTRY = { name = "Unskilled", level = "Unskilled", modifier = -4 } -- Default/fallback skill list used when no TRP3 profile skills are found local DEFAULT_SKILLS = { { name = "Unskilled", level = "Unskilled", modifier = -4 }, { name = "Novice Skill", level = "Novice", modifier = -2 }, { name = "Adept Skill", level = "Adept", modifier = 0 }, { name = "Expert Skill", level = "Expert", modifier = 2 }, { name = "Master Skill", level = "Master", modifier = 4 }, } -- Parse the skill level from the right-side text of a TRP3 personality trait. -- The level keyword must appear at the start of the string; anything after it is ignored. -- Returns the level string and modifier, or nil if not recognized. local function ParseSkillLevel(rightText) if not rightText or rightText == "" then return nil, nil end -- Trim leading/trailing whitespace local trimmed = rightText:match("^%s*(.-)%s*$") if not trimmed or trimmed == "" then return nil, nil end -- Check if the text starts with a recognized level keyword for _, levelName in ipairs({"Master", "Expert", "Adept", "Novice"}) do if trimmed == levelName or trimmed:match("^" .. levelName .. "[%s%p]") then return levelName, AltSystem.Data.SkillLevels[levelName] end end return nil, nil end -- Fetch skills from the current TRP3 profile's personality traits. -- Returns an array of skill entries, always starting with "Unskilled". -- Falls back to the default list if no profile or no valid skills are found. function AltSystem.Data:RefreshSkills() local skills = {} -- Always add Unskilled as the first entry table.insert(skills, { name = UNSKILLED_ENTRY.name, level = UNSKILLED_ENTRY.level, modifier = UNSKILLED_ENTRY.modifier }) local foundAny = false -- Try to read personality traits from the active TRP3 profile if TRP3_API and TRP3_API.profile and TRP3_API.profile.getData then local ok, characteristics = pcall(TRP3_API.profile.getData, "player/characteristics") if ok and characteristics and characteristics.PS then for _, trait in ipairs(characteristics.PS) do local skillName = trait.LT local rightText = trait.RT if skillName and skillName ~= "" then local level, modifier = ParseSkillLevel(rightText) if level and modifier then foundAny = true table.insert(skills, { name = skillName, level = level, modifier = modifier, }) end end end end end -- If no valid skills were found, use the default fallback list (skip first "Unskilled" since we already added it) if not foundAny then skills = {} for _, skill in ipairs(DEFAULT_SKILLS) do table.insert(skills, { name = skill.name, level = skill.level, modifier = skill.modifier }) end end AltSystem.Data.Skills = skills return skills end -- Initialize with the default skill list AltSystem.Data.Skills = {} for _, skill in ipairs(DEFAULT_SKILLS) do table.insert(AltSystem.Data.Skills, { name = skill.name, level = skill.level, modifier = skill.modifier }) end -- Item options: name and modifier (first entry = no item) AltSystem.Data.Items = { { name = "No item", modifier = 0 }, { name = "Rare item", modifier = 3 }, { name = "Epic item", modifier = 5 }, } -- Defense options: name and modifier AltSystem.Data.Defenses = { { name = "Base armor", modifier = 0 }, { name = "Extra small armor", modifier = 1 }, { name = "Extra large armor", modifier = 2 }, } -- Shield modifier AltSystem.Data.ShieldModifier = 1