using Content.Shared._CP14.Skill.Components; using Content.Shared._CP14.Skill.Prototypes; using Content.Shared.FixedPoint; using Robust.Shared.Prototypes; namespace Content.Shared._CP14.Skill; public abstract partial class CP14SharedSkillSystem : EntitySystem { public override void Initialize() { base.Initialize(); InitializeAdmin(); } /// /// Directly adds the skill to the player, bypassing any checks. /// public bool TryAddSkill(EntityUid target, ProtoId skill, CP14SkillStorageComponent? component = null) { if (!Resolve(target, ref component, false)) return false; if (component.LearnedSkills.Contains(skill)) return false; if (!_proto.TryIndex(skill, out var indexedSkill)) return false; if (indexedSkill.Effect is not null) { indexedSkill.Effect.AddSkill(EntityManager, target); } component.SkillsSumExperience += indexedSkill.LearnCost; component.LearnedSkills.Add(skill); Dirty(target, component); return true; } /// /// Removes the skill from the player, bypassing any checks. /// public bool TryRemoveSkill(EntityUid target, ProtoId skill, CP14SkillStorageComponent? component = null) { if (!Resolve(target, ref component, false)) return false; if (!component.LearnedSkills.Remove(skill)) return false; if (!_proto.TryIndex(skill, out var indexedSkill)) return false; if (indexedSkill.Effect is not null) { indexedSkill.Effect.RemoveSkill(EntityManager, target); } component.SkillsSumExperience -= indexedSkill.LearnCost; Dirty(target, component); return true; } /// /// Checks if the player has the skill. /// public bool HaveSkill(EntityUid target, ProtoId skill, CP14SkillStorageComponent? component = null) { if (!Resolve(target, ref component, false)) return false; return component.LearnedSkills.Contains(skill); } /// /// Checks if the player can learn the specified skill. /// public bool CanLearnSkill(EntityUid target, ProtoId skill, CP14SkillStorageComponent? component = null) { if (!_proto.TryIndex(skill, out var indexedSkill)) return false; return CanLearnSkill(target, indexedSkill, component); } /// /// Checks if the player can learn the specified skill. /// public bool CanLearnSkill(EntityUid target, CP14SkillPrototype skill, CP14SkillStorageComponent? component = null) { if (!Resolve(target, ref component, false)) return false; if (!AllowedToLearn(target, skill, component)) return false; return true; } /// /// Is it allowed to learn this skill? The player may not have enough points to learn it, but has already met all the requirements to learn it. /// public bool AllowedToLearn(EntityUid target, CP14SkillPrototype skill, CP14SkillStorageComponent? component = null) { if (!Resolve(target, ref component, false)) return false; //Already learned if (HaveSkill(target, skill, component)) return false; //Check max cap if (component.SkillsSumExperience + skill.LearnCost > component.ExperienceMaxCap) return false; //Restrictions check foreach (var req in skill.Restrictions) { if (!req.Check(EntityManager, target)) return false; } return true; } /// /// Tries to learn the specified skill for the player. /// public bool TryLearnSkill(EntityUid target, ProtoId skill, CP14SkillStorageComponent? component = null) { if (!Resolve(target, ref component, false)) return false; if (!_proto.TryIndex(skill, out var indexedSkill)) return false; if (!CanLearnSkill(target, skill, component)) return false; if (!TryAddSkill(target, skill, component)) return false; return false; } /// /// Helper function to get the skill name for a given skill prototype. /// public string GetSkillName(ProtoId skill) { if (!_proto.TryIndex(skill, out var indexedSkill)) return string.Empty; if (indexedSkill.Name != null) return Loc.GetString(indexedSkill.Name); if (indexedSkill.Effect != null) return indexedSkill.Effect.GetName(EntityManager, _proto) ?? string.Empty; return string.Empty; } /// /// Helper function to get the skill description for a given skill prototype. /// public string GetSkillDescription(ProtoId skill) { if (!_proto.TryIndex(skill, out var indexedSkill)) return string.Empty; if (indexedSkill.Desc != null) return Loc.GetString(indexedSkill.Desc); if (indexedSkill.Effect != null) return indexedSkill.Effect.GetDescription(EntityManager, _proto) ?? string.Empty; return string.Empty; } }