From dae647616f2dddbe5e312ad6ab9cf6c0c708fdd8 Mon Sep 17 00:00:00 2001 From: aw-c Date: Fri, 22 Nov 2024 11:59:30 +0300 Subject: [PATCH 01/43] init skills --- .../AWS/Skills/CharacterSkillComponent.cs | 10 ++ .../AWS/Skills/RequiredSkillComponent.cs | 7 ++ .../AWS/Skills/SharedSkillSystem.cs | 91 +++++++++++++++++++ .../AWS/Skills/SkillCategoryPrototype.cs | 9 ++ Content.Shared/AWS/Skills/SkillContainer.cs | 16 ++++ Content.Shared/AWS/Skills/SkillLevel.cs | 10 ++ Content.Shared/AWS/Skills/SkillPrototype.cs | 15 +++ .../AWS/Skills/Attributes/driving.yml | 5 + .../AWS/Skills/Attributes/economy.yml | 8 ++ .../AWS/Skills/Attributes/electricity.yml | 8 ++ .../AWS/Skills/Attributes/melee.yml | 8 ++ .../AWS/Skills/Attributes/stamina.yml | 8 ++ .../AWS/Skills/Attributes/weapon.yml | 8 ++ .../Prototypes/AWS/Skills/categories.yml | 20 ++++ 14 files changed, 223 insertions(+) create mode 100644 Content.Shared/AWS/Skills/CharacterSkillComponent.cs create mode 100644 Content.Shared/AWS/Skills/RequiredSkillComponent.cs create mode 100644 Content.Shared/AWS/Skills/SharedSkillSystem.cs create mode 100644 Content.Shared/AWS/Skills/SkillCategoryPrototype.cs create mode 100644 Content.Shared/AWS/Skills/SkillContainer.cs create mode 100644 Content.Shared/AWS/Skills/SkillLevel.cs create mode 100644 Content.Shared/AWS/Skills/SkillPrototype.cs create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/driving.yml create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/economy.yml create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/electricity.yml create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/melee.yml create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/stamina.yml create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/weapon.yml create mode 100644 Resources/Prototypes/AWS/Skills/categories.yml diff --git a/Content.Shared/AWS/Skills/CharacterSkillComponent.cs b/Content.Shared/AWS/Skills/CharacterSkillComponent.cs new file mode 100644 index 0000000000..a21e56ba57 --- /dev/null +++ b/Content.Shared/AWS/Skills/CharacterSkillComponent.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.AWS.Skills; + +public sealed partial class CharacterSkillComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite)] + public SkillContainer Container; // should be autogenerated by different system + + [ViewVariables(VVAccess.ReadWrite)] + public SkillContainer? ContainerUpgraded; +} diff --git a/Content.Shared/AWS/Skills/RequiredSkillComponent.cs b/Content.Shared/AWS/Skills/RequiredSkillComponent.cs new file mode 100644 index 0000000000..5c4ff1f454 --- /dev/null +++ b/Content.Shared/AWS/Skills/RequiredSkillComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared.AWS.Skills; + +public sealed partial class RequiredSkillComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite), DataField] + public SkillContainer Container = new(); +} diff --git a/Content.Shared/AWS/Skills/SharedSkillSystem.cs b/Content.Shared/AWS/Skills/SharedSkillSystem.cs new file mode 100644 index 0000000000..fa9ac97756 --- /dev/null +++ b/Content.Shared/AWS/Skills/SharedSkillSystem.cs @@ -0,0 +1,91 @@ +using Content.Shared.Humanoid; +using JetBrains.Annotations; +using Robust.Shared.Prototypes; +using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace Content.Shared.AWS.Skills; + +public abstract class SharedSkillSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + + const bool lowpop = false; // условно пока так будет окда + + public override void Initialize() + { + base.Initialize(); + } + + [PublicAPI] + public bool CanReachSkillLevel(HumanoidAppearanceComponent component, ProtoId skillName, SkillLevel level) + { + return false; + } + + [PublicAPI] + public SkillLevel GetSkillLevel(EntityUid ent, ProtoId skillName) + { + if (lowpop) + return SkillLevel.Trained; + + if (TryComp(ent, out var comp) && comp.Container is not null) + if (comp.Container.Skills.TryGetValue(skillName, out var skillLevel)) + return skillLevel; + + return SkillLevel.NonSkilled; + } + + [PublicAPI] + public ReadOnlyDictionary, SkillLevel> GetSkills(EntityUid ent) + { + if (TryComp(ent, out var comp) && comp.Container is not null) + return comp.Container.Skills.AsReadOnly(); + + return new Dictionary, SkillLevel>().AsReadOnly(); + } + + [PublicAPI] + public ReadOnlyCollection GetCategories() + { + return _prototypeManager.GetInstances().Values.AsReadOnly(); + } + + [PublicAPI] + public ReadOnlyCollection GetSkills() + { + return _prototypeManager.GetInstances().Values.AsReadOnly(); + } + + [PublicAPI] + public bool IsSkillBlocked(EntityUid ent, ProtoId skillName, SkillLevel skillLevel, [NotNullWhen(true)] out string? error) + { + error = null; + return false; + } + + [PublicAPI] + public bool TrySetSkillLevel(EntityUid ent, ProtoId skillName, SkillLevel skillLevel, [NotNullWhen(false)] out string? error) + { + error = null; + + if (!TryComp(ent, out var comp)) + { + error = "cannot have skills"; + return false; + } + + if (IsSkillBlocked(ent, skillName, skillLevel, out error)) + return false; + + SetSkillLevel((ent, comp), skillName, skillLevel); + return true; + } + + private void SetSkillLevel(Entity ent, ProtoId skillName, SkillLevel skillLevel) + { + if (ent.Comp.Container is not null) + ent.Comp.Container.Skills[skillName] = skillLevel; + } +} diff --git a/Content.Shared/AWS/Skills/SkillCategoryPrototype.cs b/Content.Shared/AWS/Skills/SkillCategoryPrototype.cs new file mode 100644 index 0000000000..e14b0924ff --- /dev/null +++ b/Content.Shared/AWS/Skills/SkillCategoryPrototype.cs @@ -0,0 +1,9 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.AWS.Skills; + +[Prototype("skillCategory")] +public sealed partial class SkillCategoryPrototype : IPrototype +{ + [IdDataField] public string ID { get; } = string.Empty; +} diff --git a/Content.Shared/AWS/Skills/SkillContainer.cs b/Content.Shared/AWS/Skills/SkillContainer.cs new file mode 100644 index 0000000000..e084fca60c --- /dev/null +++ b/Content.Shared/AWS/Skills/SkillContainer.cs @@ -0,0 +1,16 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.AWS.Skills; + +[Serializable] +public sealed class SkillContainer +{ + [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] + public Dictionary, SkillLevel> Skills = new(); + + [ViewVariables(VVAccess.ReadWrite), DataField] + public Dictionary, List> UnblockedSkillLevels = new(); + + [ViewVariables(VVAccess.ReadWrite), DataField] + public uint AdditionalSkillPoints = 0; +} diff --git a/Content.Shared/AWS/Skills/SkillLevel.cs b/Content.Shared/AWS/Skills/SkillLevel.cs new file mode 100644 index 0000000000..fbbd1f517f --- /dev/null +++ b/Content.Shared/AWS/Skills/SkillLevel.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.AWS.Skills; + +public enum SkillLevel +{ + NonSkilled, + Basic, + Trained, + Experienced, + Master, +} diff --git a/Content.Shared/AWS/Skills/SkillPrototype.cs b/Content.Shared/AWS/Skills/SkillPrototype.cs new file mode 100644 index 0000000000..951659fb0b --- /dev/null +++ b/Content.Shared/AWS/Skills/SkillPrototype.cs @@ -0,0 +1,15 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.AWS.Skills; + +[Prototype("skill")] +public sealed partial class SkillPrototype : IPrototype +{ + [IdDataField] public string ID { get; } = string.Empty; + + [ViewVariables(VVAccess.ReadWrite), DataField] + public Dictionary Cost = new(); + + [ViewVariables(VVAccess.ReadWrite), DataField] + public List Blocked = new(); +} diff --git a/Resources/Prototypes/AWS/Skills/Attributes/driving.yml b/Resources/Prototypes/AWS/Skills/Attributes/driving.yml new file mode 100644 index 0000000000..b5cbd342c0 --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/driving.yml @@ -0,0 +1,5 @@ +- type: skill + id: driving + cost: + - enum.SkillLevel.NonSkilled: 0 + - enum.SkillLevel.Skilled: 2 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/economy.yml b/Resources/Prototypes/AWS/Skills/Attributes/economy.yml new file mode 100644 index 0000000000..9a9c9ec68b --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/economy.yml @@ -0,0 +1,8 @@ +- type: skill + id: economy + cost: + - enum.SkillLevel.NonSkilled: 0 + - enum.SkillLevel.Minimum: 1 + - enum.SkillLevel.Basic: 2 + - enum.SkillLevel.Skilled: 4 + - enum.SkillLevel.Expert: 6 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml b/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml new file mode 100644 index 0000000000..41e65bb703 --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml @@ -0,0 +1,8 @@ +- type: skill + id: electricity + cost: + - enum.SkillLevel.NonSkilled: 0 + - enum.SkillLevel.Minimum: 1 + - enum.SkillLevel.Basic: 2 + - enum.SkillLevel.Skilled: 4 + - enum.SkillLevel.Expert: 6 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/melee.yml b/Resources/Prototypes/AWS/Skills/Attributes/melee.yml new file mode 100644 index 0000000000..f4929718e5 --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/melee.yml @@ -0,0 +1,8 @@ +- type: skill + id: melee + cost: + - enum.SkillLevel.NonSkilled: 0 + - enum.SkillLevel.Minimum: 1 + - enum.SkillLevel.Basic: 2 + - enum.SkillLevel.Skilled: 4 + - enum.SkillLevel.Expert: 6 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/stamina.yml b/Resources/Prototypes/AWS/Skills/Attributes/stamina.yml new file mode 100644 index 0000000000..f5197bc846 --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/stamina.yml @@ -0,0 +1,8 @@ +- type: skill + id: stamina + cost: + - enum.SkillLevel.NonSkilled: 0 + - enum.SkillLevel.Minimum: 1 + - enum.SkillLevel.Basic: 2 + - enum.SkillLevel.Skilled: 4 + - enum.SkillLevel.Expert: 6 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/weapon.yml b/Resources/Prototypes/AWS/Skills/Attributes/weapon.yml new file mode 100644 index 0000000000..acf5670d7d --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/weapon.yml @@ -0,0 +1,8 @@ +- type: skill + id: weapon + cost: + - enum.SkillLevel.NonSkilled: 0 + - enum.SkillLevel.Minimum: 1 + - enum.SkillLevel.Basic: 2 + - enum.SkillLevel.Skilled: 4 + - enum.SkillLevel.Expert: 6 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/categories.yml b/Resources/Prototypes/AWS/Skills/categories.yml new file mode 100644 index 0000000000..56c6563fe0 --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/categories.yml @@ -0,0 +1,20 @@ +- type: skillCategory + id: organizing + +- type: skillCategory + id: common + +- type: skillCategory + id: engineering + +- type: skillCategory + id: medicine + +- type: skillCategory + id: research + +- type: skillCategory + id: security + +- type: skillCategory + id: service \ No newline at end of file From 912a1eb478df3963f58fd85f4d32f8de3313324c Mon Sep 17 00:00:00 2001 From: aw-c Date: Sun, 24 Nov 2024 21:07:56 +0300 Subject: [PATCH 02/43] pupupu --- Content.Client/AWS/Skills/SkillSystem.cs | 11 +++++++++++ Content.Shared/AWS/Skills/SharedSkillSystem.cs | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Content.Client/AWS/Skills/SkillSystem.cs diff --git a/Content.Client/AWS/Skills/SkillSystem.cs b/Content.Client/AWS/Skills/SkillSystem.cs new file mode 100644 index 0000000000..da9c7aeb97 --- /dev/null +++ b/Content.Client/AWS/Skills/SkillSystem.cs @@ -0,0 +1,11 @@ +using Content.Shared.AWS.Skills; + +namespace Content.Client.AWS.Skills; + +public sealed class SkillSystem : SharedSkillSystem +{ + public override void Initialize() + { + base.Initialize(); + } +} diff --git a/Content.Shared/AWS/Skills/SharedSkillSystem.cs b/Content.Shared/AWS/Skills/SharedSkillSystem.cs index fa9ac97756..8e3163f75a 100644 --- a/Content.Shared/AWS/Skills/SharedSkillSystem.cs +++ b/Content.Shared/AWS/Skills/SharedSkillSystem.cs @@ -7,7 +7,7 @@ namespace Content.Shared.AWS.Skills; -public abstract class SharedSkillSystem : EntitySystem +public sealed class SharedSkillSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; From 9b4e03e30c1ac68f919bb9b7182de4ba9b366cb3 Mon Sep 17 00:00:00 2001 From: aw-c Date: Thu, 5 Dec 2024 03:09:00 +0300 Subject: [PATCH 03/43] skill logic controller --- .../AWS/Skills/SkillsBoundUserInterface.cs | 38 ++ Content.Client/AWS/Skills/SkillsWindow.xaml | 14 + .../AWS/Skills/SkillsWindow.xaml.cs | 23 ++ Content.Client/Content.Client.csproj | 13 + .../Lobby/UI/HumanoidProfileEditor.xaml.cs | 376 ++++++++++++------ .../AWS/Skills/CharacterSkillComponent.cs | 3 + .../AWS/Skills/RequiredSkillComponent.cs | 3 + .../AWS/Skills/SharedSkillSystem.cs | 26 +- Content.Shared/AWS/Skills/SkillContainer.cs | 7 +- .../AWS/Skills/SkillPointController.cs | 105 +++++ Content.Shared/AWS/Skills/SkillPrototype.cs | 9 +- .../Locale/ru-RU/aws/skills/categories.ftl | 7 + .../ru-RU/aws/skills/humanoid-profile.ftl | 1 + Resources/Locale/ru-RU/aws/skills/levels.ftl | 5 + Resources/Locale/ru-RU/aws/skills/skills.ftl | 6 + .../AWS/Skills/Attributes/driving.yml | 5 +- .../AWS/Skills/Attributes/economy.yml | 11 +- .../AWS/Skills/Attributes/electricity.yml | 11 +- .../AWS/Skills/Attributes/melee.yml | 11 +- .../AWS/Skills/Attributes/stamina.yml | 11 +- .../AWS/Skills/Attributes/weapon.yml | 11 +- 21 files changed, 522 insertions(+), 174 deletions(-) create mode 100644 Content.Client/AWS/Skills/SkillsBoundUserInterface.cs create mode 100644 Content.Client/AWS/Skills/SkillsWindow.xaml create mode 100644 Content.Client/AWS/Skills/SkillsWindow.xaml.cs create mode 100644 Content.Shared/AWS/Skills/SkillPointController.cs create mode 100644 Resources/Locale/ru-RU/aws/skills/categories.ftl create mode 100644 Resources/Locale/ru-RU/aws/skills/humanoid-profile.ftl create mode 100644 Resources/Locale/ru-RU/aws/skills/levels.ftl create mode 100644 Resources/Locale/ru-RU/aws/skills/skills.ftl diff --git a/Content.Client/AWS/Skills/SkillsBoundUserInterface.cs b/Content.Client/AWS/Skills/SkillsBoundUserInterface.cs new file mode 100644 index 0000000000..c85d73ddb7 --- /dev/null +++ b/Content.Client/AWS/Skills/SkillsBoundUserInterface.cs @@ -0,0 +1,38 @@ +using Content.Shared.Ame.Components; +using JetBrains.Annotations; +using Robust.Client.UserInterface; + +namespace Content.Client.AWS.Skills +{ + [UsedImplicitly] + public sealed class SkillsBoundUserInterface : BoundUserInterface + { + private SkillsWindow? _window; + + public SkillsBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + + } + + protected override void Open() + { + base.Open(); + + _window = this.CreateWindow(); + + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + var castState = (AmeControllerBoundUserInterfaceState) state; + _window?.UpdateState(castState); //Update window state + } + + public void ButtonPressed(UiButton button) + { + SendMessage(new UiButtonPressedMessage(button)); + } + } +} diff --git a/Content.Client/AWS/Skills/SkillsWindow.xaml b/Content.Client/AWS/Skills/SkillsWindow.xaml new file mode 100644 index 0000000000..a9e6e6eb0c --- /dev/null +++ b/Content.Client/AWS/Skills/SkillsWindow.xaml @@ -0,0 +1,14 @@ + + diff --git a/Content.Client/AWS/Skills/SkillsWindow.xaml.cs b/Content.Client/AWS/Skills/SkillsWindow.xaml.cs new file mode 100644 index 0000000000..9bbf6eb59c --- /dev/null +++ b/Content.Client/AWS/Skills/SkillsWindow.xaml.cs @@ -0,0 +1,23 @@ +using System.Linq; +using Content.Client.UserInterface; +using Content.Shared.Ame.Components; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client.AWS.Skills +{ + [GenerateTypedNameReferences] + public sealed partial class SkillsWindow : DefaultWindow + { + public SkillsWindow() + { + RobustXamlLoader.Load(this); + IoCManager.InjectDependencies(this); + } + + public void UpdateState(BoundUserInterfaceState state) + { + } + } +} diff --git a/Content.Client/Content.Client.csproj b/Content.Client/Content.Client.csproj index 384b7c30ef..d4fab6c7e5 100644 --- a/Content.Client/Content.Client.csproj +++ b/Content.Client/Content.Client.csproj @@ -33,4 +33,17 @@ + + + + + + MSBuild:Compile + + + + + SkillsWindow.xaml + + diff --git a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs index e0b0ffba06..c2f54e6f51 100644 --- a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs @@ -2,6 +2,8 @@ using System.Linq; using System.Numerics; using Content.Client.Administration.UI; +using Content.Client.Guidebook; +using Content.Client.AWS.Skills; using Content.Client.Humanoid; using Content.Client.Message; using Content.Client.Players.PlayTimeTracking; @@ -13,6 +15,7 @@ using Content.Shared._EE.Contractors.Prototypes; using Content.Shared._White.CCVar; using Content.Shared._White.Humanoid.Prototypes; +using Content.Shared.AWS.Skills; using Content.Shared.CCVar; using Content.Shared.Clothing.Components; using Content.Shared.Clothing.Loadouts.Prototypes; @@ -144,6 +147,9 @@ public sealed partial class HumanoidProfileEditor : BoxContainer [ValidatePrototypeId] private const string MimeNames = "MimeNames"; // WD EDIT END + //SS14RU + private SkillPointController? _skillPointController; + //SS14RU public HumanoidProfileEditor( IClientPreferencesManager preferencesManager, @@ -626,6 +632,14 @@ IRobustRandom random #endregion Markings + #region SS14RU-SKILLS + + // TabContainer.SetTabTitle(5, Loc.GetString("Навыки")); SS14RU + + // RefreshSkills(); + + #endregion SS14RU-SKILLS + RefreshFlavorText(); #endregion Left @@ -1071,141 +1085,239 @@ private void OnSpeciesInfoButtonPressed(BaseButton.ButtonEventArgs args) } } + // SS14RU + // public void UpdateLeftSkillPoints(uint left) + // { + // LeftSkillPoints.Text = Loc.GetString("skills-leftskillpoints", ("leftSkillPoints", left)); + // } + // public void RefreshSkills() + // { + // _skillPointController = new(30, [], null, null); + // _skillPointController.OnRecalculateSkill += (protoId) => + // { + // UpdateLeftSkillPoints(_skillPointController.CurrentPoints); + // }; + + // SkillsList.DisposeAllChildren(); + // var firstCategory = true; + + // var skillSystem = _entManager.System(); + // var skills = skillSystem.GetSkills(); + + // skills.Sort((x, y) => string.Compare(x.ID, y.ID, StringComparison.Ordinal)); + + // var skillGroups = skills.GroupBy(skill => skill.Category) + // .ToDictionary(group => group.Key, group => group.ToList()); + + // foreach (var kvp in skillGroups) + // { + // var categoryId = kvp.Key; + // var categorySkills = kvp.Value; + + // var categoryName = Loc.GetString($"skills-category-{categoryId}"); + + // var categoryPanel = new BoxContainer + // { + // Orientation = LayoutOrientation.Vertical, + // Name = categoryId, + // ToolTip = Loc.GetString("skill-category-tooltip", ("categoryName", categoryName)) + // }; + + // if (firstCategory) + // firstCategory = false; + // else + // categoryPanel.AddChild(new Control + // { + // MinSize = new Vector2(0, 23), + // }); + + // categoryPanel.AddChild(new Label + // { + // Text = categoryName, + // Margin = new Thickness(5f, 0, 0, 0) + // }); + + // SkillsList.AddChild(categoryPanel); + + // foreach (var skill in categorySkills) + // { + // var skillContainer = new BoxContainer() + // { + // Orientation = LayoutOrientation.Horizontal, + // }; + + // var skillLabel = new Label + // { + // Text = Loc.GetString($"skills-skillname-{skill.ID}"), + // Margin = new Thickness(5f, 3f, 0f, 3f) + // }; + + // skillContainer.AddChild(skillLabel); + + // foreach (SkillLevel level in Enum.GetValues(typeof(SkillLevel))) + // { + // if (!_skillPointController.CanHaveSkillLevel(skill.ID, level)) + // continue; + + // var levelButton = new Button + // { + // Text = Loc.GetString($"skills-level-{level}"), + // Margin = new Thickness(5f, 3f, 3f, 3f), + // }; + + // levelButton.OnPressed += args => + // { + // _skillPointController.ProcessSkill(skill.ID, level); + // }; + + // skillContainer.AddChild(levelButton); + // } + + // categoryPanel.AddChild(skillContainer); + // } + // } + + // UpdateLeftSkillPoints(_skillPointController.CurrentPoints); + + // } + // SS14RU + /// Refreshes all job selectors + /// /// Refreshes all job selectors. /// - public void RefreshJobs() - { - JobList.DisposeAllChildren(); - _jobCategories.Clear(); - _jobPriorities.Clear(); - - // Get all displayed departments - var departments = new List(); - foreach (var department in _prototypeManager.EnumeratePrototypes()) - { - if (department.EditorHidden) - continue; - - departments.Add(department); - } - - departments.Sort(DepartmentUIComparer.Instance); - - var items = new[] - { - ("humanoid-profile-editor-job-priority-never-button", (int) JobPriority.Never), - ("humanoid-profile-editor-job-priority-low-button", (int) JobPriority.Low), - ("humanoid-profile-editor-job-priority-medium-button", (int) JobPriority.Medium), - ("humanoid-profile-editor-job-priority-high-button", (int) JobPriority.High), - }; - - var firstCategory = true; - foreach (var department in departments) - { - var departmentName = Loc.GetString($"department-{department.ID}"); - - if (!_jobCategories.TryGetValue(department.ID, out var category)) - { - category = new AlternatingBGContainer - { - Orientation = LayoutOrientation.Vertical, - Name = department.ID, - ToolTip = Loc.GetString("humanoid-profile-editor-jobs-amount-in-department-tooltip", - ("departmentName", departmentName)), - Margin = new(0, firstCategory ? 0 : 20, 0, 0), - Children = - { - new Label - { - Text = Loc.GetString("humanoid-profile-editor-department-jobs-label", - ("departmentName", departmentName)), - StyleClasses = { StyleBase.StyleClassLabelHeading, }, - Margin = new(5f, 0, 0, 0), - }, - }, - }; - - firstCategory = false; - _jobCategories[department.ID] = category; - JobList.AddChild(category); - } - - var jobs = department.Roles.Select(jobId => _prototypeManager.Index(jobId)) - .Where(job => job.SetPreference) - .ToArray(); - - Array.Sort(jobs, JobUIComparer.Instance); - - foreach (var job in jobs) - { - var jobContainer = new BoxContainer { Orientation = LayoutOrientation.Horizontal, HorizontalExpand = true, }; - var selector = new RequirementsSelector { Margin = new(3f, 3f, 3f, 0f), HorizontalExpand = true, }; - selector.OnOpenGuidebook += OnOpenGuidebook; - - var icon = new TextureRect - { - TextureScale = new(2, 2), - VerticalAlignment = VAlignment.Center - }; - var jobIcon = _prototypeManager.Index(job.Icon); - icon.Texture = jobIcon.Icon.Frame0(); - selector.Setup(items, job.LocalizedName, 200, job.LocalizedDescription, icon, job.Guides); - - if (!_requirements.CheckJobWhitelist(job, out var reason)) - selector.LockRequirements(reason); - else if (!_characterRequirementsSystem.CheckRequirementsValid( - _roleSystem.GetJobRequirement(job) ?? new(), - job, - Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetRawPlayTimeTrackers(), - _requirements.IsWhitelisted(), - job, - _entManager, - _prototypeManager, - _cfgManager, - out var reasons)) - selector.LockRequirements(_characterRequirementsSystem.GetRequirementsText(reasons)); - else - selector.UnlockRequirements(); - - selector.OnSelected += selectedPrio => - { - var selectedJobPrio = (JobPriority) selectedPrio; - Profile = Profile?.WithJobPriority(job.ID, selectedJobPrio); - - foreach (var (jobId, other) in _jobPriorities) - { - // Sync other selectors with the same job in case of multiple department jobs - if (jobId == job.ID) - { - other.Select(selectedPrio); - continue; - } - - if (selectedJobPrio != JobPriority.High || (JobPriority) other.Selected != JobPriority.High) - continue; - - // Lower any other high priorities to medium. - other.Select((int)JobPriority.Medium); - Profile = Profile?.WithJobPriority(jobId, JobPriority.Medium); - } - - // TODO: Only reload on high change (either to or from). - ReloadPreview(); - - UpdateJobPriorities(); - SetDirty(); - }; - - _jobPriorities.Add((job.ID, selector)); - jobContainer.AddChild(selector); - category.AddChild(jobContainer); - } - } - - UpdateJobPriorities(); - } + // public void RefreshJobs() + // { + // JobList.DisposeAllChildren(); + // _jobCategories.Clear(); + // _jobPriorities.Clear(); + + // // Get all displayed departments + // var departments = new List(); + // foreach (var department in _prototypeManager.EnumeratePrototypes()) + // { + // if (department.EditorHidden) + // continue; + + // departments.Add(department); + // } + + // departments.Sort(DepartmentUIComparer.Instance); + + // var items = new[] + // { + // ("humanoid-profile-editor-job-priority-never-button", (int) JobPriority.Never), + // ("humanoid-profile-editor-job-priority-low-button", (int) JobPriority.Low), + // ("humanoid-profile-editor-job-priority-medium-button", (int) JobPriority.Medium), + // ("humanoid-profile-editor-job-priority-high-button", (int) JobPriority.High), + // }; + + // var firstCategory = true; + // foreach (var department in departments) + // { + // var departmentName = Loc.GetString($"department-{department.ID}"); + + // if (!_jobCategories.TryGetValue(department.ID, out var category)) + // { + // category = new AlternatingBGContainer + // { + // Orientation = LayoutOrientation.Vertical, + // Name = department.ID, + // ToolTip = Loc.GetString("humanoid-profile-editor-jobs-amount-in-department-tooltip", + // ("departmentName", departmentName)), + // Margin = new(0, firstCategory ? 0 : 20, 0, 0), + // Children = + // { + // new Label + // { + // Text = Loc.GetString("humanoid-profile-editor-department-jobs-label", + // ("departmentName", departmentName)), + // StyleClasses = { StyleBase.StyleClassLabelHeading, }, + // Margin = new(5f, 0, 0, 0), + // }, + // }, + // }; + + // firstCategory = false; + // _jobCategories[department.ID] = category; + // JobList.AddChild(category); + // } + + // var jobs = department.Roles.Select(jobId => _prototypeManager.Index(jobId)) + // .Where(job => job.SetPreference) + // .ToArray(); + + // Array.Sort(jobs, JobUIComparer.Instance); + + // foreach (var job in jobs) + // { + // var jobContainer = new BoxContainer { Orientation = LayoutOrientation.Horizontal, HorizontalExpand = true, }; + // var selector = new RequirementsSelector { Margin = new(3f, 3f, 3f, 0f), HorizontalExpand = true, }; + // selector.OnOpenGuidebook += OnOpenGuidebook; + + // var icon = new TextureRect + // { + // TextureScale = new(2, 2), + // VerticalAlignment = VAlignment.Center + // }; + // var jobIcon = _prototypeManager.Index(job.Icon); + // icon.Texture = jobIcon.Icon.Frame0(); + // selector.Setup(items, job.LocalizedName, 200, job.LocalizedDescription, icon, job.Guides); + + // if (!_requirements.CheckJobWhitelist(job, out var reason)) + // selector.LockRequirements(reason); + // else if (!_characterRequirementsSystem.CheckRequirementsValid( + // _roleSystem.GetJobRequirement(job) ?? new(), + // job, + // Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), + // _requirements.GetRawPlayTimeTrackers(), + // _requirements.IsWhitelisted(), + // job, + // _entManager, + // _prototypeManager, + // _cfgManager, + // out var reasons)) + // selector.LockRequirements(_characterRequirementsSystem.GetRequirementsText(reasons)); + // else + // selector.UnlockRequirements(); + + // selector.OnSelected += selectedPrio => + // { + // var selectedJobPrio = (JobPriority) selectedPrio; + // Profile = Profile?.WithJobPriority(job.ID, selectedJobPrio); + + // foreach (var (jobId, other) in _jobPriorities) + // { + // // Sync other selectors with the same job in case of multiple department jobs + // if (jobId == job.ID) + // { + // other.Select(selectedPrio); + // continue; + // } + + // if (selectedJobPrio != JobPriority.High || (JobPriority) other.Selected != JobPriority.High) + // continue; + + // // Lower any other high priorities to medium. + // other.Select((int)JobPriority.Medium); + // Profile = Profile?.WithJobPriority(jobId, JobPriority.Medium); + // } + + // // TODO: Only reload on high change (either to or from). + // ReloadPreview(); + + // UpdateJobPriorities(); + // SetDirty(); + // }; + + // _jobPriorities.Add((job.ID, selector)); + // jobContainer.AddChild(selector); + // category.AddChild(jobContainer); + // } + // } + + // UpdateJobPriorities(); + // } private void OnFlavorTextChange(string content) { diff --git a/Content.Shared/AWS/Skills/CharacterSkillComponent.cs b/Content.Shared/AWS/Skills/CharacterSkillComponent.cs index a21e56ba57..0b439a1088 100644 --- a/Content.Shared/AWS/Skills/CharacterSkillComponent.cs +++ b/Content.Shared/AWS/Skills/CharacterSkillComponent.cs @@ -1,5 +1,8 @@ +using Robust.Shared.GameStates; + namespace Content.Shared.AWS.Skills; +[RegisterComponent, NetworkedComponent] public sealed partial class CharacterSkillComponent : Component { [ViewVariables(VVAccess.ReadWrite)] diff --git a/Content.Shared/AWS/Skills/RequiredSkillComponent.cs b/Content.Shared/AWS/Skills/RequiredSkillComponent.cs index 5c4ff1f454..7a74f57b05 100644 --- a/Content.Shared/AWS/Skills/RequiredSkillComponent.cs +++ b/Content.Shared/AWS/Skills/RequiredSkillComponent.cs @@ -1,5 +1,8 @@ +using Robust.Shared.GameStates; + namespace Content.Shared.AWS.Skills; +[RegisterComponent, NetworkedComponent] public sealed partial class RequiredSkillComponent : Component { [ViewVariables(VVAccess.ReadWrite), DataField] diff --git a/Content.Shared/AWS/Skills/SharedSkillSystem.cs b/Content.Shared/AWS/Skills/SharedSkillSystem.cs index 8e3163f75a..f9f4130365 100644 --- a/Content.Shared/AWS/Skills/SharedSkillSystem.cs +++ b/Content.Shared/AWS/Skills/SharedSkillSystem.cs @@ -1,13 +1,14 @@ using Content.Shared.Humanoid; using JetBrains.Annotations; using Robust.Shared.Prototypes; +using System.Collections.Immutable; using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; using System.Linq; namespace Content.Shared.AWS.Skills; -public sealed class SharedSkillSystem : EntitySystem +public abstract class SharedSkillSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; @@ -32,30 +33,37 @@ public SkillLevel GetSkillLevel(EntityUid ent, ProtoId skillName if (TryComp(ent, out var comp) && comp.Container is not null) if (comp.Container.Skills.TryGetValue(skillName, out var skillLevel)) - return skillLevel; + return (SkillLevel)skillLevel; return SkillLevel.NonSkilled; } [PublicAPI] - public ReadOnlyDictionary, SkillLevel> GetSkills(EntityUid ent) + public Dictionary, SkillLevel> GetSkills(EntityUid ent) { if (TryComp(ent, out var comp) && comp.Container is not null) - return comp.Container.Skills.AsReadOnly(); + { + Dictionary, SkillLevel> skills = new(comp.Container.Skills.Count); + + foreach (var (key, value) in comp.Container.Skills) + skills[key] = (SkillLevel)value; + + return skills; + } - return new Dictionary, SkillLevel>().AsReadOnly(); + return new Dictionary, SkillLevel>(); } [PublicAPI] - public ReadOnlyCollection GetCategories() + public ImmutableArray GetCategories() { - return _prototypeManager.GetInstances().Values.AsReadOnly(); + return _prototypeManager.GetInstances().Values; } [PublicAPI] - public ReadOnlyCollection GetSkills() + public ImmutableArray GetSkills() { - return _prototypeManager.GetInstances().Values.AsReadOnly(); + return _prototypeManager.GetInstances().Values; } [PublicAPI] diff --git a/Content.Shared/AWS/Skills/SkillContainer.cs b/Content.Shared/AWS/Skills/SkillContainer.cs index e084fca60c..93bb7a3150 100644 --- a/Content.Shared/AWS/Skills/SkillContainer.cs +++ b/Content.Shared/AWS/Skills/SkillContainer.cs @@ -1,15 +1,16 @@ using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; namespace Content.Shared.AWS.Skills; -[Serializable] +[Serializable, NetSerializable] public sealed class SkillContainer { [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] - public Dictionary, SkillLevel> Skills = new(); + public Dictionary, Enum> Skills = new(); // Enum = SkillLevel [ViewVariables(VVAccess.ReadWrite), DataField] - public Dictionary, List> UnblockedSkillLevels = new(); + public Dictionary, List> UnblockedSkillLevels = new(); // Enum = SkillLevel [ViewVariables(VVAccess.ReadWrite), DataField] public uint AdditionalSkillPoints = 0; diff --git a/Content.Shared/AWS/Skills/SkillPointController.cs b/Content.Shared/AWS/Skills/SkillPointController.cs new file mode 100644 index 0000000000..6ebb6e2b70 --- /dev/null +++ b/Content.Shared/AWS/Skills/SkillPointController.cs @@ -0,0 +1,105 @@ +using Robust.Shared.Prototypes; +using System.Diagnostics.CodeAnalysis; + +namespace Content.Shared.AWS.Skills; + +public class SkillPointController +{ + public uint MaxPoints { get; set; } + public uint CurrentPoints { get => SumEstablishedPoints(); } + public Action, SkillLevel>? OnRecalculateSkill; + private SkillContainer Container { get; } + private readonly IPrototypeManager _prototypeManager; + + private void CopyUnblocked(Dictionary, List> from, Dictionary, List> to) + { + foreach (var (key, value) in from) + to[key] = new List(value); + } + + public SkillLevel GetCurrentSkillLevel(ProtoId protoId) + { + if (Container.Skills.TryGetValue(protoId, out var currentLevel)) + return (SkillLevel)currentLevel; + + return SkillLevel.NonSkilled; + } + + public bool CanHaveSkillLevel(ProtoId protoId, SkillLevel level) + { + if (!_prototypeManager.TryIndex(protoId, out var skillProto)) + return false; + + if (skillProto.Cost.TryGetValue(level, out _)) + return true; + + return false; + } + + public uint GetPointsForSkill(ProtoId protoId, SkillLevel level) + { + if (!_prototypeManager.TryIndex(protoId, out var skillProto)) + return 0; + + var currentSkillLevel = GetCurrentSkillLevel(protoId); + var selectedSkillCost = skillProto!.Cost[level]; + + if (currentSkillLevel == level) + return selectedSkillCost; + + var currentSkillCost = skillProto!.Cost[currentSkillLevel]; + + if (currentSkillCost > selectedSkillCost) + return currentSkillCost - selectedSkillCost; + + return selectedSkillCost - currentSkillCost; + } + + public void ProcessSkill(ProtoId protoId, SkillLevel level) + { + var skillCost = GetPointsForSkill(protoId, level); + + /*if (Container.UnblockedSkillLevels.)*/ + + if (CurrentPoints >= skillCost) + { + AddLevelToSkill(protoId, level); + OnRecalculateSkill?.Invoke(protoId, level); + } + } + + private void AddLevelToSkill(ProtoId protoId, SkillLevel level) + => Container.Skills[protoId] = level; + + private uint SumEstablishedPoints() + { + uint currentSkillsCost = 0; + + foreach (var (key, value) in Container.Skills) + currentSkillsCost += GetPointsForSkill(key, (SkillLevel)value); + + return MaxPoints - currentSkillsCost; + } + + [Obsolete("You should do this logic in your system")] + public static (bool, SkillContainer?) IsValid(uint maxPoints, Dictionary, List> unblockedSkills, SkillContainer clContainer) + { + var skillController = new SkillPointController(maxPoints, unblockedSkills, null, clContainer); + + if (skillController.CurrentPoints >= 0) + return (true, skillController.Container); + + return (false, null); + } + + public SkillPointController(uint maxPoints, Dictionary, List> unblockedSkills, IPrototypeManager? protoManager, SkillContainer? container) + { + Container = container ?? new(); + MaxPoints = maxPoints; + + foreach (var (key, value) in unblockedSkills) + Container.UnblockedSkillLevels[key] = value; + + _prototypeManager = protoManager ?? IoCManager.Resolve(); + } +} diff --git a/Content.Shared/AWS/Skills/SkillPrototype.cs b/Content.Shared/AWS/Skills/SkillPrototype.cs index 951659fb0b..335e65b304 100644 --- a/Content.Shared/AWS/Skills/SkillPrototype.cs +++ b/Content.Shared/AWS/Skills/SkillPrototype.cs @@ -7,9 +7,12 @@ public sealed partial class SkillPrototype : IPrototype { [IdDataField] public string ID { get; } = string.Empty; - [ViewVariables(VVAccess.ReadWrite), DataField] - public Dictionary Cost = new(); + [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] + public ProtoId Category = default!; + + [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] + public Dictionary Cost = new(); // Enum = SkillLevel [ViewVariables(VVAccess.ReadWrite), DataField] - public List Blocked = new(); + public List Blocked = new(); // Enum = SkillLevel } diff --git a/Resources/Locale/ru-RU/aws/skills/categories.ftl b/Resources/Locale/ru-RU/aws/skills/categories.ftl new file mode 100644 index 0000000000..7c2308305b --- /dev/null +++ b/Resources/Locale/ru-RU/aws/skills/categories.ftl @@ -0,0 +1,7 @@ +skills-category-organizing = Организационные +skills-category-common = Общие +skills-category-engineering = Инженерия +skills-category-medicine = Медицина +skills-category-research = Исследование +skills-category-security = Безопасность +skills-category-service = Сервис \ No newline at end of file diff --git a/Resources/Locale/ru-RU/aws/skills/humanoid-profile.ftl b/Resources/Locale/ru-RU/aws/skills/humanoid-profile.ftl new file mode 100644 index 0000000000..43c7689bfd --- /dev/null +++ b/Resources/Locale/ru-RU/aws/skills/humanoid-profile.ftl @@ -0,0 +1 @@ +skills-leftskillpoints = Осталось очков навыков: {$leftSkillPoints} \ No newline at end of file diff --git a/Resources/Locale/ru-RU/aws/skills/levels.ftl b/Resources/Locale/ru-RU/aws/skills/levels.ftl new file mode 100644 index 0000000000..38d124c7ae --- /dev/null +++ b/Resources/Locale/ru-RU/aws/skills/levels.ftl @@ -0,0 +1,5 @@ +skills-level-NonSkilled = Необученный +skills-level-Basic = Минимальный +skills-level-Trained = Обученный +skills-level-Experienced = Опытный +skills-level-Master = Мастер \ No newline at end of file diff --git a/Resources/Locale/ru-RU/aws/skills/skills.ftl b/Resources/Locale/ru-RU/aws/skills/skills.ftl new file mode 100644 index 0000000000..c6347b7139 --- /dev/null +++ b/Resources/Locale/ru-RU/aws/skills/skills.ftl @@ -0,0 +1,6 @@ +skills-skillname-driving = Вождение +skills-skillname-economy = Финансы +skills-skillname-electricity = Электроника +skills-skillname-melee = Ближний бой +skills-skillname-stamina = Атлетика +skills-skillname-weapon = Оружейный опыт \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/driving.yml b/Resources/Prototypes/AWS/Skills/Attributes/driving.yml index b5cbd342c0..fcbbcbff1f 100644 --- a/Resources/Prototypes/AWS/Skills/Attributes/driving.yml +++ b/Resources/Prototypes/AWS/Skills/Attributes/driving.yml @@ -1,5 +1,6 @@ - type: skill id: driving + category: common cost: - - enum.SkillLevel.NonSkilled: 0 - - enum.SkillLevel.Skilled: 2 \ No newline at end of file + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Experienced: 2 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/economy.yml b/Resources/Prototypes/AWS/Skills/Attributes/economy.yml index 9a9c9ec68b..ca9915f0d7 100644 --- a/Resources/Prototypes/AWS/Skills/Attributes/economy.yml +++ b/Resources/Prototypes/AWS/Skills/Attributes/economy.yml @@ -1,8 +1,9 @@ - type: skill id: economy + category: organizing cost: - - enum.SkillLevel.NonSkilled: 0 - - enum.SkillLevel.Minimum: 1 - - enum.SkillLevel.Basic: 2 - - enum.SkillLevel.Skilled: 4 - - enum.SkillLevel.Expert: 6 \ No newline at end of file + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml b/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml index 41e65bb703..4b068973cc 100644 --- a/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml +++ b/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml @@ -1,8 +1,9 @@ - type: skill id: electricity + category: engineering cost: - - enum.SkillLevel.NonSkilled: 0 - - enum.SkillLevel.Minimum: 1 - - enum.SkillLevel.Basic: 2 - - enum.SkillLevel.Skilled: 4 - - enum.SkillLevel.Expert: 6 \ No newline at end of file + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/melee.yml b/Resources/Prototypes/AWS/Skills/Attributes/melee.yml index f4929718e5..ed225ea5d0 100644 --- a/Resources/Prototypes/AWS/Skills/Attributes/melee.yml +++ b/Resources/Prototypes/AWS/Skills/Attributes/melee.yml @@ -1,8 +1,9 @@ - type: skill id: melee + category: security cost: - - enum.SkillLevel.NonSkilled: 0 - - enum.SkillLevel.Minimum: 1 - - enum.SkillLevel.Basic: 2 - - enum.SkillLevel.Skilled: 4 - - enum.SkillLevel.Expert: 6 \ No newline at end of file + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/stamina.yml b/Resources/Prototypes/AWS/Skills/Attributes/stamina.yml index f5197bc846..2594a501b6 100644 --- a/Resources/Prototypes/AWS/Skills/Attributes/stamina.yml +++ b/Resources/Prototypes/AWS/Skills/Attributes/stamina.yml @@ -1,8 +1,9 @@ - type: skill id: stamina + category: common cost: - - enum.SkillLevel.NonSkilled: 0 - - enum.SkillLevel.Minimum: 1 - - enum.SkillLevel.Basic: 2 - - enum.SkillLevel.Skilled: 4 - - enum.SkillLevel.Expert: 6 \ No newline at end of file + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/weapon.yml b/Resources/Prototypes/AWS/Skills/Attributes/weapon.yml index acf5670d7d..0e423fc85e 100644 --- a/Resources/Prototypes/AWS/Skills/Attributes/weapon.yml +++ b/Resources/Prototypes/AWS/Skills/Attributes/weapon.yml @@ -1,8 +1,9 @@ - type: skill id: weapon + category: security cost: - - enum.SkillLevel.NonSkilled: 0 - - enum.SkillLevel.Minimum: 1 - - enum.SkillLevel.Basic: 2 - - enum.SkillLevel.Skilled: 4 - - enum.SkillLevel.Expert: 6 \ No newline at end of file + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 \ No newline at end of file From 182eb0a5a64bcbeffb091f5cc6487a5017d65802 Mon Sep 17 00:00:00 2001 From: aw-c Date: Tue, 10 Dec 2024 18:07:46 +0300 Subject: [PATCH 04/43] something should work without saving --- .../AWS/Historical/HistoricalSystem.cs | 11 + .../AWS/Historical/HistoricalUiStorage.cs | 14 + Content.Client/AWS/Skills/SkillControlMeta.cs | 25 ++ Content.Client/Content.Client.csproj | 16 +- .../Lobby/UI/HumanoidProfileEditor.xaml.cs | 324 ++++++++++++++---- Content.Server/AWS/SkillSystem.cs | 11 + .../AWS/Historical/HistoryPrototype.cs | 38 ++ .../AWS/Historical/SharedHistoricalSystem.cs | 58 ++++ .../AWS/Skills/RequiredSkillComponent.cs | 5 +- .../AWS/Skills/SharedSkillSystem.cs | 17 + Content.Shared/AWS/Skills/SkillContainer.cs | 16 +- Content.Shared/AWS/Skills/SkillLevel.cs | 5 +- .../AWS/Skills/SkillPointController.cs | 99 +++++- Content.Shared/AWS/Skills/SkillPrototype.cs | 7 +- Resources/Locale/ru-RU/aws/skills/skills.ftl | 4 +- .../Prototypes/AWS/Historical/culture.yml | 6 + .../Prototypes/AWS/Historical/faction.yml | 6 + .../Prototypes/AWS/Historical/lifestyle.yml | 6 + .../AWS/Skills/Attributes/electricity.yml | 1 + .../Specific/Medical/healthanalyzer.yml | 5 + 20 files changed, 576 insertions(+), 98 deletions(-) create mode 100644 Content.Client/AWS/Historical/HistoricalSystem.cs create mode 100644 Content.Client/AWS/Historical/HistoricalUiStorage.cs create mode 100644 Content.Client/AWS/Skills/SkillControlMeta.cs create mode 100644 Content.Server/AWS/SkillSystem.cs create mode 100644 Content.Shared/AWS/Historical/HistoryPrototype.cs create mode 100644 Content.Shared/AWS/Historical/SharedHistoricalSystem.cs create mode 100644 Resources/Prototypes/AWS/Historical/culture.yml create mode 100644 Resources/Prototypes/AWS/Historical/faction.yml create mode 100644 Resources/Prototypes/AWS/Historical/lifestyle.yml diff --git a/Content.Client/AWS/Historical/HistoricalSystem.cs b/Content.Client/AWS/Historical/HistoricalSystem.cs new file mode 100644 index 0000000000..50c317f6ad --- /dev/null +++ b/Content.Client/AWS/Historical/HistoricalSystem.cs @@ -0,0 +1,11 @@ +using Content.Shared.AWS.Historical; + +namespace Content.Client.AWS.Historical; + +public sealed class HistoricalSystem : SharedHistoricalSystem +{ + public override void Initialize() + { + base.Initialize(); + } +} diff --git a/Content.Client/AWS/Historical/HistoricalUiStorage.cs b/Content.Client/AWS/Historical/HistoricalUiStorage.cs new file mode 100644 index 0000000000..de93d95f85 --- /dev/null +++ b/Content.Client/AWS/Historical/HistoricalUiStorage.cs @@ -0,0 +1,14 @@ + + +using Content.Shared.AWS.Historical; +using Robust.Client.UserInterface.Controls; +using Robust.Shared.Prototypes; + +namespace Content.Client.AWS.Historical; + +public record HistoricalUiStorage( + List> HistoryByButtonId, + Dictionary> SelectedHistories, + Dictionary DescriptionFieldForTypes, + Dictionary OptionButtonsByType, + Dictionary>> Histories); diff --git a/Content.Client/AWS/Skills/SkillControlMeta.cs b/Content.Client/AWS/Skills/SkillControlMeta.cs new file mode 100644 index 0000000000..ddf1e92fbf --- /dev/null +++ b/Content.Client/AWS/Skills/SkillControlMeta.cs @@ -0,0 +1,25 @@ +using Content.Shared.AWS.Skills; +using Robust.Client.UserInterface; +using Robust.Shared.Prototypes; + +namespace Content.Client.AWS.Skills +{ + internal sealed class SkillControlMeta + { + public static readonly AttachedProperty SkillMetaProperty = + AttachedProperty.Create("SkillMetaProperty", typeof(Control), defaultValue: new SkillControlMeta()); + + public ProtoId SkillId { get; } + public SkillLevel Level { get; } + + public SkillControlMeta(ProtoId skillId, SkillLevel level) + { + SkillId = skillId; + Level = level; + } + private SkillControlMeta() + { + + } + } +} diff --git a/Content.Client/Content.Client.csproj b/Content.Client/Content.Client.csproj index d4fab6c7e5..dc7ffa8021 100644 --- a/Content.Client/Content.Client.csproj +++ b/Content.Client/Content.Client.csproj @@ -12,6 +12,11 @@ Debug;Release;Tools;DebugOpt AnyCPU + + + + + @@ -34,16 +39,5 @@ - - - - - MSBuild:Compile - - - - - SkillsWindow.xaml - diff --git a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs index c2f54e6f51..cd6d11c06b 100644 --- a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs @@ -3,6 +3,7 @@ using System.Numerics; using Content.Client.Administration.UI; using Content.Client.Guidebook; +using Content.Client.AWS.Historical; using Content.Client.AWS.Skills; using Content.Client.Humanoid; using Content.Client.Message; @@ -15,6 +16,7 @@ using Content.Shared._EE.Contractors.Prototypes; using Content.Shared._White.CCVar; using Content.Shared._White.Humanoid.Prototypes; +using Content.Shared.AWS.Historical; using Content.Shared.AWS.Skills; using Content.Shared.CCVar; using Content.Shared.Clothing.Components; @@ -148,6 +150,7 @@ public sealed partial class HumanoidProfileEditor : BoxContainer private const string MimeNames = "MimeNames"; // WD EDIT END //SS14RU + private HistoricalUiStorage? _historicalUiStorage; private SkillPointController? _skillPointController; //SS14RU @@ -223,7 +226,7 @@ IRobustRandom random SexButton.OnItemSelected += args => { SexButton.SelectId(args.Id); - SetSex((Sex) args.Id); + SetSex((Sex)args.Id); }; #endregion Sex @@ -260,10 +263,10 @@ IRobustRandom random #region Gender - PronounsButton.AddItem(Loc.GetString("humanoid-profile-editor-pronouns-male-text"), (int) Gender.Male); - PronounsButton.AddItem(Loc.GetString("humanoid-profile-editor-pronouns-female-text"), (int) Gender.Female); - PronounsButton.AddItem(Loc.GetString("humanoid-profile-editor-pronouns-epicene-text"), (int) Gender.Epicene); - PronounsButton.AddItem(Loc.GetString("humanoid-profile-editor-pronouns-neuter-text"), (int) Gender.Neuter); + PronounsButton.AddItem(Loc.GetString("humanoid-profile-editor-pronouns-male-text"), (int)Gender.Male); + PronounsButton.AddItem(Loc.GetString("humanoid-profile-editor-pronouns-female-text"), (int)Gender.Female); + PronounsButton.AddItem(Loc.GetString("humanoid-profile-editor-pronouns-epicene-text"), (int)Gender.Epicene); + PronounsButton.AddItem(Loc.GetString("humanoid-profile-editor-pronouns-neuter-text"), (int)Gender.Neuter); PronounsButton.OnItemSelected += args => { @@ -473,7 +476,7 @@ IRobustRandom random ReloadProfilePreview(); }; - HairStylePicker.OnSlotAdd += delegate() + HairStylePicker.OnSlotAdd += delegate () { if (Profile is null) return; @@ -494,7 +497,7 @@ IRobustRandom random ReloadProfilePreview(); }; - FacialHairPicker.OnSlotAdd += delegate() + FacialHairPicker.OnSlotAdd += delegate () { if (Profile is null) return; @@ -525,7 +528,7 @@ IRobustRandom random SpawnPriorityButton.OnItemSelected += args => { SpawnPriorityButton.SelectId(args.Id); - SetSpawnPriority((SpawnPriorityPreference) args.Id); + SetSpawnPriority((SpawnPriorityPreference)args.Id); }; #endregion SpawnPriority @@ -638,6 +641,10 @@ IRobustRandom random // RefreshSkills(); + TabContainer.SetTabTitle(6, Loc.GetString("История")); + + RefreshHistorical(); + #endregion SS14RU-SKILLS RefreshFlavorText(); @@ -983,7 +990,7 @@ private void ReloadClothes() public void ResetToDefault() { SetProfile( - (HumanoidCharacterProfile?) _preferencesManager.Preferences?.SelectedCharacter, + (HumanoidCharacterProfile?)_preferencesManager.Preferences?.SelectedCharacter, _preferencesManager.Preferences?.SelectedCharacterIndex); } @@ -1097,6 +1104,169 @@ private void OnSpeciesInfoButtonPressed(BaseButton.ButtonEventArgs args) // { // UpdateLeftSkillPoints(_skillPointController.CurrentPoints); // }; + // private void HistoricalCheckSelectedHistories() + // { + // var historicalSystem = _entManager.System(); + // var defaultHistories = historicalSystem.GetDefaultHistories(); + // foreach (var historyType in Enum.GetValues(typeof(HistoryType))) + // { + // if (!_historicalUiStorage!.SelectedHistories.TryGetValue((HistoryType)historyType, out var protoId)) + // { + // int? id = null; + // for (int i = 0; i < _historicalUiStorage!.HistoryByButtonId.Count; i++) + // { + // var searchingProto = _prototypeManager.Index(_historicalUiStorage!.HistoryByButtonId[i]); + // if ((HistoryType)searchingProto.HistoryType == (HistoryType)historyType) + // { + // id = i; + // break; + // } + // } + + // if (id is not null) + // { + // _historicalUiStorage!.SelectedHistories[(HistoryType)historyType] = defaultHistories[(HistoryType)historyType]; + // var optionButton = _historicalUiStorage!.OptionButtonsByType[(HistoryType)historyType]; + // optionButton.SelectId(id.Value); + // } + // } + // } + + // RefreshHistoricalDescriptions(); + // } + // private void HistoricalSelectHistoryByButtonId(int buttonId) + // { + // var protoId = _historicalUiStorage!.HistoryByButtonId[buttonId]; + // var proto = _prototypeManager.Index(protoId); + // _historicalUiStorage!.SelectedHistories[(HistoryType)proto.HistoryType] = protoId; + // } + // private void RefreshHistoricalDescriptions() + // { + // foreach (var (key, value) in _historicalUiStorage!.SelectedHistories) + // { + // var proto = _prototypeManager.Index(value); + // _historicalUiStorage.DescriptionFieldForTypes[key].TextRope = new Rope.Leaf(proto.Description); + // } + // } + // public void RefreshHistorical() + // { + // HistoricalContainer.DisposeAllChildren(); + + // var historyByButtonId = new List>(); + // var selectedHistories = new Dictionary>(); + // var optionButtonsByType = new Dictionary(); + // var descriptionFieldForTypes = new Dictionary(); + // var typeContainers = new Dictionary(); + // var historicalSystem = _entManager.System(); + // var histories = historicalSystem.GetHistories(); + + // OptionButton? optionButton = null; + + // int lastButtonId = 0; + + // foreach (var (key, value) in histories) + // { + // if (!typeContainers.TryGetValue(key, out var typeContainer)) + // { + // typeContainer = new BoxContainer() { Orientation = LayoutOrientation.Vertical }; + // typeContainers[key] = typeContainer; + + // var infoDescContainer = new BoxContainer() { Align = AlignMode.Center, Orientation = LayoutOrientation.Horizontal }; + + // infoDescContainer.AddChild(new Label() { Text = key.ToString(), HorizontalAlignment = HAlignment.Left }); + // infoDescContainer.AddChild(new Control() { HorizontalExpand = true }); + + // optionButton = new OptionButton() { HorizontalAlignment = HAlignment.Right }; + // optionButton.OnItemSelected += (args) => + // { + // HistoricalSelectHistoryByButtonId(args.Id); + // RefreshHistoricalDescriptions(); + // }; + // optionButtonsByType[key] = optionButton; + // infoDescContainer.AddChild(optionButton); + + // typeContainer.AddChild(infoDescContainer); + + // var scrollContainer = new ScrollContainer + // { + // HorizontalExpand = true, + // VerticalExpand = true, + // HScrollEnabled = false, + // VScrollEnabled = true, + // MinSize = new Vector2(0, 60) + // }; + + // var descriptionField = new TextEdit + // { + // Editable = false, + // HorizontalExpand = true, + // TextRope = new Rope.Leaf(string.Empty), + // HorizontalAlignment = HAlignment.Stretch, + // }; + + // descriptionFieldForTypes[key] = descriptionField; + + // scrollContainer.AddChild(descriptionField); + // typeContainer.AddChild(scrollContainer); + + // HistoricalContainer.AddChild(typeContainer); + // } + + // foreach (var protoId in value) + // { + // optionButton?.AddItem(protoId, lastButtonId++); + // historyByButtonId.Add(protoId); + // } + // } + // _historicalUiStorage = new( + // historyByButtonId, + // selectedHistories, + // descriptionFieldForTypes, + // optionButtonsByType, + // histories + // ); + + // RefreshHistoricalDescriptions(); + // HistoricalCheckSelectedHistories(); + // } + + // private void UpdateLeftSkillPoints(int left) + // { + // LeftSkillPoints.Text = Loc.GetString("skills-leftskillpoints", ("leftSkillPoints", left)); + // } + // private void RecalculateSkill(ProtoId protoId, SkillLevel level) + // { + // foreach (var child in SkillsList.Children) + // foreach (var cont in child.Children) + // foreach (var btn in cont.Children) + // { + // var data = btn.GetValue(SkillControlMeta.SkillMetaProperty); + // if (data is not null) + // { + // if (data.SkillId == protoId) + // { + // if (data.Level <= level) + // { + // ((Button)btn).Pressed = true; + // continue; + // } + // if (data.Level >= level) + // { + // ((Button)btn).Pressed = false; + // continue; + // } + // } + // } + // } + // } + // public void RefreshSkills() + // { + // _skillPointController = new(15, [], null, null); + // _skillPointController.OnRecalculateSkill += (protoId, level) => + // { + // UpdateLeftSkillPoints(_skillPointController.CurrentPoints); + // RecalculateSkill(protoId, level); + // }; // SkillsList.DisposeAllChildren(); // var firstCategory = true; @@ -1115,6 +1285,9 @@ private void OnSpeciesInfoButtonPressed(BaseButton.ButtonEventArgs args) // var categorySkills = kvp.Value; // var categoryName = Loc.GetString($"skills-category-{categoryId}"); + // foreach (var (categoryId, categorySkills) in skillGroups) + // { + // var categoryName = Loc.GetString($"skills-category-{categoryId}"); // var categoryPanel = new BoxContainer // { @@ -1169,6 +1342,15 @@ private void OnSpeciesInfoButtonPressed(BaseButton.ButtonEventArgs args) // { // _skillPointController.ProcessSkill(skill.ID, level); // }; + // if (level == SkillLevel.NonSkilled) + // levelButton.Pressed = true; + + // levelButton.SetValue(SkillControlMeta.SkillMetaProperty, new SkillControlMeta(skill.ID, level)); + + // levelButton.OnPressed += args => + // { + // _skillPointController.ProcessSkill(skill.ID, level); + // }; // skillContainer.AddChild(levelButton); // } @@ -1348,38 +1530,47 @@ private void OnSkinColorOnValueChanged() switch (species.SkinColoration) { case HumanoidSkinColor.HumanToned: - { - if (!Skin.Visible) { - Skin.Visible = true; - RgbSkinColorContainer.Visible = false; - } + if (!Skin.Visible) + { + Skin.Visible = true; + RgbSkinColorContainer.Visible = false; + } - var color = SkinColor.HumanSkinTone((int) Skin.Value); + var color = SkinColor.HumanSkinTone((int)Skin.Value); - Markings.CurrentSkinColor = color; - Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color));// - break; - } + Markings.CurrentSkinColor = color; + Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color));// + break; + } case HumanoidSkinColor.Hues: - { - if (!RgbSkinColorContainer.Visible) { - Skin.Visible = false; - RgbSkinColorContainer.Visible = true; - } + if (!RgbSkinColorContainer.Visible) + { + Skin.Visible = false; + RgbSkinColorContainer.Visible = true; + } - Markings.CurrentSkinColor = _rgbSkinColorSelector.Color; - Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(_rgbSkinColorSelector.Color)); - break; - } + Markings.CurrentSkinColor = _rgbSkinColorSelector.Color; + Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(_rgbSkinColorSelector.Color)); + break; + } case HumanoidSkinColor.TintedHues: case HumanoidSkinColor.TintedHuesSkin: { if (!RgbSkinColorContainer.Visible) { - Skin.Visible = false; - RgbSkinColorContainer.Visible = true; + if (!RgbSkinColorContainer.Visible) + { + Skin.Visible = false; + RgbSkinColorContainer.Visible = true; + } + + var color = SkinColor.TintedHues(_rgbSkinColorSelector.Color); + + Markings.CurrentSkinColor = color; + Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color)); + break; } var color = species.SkinColoration switch @@ -1394,11 +1585,18 @@ private void OnSkinColorOnValueChanged() break; } case HumanoidSkinColor.VoxFeathers: - { - if (!RgbSkinColorContainer.Visible) { - Skin.Visible = false; - RgbSkinColorContainer.Visible = true; + if (!RgbSkinColorContainer.Visible) + { + Skin.Visible = false; + RgbSkinColorContainer.Visible = true; + } + + var color = SkinColor.ClosestVoxColor(_rgbSkinColorSelector.Color); + + Markings.CurrentSkinColor = color; + Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color)); + break; } var color = SkinColor.ClosestVoxColor(_rgbSkinColorSelector.Color); @@ -1694,7 +1892,7 @@ private void UpdateJobPriorities() foreach (var (jobId, prioritySelector) in _jobPriorities) { var priority = Profile?.JobPriorities.GetValueOrDefault(jobId, JobPriority.Never) ?? JobPriority.Never; - prioritySelector.Select((int) priority); + prioritySelector.Select((int)priority); } } @@ -1721,9 +1919,9 @@ private void UpdateSexControls() SexButton.AddItem(Loc.GetString($"humanoid-profile-editor-sex-{sex.ToString().ToLower()}-text"), (int) sex); if (sexes.Contains(Profile.Sex)) - SexButton.SelectId((int) Profile.Sex); + SexButton.SelectId((int)Profile.Sex); else - SexButton.SelectId((int) sexes[0]); + SexButton.SelectId((int)sexes[0]); } private void UpdateSkinColor() @@ -1736,46 +1934,56 @@ private void UpdateSkinColor() switch (skin) { case HumanoidSkinColor.HumanToned: - { - if (!Skin.Visible) { - Skin.Visible = true; - RgbSkinColorContainer.Visible = false; + if (!Skin.Visible) + { + Skin.Visible = true; + RgbSkinColorContainer.Visible = false; + } + + Skin.Value = SkinColor.HumanSkinToneFromColor(Profile.Appearance.SkinColor); + + break; } Skin.Value = SkinColor.HumanSkinToneFromColor(Profile.Appearance.SkinColor); break; } case HumanoidSkinColor.Hues: - { - if (!RgbSkinColorContainer.Visible) { - Skin.Visible = false; - RgbSkinColorContainer.Visible = true; - } + if (!RgbSkinColorContainer.Visible) + { + Skin.Visible = false; + RgbSkinColorContainer.Visible = true; + } // Set the RGB values to the direct values otherwise _rgbSkinColorSelector.Color = Profile.Appearance.SkinColor; break; } case HumanoidSkinColor.TintedHues: - { - if (!RgbSkinColorContainer.Visible) { - Skin.Visible = false; - RgbSkinColorContainer.Visible = true; - } + if (!RgbSkinColorContainer.Visible) + { + Skin.Visible = false; + RgbSkinColorContainer.Visible = true; + } // Set the RGB values to the direct values otherwise _rgbSkinColorSelector.Color = Profile.Appearance.SkinColor; break; } case HumanoidSkinColor.VoxFeathers: - { - if (!RgbSkinColorContainer.Visible) { - Skin.Visible = false; - RgbSkinColorContainer.Visible = true; + if (!RgbSkinColorContainer.Visible) + { + Skin.Visible = false; + RgbSkinColorContainer.Visible = true; + } + + _rgbSkinColorSelector.Color = SkinColor.ClosestVoxColor(Profile.Appearance.SkinColor); + + break; } _rgbSkinColorSelector.Color = SkinColor.ClosestVoxColor(Profile.Appearance.SkinColor); @@ -1825,7 +2033,7 @@ private void UpdateGenderControls() if (Profile == null) return; - PronounsButton.SelectId((int) Profile.Gender); + PronounsButton.SelectId((int)Profile.Gender); } private void UpdateDisplayPronounsControls() @@ -1909,7 +2117,7 @@ private void UpdateSpawnPriorityControls() if (Profile == null) return; - SpawnPriorityButton.SelectId((int) Profile.SpawnPriority); + SpawnPriorityButton.SelectId((int)Profile.SpawnPriority); } private void UpdateHeightWidthSliders() @@ -2064,7 +2272,7 @@ private void UpdateCMarkingsFacialHair() // Facial hair color Color? facialHairColor = null; - if ( Profile.Appearance.FacialHairStyleId != HairStyles.DefaultFacialHairStyle && + if (Profile.Appearance.FacialHairStyleId != HairStyles.DefaultFacialHairStyle && _markingManager.Markings.TryGetValue(Profile.Appearance.FacialHairStyleId, out var facialHairProto)) { if (_markingManager.CanBeApplied(Profile.Species, Profile.Sex, facialHairProto, _prototypeManager)) diff --git a/Content.Server/AWS/SkillSystem.cs b/Content.Server/AWS/SkillSystem.cs new file mode 100644 index 0000000000..dfa60cd3f9 --- /dev/null +++ b/Content.Server/AWS/SkillSystem.cs @@ -0,0 +1,11 @@ +using Content.Shared.AWS.Skills; + +namespace Content.Server.AWS.Skills; + +public sealed class SkillSystem : SharedSkillSystem +{ + public override void Initialize() + { + base.Initialize(); + } +} diff --git a/Content.Shared/AWS/Historical/HistoryPrototype.cs b/Content.Shared/AWS/Historical/HistoryPrototype.cs new file mode 100644 index 0000000000..7bc1de7329 --- /dev/null +++ b/Content.Shared/AWS/Historical/HistoryPrototype.cs @@ -0,0 +1,38 @@ +using Robust.Shared.Prototypes; +using Content.Shared.AWS.Skills; + +namespace Content.Shared.AWS.Historical; + +[Prototype("history")] +public sealed partial class HistoryPrototype : IPrototype +{ + [IdDataField] public string ID { get; } = string.Empty; + + [ViewVariables(VVAccess.ReadWrite), DataField] + public bool IsDefault { get; set; } = false; + + [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] + public Enum HistoryType { get; set; } = default!; + + [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] + public string Name = string.Empty; + + [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] + public string Description = string.Empty; + + [ViewVariables(VVAccess.ReadWrite), DataField] + public ProtoId BlockedForSpecies = new(); + + [ViewVariables(VVAccess.ReadWrite), DataField] + public List> BlockingHistories = new(); + + [ViewVariables(VVAccess.ReadWrite), DataField] + public SkillContainer Container = new(); +} + +public enum HistoryType +{ + Culture, + Lifestyle, + Faction, +} diff --git a/Content.Shared/AWS/Historical/SharedHistoricalSystem.cs b/Content.Shared/AWS/Historical/SharedHistoricalSystem.cs new file mode 100644 index 0000000000..ebc2ec025a --- /dev/null +++ b/Content.Shared/AWS/Historical/SharedHistoricalSystem.cs @@ -0,0 +1,58 @@ +using Content.Shared.Humanoid; +using JetBrains.Annotations; +using Robust.Shared.Prototypes; +using System.Collections.Immutable; +using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; +using System.Linq; + +namespace Content.Shared.AWS.Historical; + +public abstract class SharedHistoricalSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + + public override void Initialize() + { + base.Initialize(); + } + + [PublicAPI] + public Dictionary> GetDefaultHistories() + { + var defaultHistories = new Dictionary>(); + var enumerator = _prototypeManager.EnumeratePrototypes().GetEnumerator(); + + while (enumerator.MoveNext()) + { + var proto = enumerator.Current; + if (proto.IsDefault) + defaultHistories[(HistoryType)proto.HistoryType] = proto.ID; + } + + return defaultHistories; + } + + [PublicAPI] + public Dictionary>> GetHistories() + { + Dictionary>> histories = new(); + + var enumerator = _prototypeManager.EnumeratePrototypes().GetEnumerator(); + + while (enumerator.MoveNext()) + { + var elem = enumerator.Current; + + if (!histories.TryGetValue((HistoryType)elem.HistoryType, out var protos)) + { + histories[(HistoryType)elem.HistoryType] = protos = new([elem]); + continue; + } + + protos.Add(elem); + } + + return histories; + } +} diff --git a/Content.Shared/AWS/Skills/RequiredSkillComponent.cs b/Content.Shared/AWS/Skills/RequiredSkillComponent.cs index 7a74f57b05..4021c23647 100644 --- a/Content.Shared/AWS/Skills/RequiredSkillComponent.cs +++ b/Content.Shared/AWS/Skills/RequiredSkillComponent.cs @@ -2,9 +2,10 @@ namespace Content.Shared.AWS.Skills; -[RegisterComponent, NetworkedComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class RequiredSkillComponent : Component { - [ViewVariables(VVAccess.ReadWrite), DataField] + [AutoNetworkedField] + [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] public SkillContainer Container = new(); } diff --git a/Content.Shared/AWS/Skills/SharedSkillSystem.cs b/Content.Shared/AWS/Skills/SharedSkillSystem.cs index f9f4130365..907c50949e 100644 --- a/Content.Shared/AWS/Skills/SharedSkillSystem.cs +++ b/Content.Shared/AWS/Skills/SharedSkillSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Examine; using Content.Shared.Humanoid; using JetBrains.Annotations; using Robust.Shared.Prototypes; @@ -17,6 +18,22 @@ public abstract class SharedSkillSystem : EntitySystem public override void Initialize() { base.Initialize(); + + SubscribeLocalEvent(HandleRequiredSkillExamined); + } + + private void HandleRequiredSkillExamined(EntityUid uid, RequiredSkillComponent component, ExaminedEvent args) + { + foreach(var (key, value) in component.Container.Skills) + { + if (value is not null && (SkillLevel)value != SkillLevel.NonSkilled) + { + var proto = _prototypeManager.Index(key); + args.PushMarkup(Loc.GetString("skills-examie-minimal", + ("skillColor", proto.Color), ("levelColor", "#00FFFF"), + ("skillName", key), ("skillLevel", value))); + } + } } [PublicAPI] diff --git a/Content.Shared/AWS/Skills/SkillContainer.cs b/Content.Shared/AWS/Skills/SkillContainer.cs index 93bb7a3150..32e0d4d6ae 100644 --- a/Content.Shared/AWS/Skills/SkillContainer.cs +++ b/Content.Shared/AWS/Skills/SkillContainer.cs @@ -3,15 +3,21 @@ namespace Content.Shared.AWS.Skills; -[Serializable, NetSerializable] -public sealed class SkillContainer +[Serializable, NetSerializable, DataDefinition] +public sealed partial class SkillContainer { [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] - public Dictionary, Enum> Skills = new(); // Enum = SkillLevel + public Dictionary, Enum> Skills = new(); [ViewVariables(VVAccess.ReadWrite), DataField] - public Dictionary, List> UnblockedSkillLevels = new(); // Enum = SkillLevel + public Dictionary, List> UnblockedSkillLevels = new(); [ViewVariables(VVAccess.ReadWrite), DataField] - public uint AdditionalSkillPoints = 0; + public Dictionary, List> BlockedSkillLevels = new(); + + [ViewVariables(VVAccess.ReadWrite), DataField] + public Dictionary, Enum> DefaultSkillLevels = new(); + + [ViewVariables(VVAccess.ReadWrite), DataField] + public int AdditionalSkillPoints { get; set; } = 0; } diff --git a/Content.Shared/AWS/Skills/SkillLevel.cs b/Content.Shared/AWS/Skills/SkillLevel.cs index fbbd1f517f..00a3c2adc1 100644 --- a/Content.Shared/AWS/Skills/SkillLevel.cs +++ b/Content.Shared/AWS/Skills/SkillLevel.cs @@ -1,6 +1,9 @@ +using Robust.Shared.Serialization; + namespace Content.Shared.AWS.Skills; -public enum SkillLevel +[Serializable, NetSerializable] +public enum SkillLevel : int { NonSkilled, Basic, diff --git a/Content.Shared/AWS/Skills/SkillPointController.cs b/Content.Shared/AWS/Skills/SkillPointController.cs index 6ebb6e2b70..9260482395 100644 --- a/Content.Shared/AWS/Skills/SkillPointController.cs +++ b/Content.Shared/AWS/Skills/SkillPointController.cs @@ -1,12 +1,13 @@ using Robust.Shared.Prototypes; using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace Content.Shared.AWS.Skills; public class SkillPointController { - public uint MaxPoints { get; set; } - public uint CurrentPoints { get => SumEstablishedPoints(); } + public int MaxPoints { get; set; } + public int CurrentPoints { get => SumEstablishedPoints(); } public Action, SkillLevel>? OnRecalculateSkill; private SkillContainer Container { get; } private readonly IPrototypeManager _prototypeManager; @@ -36,44 +37,106 @@ public bool CanHaveSkillLevel(ProtoId protoId, SkillLevel level) return false; } - public uint GetPointsForSkill(ProtoId protoId, SkillLevel level) + private SkillLevel GetAnyLessThan(ProtoId protoId, SkillLevel currentSkillLevel) + { + if (!_prototypeManager.TryIndex(protoId, out var skillProto)) + return SkillLevel.NonSkilled; + + return GetAnyLessThan(skillProto, currentSkillLevel); + } + + private SkillLevel GetAnyLessThan(SkillPrototype skillProto, SkillLevel currentSkillLevel) + { + var mostMatched = currentSkillLevel; + + foreach (var (key, value) in skillProto.Cost) + if ((SkillLevel)key < currentSkillLevel) + mostMatched = (SkillLevel)key; + + return mostMatched; + } + + private SkillLevel GetAnyHigerThan(SkillPrototype skillProto, SkillLevel currentSkillLevel) + { + foreach (var (key, value) in skillProto.Cost) + if ((SkillLevel)key > currentSkillLevel) + return (SkillLevel)key; + + return currentSkillLevel; + } + + public SkillLevel MatchMoreExistenceLevel(ProtoId protoId, SkillLevel currentSkillLevel, SkillLevel selectedSkillLevel) + { + if (!_prototypeManager.TryIndex(protoId, out var skillProto)) + return SkillLevel.NonSkilled; + + if (skillProto.Cost.Count == 1) + return (SkillLevel)skillProto.Cost.First().Key; + + if (currentSkillLevel > selectedSkillLevel) + return GetAnyLessThan(skillProto, currentSkillLevel); + + if (selectedSkillLevel > currentSkillLevel) + return GetAnyHigerThan(skillProto, currentSkillLevel); + + return currentSkillLevel; + } + + public int GetPointsForSkill(ProtoId protoId, SkillLevel level) { if (!_prototypeManager.TryIndex(protoId, out var skillProto)) return 0; + if (!skillProto.Cost.TryGetValue(level, out var selectedSkillCost)) + return 0; + var currentSkillLevel = GetCurrentSkillLevel(protoId); - var selectedSkillCost = skillProto!.Cost[level]; if (currentSkillLevel == level) - return selectedSkillCost; + return ((int)selectedSkillCost); + + var currentSkillCost = skillProto.Cost[currentSkillLevel]; - var currentSkillCost = skillProto!.Cost[currentSkillLevel]; + return (int)(currentSkillCost - selectedSkillCost); - if (currentSkillCost > selectedSkillCost) - return currentSkillCost - selectedSkillCost; + /*if (currentSkillCost > selectedSkillCost) + return (int)(currentSkillCost - selectedSkillCost); - return selectedSkillCost - currentSkillCost; + return (int)(selectedSkillCost - currentSkillCost);*/ } public void ProcessSkill(ProtoId protoId, SkillLevel level) { - var skillCost = GetPointsForSkill(protoId, level); + var currentSkillLevel = GetCurrentSkillLevel(protoId); + var moreExistenceLevel = MatchMoreExistenceLevel(protoId, currentSkillLevel, level); + var skillCost = GetPointsForSkill(protoId, moreExistenceLevel); + + if (currentSkillLevel == SkillLevel.NonSkilled && level == SkillLevel.NonSkilled) + return; - /*if (Container.UnblockedSkillLevels.)*/ + var anyLess = GetAnyLessThan(protoId, currentSkillLevel); + + if (currentSkillLevel == level && currentSkillLevel != anyLess) + { + currentSkillLevel = anyLess; + SetSkillLevel(protoId, currentSkillLevel); + OnRecalculateSkill?.Invoke(protoId, currentSkillLevel); + return; + } - if (CurrentPoints >= skillCost) + if (CurrentPoints + skillCost >= 0) { - AddLevelToSkill(protoId, level); + SetSkillLevel(protoId, level); OnRecalculateSkill?.Invoke(protoId, level); } } - private void AddLevelToSkill(ProtoId protoId, SkillLevel level) + private void SetSkillLevel(ProtoId protoId, SkillLevel level) => Container.Skills[protoId] = level; - private uint SumEstablishedPoints() + private int SumEstablishedPoints() { - uint currentSkillsCost = 0; + int currentSkillsCost = 0; foreach (var (key, value) in Container.Skills) currentSkillsCost += GetPointsForSkill(key, (SkillLevel)value); @@ -82,7 +145,7 @@ private uint SumEstablishedPoints() } [Obsolete("You should do this logic in your system")] - public static (bool, SkillContainer?) IsValid(uint maxPoints, Dictionary, List> unblockedSkills, SkillContainer clContainer) + public static (bool, SkillContainer?) IsValid(int maxPoints, Dictionary, List> unblockedSkills, SkillContainer clContainer) { var skillController = new SkillPointController(maxPoints, unblockedSkills, null, clContainer); @@ -92,7 +155,7 @@ public static (bool, SkillContainer?) IsValid(uint maxPoints, Dictionary, List> unblockedSkills, IPrototypeManager? protoManager, SkillContainer? container) + public SkillPointController(int maxPoints, Dictionary, List> unblockedSkills, IPrototypeManager? protoManager, SkillContainer? container) { Container = container ?? new(); MaxPoints = maxPoints; diff --git a/Content.Shared/AWS/Skills/SkillPrototype.cs b/Content.Shared/AWS/Skills/SkillPrototype.cs index 335e65b304..9af42186d1 100644 --- a/Content.Shared/AWS/Skills/SkillPrototype.cs +++ b/Content.Shared/AWS/Skills/SkillPrototype.cs @@ -7,12 +7,15 @@ public sealed partial class SkillPrototype : IPrototype { [IdDataField] public string ID { get; } = string.Empty; + [ViewVariables(VVAccess.ReadWrite), DataField] + public Color Color { get; set; } = new Color(255, 255, 255); + [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] public ProtoId Category = default!; [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] - public Dictionary Cost = new(); // Enum = SkillLevel + public Dictionary Cost = new(); [ViewVariables(VVAccess.ReadWrite), DataField] - public List Blocked = new(); // Enum = SkillLevel + public List Blocked = new(); } diff --git a/Resources/Locale/ru-RU/aws/skills/skills.ftl b/Resources/Locale/ru-RU/aws/skills/skills.ftl index c6347b7139..26c4f226af 100644 --- a/Resources/Locale/ru-RU/aws/skills/skills.ftl +++ b/Resources/Locale/ru-RU/aws/skills/skills.ftl @@ -3,4 +3,6 @@ skills-skillname-economy = Финансы skills-skillname-electricity = Электроника skills-skillname-melee = Ближний бой skills-skillname-stamina = Атлетика -skills-skillname-weapon = Оружейный опыт \ No newline at end of file +skills-skillname-weapon = Оружейный опыт + +skills-examie-minimal = Для этого требуется [color={$skillColor}]{$skillName}[/color] не ниже [color={$levelColor}]{$skillLevel}[/color] \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Historical/culture.yml b/Resources/Prototypes/AWS/Historical/culture.yml new file mode 100644 index 0000000000..3b4eeedc47 --- /dev/null +++ b/Resources/Prototypes/AWS/Historical/culture.yml @@ -0,0 +1,6 @@ +- type: history + isDefault: true + id: culture-Earthman + name: historical-name-culture-Earthman + description: historical-description-culture-Earthman + historyType: enum.HistoryType.Culture \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Historical/faction.yml b/Resources/Prototypes/AWS/Historical/faction.yml new file mode 100644 index 0000000000..ce9272585c --- /dev/null +++ b/Resources/Prototypes/AWS/Historical/faction.yml @@ -0,0 +1,6 @@ +- type: history + isDefault: true + id: faction-Nanotrasen + name: historical-name-faction-Nanotrasen + description: historical-description-faction-Nanotrasen + historyType: enum.HistoryType.Faction \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Historical/lifestyle.yml b/Resources/Prototypes/AWS/Historical/lifestyle.yml new file mode 100644 index 0000000000..66913d4ca7 --- /dev/null +++ b/Resources/Prototypes/AWS/Historical/lifestyle.yml @@ -0,0 +1,6 @@ +- type: history + isDefault: true + id: lifestyle-Ascetic + name: historical-name-lifestyle-Ascetic + description: historical-description-lifestyle-Ascetic + historyType: enum.HistoryType.Lifestyle \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml b/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml index 4b068973cc..e7b76bb1ef 100644 --- a/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml +++ b/Resources/Prototypes/AWS/Skills/Attributes/electricity.yml @@ -1,6 +1,7 @@ - type: skill id: electricity category: engineering + color: '#FFFF00' cost: enum.SkillLevel.NonSkilled: 0 enum.SkillLevel.Basic: 1 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml index 3939d9a8c8..6c867ed88e 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml @@ -53,6 +53,11 @@ drawRate: 1.2 #Calculated for 5 minutes on a small cell - type: ToggleCellDraw - type: ActivatableUIRequiresPowerCell + - type: RequiredSkill + container: + skills: + electricity: enum.SkillLevel.Trained + - type: entity id: HandheldHealthAnalyzerEmpty From 86aadcfdef2d38bd45215b07ce5dbcd06427fb1a Mon Sep 17 00:00:00 2001 From: aw-c Date: Tue, 10 Dec 2024 19:17:44 +0300 Subject: [PATCH 05/43] fix required --- Content.Shared/AWS/Skills/SkillContainer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/AWS/Skills/SkillContainer.cs b/Content.Shared/AWS/Skills/SkillContainer.cs index 32e0d4d6ae..ce6901737d 100644 --- a/Content.Shared/AWS/Skills/SkillContainer.cs +++ b/Content.Shared/AWS/Skills/SkillContainer.cs @@ -6,7 +6,7 @@ namespace Content.Shared.AWS.Skills; [Serializable, NetSerializable, DataDefinition] public sealed partial class SkillContainer { - [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] + [ViewVariables(VVAccess.ReadWrite), DataField] public Dictionary, Enum> Skills = new(); [ViewVariables(VVAccess.ReadWrite), DataField] From 061e1e0b672ac4cf2a454d198ce0fb3ae097147a Mon Sep 17 00:00:00 2001 From: ZoNeSRuS Date: Wed, 11 Dec 2024 23:15:20 +0700 Subject: [PATCH 06/43] addProt --- .../Locale/ru-RU/ss14ru/history/culture.ftl | 38 +++++++++++++++++++ .../Prototypes/AWS/Historical/culture.yml | 19 +++++++++- .../Prototypes/AWS/Historical/faction.yml | 21 +++++++++- 3 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 Resources/Locale/ru-RU/ss14ru/history/culture.ftl diff --git a/Resources/Locale/ru-RU/ss14ru/history/culture.ftl b/Resources/Locale/ru-RU/ss14ru/history/culture.ftl new file mode 100644 index 0000000000..9a7172ba11 --- /dev/null +++ b/Resources/Locale/ru-RU/ss14ru/history/culture.ftl @@ -0,0 +1,38 @@ +historical-name-culture-Marsman = Марс +historical-description-culture-Marsman = + Марс - нынешняя столица ЦПСС, известная в обиходе как "Красная планета", является одним из самых густонаселенных центров Человечества. + Со времени основания Джимми Гидеоном первой колонии много лет назад, Марс был важным игроком в Человеческом пространстве. + Терраформинг на Марсе был успешен лишь частично, и сегодня большая часть населения живет либо в огромных купольных городах или же агро-зонах, + либо в обширных подземных комплексах, известных как Туннельная сеть, соединяющая крупные подземные города. + Как правило богатые жители планеты живут на поверхности, в то время как бедные - в тоннелях. Марс изобилует инакомыслием, + преступностью и постоянными беспорядками, особенно под землей. Социальное расслоение всегда было спутником этих мест, + однако сами марсиане полны гордости и решимости. У них не было легкой истории. + Точно также как и с колыбелью Человечества - Землей, на протяжении веков их сопровождали кризисы, революции и регулярные беспорядки. + Народ Марса нередко считает себя лучше остальных Людей, даже тех, кто живет на окраинах "Красной Планеты". + +historical-name-culture-Earthman = Земля +historical-description-culture-Earthman = + Земля - родина Человечества, долгое время находилась в состоянии восстановления после столетий загрязнения и переэксплуатации. + Сегодня большая ее часть существует как природный заповедник, посвященный сохранению истории Человечества. + Проживающие, как правило, находятся в крупных городских зонах, расположенных по всей планете. + Огромные города, состоящие из многочисленных научных центров с акцентом на экологичность. + Земля больше не политический центр Человечества, однако, её жители довольны тем, что их дом является чем-то вроде захолустного, + но туристического направления для тех людей, что хотят узреть родину своих предков. + Людей с этой планеты в целом можно назвать богатыми, хотя они все несопоставимы с таковыми на Марсе. + Как правило, они довольны своей жизнью. Земля так же разнообразна, как и всегда. + +historical-name-culture-Lunaman = Луна +historical-description-culture-Lunaman = + Луна - спутник планеты Земля, долгое время была целью для Человечества и символом освоения космоса. + Сегодня она является одной из старейших колоний для людей. Здешние жители богаты и могущественны. + Разделенные на ряд взаимосвязанных куполов, разбросанных по поверхности, каждый из которых содержит свой уникальный город, + известный как "префектура". Луна является домом для разнообразной и богатой культуры, которая варьируется от префектуры к префектуре. + Столица - Селена, является центром культуры, искусства, торговли и политики, и именно отсюда жители + Луны берут название своего языка - "селенианский". Несмотря на свой статус, Луна имеет свои собственные проблемы, + хотя большую часть населения составляет высший и высший средний классы, эти проблемы обычно проявляются в политических махинациях и сложных интригах. + Люди Луны продолжают оказывать влияние на Человеческое пространство, и корпорации стекаются на Луну, + чтобы построить свою собственную префектуру и создать в ней свою штаб-квартиру как символ успеха, власти и достижений. + Людей Луны часто считают «Старыми Аристократами» Человечества, многие из которых имеют четкие, прослеживаемые родословные еще от первых поселенцев, + династий Земли и крупных корпораций. Большинство жителей Луны богаты, культурны и изысканны. + Однако, не все - многие из жителей города Нью-Вегас находятся за чертой бедности, + что вызывает социальное расслоение и почву для зависти к остальным колонистам. diff --git a/Resources/Prototypes/AWS/Historical/culture.yml b/Resources/Prototypes/AWS/Historical/culture.yml index 3b4eeedc47..ef621b0768 100644 --- a/Resources/Prototypes/AWS/Historical/culture.yml +++ b/Resources/Prototypes/AWS/Historical/culture.yml @@ -3,4 +3,21 @@ id: culture-Earthman name: historical-name-culture-Earthman description: historical-description-culture-Earthman - historyType: enum.HistoryType.Culture \ No newline at end of file + historyType: enum.HistoryType.Culture + +- type: history + id: culture-Marsman + name: historical-name-culture-Marsman + description: historical-description-culture-Marsman + historyType: enum.HistoryType.Culture + container: + blockedSkillLevels: + driving: [enum.SkillLevel.Experienced] + +- type: history + id: culture-Lunaman + name: historical-name-culture-Lunaman + description: historical-description-culture-Lunaman + historyType: enum.HistoryType.Culture + container: + additionalSkillPoints: 5 diff --git a/Resources/Prototypes/AWS/Historical/faction.yml b/Resources/Prototypes/AWS/Historical/faction.yml index ce9272585c..d8dd2e725d 100644 --- a/Resources/Prototypes/AWS/Historical/faction.yml +++ b/Resources/Prototypes/AWS/Historical/faction.yml @@ -3,4 +3,23 @@ id: faction-Nanotrasen name: historical-name-faction-Nanotrasen description: historical-description-faction-Nanotrasen - historyType: enum.HistoryType.Faction \ No newline at end of file + historyType: enum.HistoryType.Faction + +- type: history + id: faction-Central-Government-of-the-Solar-System + name: historical-name-faction-Central-Government-of-the-Solar-System + description: historical-description-faction-Central-Government-of-the-Solar-System + historyType: enum.HistoryType.Faction + container: + additionalSkillPoints: 5 + +- type: history + id: faction-Free-Trade=Union + name: historical-name-faction-Free-Trade=Union + description: historical-description-faction-Free-Trade=Union + historyType: enum.HistoryType.Faction + container: + defaultSkillLevels: + economy: [enum.SkillLevel.Basic] + unblockedSkillLevels: + economy: [enum.SkillLevel.Master] From 9f07dfe5f28ebfcdcc19c85c5b3fa9c2d973d5df Mon Sep 17 00:00:00 2001 From: aw-c Date: Fri, 13 Dec 2024 02:41:38 +0300 Subject: [PATCH 07/43] bug fixes + locale --- .../Lobby/UI/HumanoidProfileEditor.xaml.cs | 51 ++++++++++--------- .../historical/cultures.ftl} | 12 ++--- .../Locale/ru-RU/aws/historical/factions.ftl | 0 .../Locale/ru-RU/aws/historical/names.ftl | 3 ++ .../Prototypes/AWS/Historical/culture.yml | 12 ++--- .../Prototypes/AWS/Historical/faction.yml | 12 ++--- .../Prototypes/AWS/Historical/lifestyle.yml | 4 +- 7 files changed, 50 insertions(+), 44 deletions(-) rename Resources/Locale/ru-RU/{ss14ru/history/culture.ftl => aws/historical/cultures.ftl} (96%) create mode 100644 Resources/Locale/ru-RU/aws/historical/factions.ftl create mode 100644 Resources/Locale/ru-RU/aws/historical/names.ftl diff --git a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs index cd6d11c06b..f4b5ce16aa 100644 --- a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml.cs @@ -1139,13 +1139,15 @@ private void OnSpeciesInfoButtonPressed(BaseButton.ButtonEventArgs args) // var protoId = _historicalUiStorage!.HistoryByButtonId[buttonId]; // var proto = _prototypeManager.Index(protoId); // _historicalUiStorage!.SelectedHistories[(HistoryType)proto.HistoryType] = protoId; + // _historicalUiStorage!.OptionButtonsByType[(HistoryType)proto.HistoryType].SelectId(buttonId); // } // private void RefreshHistoricalDescriptions() // { // foreach (var (key, value) in _historicalUiStorage!.SelectedHistories) // { // var proto = _prototypeManager.Index(value); - // _historicalUiStorage.DescriptionFieldForTypes[key].TextRope = new Rope.Leaf(proto.Description); + // var description = Loc.GetString(proto.Description); + // _historicalUiStorage.DescriptionFieldForTypes[key].TextRope = new Rope.Leaf(description); // } // } // public void RefreshHistorical() @@ -1173,8 +1175,8 @@ private void OnSpeciesInfoButtonPressed(BaseButton.ButtonEventArgs args) // var infoDescContainer = new BoxContainer() { Align = AlignMode.Center, Orientation = LayoutOrientation.Horizontal }; - // infoDescContainer.AddChild(new Label() { Text = key.ToString(), HorizontalAlignment = HAlignment.Left }); - // infoDescContainer.AddChild(new Control() { HorizontalExpand = true }); + // infoDescContainer.AddChild(new Label() { Text = Loc.GetString($"historical-names-{key.ToString()}"), HorizontalAlignment = HAlignment.Left }); + // infoDescContainer.AddChild(new Control() { HorizontalExpand = true }); // optionButton = new OptionButton() { HorizontalAlignment = HAlignment.Right }; // optionButton.OnItemSelected += (args) => @@ -1187,14 +1189,14 @@ private void OnSpeciesInfoButtonPressed(BaseButton.ButtonEventArgs args) // typeContainer.AddChild(infoDescContainer); - // var scrollContainer = new ScrollContainer - // { - // HorizontalExpand = true, - // VerticalExpand = true, - // HScrollEnabled = false, - // VScrollEnabled = true, - // MinSize = new Vector2(0, 60) - // }; + // var scrollContainer = new ScrollContainer + // { + // HorizontalExpand = true, + // VerticalExpand = true, + // HScrollEnabled = false, + // VScrollEnabled = true, + // MinSize = new Vector2(0, 120) + // }; // var descriptionField = new TextEdit // { @@ -1212,19 +1214,20 @@ private void OnSpeciesInfoButtonPressed(BaseButton.ButtonEventArgs args) // HistoricalContainer.AddChild(typeContainer); // } - // foreach (var protoId in value) - // { - // optionButton?.AddItem(protoId, lastButtonId++); - // historyByButtonId.Add(protoId); - // } - // } - // _historicalUiStorage = new( - // historyByButtonId, - // selectedHistories, - // descriptionFieldForTypes, - // optionButtonsByType, - // histories - // ); + // foreach (var protoId in value) + // { + // var proto = _prototypeManager.Index(protoId); + // optionButton?.AddItem(Loc.GetString(proto.Name), lastButtonId++); + // historyByButtonId.Add(protoId); + // } + // } + // _historicalUiStorage = new( + // historyByButtonId, + // selectedHistories, + // descriptionFieldForTypes, + // optionButtonsByType, + // histories + // ); // RefreshHistoricalDescriptions(); // HistoricalCheckSelectedHistories(); diff --git a/Resources/Locale/ru-RU/ss14ru/history/culture.ftl b/Resources/Locale/ru-RU/aws/historical/cultures.ftl similarity index 96% rename from Resources/Locale/ru-RU/ss14ru/history/culture.ftl rename to Resources/Locale/ru-RU/aws/historical/cultures.ftl index 9a7172ba11..7594f2b393 100644 --- a/Resources/Locale/ru-RU/ss14ru/history/culture.ftl +++ b/Resources/Locale/ru-RU/aws/historical/cultures.ftl @@ -1,5 +1,5 @@ -historical-name-culture-Marsman = Марс -historical-description-culture-Marsman = +historical-name-Culture-Marsman = Марс +historical-description-Culture-Marsman = Марс - нынешняя столица ЦПСС, известная в обиходе как "Красная планета", является одним из самых густонаселенных центров Человечества. Со времени основания Джимми Гидеоном первой колонии много лет назад, Марс был важным игроком в Человеческом пространстве. Терраформинг на Марсе был успешен лишь частично, и сегодня большая часть населения живет либо в огромных купольных городах или же агро-зонах, @@ -10,8 +10,8 @@ historical-description-culture-Marsman = Точно также как и с колыбелью Человечества - Землей, на протяжении веков их сопровождали кризисы, революции и регулярные беспорядки. Народ Марса нередко считает себя лучше остальных Людей, даже тех, кто живет на окраинах "Красной Планеты". -historical-name-culture-Earthman = Земля -historical-description-culture-Earthman = +historical-name-Culture-Earthman = Земля +historical-description-Culture-Earthman = Земля - родина Человечества, долгое время находилась в состоянии восстановления после столетий загрязнения и переэксплуатации. Сегодня большая ее часть существует как природный заповедник, посвященный сохранению истории Человечества. Проживающие, как правило, находятся в крупных городских зонах, расположенных по всей планете. @@ -21,8 +21,8 @@ historical-description-culture-Earthman = Людей с этой планеты в целом можно назвать богатыми, хотя они все несопоставимы с таковыми на Марсе. Как правило, они довольны своей жизнью. Земля так же разнообразна, как и всегда. -historical-name-culture-Lunaman = Луна -historical-description-culture-Lunaman = +historical-name-Culture-Lunaman = Луна +historical-description-Culture-Lunaman = Луна - спутник планеты Земля, долгое время была целью для Человечества и символом освоения космоса. Сегодня она является одной из старейших колоний для людей. Здешние жители богаты и могущественны. Разделенные на ряд взаимосвязанных куполов, разбросанных по поверхности, каждый из которых содержит свой уникальный город, diff --git a/Resources/Locale/ru-RU/aws/historical/factions.ftl b/Resources/Locale/ru-RU/aws/historical/factions.ftl new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Resources/Locale/ru-RU/aws/historical/names.ftl b/Resources/Locale/ru-RU/aws/historical/names.ftl new file mode 100644 index 0000000000..94a14571b1 --- /dev/null +++ b/Resources/Locale/ru-RU/aws/historical/names.ftl @@ -0,0 +1,3 @@ +historical-names-Culture = Культура +historical-names-Lifestyle = Стиль жизни +historical-names-Faction = Фракция \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Historical/culture.yml b/Resources/Prototypes/AWS/Historical/culture.yml index ef621b0768..48afc64e9f 100644 --- a/Resources/Prototypes/AWS/Historical/culture.yml +++ b/Resources/Prototypes/AWS/Historical/culture.yml @@ -1,14 +1,14 @@ - type: history isDefault: true id: culture-Earthman - name: historical-name-culture-Earthman - description: historical-description-culture-Earthman + name: historical-name-Culture-Earthman + description: historical-description-Culture-Earthman historyType: enum.HistoryType.Culture - type: history id: culture-Marsman - name: historical-name-culture-Marsman - description: historical-description-culture-Marsman + name: historical-name-Culture-Marsman + description: historical-description-Culture-Marsman historyType: enum.HistoryType.Culture container: blockedSkillLevels: @@ -16,8 +16,8 @@ - type: history id: culture-Lunaman - name: historical-name-culture-Lunaman - description: historical-description-culture-Lunaman + name: historical-name-Culture-Lunaman + description: historical-description-Culture-Lunaman historyType: enum.HistoryType.Culture container: additionalSkillPoints: 5 diff --git a/Resources/Prototypes/AWS/Historical/faction.yml b/Resources/Prototypes/AWS/Historical/faction.yml index d8dd2e725d..dad640d6e8 100644 --- a/Resources/Prototypes/AWS/Historical/faction.yml +++ b/Resources/Prototypes/AWS/Historical/faction.yml @@ -2,24 +2,24 @@ isDefault: true id: faction-Nanotrasen name: historical-name-faction-Nanotrasen - description: historical-description-faction-Nanotrasen + description: historical-description-Faction-Nanotrasen historyType: enum.HistoryType.Faction - type: history id: faction-Central-Government-of-the-Solar-System name: historical-name-faction-Central-Government-of-the-Solar-System - description: historical-description-faction-Central-Government-of-the-Solar-System + description: historical-description-Faction-Central-Government-of-the-Solar-System historyType: enum.HistoryType.Faction container: additionalSkillPoints: 5 - type: history - id: faction-Free-Trade=Union - name: historical-name-faction-Free-Trade=Union - description: historical-description-faction-Free-Trade=Union + id: faction-Free-Trade-Union + name: historical-name-faction-Free-Trade-Union + description: historical-description-Faction-Free-Trade-Union historyType: enum.HistoryType.Faction container: defaultSkillLevels: economy: [enum.SkillLevel.Basic] unblockedSkillLevels: - economy: [enum.SkillLevel.Master] + economy: [enum.SkillLevel.Master] \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Historical/lifestyle.yml b/Resources/Prototypes/AWS/Historical/lifestyle.yml index 66913d4ca7..e9b985dd64 100644 --- a/Resources/Prototypes/AWS/Historical/lifestyle.yml +++ b/Resources/Prototypes/AWS/Historical/lifestyle.yml @@ -1,6 +1,6 @@ - type: history isDefault: true id: lifestyle-Ascetic - name: historical-name-lifestyle-Ascetic - description: historical-description-lifestyle-Ascetic + name: historical-name-Lifestyle-Ascetic + description: historical-description-Lifestyle-Ascetic historyType: enum.HistoryType.Lifestyle \ No newline at end of file From 983ab327bcf0a69c840a64ba1ef08cdd671dd570 Mon Sep 17 00:00:00 2001 From: ZoNeSRuS Date: Tue, 17 Dec 2024 13:55:38 +0700 Subject: [PATCH 08/43] addSkils --- Resources/Locale/ru-RU/aws/skills/skills.ftl | 8 ++++++-- .../Prototypes/AWS/Skills/Attributes/bureaucracy.yml | 9 +++++++++ Resources/Prototypes/AWS/Skills/Attributes/chemistry.yml | 9 +++++++++ .../Prototypes/AWS/Skills/Attributes/construction.yml | 9 +++++++++ Resources/Prototypes/AWS/Skills/Attributes/medicine.yml | 9 +++++++++ .../AWS/Skills/Attributes/{driving.yml => piloting.yml} | 6 +++--- 6 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/bureaucracy.yml create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/chemistry.yml create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/construction.yml create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/medicine.yml rename Resources/Prototypes/AWS/Skills/Attributes/{driving.yml => piloting.yml} (53%) diff --git a/Resources/Locale/ru-RU/aws/skills/skills.ftl b/Resources/Locale/ru-RU/aws/skills/skills.ftl index 26c4f226af..23b3bea660 100644 --- a/Resources/Locale/ru-RU/aws/skills/skills.ftl +++ b/Resources/Locale/ru-RU/aws/skills/skills.ftl @@ -1,8 +1,12 @@ -skills-skillname-driving = Вождение +skills-skillname-piloting = Пилотирование skills-skillname-economy = Финансы skills-skillname-electricity = Электроника +skills-skillname-construction = Строительство skills-skillname-melee = Ближний бой skills-skillname-stamina = Атлетика skills-skillname-weapon = Оружейный опыт +skills-skillname-medicine = Медицина +skills-skillname-chemistry = Химия +skills-skillname-bureaucracy = Бюрократия -skills-examie-minimal = Для этого требуется [color={$skillColor}]{$skillName}[/color] не ниже [color={$levelColor}]{$skillLevel}[/color] \ No newline at end of file +skills-examie-minimal = Для этого требуется [color={$skillColor}]{$skillName}[/color] не ниже [color={$levelColor}]{$skillLevel}[/color] diff --git a/Resources/Prototypes/AWS/Skills/Attributes/bureaucracy.yml b/Resources/Prototypes/AWS/Skills/Attributes/bureaucracy.yml new file mode 100644 index 0000000000..f9f8eb28a5 --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/bureaucracy.yml @@ -0,0 +1,9 @@ +- type: skill + id: bureaucracy + category: organizing + cost: + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 diff --git a/Resources/Prototypes/AWS/Skills/Attributes/chemistry.yml b/Resources/Prototypes/AWS/Skills/Attributes/chemistry.yml new file mode 100644 index 0000000000..48d7a58bfc --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/chemistry.yml @@ -0,0 +1,9 @@ +- type: skill + id: chemistry + category: medicine + cost: + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 diff --git a/Resources/Prototypes/AWS/Skills/Attributes/construction.yml b/Resources/Prototypes/AWS/Skills/Attributes/construction.yml new file mode 100644 index 0000000000..33a5be678e --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/construction.yml @@ -0,0 +1,9 @@ +- type: skill + id: construction + category: engineering + cost: + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 diff --git a/Resources/Prototypes/AWS/Skills/Attributes/medicine.yml b/Resources/Prototypes/AWS/Skills/Attributes/medicine.yml new file mode 100644 index 0000000000..7347b6d899 --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/medicine.yml @@ -0,0 +1,9 @@ +- type: skill + id: medicine + category: medicine + cost: + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 diff --git a/Resources/Prototypes/AWS/Skills/Attributes/driving.yml b/Resources/Prototypes/AWS/Skills/Attributes/piloting.yml similarity index 53% rename from Resources/Prototypes/AWS/Skills/Attributes/driving.yml rename to Resources/Prototypes/AWS/Skills/Attributes/piloting.yml index fcbbcbff1f..072747ed81 100644 --- a/Resources/Prototypes/AWS/Skills/Attributes/driving.yml +++ b/Resources/Prototypes/AWS/Skills/Attributes/piloting.yml @@ -1,6 +1,6 @@ - type: skill - id: driving + id: piloting category: common - cost: + cost: enum.SkillLevel.NonSkilled: 0 - enum.SkillLevel.Experienced: 2 \ No newline at end of file + enum.SkillLevel.Experienced: 2 From b5bf0ebea978552ec81f3263a0ef5150c18e6992 Mon Sep 17 00:00:00 2001 From: aw-c Date: Thu, 9 Jan 2025 03:27:52 +0300 Subject: [PATCH 09/43] skills&histories --- .../AWS/Historical/HistoricalUiStorage.cs | 2 -- .../AWS/Historical/HistoryPrototype.cs | 4 ++++ .../AWS/Historical/SharedHistoricalSystem.cs | 21 +++++++++++++++++++ .../AWS/Skills/SharedSkillSystem.cs | 20 +++++++++++++++++- .../Prototypes/AWS/Historical/faction.yml | 2 +- 5 files changed, 45 insertions(+), 4 deletions(-) diff --git a/Content.Client/AWS/Historical/HistoricalUiStorage.cs b/Content.Client/AWS/Historical/HistoricalUiStorage.cs index de93d95f85..143aa76e21 100644 --- a/Content.Client/AWS/Historical/HistoricalUiStorage.cs +++ b/Content.Client/AWS/Historical/HistoricalUiStorage.cs @@ -1,5 +1,3 @@ - - using Content.Shared.AWS.Historical; using Robust.Client.UserInterface.Controls; using Robust.Shared.Prototypes; diff --git a/Content.Shared/AWS/Historical/HistoryPrototype.cs b/Content.Shared/AWS/Historical/HistoryPrototype.cs index 7bc1de7329..e1643161fb 100644 --- a/Content.Shared/AWS/Historical/HistoryPrototype.cs +++ b/Content.Shared/AWS/Historical/HistoryPrototype.cs @@ -1,5 +1,6 @@ using Robust.Shared.Prototypes; using Content.Shared.AWS.Skills; +using Content.Shared.Roles; namespace Content.Shared.AWS.Historical; @@ -26,6 +27,9 @@ public sealed partial class HistoryPrototype : IPrototype [ViewVariables(VVAccess.ReadWrite), DataField] public List> BlockingHistories = new(); + [ViewVariables(VVAccess.ReadWrite), DataField] + public List> BlockingJobs = new(); + [ViewVariables(VVAccess.ReadWrite), DataField] public SkillContainer Container = new(); } diff --git a/Content.Shared/AWS/Historical/SharedHistoricalSystem.cs b/Content.Shared/AWS/Historical/SharedHistoricalSystem.cs index ebc2ec025a..35ea15a60b 100644 --- a/Content.Shared/AWS/Historical/SharedHistoricalSystem.cs +++ b/Content.Shared/AWS/Historical/SharedHistoricalSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Humanoid; +using Content.Shared.Roles; using JetBrains.Annotations; using Robust.Shared.Prototypes; using System.Collections.Immutable; @@ -15,6 +16,8 @@ public abstract class SharedHistoricalSystem : EntitySystem public override void Initialize() { base.Initialize(); + + /*SubscribeLocalEvent(OnIsJobAllowed);*/ } [PublicAPI] @@ -55,4 +58,22 @@ public Dictionary>> GetHistories() return histories; } + + [PublicAPI] + public bool CanUseJob(ProtoId jobId, ProtoId historyId, + [NotNullWhen(false)] out string? error) + { + error = null; + if (_prototypeManager.TryIndex(historyId, out var proto) && !proto.BlockingJobs.Contains(jobId)) + return true; + + error = "incorrect history"; + return false; + } + +/* private void OnIsJobAllowed(ref IsJobAllowedEvent ev) + { + if (!_manager.IsAllowed(ev.Player, ev.JobId)) + ev.Cancelled = true; + }*/ } diff --git a/Content.Shared/AWS/Skills/SharedSkillSystem.cs b/Content.Shared/AWS/Skills/SharedSkillSystem.cs index 907c50949e..75954a5b21 100644 --- a/Content.Shared/AWS/Skills/SharedSkillSystem.cs +++ b/Content.Shared/AWS/Skills/SharedSkillSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Examine; using Content.Shared.Humanoid; +using Content.Shared.Roles; using JetBrains.Annotations; using Robust.Shared.Prototypes; using System.Collections.Immutable; @@ -24,7 +25,7 @@ public override void Initialize() private void HandleRequiredSkillExamined(EntityUid uid, RequiredSkillComponent component, ExaminedEvent args) { - foreach(var (key, value) in component.Container.Skills) + foreach (var (key, value) in component.Container.Skills) { if (value is not null && (SkillLevel)value != SkillLevel.NonSkilled) { @@ -108,6 +109,23 @@ public bool TrySetSkillLevel(EntityUid ent, ProtoId skillName, S return true; } + [PublicAPI] + public bool CanUseJob(ProtoId jobId, SkillContainer cont, + [NotNullWhen(false)] out string? error) + { + error = null; + if (_prototypeManager.TryIndex(jobId, out var jobProto)) + { + if (true) // соответственно после добавления свойства должна быть логика на проверку заблокированных джобок + return true; + + error = "insufficient skills"; + return false; + } + + return true; + } + private void SetSkillLevel(Entity ent, ProtoId skillName, SkillLevel skillLevel) { if (ent.Comp.Container is not null) diff --git a/Resources/Prototypes/AWS/Historical/faction.yml b/Resources/Prototypes/AWS/Historical/faction.yml index dad640d6e8..3b4a6e4e64 100644 --- a/Resources/Prototypes/AWS/Historical/faction.yml +++ b/Resources/Prototypes/AWS/Historical/faction.yml @@ -20,6 +20,6 @@ historyType: enum.HistoryType.Faction container: defaultSkillLevels: - economy: [enum.SkillLevel.Basic] + economy: enum.SkillLevel.Basic unblockedSkillLevels: economy: [enum.SkillLevel.Master] \ No newline at end of file From 4a1c3c83d1661a3c512d0166331265b9216e8105 Mon Sep 17 00:00:00 2001 From: aw-c Date: Thu, 9 Jan 2025 04:21:34 +0300 Subject: [PATCH 10/43] points for age --- .../AWS/Skills/AgeSkillPointsPrototype.cs | 19 +++++++++++++++++ .../AWS/Skills/SkillPointController.cs | 21 +++++++++++++++++++ .../Locale/ru-RU/aws/historical/factions.ftl | 3 +++ .../Prototypes/AWS/Skills/AgePoints/human.yml | 8 +++++++ 4 files changed, 51 insertions(+) create mode 100644 Content.Shared/AWS/Skills/AgeSkillPointsPrototype.cs create mode 100644 Resources/Prototypes/AWS/Skills/AgePoints/human.yml diff --git a/Content.Shared/AWS/Skills/AgeSkillPointsPrototype.cs b/Content.Shared/AWS/Skills/AgeSkillPointsPrototype.cs new file mode 100644 index 0000000000..868f257337 --- /dev/null +++ b/Content.Shared/AWS/Skills/AgeSkillPointsPrototype.cs @@ -0,0 +1,19 @@ +using Robust.Shared.Prototypes; +using Content.Shared.Humanoid.Prototypes; + +namespace Content.Shared.AWS.Skills; + +[Prototype("ageSkillPoints")] +public sealed partial class AgeSkillPointsPrototype : IPrototype +{ + [IdDataField] public string ID { get; } = string.Empty; + + [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] + public ProtoId Specie = default!; + + [ViewVariables(VVAccess.ReadWrite), DataField(required: true)] + public Dictionary PointsForAges = new(); + + [ViewVariables(VVAccess.ReadWrite), DataField] + public int MinAge = 18; +} \ No newline at end of file diff --git a/Content.Shared/AWS/Skills/SkillPointController.cs b/Content.Shared/AWS/Skills/SkillPointController.cs index 9260482395..8b19f3c924 100644 --- a/Content.Shared/AWS/Skills/SkillPointController.cs +++ b/Content.Shared/AWS/Skills/SkillPointController.cs @@ -155,6 +155,27 @@ public static (bool, SkillContainer?) IsValid(int maxPoints, Dictionary= _minAge) + { + if (age >= _ageSecondStep) + { + + } + + } + + return 0; + } + + public SkillPointController(int age, ProtoId historyId, IPrototypeManager? protoManager) + { + MaxPoints = CalculateAges(age); + + _prototypeManager = protoManager ?? IoCManager.Resolve(); + } + public SkillPointController(int maxPoints, Dictionary, List> unblockedSkills, IPrototypeManager? protoManager, SkillContainer? container) { Container = container ?? new(); diff --git a/Resources/Locale/ru-RU/aws/historical/factions.ftl b/Resources/Locale/ru-RU/aws/historical/factions.ftl index e69de29bb2..02e6ba5b4d 100644 --- a/Resources/Locale/ru-RU/aws/historical/factions.ftl +++ b/Resources/Locale/ru-RU/aws/historical/factions.ftl @@ -0,0 +1,3 @@ +historical-name-faction-Nanotrasen = Nanotrasen +historical-name-faction-Central-Government-of-the-Solar-System = Центральное правительство солнечной системы +historical-name-faction-Free-Trade-Union = Свободный торговый союз \ No newline at end of file diff --git a/Resources/Prototypes/AWS/Skills/AgePoints/human.yml b/Resources/Prototypes/AWS/Skills/AgePoints/human.yml new file mode 100644 index 0000000000..ba07539e04 --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/AgePoints/human.yml @@ -0,0 +1,8 @@ +- type: ageSkillPoints + id: humanSkillPoints + specie: human + minAge: 18 + pointsForAges: + 20: 0.5 + 35: 0.3 + 50: 0.1 \ No newline at end of file From 9a95882f65155411433b7267c7e9b1c7351c7a19 Mon Sep 17 00:00:00 2001 From: aw-c Date: Sun, 2 Feb 2025 15:38:22 +0300 Subject: [PATCH 11/43] remove unused --- Content.Shared/AWS/Skills/SkillPointController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Shared/AWS/Skills/SkillPointController.cs b/Content.Shared/AWS/Skills/SkillPointController.cs index 8b19f3c924..582651d63b 100644 --- a/Content.Shared/AWS/Skills/SkillPointController.cs +++ b/Content.Shared/AWS/Skills/SkillPointController.cs @@ -155,7 +155,7 @@ public static (bool, SkillContainer?) IsValid(int maxPoints, Dictionary= _minAge) { @@ -174,7 +174,7 @@ public SkillPointController(int age, ProtoId histor MaxPoints = CalculateAges(age); _prototypeManager = protoManager ?? IoCManager.Resolve(); - } + }*/ public SkillPointController(int maxPoints, Dictionary, List> unblockedSkills, IPrototypeManager? protoManager, SkillContainer? container) { From eecacfd4e76ba57b83fdf2087c748bb0c237e561 Mon Sep 17 00:00:00 2001 From: aw-c Date: Wed, 5 Feb 2025 02:31:22 +0300 Subject: [PATCH 12/43] points fix --- .../AWS/Skills/SkillPointController.cs | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/Content.Shared/AWS/Skills/SkillPointController.cs b/Content.Shared/AWS/Skills/SkillPointController.cs index 582651d63b..a84bbb5e58 100644 --- a/Content.Shared/AWS/Skills/SkillPointController.cs +++ b/Content.Shared/AWS/Skills/SkillPointController.cs @@ -56,13 +56,18 @@ private SkillLevel GetAnyLessThan(SkillPrototype skillProto, SkillLevel currentS return mostMatched; } - private SkillLevel GetAnyHigerThan(SkillPrototype skillProto, SkillLevel currentSkillLevel) + private SkillLevel GetAnyHigerMostMatchedThanAndLess(SkillPrototype skillProto, SkillLevel currentSkillLevel, SkillLevel selectedSkillLevel) { + var currentSkillPoints = CurrentPoints; + SkillLevel lastCycledLevel = currentSkillLevel; + foreach (var (key, value) in skillProto.Cost) - if ((SkillLevel)key > currentSkillLevel) - return (SkillLevel)key; + if (key is SkillLevel cycleLevel) + if (cycleLevel > currentSkillLevel && cycleLevel <= selectedSkillLevel) + if (currentSkillPoints + GetPointsForSkill(skillProto.ID, cycleLevel) >= 0) + lastCycledLevel = cycleLevel; - return currentSkillLevel; + return lastCycledLevel; } public SkillLevel MatchMoreExistenceLevel(ProtoId protoId, SkillLevel currentSkillLevel, SkillLevel selectedSkillLevel) @@ -77,12 +82,12 @@ public SkillLevel MatchMoreExistenceLevel(ProtoId protoId, Skill return GetAnyLessThan(skillProto, currentSkillLevel); if (selectedSkillLevel > currentSkillLevel) - return GetAnyHigerThan(skillProto, currentSkillLevel); + return GetAnyHigerMostMatchedThanAndLess(skillProto, currentSkillLevel, selectedSkillLevel); return currentSkillLevel; } - public int GetPointsForSkill(ProtoId protoId, SkillLevel level) + private int GetPointsForSkillByCurrentSkillLevel(SkillLevel currentSkillLevel, ProtoId protoId, SkillLevel level) { if (!_prototypeManager.TryIndex(protoId, out var skillProto)) return 0; @@ -90,19 +95,17 @@ public int GetPointsForSkill(ProtoId protoId, SkillLevel level) if (!skillProto.Cost.TryGetValue(level, out var selectedSkillCost)) return 0; - var currentSkillLevel = GetCurrentSkillLevel(protoId); - if (currentSkillLevel == level) return ((int)selectedSkillCost); var currentSkillCost = skillProto.Cost[currentSkillLevel]; return (int)(currentSkillCost - selectedSkillCost); + } - /*if (currentSkillCost > selectedSkillCost) - return (int)(currentSkillCost - selectedSkillCost); - - return (int)(selectedSkillCost - currentSkillCost);*/ + public int GetPointsForSkill(ProtoId protoId, SkillLevel level) + { + return GetPointsForSkillByCurrentSkillLevel(GetCurrentSkillLevel(protoId), protoId, level); } public void ProcessSkill(ProtoId protoId, SkillLevel level) @@ -126,8 +129,8 @@ public void ProcessSkill(ProtoId protoId, SkillLevel level) if (CurrentPoints + skillCost >= 0) { - SetSkillLevel(protoId, level); - OnRecalculateSkill?.Invoke(protoId, level); + SetSkillLevel(protoId, moreExistenceLevel); + OnRecalculateSkill?.Invoke(protoId, moreExistenceLevel); } } From 61fbca0675378c39e108e4491b4f4bd9328f21c0 Mon Sep 17 00:00:00 2001 From: ZoNeSRuS Date: Mon, 17 Feb 2025 07:45:07 +0700 Subject: [PATCH 13/43] add research --- Resources/Locale/ru-RU/aws/skills/categories.ftl | 4 ++-- Resources/Locale/ru-RU/aws/skills/skills.ftl | 2 ++ Resources/Prototypes/AWS/Skills/Attributes/devices.yml | 9 +++++++++ Resources/Prototypes/AWS/Skills/Attributes/research.yml | 9 +++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/devices.yml create mode 100644 Resources/Prototypes/AWS/Skills/Attributes/research.yml diff --git a/Resources/Locale/ru-RU/aws/skills/categories.ftl b/Resources/Locale/ru-RU/aws/skills/categories.ftl index 7c2308305b..6b1278c5a3 100644 --- a/Resources/Locale/ru-RU/aws/skills/categories.ftl +++ b/Resources/Locale/ru-RU/aws/skills/categories.ftl @@ -2,6 +2,6 @@ skills-category-organizing = Организационные skills-category-common = Общие skills-category-engineering = Инженерия skills-category-medicine = Медицина -skills-category-research = Исследование +skills-category-research = Научный труд skills-category-security = Безопасность -skills-category-service = Сервис \ No newline at end of file +skills-category-service = Сервис diff --git a/Resources/Locale/ru-RU/aws/skills/skills.ftl b/Resources/Locale/ru-RU/aws/skills/skills.ftl index 23b3bea660..53d036532e 100644 --- a/Resources/Locale/ru-RU/aws/skills/skills.ftl +++ b/Resources/Locale/ru-RU/aws/skills/skills.ftl @@ -8,5 +8,7 @@ skills-skillname-weapon = Оружейный опыт skills-skillname-medicine = Медицина skills-skillname-chemistry = Химия skills-skillname-bureaucracy = Бюрократия +skills-skillname-research = Изучение +skills-skillname-devices = Сложные устройства skills-examie-minimal = Для этого требуется [color={$skillColor}]{$skillName}[/color] не ниже [color={$levelColor}]{$skillLevel}[/color] diff --git a/Resources/Prototypes/AWS/Skills/Attributes/devices.yml b/Resources/Prototypes/AWS/Skills/Attributes/devices.yml new file mode 100644 index 0000000000..1730b2100e --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/devices.yml @@ -0,0 +1,9 @@ +- type: skill + id: devices + category: research + cost: + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 diff --git a/Resources/Prototypes/AWS/Skills/Attributes/research.yml b/Resources/Prototypes/AWS/Skills/Attributes/research.yml new file mode 100644 index 0000000000..7f51766cbd --- /dev/null +++ b/Resources/Prototypes/AWS/Skills/Attributes/research.yml @@ -0,0 +1,9 @@ +- type: skill + id: research + category: research + cost: + enum.SkillLevel.NonSkilled: 0 + enum.SkillLevel.Basic: 1 + enum.SkillLevel.Trained: 2 + enum.SkillLevel.Experienced: 4 + enum.SkillLevel.Master: 6 From e29009f721073a27be138c052413d265213de0e8 Mon Sep 17 00:00:00 2001 From: ZoNeSRuS Date: Sat, 19 Apr 2025 11:28:09 +0700 Subject: [PATCH 14/43] Revert "WWDP Logo (#37)" This reverts commit bb6c49745704211ee63560e96016234bd490c9f5. --- .../MainMenu/UI/MainMenuControl.xaml.cs | 2 +- .../Menu/ReplayMainMenuControl.xaml.cs | 2 +- .../Textures/_White/Logo/icon/icon-128x128.png | Bin 3812 -> 0 bytes .../Textures/_White/Logo/icon/icon-16x16.png | Bin 934 -> 0 bytes .../Textures/_White/Logo/icon/icon-24x24.png | Bin 1392 -> 0 bytes .../Textures/_White/Logo/icon/icon-256x256.png | Bin 8467 -> 0 bytes .../Textures/_White/Logo/icon/icon-32x32.png | Bin 1337 -> 0 bytes .../Textures/_White/Logo/icon/icon-48x48.png | Bin 1720 -> 0 bytes .../Textures/_White/Logo/icon/icon-64x64.png | Bin 2017 -> 0 bytes Resources/manifest.yml | 6 +++--- 10 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 Resources/Textures/_White/Logo/icon/icon-128x128.png delete mode 100644 Resources/Textures/_White/Logo/icon/icon-16x16.png delete mode 100644 Resources/Textures/_White/Logo/icon/icon-24x24.png delete mode 100644 Resources/Textures/_White/Logo/icon/icon-256x256.png delete mode 100644 Resources/Textures/_White/Logo/icon/icon-32x32.png delete mode 100644 Resources/Textures/_White/Logo/icon/icon-48x48.png delete mode 100644 Resources/Textures/_White/Logo/icon/icon-64x64.png diff --git a/Content.Client/MainMenu/UI/MainMenuControl.xaml.cs b/Content.Client/MainMenu/UI/MainMenuControl.xaml.cs index 2449c08b73..1d5244305d 100644 --- a/Content.Client/MainMenu/UI/MainMenuControl.xaml.cs +++ b/Content.Client/MainMenu/UI/MainMenuControl.xaml.cs @@ -22,7 +22,7 @@ public MainMenuControl(IResourceCache resCache, IConfigurationManager configMan) LayoutContainer.SetMarginTop(VBox, 30); LayoutContainer.SetGrowHorizontal(VBox, LayoutContainer.GrowDirection.Begin); - var logoTexture = resCache.GetResource("/Textures/_White/Logo/icon/icon-256x256.png"); // WD EDIT + var logoTexture = resCache.GetResource("/Textures/Logo/logo.png"); Logo.Texture = logoTexture; var currentUserName = configMan.GetCVar(CVars.PlayerName); diff --git a/Content.Replay/Menu/ReplayMainMenuControl.xaml.cs b/Content.Replay/Menu/ReplayMainMenuControl.xaml.cs index 0f82870047..8ab7f7412d 100644 --- a/Content.Replay/Menu/ReplayMainMenuControl.xaml.cs +++ b/Content.Replay/Menu/ReplayMainMenuControl.xaml.cs @@ -23,7 +23,7 @@ public ReplayMainMenuControl(IResourceCache resCache) LayoutContainer.SetGrowHorizontal(VBox, LayoutContainer.GrowDirection.Begin); Subtext.FontOverride = resCache.GetFont("/Fonts/NotoSansDisplay/NotoSansDisplay-Bold.ttf", 24); - var logoTexture = resCache.GetResource("/Textures/_White/Logo/icon/icon-256x256.png"); // WD EDIT + var logoTexture = resCache.GetResource("/Textures/Logo/logo.png"); Logo.Texture = logoTexture; LayoutContainer.SetAnchorPreset(InfoContainer, LayoutContainer.LayoutPreset.BottomLeft); diff --git a/Resources/Textures/_White/Logo/icon/icon-128x128.png b/Resources/Textures/_White/Logo/icon/icon-128x128.png deleted file mode 100644 index 5dfc2b9dbdaa4a0303ede3460f2bf664ee95fa0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3812 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 JL_O!2{{dAS6r%tD diff --git a/Resources/Textures/_White/Logo/icon/icon-16x16.png b/Resources/Textures/_White/Logo/icon/icon-16x16.png deleted file mode 100644 index 50dc3cf99fb5dbc95ed8f04dc2a74a0e8ed7c8d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 934 zcmV;X16lluP)EX>4Tx04R}tkvmAkP!xv$rk1Ky9PA+KkfAzR5EXHhDi*;)X)CnqU~i6e@tQGX%p zvch?bvs$UK)|~u>p}e+|<~rpF;#figNr;e9Lm3rVh|;N%Vj@NNF%SQc<4=-HCRZ7Z z91EyIh2;3b|KRs-&BD~A+bI+S0x!1xF$x5Cfo9#dzmILZc>?&Kfh(=;uQq_$Ptxmc zEpi0(Zvz+CZB5<-E_Z;zCtWfmNAgn&g#z$?M&FbJ25y1gHFs~Vdz?N18QRtI4RCM> zj1{T(y2rb_JNNc)O>2KY6WeluT9n4#00006VoOIv089Wy07i|jrMUnA010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=m`M{9wYjgLwNuI02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00DkUL_t(I%hi%kD1&hr$3MT{Uazq&|Atb$7p2}b|4z#e zyDX&~TpSfC#mz-rhLlncE>e=@AUViMqDXIcb9@gD)*MDn@=CL2^SZp#S_(J5r>Cdy z^ZE8XJ@D@(zB5FE!3|)nq-_GTC$ZR}Ff@G&mlkSf$_ z{@n-gV}P*P@4YqS0EVUy7y1hD?6UFpr?cJ88nWXp-wM?H1grofDy-YE68ES)OF?7q zeLU__v5SnhV8GDy6i^Pd=Y@Fu{DVj^7yxDg{}&+>(WJFj%mVfnnyR*KI1(jK(*jfg z5-0<5z>5>)2hzaZNi6nMn2{xE0idpEs1xu2s&f;|f&L+V0HKRi_@%07*qo IM6N<$f=xP~C;$Ke diff --git a/Resources/Textures/_White/Logo/icon/icon-24x24.png b/Resources/Textures/_White/Logo/icon/icon-24x24.png deleted file mode 100644 index 78e4a556a275da6c33fc782f21faca99253bbe0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1392 zcmV-$1&{iPP)EX>4Tx04R}tkvmAkP!xv$rk1Ky9PA+KkfAzR5EXHhDi*;)X)CnqU~i6e@tQGX%p zvch?bvs$UK)|~u>p}e+|<~rpF;#figNr;e9Lm3rVh|;N%Vj@NNF%SQc<4=-HCRZ7Z z91EyIh2;3b|KRs-&BD~A+bI+S0x!1xF$x5Cfo9#dzmILZc>?&Kfh(=;uQq_$Ptxmc zEpi0(Zvz+CZB5<-E_Z;zCtWfmNAgn&g#z$?M&FbJ25y1gHFs~Vdz?N18QRtI4RCM> zj1{T(y2rb_JNNc)O>2KY6WeluT9n4#00006VoOIv089Wy07i|jrMUnA010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=m`M{A2keSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00T%#L_t(Y$L*C(Xk1kk$A9O(J8v?XNv2JcIDxiFno7(U zwox=`gEV3aibz03kcyDKOWi82+_-enjVN>>xDwsisJNI+G#0u_{AenswxxBNrb#Am zX5PGaj|-o*hWORst_Loc!@c)>-Sht+xF`Q0@?S1bjgR}lexP%Q;|N#>t{_sKEtM2N ziamoqh?6EiKK|W#Egl*+IQ0NG@zY`qQ0yJ@P~`1GOQ9n2D)3@rGzDaV0JsG#0UrWi zB64ZAREoTre8(ivP864C+6#`@?E{VgnRnOAH;O$&7S(Rx@Lof(=-Vye60iVV1-gLG zfD(`cUI03PZ~G1$xaH04={OS^8JgSMygZjnha+2Izrt(Pl)3L(f8T{(=WI*lo~&7O zs&351g6jM;>(%cctJHtY853EN(UCCvc&bwWB=$_P?3s$fvq`xYEHD&UbNFJ)(={V! zfQBR(&t)TbWIAYk zHJbI`e=nbTSYaA?#{h&z+N&bd5i$Vazy_Z511Bp++Umw|(|R2%o_PQ$0As-OnaE8R zs*Qcw$Q=h>23|k76&}s1E&v07*j;pB0Mveq2LKDS0gtpQzf^?mZXL`4p8^|+-UYk_ zG<&KFBENgRTUi7?m{?i54p8hK8~~oUBO?F|p#LY5EwBuX8t@*fM~@~*%>ky%xx&#P zeA;)~w;KmR1?U4F_Q+?bMG&OlZV3$1ci;aows0Vr}?FN7e_jv-9&e zU%*@Wu>%IAXSMn=<>o*R+#)xMC0000XH=6<(C?Gbk*0uv(gYNh4oa^gB2q;VkrHYEX$ifPfE4KnQl$G=5d;*X2@pyE zX;K9#fdHW^(p$g)x$(Ro@BMVoyXQP-_nF=En=LatvokNuO!QfqFEIlEz-n;+t~mgJ zs7(;SNKdV7{XRgcKhHgMb|ocrBw$ z)tZAFo_+IT+Z_*yFKZ5dqdd1f?wi~4(@n(0rgv7xCZlTDYGQ)7PZv4zI%D~O$T_3Pf@-i zbV0WE$+|;BtaY#1i}DwuNtF+yul%WN4^2irt*9L@Jc%o7Lcd&5U1nT(atCaXnDJ1T zkNZjDNJXZTh#pCfoszL=`qJ>46<-Sfxes^ZmX6veM3T=y`_H%2H@IlPGU!t|X4+sR zbOzm;?u`uvAC({_sy99uo(>?*;PjE>D#%u)CTzb`tFlMi_x7lkv?M$ zfwQWCYd>#roc~`ce5*#5!mVD`*Zff(xrphmP)ja^y>K%AJb|6JX&tJiL>j0iuPCQM zeg)5IsT8G2GKQ4C>+Bw3dmm7rT!@Y|qQ{*YlDnQ6s-DVu*W z+#GCaV{_}}Wu7&1CPXp%aNW9dlj2<Bpj6Qo7vKP58vXHdu1|5Aj6BpZQ!(eLG|l z?LDbTyGj`hNO&j>>0I|LSM1qq6QDN+9X)veKM7+&c2~ z^H)PVaH2Hmo;{;v;yhdbP54~oF`+@@b}mHF7vEy10c7srhE}1_w@GrqOwP;#U z2ch7gSPK0~)OwVj3O&PtB%;uWZIWS~w{zNEjD5x;*X$lGKV4ek3N2spHicW8J43K7 z%Z>SnYjYJ#wtBs`rl^F$@I0uvn>k^PcK^Y}9@8gRpqQkjkc#JlwN^ZrXHz@*MueE` z2AApFhK{ju!b?){M!_X+vgh(1$iE9V-x1dUZ~Uf!AgshrO96pQuy$AKd!zTvM@%q% zrp~4q@<>~54q*9v z-kG{pEF+QC)hZ5dJF911U0oJ8a|_%yF)#Z!Aot}z`rg!4o9IHAHdkCu(ACg14ehc2)d0>86sL&vkdR z+)RM=3j;oiA!9Qo*nq*pGjD7#dlSR3d^z-O9+4JQY-_(W2O{$<>Cf+wWIsdBm@!et$>>l-zek z&2^tzA(ypTVP|HA0j!n%>;7`NkAF zQ(dT<;jg|EBqqix@1gVdpuDZvCQJVWFg>Q8Ff{em)7fFKi1S*+*NrL9=ym88!z}28 z88*woLT@C88k%p3q{?snn721gqe4deQ3RhRCBr#d>kWuwvLAQsU0Sh!Xezk+`}{co zb*szf`_2sS7e}v0KuXFG=}@(($R@`wd?UBHF^pAbyKF(ZO)oo|rG}oQ1!#tc>vo`D zRad+5vk%`D&YZ8m74r9Yguj(la)+D1892mG*6u*(h#lw4!yI?R(9_cxBrKn#KKY}z z)y(=>N{I~q%&eTfPwbmO29Qi?Ff1Zl1~~YtooO~Uu##!5Yy>^|+UwE~ z`fa!Z_AlD#+CTLe=lHc2c9kW@7ffMXzp=QCyGmaol2(2lxO=bmmA7{SV+@wR1+pTC zgeX1v@&&E&eC#0&MtZa7ae;l8E`h1! z>lmMz#t7n>t^@1vqj(YV3*AD(X%HpeCpih{`Fj}N<|y7W(wvqD2eZGq-dcx3MZcBM zx=hP$bIqz46JXL|J(tD0pxoNn-0b@SGluL*=`lGb&DSQu+JCoPP8Px3xq=Prh$lE` zwFYjEDGV$ei}g9P77$uClh8NDDrRwqMc#a6;iQy15kGiV#%>i=q`{N>)mKf}l%YNe zFH{P(ZlN$cldrFYdPP{etx6bw{W{mNeu=31AUgYq&7o^LM>6#IEJ5h7j!wHxGNQI| z!7up@#k?KK-wFMLT*+iZNO4NkJbhGjW|#ct4ikBgYkRbeUBcPaGD(zMTubrqfb?vp z$!VkB57zP@`>A5^8pG#uy5PU} z1&JyPD`dvd8@HXeYS4VQv4qKsR!gLr-S%^?cEMMcXU%1?JbA`-jL&XB8^WEhlu+h( zY$YB68Gl3dD(ORlZ*9*A_rbyYGKSE(-h3;84F zRCMLYa%z5xAV8C~ioV|ONvl}G15&1@g@{9I$Hl_(*oaO}sl8{#K??&Iujn&(6-^?t zriM`0*eFy_c6#}{`5hWR$2js^D6{IMN)E`p@LbH3G6Rmduqv?T5bg0}38qr)*1O%ZBxl%gD!+pTqnFC`3BJ)>Jb z4as2{Chz>l(1~|%8t%o#P|ZT3k*GDpc6$Gj*G-nWDf!jP-mBcop5sslspY&Y?&B6L zl2oDNXrw(dR?u{VwvH>7uf(9Fer;m6f)c`!&Dm##+ESfZMXI8eSu))MqKRD$HmhU( zn$t00R4VS8u+4(vKmh3y6=XY=U6NK46j2&D+ival=sw)O_Y%>84_&@<*qQuK*&|lw zBY0Oey#09w)jwV!On}LKFuu>rLuSPPmZB16ain28vc7MHY{swXliN~$C-T=flIL{leMEF%R7Uq)?I6P=bhUQIUPK6)kpUi ztbw|Em$yjn6~eeG25OcI*5U9H3$69=Abk3#mxbq$5E_VV9^^rOvyuFj4{y1j3tarC z`{M)kW0(PZ<-pQb7{t?)4W*H-%;7Ezq4KG_=1AB?LKJ&8$!rfIL#y#|)P2dsFfOj; z9G|1#J34ML4+rXp{u$_|3gzS~4z?p}km)A)?z^ZO>TCk)&!4>1v27KS&;=|csH_s` zaGga~wsNI`6m@In>YpUW$2b3xdvUIDwrfqG1Asv8;{ZIUd+^HvXUlkveOoAZQK~)c zl9>xv1Mf-G{E7CzKDegO7nUFltrun047{>BR*n(ywz8$J}~{nRl5S!czg0kLzD)QQj&LJB)@5EXu2 zZ1}t(!kP-*mdr9Y_t}5+thSMcDynRt&{R-jB3Sz_mD&G={1Ev6?{aBkKzzJ(x62n; z`u@-)vD~sq#90PN%dt&5|G3`tabQwPGoWnlcf&;Qd*tiNM=tAhxHLa5m%Iv9y{;z! zuh-+-i7BH%;yj;aY>zT4LiY1xVROsG6s?Nb1U7Z0!0-FHIJfj|^duLFNy`6X%kQcv zHNNLn*ZbnNpFHDxwQ1>wm0{y#)iO;eX9)$23gi@aZRhP%($n3oXxr%;e%&J~xJ|fk zfVUf5E4bXACYFl~M%nJQ+gkXKlbtMp+p6lWJv60fo#jp5o0eJu>!P?s;}tpaLcz}D z{)ivz`wO6&6L3{<0bZ;Mc(~DjL4yH?9XnZlwi##6^D(go1 zl8c^U+b_su-8afi=^Z7BmHyOUAlJ?py&}hR26v!S7H5g~zev}G&OUS?Y zDrhqeDaC!m{)5SAc`d-VVMqB`!`%Odj@Zg9DXE*OHn7n{1z61S3O~EAc{4&_Q9@e+ zHX{AtW{~t??rf+Q7q6+M<>$~lubnTkXFQBpDVM2dKGGn1XP?n}uz$YIef(pdkPezb zyA!@HPm22UoZ$#c1v`!oa@!K(^!N4F`+N1(E$treMy6;~APC=XMV7&>qmeg`6TeSB zEYZIA^nct(9_{^$g(O5PP2SV^HxS^E&_r%%|8NdK*aWE;M0?G?sqrFURG8mj3if=6 zst$r2kG~D-9VZ&p`hQ`WA)Pwn8ks!MR&VP?tQ^9whzO`5V_A2KMv8|Y2qvzxrZoTl znGubgsX#b8Q~WBD5PIHw&)Cw(Spyhh*Fxl{qBV}ZJAI-XT9)+Thb*Kh)@O^plP$AI zUGLnn6I_u#!5Zp=iGgtA-f{jH^4+xoY-;(+)sD>%>Sd77l*g9Op_cVu-WPI4>)gHY^6#&;L^c`9pz41K}TQ z1xOhwtzU9Fzc%&089qrIf#jS82`4 z<}?M@vrOo;UbkhjJ7P9J0%hI~Ui|(tH%c8K0yU zZ=6>tip8b3m3XT+Lhnv}&qxu>Crig}y(CO=WGdYR25@WfMFniBKku;^099+hdK&Rz zypt$ek;UOh4s%NE_x8n9TuAAS|NXKgY?(AF@2`n5TdFj_`E%Ri`zCTUSLR&|92|i2%i{xK+r`(r08}aaZaVvpNjm=u(OL|dZ4Db zaf$Wvt))jjud$80Ivnbb+dQ3pNFM&pi9+ww1S6 zaTsK^s-R2Z^$dP;wDb1H-;IK(sKt0z%^EP^;Ht0RqQt1!h=&$+X`E5A?UcyCCKTmoCtc2bDPiAz<4B&ao<9$A;!kU9q#13pwV%W-Q8hfHf!{lR zt;`t4=87s13}3IkpAZXnu!W;|U=$`8%YB<&$?!j`D7^n)fwYELhH^ltZ9R6S#qFu; zX)7X7RfG#zT#u0<=yRPaY?5s1guP^-pNjX|awQe4oMEi8125yCcR{i(w=iGs;y!kk z?0h@w44HUA(bz273kGdIX$o;_F+0l8>FRGpV0%}|ix$r^8z5G;F z0{v~Klf`r3HgYOtWdAc*>u~>|nt@O=v3JBGoTa!{dGqPa*uh9X8g6~<(c-rK zOB7L~Lb+v&>VuE6fh8eLAusiR1a7u4lKT3+;>8aR`u+;AJu&ya42y1RK>6dg;%sM! zVb&JcCA++k4Uic8x2%I-2KLe@p^*MJADj>V9)z2oF!(~6lza4l6i%L|Bl*M(d!-~d z{e`yqdsU;v6`xzlVci15$uw)ALfzft6G?^e%fpFeOSV0OcNckW)9_-YjZfHHL-b>; zS(e~iG>sjy5lt27!#?_oE1WF>F#X$t>p><4J%BgyoOBbfjh?eeiiQ;%~PTAEq?5iEM=)H|2 z-@j<5ae+aH0rq_wL4C0W!ppY9aRazp{gnbYm56h?K)kUtl9&9eeG8T#&UVo zCxsG#k}WuQGQM$eF#Q<)wX^)F-lLPIA2G-Dl4e7Ms2BTc^Q^8zM?ozGFIc+wH9n`; zsINV`>y)$8@9;IgwSl}R=JwZ~kj`M?Zcy3}`*6kDyt!?D;f|)(eAi{)la>F{HNz@P zE2ZOq&^o-qmYa+odCHM>9XxiP;DIk{O)2l6yF%2j*V=776r!Cemi%2UhwzVxj%JDA znS2rcDSvrJqg_%SmH?o*;I{MIBqTnUf0mArh$lOfTCefxX*v61Lzs515SdCDda??? zo)e@!UKta1%{%sY2V|9RZ6$)xTIZLSS>fo68@$f#b1UNLioatio}d)&=+ zK16%`-WL^1{#g8#8a&H(L-{Jzf91Ux>=?wesg~?E*Mozc0~pm+`radbv1Fe9bvv9f zZ5wuRZ7uiyW1*-b8{fv?&w``bVOOB!nRQI!8@J?K&WA+%kd2>0wDIBYy(DGi(kq*2 zI@=}K)z23l#yZ%^)R@3;>7_l-7mL{pZAJ+xS3$$<>W;lL8H>oIf=+wu{6|3HbP$;G z3@Y$(diosA5$Tik$LdoM6a!XpCQT!JS+4{A_Dn=2(UAGJw6xJQp}TNfI@@%7LDIwr zJKWUR#s-b`?lF;ihYXZfPc9cR*xEehC{B|waUtGR34<=Koz0Q93&W)e zkmbx6Y?G{Mwwtr)5ZH-}-FhtU^or_}_|Pt%p4pa=o%uUu+onF_+}d$iU(KDZt>`01 z8G4^6k87ilCa>#!jDZJMv@xaux(*NUs{>wK?~Zxx+1b zYU&dEc6j}VNk%^(^q)55?XyK^_8GBH#q@cJ1+@Ez($dDb?DF=9iZ|ucy;;u7lYF#-(^PafE1v`o6y^;xJkfHr6DQ1LR&;Um_ zC&V)gs-HC*iSImdqB_QHEt@wO&FigrC;=y$5fw8pBzxT{JA1n|0laK$iq_F(vP$=_ z-4eaRW3O+_T$H7n2qT#4tPGZ!*RdVq2f6 zFPZ=~K3-l%pKLHbrI>e62XyIVq~`i&`1j9qWSG{IrZ0JMcs&hA-Wuuv?bv|6wY3_# zqxg4+Ke-&dN<3WuNPkFo9N**>;%gL4gh5k7j9AS;XYq+aQZ<-Z18kOJaA zw_d4!PVO$QBrfI5!aBaa3k;+t4(7!3Z}Nw85R7>bbI2(33Jd9==&39#BP&4ZeH~s# zdcb9+sOPTW@!@w_5nld$v(kazpICpUxg(u9eNr0O>Yk_fBm|*_2Hx1vYVt$-8Uzc zAyZ5=py{wJ9Bgn`qj{+3j{s18R!i6e3S)gq0XBL~Z~{OW|MX;hy= zJ_Ec}RFTX9-NK#jI`Izda6)IeF*`@5IZLkl!8ZJJ#=M(PPkTgN`N|nPwzV?`X7kxQ z9>>nX+-aq+pM4Xb6;y#2@c$h+g(pPQMJ>Ub$of>{GvXcgt1O|ZqO42`)+&{@IM=y8 zQx9P>>WF;2nh29@wIM+-f+Sl8HSd22oscl|Hhb_zE7i*g72eOp1&m7q+z zw$Vaa4I2<_6VG~50x7;7^paNjna*c+R4#nzDTj*{s{_5QY6&IlO!$Z-%z_>8>Tpo< zvDDY!Oq-fobvojQQbq^fKj9yOlX^Q1V;6O3pen)9+@#$8b;b<#em{xn>AoPLYGwS& zuR5a@dxyZAX&;%PJYWS4l@12+6lX4kPlB!v@1}TC*o(!gf@P~}Nc5EVGaqlMswZ_W z;nKNe1)>C!%*EcJBG~Vf#fqeJY!))F3mswjx+^_ zog%03d|CZgTafX|Nn>fu<>2s+>h`4}A81P$N9yd{q^HW>vbMf{nR3f8Ry|8)>GQEz zbIHPlaXhbi3t){4DsFMjPmhem>xARnKj3ky@Ez3E~RO2?f(6% zTT4FIseNF%2s8f?Qpm)sL`^{9#fnx&)uq*c{n-xuQz&n;-GHk6K1EbFEvBdamA+UX zE$d2s0m9-#UXC{R;v;(8XsaJ+y4jju8TZEd+d4ZtyT`RJ$tFoZyWK}TJ6kB7Kkx9T zO;n$)GKUNBV|zL~EUPiNtQkiZ0(-oa4%FVwCTKtpN4txo?freZfz_Hj9P4cJbi`)_ zAyMlG&up(R`Navdq&toq`U#!6I%IXUc0wg4zF>sRIsezv!vC_%neY_~jmuQpk}xIP RnwlF24D?Ly*4%N3`9Bs7D%}78 diff --git a/Resources/Textures/_White/Logo/icon/icon-32x32.png b/Resources/Textures/_White/Logo/icon/icon-32x32.png deleted file mode 100644 index 43c6d4854fc4de092a4b9ebb52dc104fc0d843f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1337 zcmV-91;+Y`P)EX>4Tx04R}tkvmAkP!xv$rk1Ky9PA+KkfAzR5EXHhDi*;)X)CnqU~i6e@tQGX%p zvch?bvs$UK)|~u>p}e+|<~rpF;#figNr;e9Lm3rVh|;N%Vj@NNF%SQc<4=-HCRZ7Z z91EyIh2;3b|KRs-&BD~A+bI+S0x!1xF$x5Cfo9#dzmILZc>?&Kfh(=;uQq_$Ptxmc zEpi0(Zvz+CZB5<-E_Z;zCtWfmNAgn&g#z$?M&FbJ25y1gHFs~Vdz?N18QRtI4RCM> zj1{T(y2rb_JNNc)O>2KY6WeluT9n4#00006VoOIv089Wy07i|jrMUnA010qNS#tmY zE+YT{E+YYWr9XB6000McNliru=m`M{ATrVIc=iAQ02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00R+8L_t(o!|j$yXcR#dhQIFF$Rg1wVxrhV(Zohch>BEf z!DZT85b>Y~!5uxQ0dYB~sCacbie5woJqO&Nbwun;MG=h#E6&>jBAK97{A56yA)$6C7RD~yH66nlJODMZgs>^F`ZUb7Q zb#)gFrOpAXfwQgLOd+yDfC zgFx1ScR{lXI1aP|SqE+vMR*x74*)lTHeer64iHJDsd@W3qk1?eeW#sxe48u83E&K{ z!u-cox7D}oWx##Ct~5uW^ab!%&m+NMFz^WI`2k+3tK&QF84d@wJIREf5BipU0a%-l zn%SGv4V0zQlYPrR3zYtC2O5A_K=t!^ zSgBf|Hvh#eP>ciC55d+XJ*K~Nz)2<^_?A68qSRqv)AhnI9iae0rTUrB?9a^WfWegs zMcIR0=1((r%(v|BJgg)qqTYZqbdrho=#+(9jC9&e!-kenV8E>(41@dOK~?R7pWq7E z?<5oV+;TB(01w<~YEr;PSBR6q+)VBVAy4(VTfh51l3pP0Boi<6`VFvo$Uo3>Aqt1J zC3A&XrgffZ8jWZkF9X^Edt5r**ln7brp5z;t=lw9fofnZFdeAEFk%?Sd!YMQ#s}j-MXIlFsqTudY3!OSL=?CRl20TEi#VC~mVy+P7qrLyA{MYgowNdJ~#gLQt00000NkvXXu0mjfac*Mx diff --git a/Resources/Textures/_White/Logo/icon/icon-48x48.png b/Resources/Textures/_White/Logo/icon/icon-48x48.png deleted file mode 100644 index edc51d002b90d9430fb0f028cb97ec152eaa0116..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1720 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 diff --git a/Resources/manifest.yml b/Resources/manifest.yml index e507e85a3e..c6eadc6420 100644 --- a/Resources/manifest.yml +++ b/Resources/manifest.yml @@ -1,3 +1,3 @@ -defaultWindowTitle: White Dream -windowIconSet: /Textures/_White/Logo/icon -splashLogo: /Textures/_White/Logo/WWDPDarkSplashIcon.png +defaultWindowTitle: Einstein Engines +windowIconSet: /Textures/Logo/icon +splashLogo: /Textures/Logo/splashlogo.png From 7845b4b52ee07188b76f5a51db035aae3dca8c69 Mon Sep 17 00:00:00 2001 From: aw-c Date: Mon, 17 Mar 2025 01:22:33 +0300 Subject: [PATCH 15/43] seems've been fixed, but not shown --- .../Lobby/UI/HumanoidProfileEditor.xaml | 145 +++++++++--------- .../Lobby/UI/HumanoidProfileEditor.xaml.cs | 81 ++++------ 2 files changed, 101 insertions(+), 125 deletions(-) diff --git a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml index c71d314606..53914f1d65 100644 --- a/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml +++ b/Content.Client/Lobby/UI/HumanoidProfileEditor.xaml @@ -7,26 +7,50 @@ HorizontalExpand="True"> - - - - - -