using Content.Shared._CP14.Skills.Components; using Content.Shared._CP14.Skills.Prototypes; using Robust.Shared.Prototypes; using Robust.Shared.Random; namespace Content.Shared._CP14.Skills; public partial class SharedCP14SkillSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _proto = default!; public override void Initialize() { SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(AutoAddSkill); } private void AutoAddSkill(Entity ent, ref MapInitEvent args) { foreach (var skill in ent.Comp.Skills) { TryLearnSkill(ent, skill); } RemComp(ent, ent.Comp); } private void OnMapInit(Entity ent, ref MapInitEvent args) { foreach (var skill in ent.Comp.Skills) { TryLearnSkill(ent, skill, force: true); } } public bool HasEnoughSkillToUse(EntityUid user, EntityUid target, out List> missingSkills) { missingSkills = new(); if (!TryComp(target, out var requirement) || requirement.RequiredSkills.Count == 0) return true; if (!TryComp(user, out var skillStorage)) { missingSkills = requirement.RequiredSkills; return false; } var success = requirement.NeedAll; foreach (var skill in requirement.RequiredSkills) { var hasSkill = skillStorage.Skills.Contains(skill); if (requirement.NeedAll && !hasSkill) { missingSkills.Add(skill); success = false; } else if (!requirement.NeedAll && hasSkill) { success = true; } else if (!requirement.NeedAll && !hasSkill) { missingSkills.Add(skill); } } return success; } public bool TryLearnSkill(EntityUid uid, ProtoId skill, bool force = false) { if (!TryComp(uid, out var skillStorage)) return false; if (!skillStorage.Skills.Contains(skill)) { skillStorage.Skills.Add(skill); if (!force) return false; } var proto = _proto.Index(skill); EntityManager.AddComponents(uid, proto.Components); return true; } public bool TryForgotSkill(EntityUid uid, ProtoId skill) { if (!TryComp(uid, out var skillStorage)) return false; if (!skillStorage.Skills.Contains(skill)) return false; skillStorage.Skills.Remove(skill); var proto = _proto.Index(skill); EntityManager.RemoveComponents(uid, proto.Components); return true; } } public sealed partial class CP14TrySkillIssueEvent : EntityEventArgs { public readonly EntityUid User; public CP14TrySkillIssueEvent(EntityUid uid) { User = uid; } }