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:
Red
2025-07-27 13:47:05 +03:00
committed by GitHub
parent d9b3ceac7c
commit 5020be8ec6
27 changed files with 213 additions and 109 deletions

View File

@@ -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>

View File

@@ -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}";
}

View File

@@ -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 += () =>
{

View File

@@ -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>

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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>

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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");
}
}

View File

@@ -0,0 +1,2 @@
cp14-skill-point-memory = Memory
cp14-skill-point-vampire-blood = Vampiric powers

View File

@@ -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}.

View File

@@ -0,0 +1,2 @@
cp14-skill-point-memory = Память
cp14-skill-point-vampire-blood = Вампирские силы

View File

@@ -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}.

View File

@@ -9,7 +9,9 @@
factions:
- CP14Monster
- type: CP14SkillStorage
experienceMaxCap: 0
skillPoints:
Memory:
max: 0
freeLearnedSkills:
- SwordMastery
- RapierMastery

View File

@@ -89,7 +89,9 @@
types:
CP14ManaDepletion: -0.1
- type: CP14SkillStorage
experienceMaxCap: 0
skillPoints:
Memory:
max: 0
freeLearnedSkills:
- SwordMastery
- RapierMastery

View File

@@ -51,7 +51,9 @@
- FootstepSound
- CP14RaidLeader
- type: CP14SkillStorage
experienceMaxCap: 0
skillPoints:
Memory:
max: 0
freeLearnedSkills:
- SwordMastery
- RapierMastery

View File

@@ -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:

View File

@@ -58,6 +58,9 @@
- type: CP14MagicUnsafeDamage
- type: CP14MagicUnsafeSleep
- type: CP14SkillStorage
skillPoints:
Memory:
max: 5
availableSkillTrees:
- Pyrokinetic
- Hydrosophistry

View File

@@ -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"

View File

@@ -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

View 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

View File

Before

Width:  |  Height:  |  Size: 219 B

After

Width:  |  Height:  |  Size: 219 B

View File

@@ -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"
}
]
}