Add supports for different skillpoints types (#1581)
* Refactor skill points to support multiple types Reworked the skill point system to support multiple types (e.g., Memory, Blood) instead of a single experience cap. Added CP14SkillPointPrototype, updated skill storage and UI to handle per-type points, and adjusted related logic and prototypes. Updated localization and assets to reflect these changes. * oopsie * Update human.yml * Update CP14SkillUIController.cs * Refactor skill storage to use skillPoints config Replaced 'experienceMaxCap: 0' with 'skillPoints: Memory: max: 0' in Skeletons T1, T2, and undead mob prototypes. This change standardizes skill storage configuration and improves clarity.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
StyleClasses="OpenRight"
|
||||
Margin="0 0 -1 0">
|
||||
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" HorizontalAlignment="Right">
|
||||
<TextureRect Name="SkillPointImage" VerticalAlignment="Center" Visible="False" HorizontalAlignment="Center" Margin="0 0 8 0" TextureScale="2, 2" TexturePath="/Textures/_CP14/Interface/Misc/skillpoint.png"/>
|
||||
<TextureRect Name="SkillPointImage" VerticalAlignment="Center" Visible="False" HorizontalAlignment="Center" Margin="0 0 8 0" TextureScale="2, 2" Access="Public"/>
|
||||
<Label Name="SkillTreeLabel" Margin="-5 0 0 0"/>
|
||||
</BoxContainer>
|
||||
</Button>
|
||||
|
||||
@@ -10,13 +10,14 @@ public sealed partial class CP14SkillTreeButtonControl : Control
|
||||
{
|
||||
public event Action? OnPressed;
|
||||
|
||||
public CP14SkillTreeButtonControl(Color color, string label, float skillpoints)
|
||||
public CP14SkillTreeButtonControl(Color color, string label, float skillpoints, Texture? icon)
|
||||
{
|
||||
RobustXamlLoader.Load(this);
|
||||
|
||||
ColorPanel.PanelOverride = new StyleBoxFlat { BackgroundColor = color };
|
||||
if (skillpoints > 0)
|
||||
{
|
||||
SkillPointImage.Texture = icon;
|
||||
SkillPointImage.Visible = true;
|
||||
SkillTreeLabel.Text = $"{skillpoints} {label}";
|
||||
}
|
||||
|
||||
@@ -155,27 +155,36 @@ public sealed class CP14SkillUIController : UIController, IOnStateEntered<Gamepl
|
||||
|
||||
private void SelectNode(CP14SkillPrototype? skill)
|
||||
{
|
||||
if (skill is null)
|
||||
{
|
||||
DeselectNode();
|
||||
UpdateGraphControl();
|
||||
return;
|
||||
}
|
||||
|
||||
if (_window is null)
|
||||
return;
|
||||
|
||||
if (_targetPlayer == null)
|
||||
return;
|
||||
|
||||
if (!_proto.TryIndex(skill.Tree, out var indexedTree))
|
||||
return;
|
||||
|
||||
if (!_proto.TryIndex(indexedTree.SkillType, out var indexedSkillType))
|
||||
return;
|
||||
|
||||
_selectedSkill = skill;
|
||||
|
||||
if (skill == null)
|
||||
{
|
||||
DeselectNode();
|
||||
}
|
||||
else
|
||||
{
|
||||
_window.SkillName.Text = _skill.GetSkillName(skill);
|
||||
_window.SkillDescription.SetMessage(GetSkillDescription(skill));
|
||||
_window.SkillFree.Visible = _skill.HaveFreeSkill(_targetPlayer.Value, skill);
|
||||
_window.SkillView.Texture = skill.Icon.Frame0();
|
||||
_window.LearnButton.Disabled = !_skill.CanLearnSkill(_targetPlayer.Value, skill);
|
||||
_window.SkillCost.Text = skill.LearnCost.ToString();
|
||||
}
|
||||
_window.SkillName.Text = _skill.GetSkillName(skill);
|
||||
_window.SkillDescription.SetMessage(GetSkillDescription(skill));
|
||||
_window.SkillFree.Visible = _skill.HaveFreeSkill(_targetPlayer.Value, skill);
|
||||
_window.SkillView.Texture = skill.Icon.Frame0();
|
||||
_window.LearnButton.Disabled = !_skill.CanLearnSkill(_targetPlayer.Value, skill);
|
||||
_window.SkillPointText.Text =
|
||||
Loc.GetString("cp14-skill-menu-learncost", ("type", Loc.GetString(indexedSkillType.Name)));
|
||||
_window.SkillCost.Text = skill.LearnCost.ToString();
|
||||
_window.SkillPointIcon.Texture = indexedSkillType.Icon?.Frame0();
|
||||
|
||||
UpdateGraphControl();
|
||||
}
|
||||
@@ -231,6 +240,19 @@ public sealed class CP14SkillUIController : UIController, IOnStateEntered<Gamepl
|
||||
if (!EntityManager.TryGetComponent<CP14SkillStorageComponent>(_targetPlayer, out var storage))
|
||||
return;
|
||||
|
||||
if (!_proto.TryIndex(_selectedSkillTree.SkillType, out var indexedSkillType))
|
||||
return;
|
||||
|
||||
var skillPointsMap = storage.SkillPoints;
|
||||
|
||||
if (skillPointsMap.TryGetValue(_selectedSkillTree.SkillType, out var skillContainer))
|
||||
_window.LevelLabel.Text =
|
||||
$"{Loc.GetString(indexedSkillType.Name)}: {skillContainer.Sum}/{skillContainer.Max}";
|
||||
else
|
||||
_window.LevelLabel.Text = $"{Loc.GetString(indexedSkillType.Name)}: 0/0";
|
||||
|
||||
_window.LevelTexture.Texture = indexedSkillType.Icon?.Frame0();
|
||||
|
||||
HashSet<CP14NodeTreeElement> nodeTreeElements = new();
|
||||
|
||||
HashSet<(string, string)> nodeTreeEdges = new();
|
||||
@@ -303,14 +325,15 @@ public sealed class CP14SkillUIController : UIController, IOnStateEntered<Gamepl
|
||||
SelectNode(_selectedSkill);
|
||||
UpdateGraphControl();
|
||||
|
||||
_window.LevelLabel.Text = $"{storage.SkillsSumExperience}/{storage.ExperienceMaxCap}";
|
||||
|
||||
_window.TreeTabsContainer.RemoveAllChildren();
|
||||
foreach (var tree in storage.AvailableSkillTrees)
|
||||
{
|
||||
if (!_proto.TryIndex(tree, out var indexedTree))
|
||||
return;
|
||||
|
||||
if (!_proto.TryIndex(indexedTree.SkillType, out var indexedSkillType))
|
||||
return;
|
||||
|
||||
float learnedPoints = 0;
|
||||
foreach (var skillId in storage.LearnedSkills)
|
||||
{
|
||||
@@ -323,7 +346,10 @@ public sealed class CP14SkillUIController : UIController, IOnStateEntered<Gamepl
|
||||
}
|
||||
}
|
||||
|
||||
var treeButton2 = new CP14SkillTreeButtonControl(indexedTree.Color, Loc.GetString(indexedTree.Name), learnedPoints);
|
||||
var treeButton2 = new CP14SkillTreeButtonControl(indexedTree.Color,
|
||||
Loc.GetString(indexedTree.Name),
|
||||
learnedPoints,
|
||||
indexedSkillType.Icon?.Frame0());
|
||||
treeButton2.ToolTip = Loc.GetString(indexedTree.Desc ?? string.Empty);
|
||||
treeButton2.OnPressed += () =>
|
||||
{
|
||||
|
||||
@@ -37,8 +37,8 @@
|
||||
</BoxContainer>
|
||||
<!-- Skill Cost -->
|
||||
<BoxContainer HorizontalExpand="True">
|
||||
<RichTextLabel HorizontalExpand="True" Access="Public" Text="{Loc 'cp14-skill-menu-learncost'}" Margin="0 10 0 10" />
|
||||
<TextureRect VerticalAlignment="Center" HorizontalAlignment="Left" TextureScale="2, 2" TexturePath="/Textures/_CP14/Interface/Misc/skillpoint.png"/>
|
||||
<RichTextLabel Name="SkillPointText" HorizontalExpand="True" Access="Public" Margin="0 10 0 10" />
|
||||
<TextureRect Name="SkillPointIcon" VerticalAlignment="Center" HorizontalAlignment="Left" TextureScale="2, 2" Access="Public" />
|
||||
<RichTextLabel Name="SkillCost" Access="Public" Text="0"/>
|
||||
</BoxContainer>
|
||||
<!-- Skill Description -->
|
||||
@@ -78,9 +78,8 @@
|
||||
</BoxContainer>
|
||||
<!-- Experience Data -->
|
||||
<BoxContainer Margin="10 10 10 10" VerticalAlignment="Bottom" HorizontalAlignment="Center" Orientation="Horizontal" VerticalExpand="True">
|
||||
<RichTextLabel VerticalAlignment="Center" HorizontalAlignment="Left" Text="{Loc 'cp14-skill-menu-level'}" StyleClasses="LabelKeyText"/>
|
||||
<TextureRect VerticalAlignment="Center" HorizontalAlignment="Center" TextureScale="2, 2" TexturePath="/Textures/_CP14/Interface/Misc/skillpoint.png"/>
|
||||
<RichTextLabel Margin="0 0 0 0" Name="LevelLabel" VerticalAlignment="Center" HorizontalAlignment="Left" Text="0" StyleClasses="LabelKeyText" Access="Public"/>
|
||||
<TextureRect Name="LevelTexture" VerticalAlignment="Center" HorizontalAlignment="Center" TextureScale="2, 2" Access="Public"/>
|
||||
</BoxContainer>
|
||||
</PanelContainer>
|
||||
</BoxContainer>
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using Content.Shared._CP14.Skill;
|
||||
using Content.Shared._CP14.Skill.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.MagicSpell.Spells;
|
||||
|
||||
@@ -10,6 +12,9 @@ public sealed partial class CP14SpellAddMemoryPoint : CP14SpellEffect
|
||||
[DataField]
|
||||
public float Limit = 6.5f;
|
||||
|
||||
[DataField]
|
||||
public ProtoId<CP14SkillPointPrototype> SkillPointType = "Memory";
|
||||
|
||||
public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args)
|
||||
{
|
||||
if (args.Target is null)
|
||||
@@ -17,6 +22,6 @@ public sealed partial class CP14SpellAddMemoryPoint : CP14SpellEffect
|
||||
|
||||
var skillSys = entManager.System<CP14SharedSkillSystem>();
|
||||
|
||||
skillSys.AddMemoryPoints(args.Target.Value, AddedPoints, Limit);
|
||||
skillSys.AddSkillPoints(args.Target.Value, SkillPointType, AddedPoints, Limit);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using Content.Shared._CP14.Skill;
|
||||
using Content.Shared._CP14.Skill.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.MagicSpell.Spells;
|
||||
|
||||
@@ -7,6 +9,9 @@ public sealed partial class CP14SpellRemoveMemoryPoint : CP14SpellEffect
|
||||
[DataField]
|
||||
public float RemovedPoints = 0.5f;
|
||||
|
||||
[DataField]
|
||||
public ProtoId<CP14SkillPointPrototype> SkillPointType = "Memory";
|
||||
|
||||
public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args)
|
||||
{
|
||||
if (args.Target is null)
|
||||
@@ -14,6 +19,6 @@ public sealed partial class CP14SpellRemoveMemoryPoint : CP14SpellEffect
|
||||
|
||||
var skillSys = entManager.System<CP14SharedSkillSystem>();
|
||||
|
||||
skillSys.RemoveMemoryPoints(args.Target.Value, RemovedPoints);
|
||||
skillSys.RemoveMemoryPoints(args.Target.Value, SkillPointType, RemovedPoints);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace Content.Shared._CP14.Skill;
|
||||
|
||||
public abstract partial class CP14SharedSkillSystem : EntitySystem
|
||||
{
|
||||
private EntityQuery<CP14SkillStorageComponent> _skillStorageQuery = default!;
|
||||
private EntityQuery<CP14SkillStorageComponent> _skillStorageQuery;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -64,6 +64,9 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem
|
||||
if (!_proto.TryIndex(skill, out var indexedSkill))
|
||||
return false;
|
||||
|
||||
if (!_proto.TryIndex(indexedSkill.Tree, out var indexedTree))
|
||||
return false;
|
||||
|
||||
foreach (var effect in indexedSkill.Effects)
|
||||
{
|
||||
effect.AddSkill(EntityManager, target);
|
||||
@@ -72,7 +75,12 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem
|
||||
if (free)
|
||||
component.FreeLearnedSkills.Add(skill);
|
||||
else
|
||||
component.SkillsSumExperience += indexedSkill.LearnCost;
|
||||
{
|
||||
if (component.SkillPoints.TryGetValue(indexedTree.SkillType, out var skillContainer))
|
||||
{
|
||||
skillContainer.Sum += indexedSkill.LearnCost;
|
||||
}
|
||||
}
|
||||
|
||||
component.LearnedSkills.Add(skill);
|
||||
Dirty(target, component);
|
||||
@@ -99,13 +107,21 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem
|
||||
if (!_proto.TryIndex(skill, out var indexedSkill))
|
||||
return false;
|
||||
|
||||
if (!_proto.TryIndex(indexedSkill.Tree, out var indexedTree))
|
||||
return false;
|
||||
|
||||
foreach (var effect in indexedSkill.Effects)
|
||||
{
|
||||
effect.RemoveSkill(EntityManager, target);
|
||||
}
|
||||
|
||||
if (!component.FreeLearnedSkills.Remove(skill))
|
||||
component.SkillsSumExperience -= indexedSkill.LearnCost;
|
||||
{
|
||||
if (component.SkillPoints.TryGetValue(indexedTree.SkillType, out var skillContainer))
|
||||
{
|
||||
skillContainer.Sum -= indexedSkill.LearnCost;
|
||||
}
|
||||
}
|
||||
|
||||
Dirty(target, component);
|
||||
return true;
|
||||
@@ -157,20 +173,7 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem
|
||||
if (!Resolve(target, ref component, false))
|
||||
return false;
|
||||
|
||||
if (!AllowedToLearn(target, skill, component))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Is it allowed to learn this skill? The player may not have enough points to learn it, but has already met all the requirements to learn it.
|
||||
/// </summary>
|
||||
public bool AllowedToLearn(EntityUid target,
|
||||
CP14SkillPrototype skill,
|
||||
CP14SkillStorageComponent? component = null)
|
||||
{
|
||||
if (!Resolve(target, ref component, false))
|
||||
if (!_proto.TryIndex(skill.Tree, out var indexedTree))
|
||||
return false;
|
||||
|
||||
//Already learned
|
||||
@@ -181,8 +184,11 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem
|
||||
if (!component.AvailableSkillTrees.Contains(skill.Tree))
|
||||
return false;
|
||||
|
||||
//Check max cap
|
||||
if (component.SkillsSumExperience + skill.LearnCost > component.ExperienceMaxCap)
|
||||
//Check skill points
|
||||
if (!component.SkillPoints.TryGetValue(indexedTree.SkillType, out var skillContainer))
|
||||
return false;
|
||||
|
||||
if (skillContainer.Sum + skill.LearnCost > skillContainer.Max)
|
||||
return false;
|
||||
|
||||
//Restrictions check
|
||||
@@ -294,26 +300,35 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem
|
||||
{
|
||||
return false;
|
||||
}
|
||||
for(var i = component.LearnedSkills.Count - 1; i >= 0; i--)
|
||||
|
||||
for (var i = component.LearnedSkills.Count - 1; i >= 0; i--)
|
||||
{
|
||||
if(HaveFreeSkill(target, component.LearnedSkills[i], component))
|
||||
if (HaveFreeSkill(target, component.LearnedSkills[i], component))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
TryRemoveSkill(target, component.LearnedSkills[i], component);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Increases the number of memory points for a character, limited to a certain amount.
|
||||
/// </summary>
|
||||
public void AddMemoryPoints(EntityUid target, FixedPoint2 points, FixedPoint2 limit, CP14SkillStorageComponent? component = null)
|
||||
public void AddSkillPoints(EntityUid target,
|
||||
ProtoId<CP14SkillPointPrototype> type,
|
||||
FixedPoint2 points,
|
||||
FixedPoint2 limit,
|
||||
CP14SkillStorageComponent? component = null)
|
||||
{
|
||||
if (!Resolve(target, ref component, false))
|
||||
return;
|
||||
|
||||
component.ExperienceMaxCap = FixedPoint2.Min(component.ExperienceMaxCap + points, limit);
|
||||
if (component.SkillPoints.TryGetValue(type, out var skillContainer))
|
||||
skillContainer.Max = FixedPoint2.Min(skillContainer.Max + points, limit);
|
||||
|
||||
Dirty(target, component);
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("cp14-skill-popup-added-points", ("count", points)), target, target);
|
||||
@@ -322,17 +337,23 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem
|
||||
/// <summary>
|
||||
/// Removes memory points. If a character has accumulated skills exceeding the new memory limit, random skills will be removed.
|
||||
/// </summary>
|
||||
public void RemoveMemoryPoints(EntityUid target, FixedPoint2 points, CP14SkillStorageComponent? component = null)
|
||||
public void RemoveMemoryPoints(EntityUid target,
|
||||
ProtoId<CP14SkillPointPrototype> type,
|
||||
FixedPoint2 points,
|
||||
CP14SkillStorageComponent? component = null)
|
||||
{
|
||||
if (!Resolve(target, ref component, false))
|
||||
return;
|
||||
|
||||
component.ExperienceMaxCap = FixedPoint2.Max(component.ExperienceMaxCap - points, 0);
|
||||
if (!component.SkillPoints.TryGetValue(type, out var skillContainer))
|
||||
return;
|
||||
|
||||
skillContainer.Max = FixedPoint2.Max(skillContainer.Max - points, 0);
|
||||
Dirty(target, component);
|
||||
|
||||
_popup.PopupEntity(Loc.GetString("cp14-skill-popup-removed-points", ("count", points)), target, target);
|
||||
|
||||
while (component.SkillsSumExperience > component.ExperienceMaxCap)
|
||||
while (skillContainer.Sum > skillContainer.Max)
|
||||
{
|
||||
var frontier = GetFrontierSkills(target, component);
|
||||
if (frontier.Count == 0)
|
||||
|
||||
@@ -57,7 +57,7 @@ public abstract partial class CP14SharedSkillSystem
|
||||
sb.Append($"• [color={indexedTree.Color.ToHex()}]{skillName}[/color]\n");
|
||||
}
|
||||
|
||||
sb.Append($"\n{Loc.GetString("cp14-skill-menu-level")} {ent.Comp.SkillsSumExperience}/{ent.Comp.ExperienceMaxCap}\n");
|
||||
//sb.Append($"\n{Loc.GetString("cp14-skill-menu-level")} {ent.Comp.SkillsSumExperience}/{ent.Comp.ExperienceMaxCap}\n");
|
||||
msg.AddMarkupOrThrow(sb.ToString());
|
||||
return msg;
|
||||
}
|
||||
|
||||
@@ -29,23 +29,24 @@ public sealed partial class CP14SkillStorageComponent : Component
|
||||
[DataField, AutoNetworkedField]
|
||||
public List<ProtoId<CP14SkillPrototype>> LearnedSkills = new();
|
||||
|
||||
/// <summary>
|
||||
/// skills that the player has learned on the research table, but has not yet learned in the skill tree.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public List<ProtoId<CP14SkillPrototype>> ResearchedSkills = new();
|
||||
public Dictionary<ProtoId<CP14SkillPointPrototype>, CP14SkillPointContainerEntry> SkillPoints = new();
|
||||
}
|
||||
|
||||
[DataDefinition, Serializable, NetSerializable]
|
||||
public sealed partial class CP14SkillPointContainerEntry
|
||||
{
|
||||
/// <summary>
|
||||
/// The number of experience points spent on skills.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
public FixedPoint2 Sum = 0;
|
||||
|
||||
/// <summary>
|
||||
/// The number of experience points spent on skills. Technically this could be calculated via LearnedSkills, but this is a cached value for optimization.
|
||||
/// The maximum of experience points that can be spent on learning skills.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public FixedPoint2 SkillsSumExperience = 0;
|
||||
|
||||
/// <summary>
|
||||
/// The maximum ceiling of experience points that can be spent on learning skills. Not tied to a category.
|
||||
/// </summary>
|
||||
[DataField, AutoNetworkedField]
|
||||
public FixedPoint2 ExperienceMaxCap = 5;
|
||||
[DataField]
|
||||
public FixedPoint2 Max = 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Utility;
|
||||
|
||||
namespace Content.Shared._CP14.Skill.Prototypes;
|
||||
|
||||
/// <summary>
|
||||
/// A group of skills combined into one “branch”
|
||||
/// </summary>
|
||||
[Prototype("cp14SkillPoint")]
|
||||
public sealed partial class CP14SkillPointPrototype : IPrototype
|
||||
{
|
||||
[IdDataField] public string ID { get; } = default!;
|
||||
|
||||
[DataField(required: true)]
|
||||
public LocId Name;
|
||||
|
||||
[DataField]
|
||||
public SpriteSpecifier? Icon;
|
||||
}
|
||||
@@ -15,6 +15,9 @@ public sealed partial class CP14SkillTreePrototype : IPrototype
|
||||
[DataField(required: true)]
|
||||
public LocId Name;
|
||||
|
||||
[DataField(required: true)]
|
||||
public ProtoId<CP14SkillPointPrototype> SkillType;
|
||||
|
||||
[DataField]
|
||||
public SpriteSpecifier? FrameIcon;
|
||||
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
using Content.Shared._CP14.Skill.Components;
|
||||
using Content.Shared._CP14.Skill.Prototypes;
|
||||
using Content.Shared._CP14.Workbench;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Shared._CP14.Skill.Restrictions;
|
||||
|
||||
public sealed partial class Researched : CP14SkillRestriction
|
||||
{
|
||||
[DataField(required: true)]
|
||||
public List<CP14WorkbenchCraftRequirement> Requirements = new();
|
||||
|
||||
public override bool Check(IEntityManager entManager, EntityUid target, CP14SkillPrototype skill)
|
||||
{
|
||||
if (!entManager.TryGetComponent<CP14SkillStorageComponent>(target, out var skillStorage))
|
||||
return false;
|
||||
|
||||
var learned = skillStorage.ResearchedSkills;
|
||||
return learned.Contains(skill);
|
||||
}
|
||||
|
||||
public override string GetDescription(IEntityManager entManager, IPrototypeManager protoManager)
|
||||
{
|
||||
return Loc.GetString("cp14-skill-req-researched");
|
||||
}
|
||||
}
|
||||
2
Resources/Locale/en-US/_CP14/skill/skill_points.ftl
Normal file
2
Resources/Locale/en-US/_CP14/skill/skill_points.ftl
Normal file
@@ -0,0 +1,2 @@
|
||||
cp14-skill-point-memory = Memory
|
||||
cp14-skill-point-vampire-blood = Vampiric powers
|
||||
@@ -5,13 +5,8 @@ cp14-skill-info-title = Skills
|
||||
cp14-game-hud-open-skill-menu-button-tooltip = Skill tree
|
||||
|
||||
cp14-skill-menu-learn-button = Learn skill
|
||||
cp14-skill-menu-learncost = [color=yellow]Memory required:[/color]
|
||||
cp14-skill-menu-level = Memory:
|
||||
cp14-skill-menu-free = [color=green]This skill is innate to your character, and wastes no memory points![/color]
|
||||
|
||||
cp14-research-table-title = Research table
|
||||
cp14-research-recipe-list = Research costs:
|
||||
cp14-research-craft = Research
|
||||
cp14-skill-menu-learncost = [color=yellow]{$type} required:[/color]
|
||||
cp14-skill-menu-free = [color=green]This skill is innate to your character, and wastes no skill points![/color]
|
||||
|
||||
cp14-skill-desc-add-mana = Increases your character's mana amount by {$mana}.
|
||||
cp14-skill-desc-add-stamina = Increases your character's stamina amount by {$stamina}.
|
||||
|
||||
2
Resources/Locale/ru-RU/_CP14/skill/skill_points.ftl
Normal file
2
Resources/Locale/ru-RU/_CP14/skill/skill_points.ftl
Normal file
@@ -0,0 +1,2 @@
|
||||
cp14-skill-point-memory = Память
|
||||
cp14-skill-point-vampire-blood = Вампирские силы
|
||||
@@ -5,13 +5,8 @@ cp14-skill-info-title = Навыки
|
||||
cp14-game-hud-open-skill-menu-button-tooltip = Деревья навыков
|
||||
|
||||
cp14-skill-menu-learn-button = Изучить навык
|
||||
cp14-skill-menu-learncost = [color=yellow]Требуется памяти:[/color]
|
||||
cp14-skill-menu-level = Память:
|
||||
cp14-skill-menu-free = [color=green]Этот навык врожденный для вашего персонажа, и не тратит очков памяти![/color]
|
||||
|
||||
cp14-research-table-title = Стол исследований
|
||||
cp14-research-recipe-list = Затраты на исследование:
|
||||
cp14-research-craft = Исследовать
|
||||
cp14-skill-menu-learncost = [color=yellow]Требуется {$type}:[/color]
|
||||
cp14-skill-menu-free = [color=green]Этот навык врожденный для вашего персонажа, и не тратит очков навыков![/color]
|
||||
|
||||
cp14-skill-desc-add-mana = Увеличивает объем маны вашего персонажа на {$mana}.
|
||||
cp14-skill-desc-add-stamina = Увеличивает выносливость вашего персонажа на {$stamina}.
|
||||
|
||||
@@ -9,7 +9,9 @@
|
||||
factions:
|
||||
- CP14Monster
|
||||
- type: CP14SkillStorage
|
||||
experienceMaxCap: 0
|
||||
skillPoints:
|
||||
Memory:
|
||||
max: 0
|
||||
freeLearnedSkills:
|
||||
- SwordMastery
|
||||
- RapierMastery
|
||||
|
||||
@@ -89,7 +89,9 @@
|
||||
types:
|
||||
CP14ManaDepletion: -0.1
|
||||
- type: CP14SkillStorage
|
||||
experienceMaxCap: 0
|
||||
skillPoints:
|
||||
Memory:
|
||||
max: 0
|
||||
freeLearnedSkills:
|
||||
- SwordMastery
|
||||
- RapierMastery
|
||||
|
||||
@@ -51,7 +51,9 @@
|
||||
- FootstepSound
|
||||
- CP14RaidLeader
|
||||
- type: CP14SkillStorage
|
||||
experienceMaxCap: 0
|
||||
skillPoints:
|
||||
Memory:
|
||||
max: 0
|
||||
freeLearnedSkills:
|
||||
- SwordMastery
|
||||
- RapierMastery
|
||||
|
||||
@@ -23,8 +23,10 @@
|
||||
- type: Body
|
||||
prototype: CP14Human
|
||||
requiredLegs: 2
|
||||
- type: CP14SkillStorage # +0.5 memory point
|
||||
experienceMaxCap: 5.5
|
||||
- type: CP14SkillStorage
|
||||
skillPoints:
|
||||
Memory:
|
||||
max: 5.5 # +0.5 memory point
|
||||
- type: Inventory
|
||||
templateId: CP14Human
|
||||
femaleDisplacements:
|
||||
|
||||
@@ -58,6 +58,9 @@
|
||||
- type: CP14MagicUnsafeDamage
|
||||
- type: CP14MagicUnsafeSleep
|
||||
- type: CP14SkillStorage
|
||||
skillPoints:
|
||||
Memory:
|
||||
max: 5
|
||||
availableSkillTrees:
|
||||
- Pyrokinetic
|
||||
- Hydrosophistry
|
||||
|
||||
@@ -2,54 +2,63 @@
|
||||
id: Pyrokinetic
|
||||
name: cp14-skill-tree-pyrokinetic-name
|
||||
desc: cp14-skill-tree-pyrokinetic-desc
|
||||
skillType: Memory
|
||||
color: "#d6933c"
|
||||
|
||||
- type: cp14SkillTree
|
||||
id: Hydrosophistry
|
||||
name: cp14-skill-tree-hydrosophistry-name
|
||||
desc: cp14-skill-tree-hydrosophistry-desc
|
||||
skillType: Memory
|
||||
color: "#1554a1"
|
||||
|
||||
- type: cp14SkillTree
|
||||
id: Illusion
|
||||
name: cp14-skill-tree-illusion-name
|
||||
desc: cp14-skill-tree-illusion-desc
|
||||
skillType: Memory
|
||||
color: "#f55faf"
|
||||
|
||||
- type: cp14SkillTree
|
||||
id: Metamagic
|
||||
name: cp14-skill-tree-metamagic-name
|
||||
desc: cp14-skill-tree-metamagic-desc
|
||||
skillType: Memory
|
||||
color: "#56e5f5"
|
||||
|
||||
- type: cp14SkillTree
|
||||
id: Healing
|
||||
name: cp14-skill-tree-healing-name
|
||||
desc: cp14-skill-tree-healing-desc
|
||||
skillType: Memory
|
||||
color: "#51cf72"
|
||||
|
||||
- type: cp14SkillTree
|
||||
id: Athletic
|
||||
name: cp14-skill-tree-athletic-name
|
||||
desc: cp14-skill-tree-athletic-desc
|
||||
skillType: Memory
|
||||
color: "#b32e37"
|
||||
|
||||
#- type: cp14SkillTree
|
||||
# id: Dimension
|
||||
# name: cp14-skill-tree-dimension-name
|
||||
# desc: cp14-skill-tree-dimension-desc
|
||||
# skillType: Memory
|
||||
# color: "#ac66be"
|
||||
|
||||
- type: cp14SkillTree
|
||||
id: Electromancy
|
||||
name: cp14-skill-tree-electric-name
|
||||
desc: cp14-skill-tree-electric-desc
|
||||
skillType: Memory
|
||||
color: "#e8ff4c"
|
||||
|
||||
- type: cp14SkillTree
|
||||
id: MartialArts
|
||||
name: cp14-skill-tree-martial-name
|
||||
desc: cp14-skill-tree-martial-desc
|
||||
skillType: Memory
|
||||
color: "#f54242"
|
||||
|
||||
#
|
||||
@@ -58,22 +67,26 @@
|
||||
# id: Thaumaturgy
|
||||
# name: cp14-skill-tree-thaumaturgy-name
|
||||
# desc: cp14-skill-tree-thaumaturgy-desc
|
||||
# skillType: Memory
|
||||
# color: "#7c52bf"
|
||||
|
||||
#- type: cp14SkillTree
|
||||
# id: Blacksmithing
|
||||
# name: cp14-skill-tree-blacksmithing-name
|
||||
# desc: cp14-skill-tree-blacksmithing-desc
|
||||
# skillType: Memory
|
||||
# color: "#6b3200"
|
||||
|
||||
#- type: cp14SkillTree
|
||||
# id: Trading
|
||||
# name: cp14-skill-tree-trading-name
|
||||
# desc: cp14-skill-tree-trading-desc
|
||||
# skillType: Memory
|
||||
# color: "#f5edaa"
|
||||
|
||||
- type: cp14SkillTree
|
||||
id: Craftsmanship
|
||||
name: cp14-skill-tree-craftsman-name
|
||||
desc: cp14-skill-tree-craftsman-desc
|
||||
skillType: Memory
|
||||
color: "#a04b00"
|
||||
|
||||
@@ -2,11 +2,13 @@
|
||||
id: GodMerkas
|
||||
name: cp14-job-name-god-merkas
|
||||
desc: cp14-job-desc-god-merkas
|
||||
skillType: Memory
|
||||
color: "#51cf72"
|
||||
|
||||
- type: cp14SkillTree
|
||||
id: GodLumera
|
||||
name: cp14-job-name-god-lumera
|
||||
desc: cp14-job-desc-god-lumera
|
||||
skillType: Memory
|
||||
color: "#5632a8"
|
||||
parallax: Default
|
||||
13
Resources/Prototypes/_CP14/Skill/points.yml
Normal file
13
Resources/Prototypes/_CP14/Skill/points.yml
Normal file
@@ -0,0 +1,13 @@
|
||||
- type: cp14SkillPoint
|
||||
id: Memory
|
||||
name: cp14-skill-point-memory
|
||||
icon:
|
||||
sprite: _CP14/Interface/Misc/skill_point.rsi
|
||||
state: exp
|
||||
|
||||
- type: cp14SkillPoint
|
||||
id: Blood
|
||||
name: cp14-skill-point-vampire-blood
|
||||
icon:
|
||||
sprite: _CP14/Interface/Misc/skill_point.rsi
|
||||
state: blood
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 191 B |
|
Before Width: | Height: | Size: 219 B After Width: | Height: | Size: 219 B |
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"version": 1,
|
||||
"size": {
|
||||
"x": 8,
|
||||
"y": 8
|
||||
},
|
||||
"license": "CC-BY-SA-4.0",
|
||||
"copyright": "Created by TheShuEd (Github)",
|
||||
"states": [
|
||||
{
|
||||
"name": "exp"
|
||||
},
|
||||
{
|
||||
"name": "blood"
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user