Skill requirements (#1085)

* prerequites refactor

* tiefling only spells

* metamagic update

* sort trying

* goblin speed port
This commit is contained in:
Ed
2025-03-29 16:50:14 +03:00
committed by GitHub
parent 2248e2ad5c
commit fddbb010cf
32 changed files with 378 additions and 89 deletions

View File

@@ -3,6 +3,7 @@ using System.Numerics;
using Content.Shared._CP14.Skill;
using Content.Shared._CP14.Skill.Components;
using Content.Shared._CP14.Skill.Prototypes;
using Content.Shared._CP14.Skill.Restrictions;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.UserInterface;
@@ -130,19 +131,25 @@ public sealed partial class CP14SkillTreeGraphControl : BoxContainer
var fromPos = skill.SkillUiPosition * GridSize * UIScale + _globalOffset;
foreach (var prerequisite in skill.Prerequisites)
foreach (var req in skill.Restrictions)
{
if (!_proto.TryIndex(prerequisite, out var prerequisiteSkill))
continue;
switch (req)
{
case NeedPrerequisite prerequisite:
if (!_proto.TryIndex(prerequisite.Prerequisite, out var prerequisiteSkill))
continue;
if (prerequisiteSkill.Tree != Tree)
continue;
if (prerequisiteSkill.Tree != Tree)
continue;
var learned = playerSkills.Contains(skill.ID);
var learned = playerSkills.Contains(skill.ID);
var toPos = prerequisiteSkill.SkillUiPosition * GridSize * UIScale + _globalOffset;
var color = learned ? Color.White : Color.FromSrgb(new Color(0.7f, 0.7f, 0.7f));
handle.DrawLine(fromPos, toPos, color);
var toPos = prerequisiteSkill.SkillUiPosition * GridSize * UIScale + _globalOffset;
var color = learned ? Color.White : Color.FromSrgb(new Color(0.7f, 0.7f, 0.7f));
handle.DrawLine(fromPos, toPos, color);
break;
}
}
}
@@ -153,9 +160,7 @@ public sealed partial class CP14SkillTreeGraphControl : BoxContainer
continue;
//TODO: Not optimized, recalculates every frame. Needs to be calculated on state update and cached.
var learned = playerSkills.Contains(skill.ID);
var available = _skillSystem.CanLearnSkill(_player.Value, skill.ID);
var canBeLearned = learned || skill.Prerequisites.All(prerequisite => playerSkills.Contains(prerequisite));
var canBeLearned = _skillSystem.CanLearnSkill(_player.Value, skill, _player.Value.Comp);
var pos = skill.SkillUiPosition * GridSize * UIScale + _globalOffset;
// Base skill icon
@@ -190,6 +195,9 @@ public sealed partial class CP14SkillTreeGraphControl : BoxContainer
handle.DrawTextureRect(hoveredTexture, hoveredQuad, Color.White);
}
var learned = playerSkills.Contains(skill.ID);
var allowedToLearn = _skillSystem.AllowedToLearn(_player.Value, skill, _player.Value.Comp);
// Learned Skill
if (learned)
{
@@ -198,7 +206,7 @@ public sealed partial class CP14SkillTreeGraphControl : BoxContainer
var learnedQuad = new UIBox2(pos - learnedSize / 2, pos + learnedSize / 2);
handle.DrawTextureRect(learnedTexture, learnedQuad, Color.White);
}
else if (available)
else if (canBeLearned)
{
var availableTexture = Tree.AvailableIcon.Frame0();
var availableSize = new Vector2(availableTexture.Width, availableTexture.Height) * 2;
@@ -206,11 +214,12 @@ public sealed partial class CP14SkillTreeGraphControl : BoxContainer
handle.DrawTextureRect(availableTexture, availableQuad, Color.White);
}
var iconColor = Color.White;
if (!learned)
iconColor = Color.FromSrgb(new Color(0.7f, 0.7f, 0.7f));
if (!canBeLearned && !learned)
iconColor = Color.FromSrgb(new Color(0f, 0f, 0f));
var iconColor = allowedToLearn switch
{
true when !learned => Color.FromSrgb(new Color(0.7f, 0.7f, 0.7f)),
false when !learned => Color.FromSrgb(new Color(0f, 0f, 0f)),
_ => Color.White
};
handle.DrawTextureRect(baseTexture, baseQuad, iconColor);
}